Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
Computer Science/운영체제

8. 동기화 기법(뮤텍스 락, 세마포, 모니터)

by Toughie 2023. 9. 2.

🖥️ 동기화 기법 🖥️ 

동기화의 종류에는 크게 상호배제, 실행 순서 제어가 있다.

 

뮤텍스 락

상호 배제를 위한 동기화 도구로 자물쇠 역할을 함.

 

뮤텍스 락의 단순한 형태

- 전역 변수 하나, 함수 두 개

- 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock

- 임계 구역을 잠그는 역할: acquire 함수

- 임계 구역 잠금 해제 역할: release 함수 

acquire 함수

- 프로세스가 임계 구역에 진입하기 전에 호출

if 임계 구역이 잠겨 있다면, 임계 구역이 열릴 때까지(lock이 false가 될 때까지) 임계 구역을 반복적으로 확인

(탈의실 똑똑 무한 반복)

if 임계 구역이 열려 있다면, 임계 구역을 잠그기(lock = true)

계속 확인해보는 것을 바쁜 대기라고 함

 

임계구역 작업 ...

 

release 함수

- 임계 구역에서의 작업이 끝나고 호출

- 현재 잠긴 임계 구역을 열기(lock = false) 


세마포

- 좀 더 일반화된 방식의 동기화 도구 

- 공유 자원이 여러 개 있는 경우에도 적용 가능 (뮤텍스락은 탈의실이 1개인 경우를 가정)

탈의실이 여러개 / 차단기를 생각해보자

세마포의 단순한 형태

- 전역 변수 하나, 함수 두 개

- 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S

- 임계구역에 진입해도 괜찮은지, 기다려야 하는지 알려주는 wait 함수(down)

- 임계 구역 앞에서 기다리는 프로세스에 'you can go' 신호를 주는 signal 함수(up)

자리 날 때까지 계속 기다리다가(busy waiting), 자리 나면 내 자리(count 1) 감소 시키고 진입
자리 났어요~

S<=0을 계속 확인하는 것 또한 Busy waiting으로 CPU 사이클의 낭비를 일으킨다.

-> 대기큐를 사용해 해결

 

사용할 수 없는 자원이 없는 경우(S가 <=0 인 경우)

해당 프로세스의 PCB를 대기 큐에 삽입해 프로세스를 대기 상태로 만든다.

 

사용할 수 있는 자원이 생겼을 경우(S>=1인 경우) 대기 큐의 프로세스를 준비 상태로 만든다.

(PCB를 대기큐에서 꺼내 준비 큐에 삽입)

 

세마포를 활용한 '실행 순서 동기화'

- 세마포의 변수 S를 0으로 둔다.

- 먼저 실행해야 하는 프로세스 뒤에 signal 함수

- 다음에 실행할 프로세스 앞에 wait 함수


모니터

매번 임계구역 앞 뒤로 wait(), signal()을 호출해야 하는데.. 실수로 빼먹거나 순서를 바꾼다면?

-> 개발자가 다루기에 편리한 동기화 도구로 모니터가 등장함.

조건변수.wait(): 대기 상태로 변경, 조건 변수에 대한 큐에 삽입

조건변수.signal(): wait()으로 대기 상태로 접어든 조건 변수를 실행 상태로 변경

모니터 안에는 하나의 프로세스만이 있을 수 있다.(상호 배제)

1. wait()을 호출했던 프로세스는 signal()을 호출한 프로세스가 '모니터를 떠난 뒤'에 수행을 재개 (보내고 하거나)

2. ignal()을 호출한 프로세스의 실행을 일시 중단하고, 자신이 실행된 뒤 다시 signal()을 호출한 프로세스의 수행을 재개 (중간에 하거나)

 

실행 순서 제어를 위한 동기화

1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 경우에는 wait을 통해 실행을 중단.

2. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행 재개

 

 

 

학습 출처: https://www.youtube.com/watch?v=bls_GjX-4U8&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl 

 

'Computer Science > 운영체제' 카테고리의 다른 글

10. 교착 상태 해결 방법  (0) 2023.09.02
9. 교착 상태(Dead Lock)  (0) 2023.09.02
7. 동기화(synchronization)  (0) 2023.09.02
6. CPU 스케줄링 알고리즘  (0) 2023.08.30
5. CPU 스케줄링  (0) 2023.08.29