카테고리 없음

[CS] {운영체제} 동기화 기법

ogh4554 2025. 4. 23. 17:26

1. 뮤텍스 락

: 상호배제를 위한 동기화 도구(자물쇠 역할), 뮤텍스 락

 

> 뮤텍스 락의 단순한 형태

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

  • 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
  • 임계 구역을 잠그는 역할 : acquire 함수
  • 임계 구역의 잠금을 해제하는 역할 : release 함수

 

1) acquire 함수

  • 프로세스가 임계 구역에 진입하기 전에 호출
  • 임계 구역이 잠겨 있다면 열릴 때까지 임계 구역을 반복적으로 확인(lock이 false가 될 때까지)
  • 임계 구역이 열려 있다면 임계 구역을 잠그기(lock을 true로 바꾸기)

2) release 함수

  • 임계 구역에서의 작업이 끝나고 호출
  • 현재 잠긴 임계 구역을 열기(lock을 false로 바꾸기)

3) 바쁜 대기(busy-waiting)

- 임계구역이 잠겨있는지를 반복적으로(무한히) 확인하는 것은 좋은 방법이 아님


2. 세마포

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

- 공유자원이 여러개 있는 경우에도 적용 가능

- 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기

- 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입

(ex. 철도 신호기)

 

> 세마포의 단순한 형태

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

  • 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역변수 S
  • 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
  • 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 주는 signal 함수

(좌) Wait 함수 (우) Signal 함수

 

+ Busy Waiting(바쁜 대기)을 통해 뮤텍스 락과 마찬가지로 CPU의 사이클을 낭비할 수 있음

=> 해결방법

- 사용할 수 있는 자원이 없을 경우 대기상태로 만듦

   (해당 프로세스의 PCB를 대기 큐에 삽입)

- 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비상태로 만듦

   (해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)

 


3. 모니터

1) 상호 배제를 위한 동기화

- 인터페이스를 위한 큐

- 공유자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입

- 큐에 삽입된 순서대로 (한번에 하나의 프로세스만) 공유 자원 이용

 

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

- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때는 wait를 통해 실행을 중단

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

- 조건 변수 이용

* 조건 변수 : 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수

  • 조건변수.Wait() : 대기상태로 변경, 조건 변수에 대한 큐에 삽입
  • 조건변수.Signal() : Wait()로 대기 상태로 접어든 조건 변수를 실행 상태로 변경

- 모니터 안에는 하나의 프로세스만이 있을 수 있다.(아래는 두가지 방법)

  • wait()를 호출했던 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 수행을 재개
  • signal()을 호출한 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤 다시 signal()을 호출한 프로세스의 수행을 재개