// 생산자와 소비자 공유하는 자료구조
int n ;
semaphore mutex = 1;
semaphore empty = n;
semaphore full = 0;
// 생산자 코드
while(true){
wait(empty);
wait(mutex);
// add buffer
signal(mutex);
signal(full);
}
// 소비자 코드
while(true){
wait(full);
wait(mutex);
// remove buffer
signal(mutex);
signal(empty);
}
<aside> 💡 위 코드는 유한 버퍼문제가 발생하는 생산자, 소비자 코드이다. 위 코드에서 사용되는 동기화 프리미티브의 종류(2 종류)에 대해 작성해주세요.
동기화 프리미티브란 ? 병렬, 동시에 실행되는 프로세스 간 상호작용을 조정하기 위해 사용되는 저수준의 기본 매커니즘
</aside>
→ 뮤텍스, 세마포(상수 세마포)
<aside>
💡 데이터베이스에 계좌에 입금, 출금, 조회를 하기 위해 2개의 프로세스가 공유될 수 있다고 가정해보자.
현재 3개의 프로세스(A,B,C) 중 A 프로세스는 먼저 잔액 조회를 위해 읽기 락을 요청하고, B프로세스는 출금을 하기 위해 쓰기 락을 요청했다. 마지막으로 C프로세스도 A와 동일하기 잔액 조회를 위해 읽기 락을 요청했다.
(단, critical section의 소요 시간은 10초이고, A,B,C의 락 획득은 1초 단위로 요청한다.)
위 상황에서 발생할 수 있는 문제
와 문제 발생 원인
에 대해 설명해주세요.
</aside>
→ Reader - Writer 락에 의해 Reader 가 수행중일 때, 새로운 Reader 가 들어와서 writer락을 지연시켜 C는 B의 프로세스 다음임에도 불구하고 A와 동일한 값을 출력한다. 즉, 변경사항이 반영되지 않는다.
<aside>
💡 Windows 운영체제에서는 스레드를 동기화하기 위해 Dispatcher 객체(동기화 오브젝트)를 제공한다.
이러한 Dispatcher 객체는 signaled
, nonsignaled
2가지 상태에 존재할 수 있다.
이 두 가지 상태에 있을 경우 스레드가 어떻게 되는지
</aside>
→ signaled 상태 같은 경우 객체에 접근 가능한 상태를 말한다. 그래서 스레드가 객체에 집입하려 할 때 저 상태의 경우 mutex락을 얻어 객체에 접근하고, non-signaled상태의 경우 객체에 접근이 불가능한 상태를 말하는데, 이 때 스레드는 mutex 대기큐에서 반환된 mutex가 생길 때 까지 대기한다.
<aside>
💡 POSIX가 제공하는 세마포는 기명 과 무명 2가지 유형으로 구분된다.
무명 세마포는 sem_init(&sem, pshared, value)
함수를 통해 생성 및 초기화가 이루어지는데 각 매개변수에 대해서 설명해주세요.
</aside>