섹션3 프로세스 동기화
- 한 컴퓨터 내에서 프로세스 간 통신하고,
다른 컴퓨터와 네트워크로 연결되어 프로세스 간 통신도 가능하다.
- 프로세스간 통신 종류
- 한 컴퓨터 내에서
- 파일 - 하나의 파일을 같이 읽고 쓴다
- 파이프 - 운영체제가 생성한 파이프를 통해 데이터를 주고받는다
- 쓰레드 간 통신 - 데이터, 힙 영역 공유
- 네트워크 이용
- 공유자원 - 프로세스 간 통신시 공동으로 이용하는 변수 또는 파일
- 동기화 문제 발생!
- 여러 프로세스가 공유중이기 떄문에, 프로세스 접근 순서에 따라 결과가 달라질 수 있다!
- 컨텍스트 스위칭으로 시분할 처리 되기 때문에 프로세스 실행 순서를 예측하기 힘듬
- 해결
- 임계 구역 지정 - 여러 프로세스가 동시에 사용하면 안되는 영역을 지정
- 상호 배제 매커니즘
- 임계영역엔 동시에 하나의 프로세스만 접근한다
- 여러 요청에도 하나의 프로세스의 접근만 허용한다.
- 임계구역에 들어간 프로세스는 최대한 빠르게 나와야한다.
(다른 프로세스들이 기다리니까)
- 경쟁 조건 - 공유자원을 서로 사용하기 위해 경쟁하는 것
- 세마포어
- 두 명의 직원(프로세스)이 하나의 프린트(공유자원)를 사용
- 경쟁 조건 - 서로 먼저 출력하려고 경쟁
- 따로 프린터실을 두어 그곳에 PC와 프린터기를 둔다
- 방 밖에는 열쇠(세마포어) 관리자(운영체제)가 있다
- 직원은 열쇠를 받아 사용 후 열쇠를 관리자에게 반납
- 그러면 다음 직원이 차례대로(대기 큐) 프린터실을 사용
- 세마포어는 정수형 변수(s)이고, (여러 개도 가능)
wait(s) (세마포어를 획득할 때 까지 큐에서 대기) 와
signal(s) (세마포어 반납) 를 사용하여 경쟁을 막음
- 세마포어의 단점
- 모니터
- 세마포어의 단점을 해결한 상호배제 메커니즘
- 운영제체 차원이 아닌, 프로그래밍 언어 차원에서 지원하는 방법이다.
public class Health {
private int health = 100;
synchronized void increase(int amount) {
health += amount;
}
synchronized void decrease(int amount) {
health -= amount;
}
}
출처 : 인프런, 그림으로 쉽게 배우는 운영체제