뮤텍스 락
상호 배제를 위한 동기화 도구 (자물쇠 역할)
뮤텍스 락의 단순한 형태: 전역 변수 하나, 함수 두 개
자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
임계 구역을 잠그는 역할: acquire 함수
임계 구역을 잠금 해제하는 역할: release 함수
- 바쁜 대기 (busy waiting) 발생
세마포
좀더 일반화된 방식의 동기화 도구
뮤텍스 락은 공유 자원이 하나인 경우만 가능하지만
세마포는 공유 자원이 여러 개 있는 경우에도 적용 가능
세마포의 종류는 이진 세마포, 카운팅 세마포가 있는데 여기서는 카운팅 세마포를 지칭
세마포의 상호 배제를 위한 동기화
세마포의 단순한 형태: 전역 변수 하나, 함수 두 개
임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
임계 구역 앞에서 기다리는 프로세스에 가도 된다고 신호를 주는 signal 함수
예시)
세 개의 프로세스 P1, P2, P3가 두개의 공유 자원(S=2)에 P1, P2, P3 순서로 접근한다고 가정
- 바쁜 대기 (busy waiting) 발생
- 해결 방법
사용할 수 있는 자원이 없을 경우 대기 상태로 만듦
(해당 프로세스의 PCB를 대기 큐에 삽입)
사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦
(해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)
예시
세 개의 프로세스 P1, P2, P3가 두개의 공유 자원(S=2)에 P1, P2, P3 순서로 접근한다고 가정
세마포의 실행 순서 제어를 위한 동기화
세마포의 변수 S를 0으로 두고
먼저 실행할 프로세스 뒤에 signal 함수
다음에 실행할 프로세스 앞에 wait 함수를 붙이면 된다
매번 임계 구역 앞뒤로 wait(), signal()을 호출해야 한다면
실수로 인한 리스크가 너무 크게된다
ex. 세마포 누락한 경우, wait와 signal의 순서를 헷갈린 경우, wait와 signal을 중복 사용한 경우,...
따라서, 이러한 문제를 해결하기위해 등장한 모니터
모니터
사용자(개발자)가 다루기에 편한 동기화 도구
모니터의 상호 배제를 위한 동기화
인터페이스를 위한 큐
공유 자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입
큐에 삽입된 순서대로 (한번에 하나의 프로세스만) 공유 자원 이용
모니터의 실행 순서 제어를 위한 동기화
wait와 signal을 호출할 수 있는 조건 변수(condition variable) 이용
조건 변수: 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
조건변수 wait(): 대기 상태로 변경, 조건 변수에 대한 큐 삽입
조건변수 signal(): wait()으로 대기 상태인 조건 변수를 실행 상태로 변경
모니터 안에는 하나의 프로세스만이 있을 수 있기에
아래와 같은 두가지 방식 중 하나로 관리
1. wait()를 호출했던 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 수행을 재개
2. signal()을 호출한 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤에
다시 signal()을 호출한 프로세스의 수행을 재개
따라서,
특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단하고
특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개하는 방식을 가진 것이다
'CS > [혼자 공부하는] 운영체제' 카테고리의 다른 글
5-2] 교착상태: 교착 상태 해결 방법 (0) | 2023.06.08 |
---|---|
5-1] 교착상태: 교착 상태란 (0) | 2023.06.07 |
4-1] 프로세스 동기화: 동기화란 (0) | 2023.06.06 |
3-2] CPU 스케줄링: CPU 스케줄링 알고리즘 (0) | 2023.06.06 |
3-1] CPU 스케줄링: CPU 스케줄링 개요 (0) | 2023.06.05 |