2026년 4월 21일 · 조회수 0
CS / OS[OS] 4. 프로세스 동기화
본 글은 인프런 강의를 바탕으로 정리한 개인 학습 기록입니다.
출처: <그림으로 쉽게 배우는 운영체제>
목차
1. 프로세스 간 통신
2. 공유자원과 임계구역
3. 세마포어
4. 모니터
1. 프로세스 간 통신
1) 메시지 전달 방식
- 프로세스들이 메모리를 공유하지 않고 데이터를 주고받는 방식
- 운영체제가 제공하는 통신 수단을 이용함
파이프
- 운영체제가 만든 통로를 통해 데이터 전달
- 스트림 형태의 단방향 통신
- 송신 프로세스와 수신 프로세스가 동시에 실행되어야 함
메시지 큐
- 보낸 데이터를 큐에 저장해 두었다가 받는 프로세스가 꺼내 감
- 두 프로세스가 동시에 실행되지 않아도 됨
- 양방향 통신 가능
소켓
- 클라이언트-서버 방식으로 통신
- 같은 컴퓨터뿐 아니라 네트워크를 통해 다른 컴퓨터와도 통신 가능
- 양방향 통신 가능
2) 공유 메모리 방식
- 여러 프로세스가 같은 메모리 영역을 함께 사용하는 방식
- 데이터를 직접 읽고 쓸 수 있어 빠를 수 있음
- 하지만 동시에 접근하면 문제가 생길 수 있음
3) 동기화 문제
- 공유 메모리를 여러 프로세스나 스레드가 함께 사용하면 충돌이나 오류가 생길 수 있음
- 이런 문제를 동기화 문제라고 함
- 해결을 위해 다음과 같은 도구를 사용함
- 세마포어
- 뮤텍스
- 모니터
4) 기타 IPC 방식
- 시그널
- 파일
- RPC(원격 프로시저 호출)
2. 공유자원과 임계구역
1) 공유자원
- 여러 프로세스나 스레드가 공동으로 사용하는 자원
- 예:
- 변수
- 파일
- 메모리 공간
2) 동기화 문제
- 공유자원에 여러 작업이 동시에 접근하면 실행 순서에 따라 결과가 달라질 수 있음
- 시분할 처리와 컨텍스트 스위칭 때문에 어떤 작업이 먼저 실행될지 예측하기 어려움
3) 경쟁조건
- 여러 프로세스가 공유자원을 차지하려고 경쟁하면서 결과가 실행 타이밍에 따라 달라지는 현상
- 이런 상황을 경쟁조건(Race Condition) 이라고 함
4) 임계구역
- 공유자원에 접근하는 코드 중 동시에 실행되면 안 되는 부분
- 이 구간에서는 한 번에 하나의 프로세스만 실행되어야 함
5) 예시
- 현재 체력: 20
- 두 작업이 동시에 실행됨
- 공격: 체력 감소
- 물약: 체력 증가
문제 상황
- 공격 코드가 체력 20을 읽음
- 중간에 물약 코드가 실행되어 체력을 70으로 바꿈
- 다시 공격 코드가 예전 값 20을 기준으로 계산해 체력을 10으로 바꿈
결과
- 기대값: 60
- 실제값: 10
- 원인: 같은 공유자원인 체력을 동시에 다뤘기 때문
6) 임계구역 문제 해결 조건
- 동시에 임계구역에 들어갈 수 있는 프로세스는 1개만 허용
- 여러 프로세스가 들어가려 하면 오직 하나만 진입
- 임계구역에 들어간 프로세스는 가능한 빨리 나와야 함
3. 세마포어
1) 세마포어란
- 세마포어는 정수형 변수
- 현재 사용할 수 있는 자원의 개수를 의미함
2) 왜 필요한가
- 여러 프로세스가 같은 공유자원에 동시에 접근하면 결과가 섞이거나 잘못될 수 있음
- 이런 문제를 경쟁 조건이라고 함
- 세마포어는 이런 동시 접근을 막아 줌
3) 기본 연산
-
wait()
- 자원을 사용하려고 할 때 호출
- 세마포어를 하나 얻을 수 있으면 진입
- 없으면 기다림
-
signal()
- 자원 사용이 끝났을 때 호출
- 세마포어를 반납
- 기다리던 다른 프로세스가 사용할 수 있게 함
4) 동작 예시
- 공유자원: 체력 변수 1개
- 세마포어 초기값: 1
흐름
물약 코드가 `wait(s)` 호출
세마포어를 얻고 임계구역 진입
공격 코드는 `wait(s)`를 호출하지만 세마포어가 없어서 대기
물약 코드가 작업을 마치고 `signal(s)` 호출
세마포어가 반납되면 공격 코드가 진입
공격 코드도 작업 후 `signal(s)` 호출
5) 대기 큐
- 세마포어를 얻지 못한 프로세스는 대기 큐에서 기다림
- 자원이 반납되면 대기 중인 프로세스가 차례로 실행됨
6) 카운팅 세마포어
- 세마포어 값이 꼭 1일 필요는 없음
- 공유자원이 여러 개라면 그 개수만큼 설정 가능
- 예:
- 프린터가 2대면 세마포어 값도 2
- 이렇게 여러 개의 자원을 관리하는 것을 카운팅 세마포어라고 함
7) 한계
wait()와signal()을 잘못 사용하면 오류가 생길 수 있음- 즉, 사용법이 복잡하면 실수할 가능성이 있음
4. 모니터
1) 모니터
- 상호배제를 위한 동기화 메커니즘
- 한 번에 하나의 스레드만 임계구역에 들어가게 함
- 세마포어보다 사용이 더 단순함
2) 자바의 synchronized
- 자바에서는 모니터를
synchronized키워드로 구현함 synchronized가 붙은 메서드나 블록은 동시에 여러 스레드가 실행할 수 없음
3) 동작 방식
- 어떤 스레드가
synchronized메서드에 들어가 실행 중이면 - 다른 스레드는 같은 객체의 다른
synchronized메서드에도 바로 들어갈 수 없음 - 즉, 한 번에 하나만 실행되도록 막아 줌
4) 예시
health라는 공유 변수가 있음increase()와decrease()메서드에synchronized를 붙임
댓글
댓글을 불러오는 중...