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 Semaphore와 Counting 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는 자바에서 라이브러리 형태로 구현되어있으며, 특정 함수에서 공유 변수를 사용하고 있을 때 다른 함수에서는 사용하지 못하도록 자동으로 차단해줍니다.
'ㄴ CS > 운영체제' 카테고리의 다른 글
메모리 관리_Address binding(Compile time, Load time, Execution time) (0) | 2022.06.16 |
---|---|
Deadlock_Deadlock의 발생 조건 (0) | 2022.06.15 |
동기화_Low Level Synchronization Tools(Spin Lock, Disabling interrupts) (0) | 2022.06.14 |
동기화_Race condition, Synchronization (0) | 2022.06.14 |
스케줄링_Real-Time Scheduling (0) | 2022.06.13 |
댓글