Semaphore

yalpalyappap·2021년 3월 1일
0

운영체제

목록 보기
18/20

Semaphores: A Definition

semaphore란 sem_wait()sem_post()로 우리가 조작할 수 있는 정수값을 갖는 object이다.위처럼 semaphore는 초기화를 해야만 한다.
sem_init()으로 초기화를 수행하는데 s라는 semaphore를 1로 초기화 하고, 2번째 인자인 0은 이 semaphore는 하나의 프로세스안에서 thread들에 의해서 공유될 수 있음을 의미한다.sem_wait()은 semaphore의 값을 1씩 줄이고, 음수가 됐을 경우에는 0이 될 때까지 다시 기다리게된다.

그리고 sem_post()는 semaphore의 값을 1씩 증가시키고, 하나이상의 thread가 기다리고 있는 경우 그 thread를 깨운다.

Binary Semaphores (Locks)

semaphore를 우리에게 익숙한 lock으로 활용하는 방법부터 살펴보자.
이처럼 semaphore를 1로 초기화 해두면 당연하게도 lock처럼 동작할 수 있고, lock처럼 동작하는 semaphore를 binary semaphore라고 부른다.예를들어 2개의 thread가 동시에 동작할 때 critical section에서의 동작은 31.5를 통해 확인할 수 있다.

Semaphores For Ordering

semaphore는 concurrent programing에서 이벤트들의 순서를 지정할 때 유용하게 사용될 수 있다.
예를들어 이전에 살펴보았던 conditional variable처럼 사용될 수 있다. list가 채워질 때 까지 기다리는 thread, 그리고 채워진 list를 비우는 thread를 활용하는 예제처럼 말이다.따라서 초기의 semaphore를 0으로 초기화 한 후 실행하면 위와같은 흐름으로 동작하게된다. 그리고 만약 child thread가 먼저 종료되는 경우에는 parent thread에서는 31.8의 흐름처럼 sem_wait()이 바로 실행되어 즉시 종료된다.

The Producer/Consumer (Bounded Buffer) Problem

semaphore 역시 producer/consumer문제에도 사용될 수 있다.
하지만 concurrent programming에서 항상 염두해둬야 할 deadlock을 피하는 것을 주의해야한다.
semaphore를 활용하는 producer/consumer 문제의 경우에는 위와같은 코드를 사용할 수 있다.

Reader-Writer Locks

좀 더 다양한 자료구조에 lock을 하려는 시도가 있었다.
예를들어 list에 원소를 삽입하거나, 살펴보는 concurrent한 작업이 있다고 하자.
원소를 삽입하는 과정은 list를 변화시키지만 살펴보는 행위는 list에 그 어떤 변화도 발생시키지 않는다.

이와같은 작업을 수행하기 위한 특별한 lock을 reader-writer lock이라고 부른다.

자료구조에 새로운 값을 작성하기 위해서는 rwlock acquire writelock()을 사용하고, 작성이 끝나면 rwlock release writelock()을 사용한다. write lock은 하나만 사용이 가능하다.

그리고 값을 읽을 땐 rwlockacquirereadlock()를 사용하는데 가장 첫번째 reader가 read lock을 수행할 때는 write도 같이 lock을 시킨다. 따라서 값을 읽는 동안에는 추가적인 값이 들어오지 못하게 만들고, 이러한 조치 덕분에 reader는 동시에 여러개의 값을 읽을 수 있다.
하지만 이 조치의 단점은 write를 하고자하는 thread가 생겼을 때 write가 즉시 수행될 수 없고, 모든 read가 끝날 때 까지 기다려야만 한다는 점이다.writer가 기다려야하는 문제 때문에 reader가 writer를 굶주리게하는 fairness문제가 있을 수 있다.

출처: OSTEP

profile
안녕하세요! 개발 공부를 하고있습니다~

0개의 댓글