dsdsdsdssda
동기화 기법
1. 뮤텍스 락
2. 세마포
3. 모니터
1. 뮤텍스 락
상호 배제를 위한 동기화 도구(자물쇠 역할), 뮤텍스 락
뮤텍스 락의 단순한 형태
전역 변수 하나, 함수 두 개
- 자물쇠 역할 -> 프로세스들이 공유하는 전역 변수 lock
- 임계 구역을 잠그는 역할 -> acquire 함수
- 임계 구역 해제 -> release 함수
-> 썩 좋은 방법은 아님
busy waiting (바쁜 대기) -> 무한히 반복하면서 임계구역이 열려있는지 아닌지 확인하는것
2. 세마포 (= 여러 세마포 중 카운팅 세마포)
좀 더 일반화된 방식의 동기화 도구
공유 자원이 여러 개 있는 경우에도 적용 가능
임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기
임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입
예) 철도 신호기
구현 -> 전역 변수 하나, 함수 두개
임계 구역에 진입할 수 있는 프로세스의 개수 (사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
임계 구역에 들어가도 좋은지, 기다려얗 ㅏㄹ지를 알려주는 wait 함수
임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 주는 signal 함수
wait()
//임계 구역
signal()
wait(){
while(S<=0)
;
S--;
}
signal(){
S++
}
wait과 signal은 임계구역 앞뒤에서 실행
세마포 Busy waiting
근데 Busy waiting 썩 좋은일아님 쓸데 없는 일에 CPU 싸이클 낭비
해결 방법
사용할 수 있는 자원이 없을 경우 대기 상태로 만듦 (해당 프로세스의 PCB를 대기 큐에 삽입)
사용할 수 있느 자원이 생겼을 경우 대기큐의 어쩌구 ㅈㅉ 준비 상태로 만듦
세마포를 활용한 실행 순서 동기화
1. 세마포의 변수 S를 0으로 두고,
2. 먼저 실행할 프로세스 뒤에 signal 함수,
3. 다음에 실행할 프로세스 앞에 wait 함수를 붙이면됩니다.
3. 모니터
매번 임계 구역 앞뒤로 wait, signal 함수를 호출해야 하나? 순서를 헷갈리면 에바적
그래서 등장
사용자(개발자)가 다루기 편한 도구
[상호 배제를 위한 동기화]
인터페이스를 위한 큐
공유자원에 접근하고자 하는 프로세스를(인터페이스를 위한) 큐에 삽입
큐에 삽입된 순서대로 (한 번에 하나의 프로세스만) 공유 자원 이용
[실행 순서 제어를 위한 동기화]
조건 변수 이용
조건 변수란 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
조건변수.wait() ->
조건변수.signal() ->