본문 바로가기
ㄴ CS/운영체제

동기화_High level Synchronizations Tools(Semaphore, Mutex, Monitor)

by 경아ㅏ 2022. 6. 15.

High level mechanism

여러개의 프로세스(스레드)들이 공유자원에 동시에 접근하여 비의도적으로 공유자원의 값이 변경되거나 오염되는 상황을 race condition이라 합니다. Synchronization(동기화)란, 이러한 상황을 방지하기 위한 기법으로 하나의 프로세스가 Critical section을 실행하고 있을 때 다른 프로세스는 접근하지 못하도록 막는 개념입니다. 

(자세한 설명은 여기에)

 

본 포스팅에서는 User level에서 사용되는 동기화 기법들에 대해 소개합니다.

 

 

Semaphore

Semaphore는 공유자원에 동시에 접근할 수 있는 프로세스의 수를 정수형 변수로 나타냅니다. 이를 공유 자원에 접근할 수 있는 티켓이라고 생각하면 이해하기 쉽습니다. 

 

 

Semaphore 에서는 프로세스의 Critical section을 wait()와 signal()로 감싸 보호합니다. wait()은 공유자원에 접근할 수 있는 티켓이 나올 때까지 대기한 후, 티켓이 나오면 이를 하나 잡아챕니다. 해당 프로세스가 티켓을 하나 가져갔으므로 정수형 변수는 1만큼 감소하게 됩니다. Signal()은 Critical section을 모두 실행한 후 가져갔던 티켓을 반납하는 연산입니다. 티켓을 반납했으므로 정수형 변수는 1만큼 증가합니다.

 

Semaphore는 정수형 변수의 제한범위에 따라 Binary SemaphoreCounting Semaphore 나눌 수 있습니다. Binary Semaphore의 경우, 정수형 변수의 값은 0과 1만 가능합니다. Counting Semaphore는 정수형 변수의 범위가 제한되지 않습니다. 

 

Semaphore는 동기화 이슈가 아닌, 프로세스의 선후 관계 조정에도 사용될 수 있습니다. 

예를 들어, 프로세스 P2 내부의 코드 섹션 B가 P1의 A보다 늦게 수행되어야 한다고 가정해봅시다.

Semaphore의 정수형 변수를 0으로 초기화 하고, B 앞에 wait()을, A 뒤에 signal()을 추가합니다. 

 

 

프로세스 P2가 P1 보다 먼저 스케줄링 되어 wait()에 도달한다면 flag = 0 이므로 flag가 1이 될 때까지 대기합니다. 이후, P1이 스케줄링 되어 A를 실행하고 signal()을 보내면 flag = 1 이 되어 다음에 P2가 스케줄링이 되었을 때 B를 실행할 수 있게 됩니다. 

 

 

Mutex Lock

Mutex 에서의 lock()과 unLock은 binary Semaphore와 동일하게 사용됩니다.

 

상호 배제의 원리로 특정 프로세스가 Critical Section을 수행하고 있으면 다른 프로세스는 진입할 수 없게 됩니다.

 

 

Monitor

Monitor는 mutex 와 conditional variable 로 구성됩니다.

mutex 변수는 critical section에 한번에 하나의 프로세스만 접근할 수 있도록 관리합니다. mutex 변수를 취득하지 못한 프로세스는 entry queue에서 대기합니다.

 

 

contination variable은 프로세스가 특정 조건을 만족할 때까지 대기해야 하는 상황을 관리합니다. 특정 조건을 만족하지 못하는 경우, wait()을 호출하게 됩니다. 이 때, 프로세스는 conditional variable이 관리하는 waiting queue에 들어가게 되며, 다른 프로세스들이 critical section을 사용할 수 있도록 mutex를 반환합니다. waiting queue에 들어가있는 프로세스는 이후 signal()에 의해 깨어납니다.

 

Semaphore에서의 signal()과 Monitor에서의 signal()에는 차이점이 있는데, 

Semaphore에서 signal을 보내면 조건과 관련된 변수가 1 증가하면서 history가 기록되지만,

Monitor에서는 waiting queue에 있는 프로세스만 깨어날 뿐 history는 기록되지 않습니다. 

 

Monitor는 자바에서 라이브러리 형태로 구현되어있으며, 특정 함수에서 공유 변수를 사용하고 있을 때 다른 함수에서는 사용하지 못하도록 자동으로 차단해줍니다.

 

댓글