Classical Problems of Synchronization

정하윤·2022년 8월 30일
0
post-custom-banner

Classical Problems of Synchronization

  • Bounded-Buffer Problem
  • Readers and Writers Problem
  • Dining-Philosophers Problem

Bounded-Buffer Problem

Producer

  1. 비어있는 버퍼가 있는지 확인하고 없으면 기다리고 있으면 획득한다.
  2. lock을 건후 버퍼에 데이터를 넣는다.
  3. lock을 푼후 데이터가 들어가있는 버퍼를 푼다.

Consumet

  1. 데이터가 들어가있는 버퍼가 있는지 확인하고 없으면 기다리고 있으면획득한다.
  2. lock 을 건후 버퍼에서 데이터를 꺼내간후 lock을 푼다.
  3. 그리고 비어있는 버퍼의 개수를 1개 증가시킨다.

Readers and Writers Problem

  • 한 process가 DB에 write 중일 때 다른 process가 접근하면 안됨
  • read는 동시에 여럿이 해도 됨

Solution

  • Writer가 DB에 접근 허가를 아직 얻지 못한 상태에서는 모든 대기중인 Reader들을 다 DB에 접근하게 해준다.
  • Writer는 대기 중인 Reader가 하나도 없을 때 DB 접근이 허용된다.
  • 일단 Writer가 DB에 접근 중이면 Reader들은 접근이 금지된다.
  • Writer가 DB에서 빠져나가야만 Reader의 접근이 허용된다.

위의 코드는 Reader은 read는 동시에 해도 된다고 했으므로 readcount에서 1을증가 시켜 최초의

프로세스라면 lock 을 걸고 그후 readcount가 2부터는 lock을 걸 필요가 없다.

그리고 마지막으로 나가는 프로세스일 경우에는 lock을 풀어준다.

철학자 5명이 앉아있고 앞에 놓여진 젓가락을 2개 사용하여 밥을 먹을수 있을때의 상황

앞의 solution의 문제점

  • Deadlokc 가능성이 있다.
  • 모든 철학자가 동시에 배가 고파져서 왼쪽 젓가락을 집어버린 경우

해결 방안

  • 4명의 철학자만이 테이블에 동시에 앉을 수 있도록 한다.
  • 젓가락을 두 개 모두 집을 수 있을 때에만 젓가락을 집을 수 있게 한다.
  • 비대칭 - 짝수(홀수) 철학자는 왼쪽(오른쪽) 젓가락부터 집도록 한다.

Semaphore의 문제점

  • 코딩하기 힘들다

  • 정확성의 입증이 어렵다

  • 자발작 협력이 필요하다.

  • 한번의 실수가 모든 시스템에 치명적 영향


Monitor

  • 모니터 내에서는 한번에 하나의 프로세스만이 활동 가능

  • 프로그래머가 동기화 제약 조건을 명시적으로 코딩할 필요없음

  • 프로세스가 모니터 안에서 가디를 수 있도록 하기 위해 condition variable 사용

  • Condition variable 은 wait와 signal 연산에 의해서만 접근 가능

    x.wait();

    x.wait()을 invoke한 프로세스는 다른 프로세스가 x.signal()을 invoke 하기 전 까지 suspend된다.

    x.signal();

x.signal()은 정확하게 하나의 suspend된 프로세스를 resume한다.

Suspend된 프로세스가 없으면 아무 일도 일어나지 않는다.

monitor는 공유버퍼가 안에 정의되어 있기 때문에 생산하거나 소비하는 작업을 하기위해는 monitor 내부코드를 실행해야 되고 그러면 생산자든 소비자든 하나의 프로세스가 monitor안에서 활성화 하기 때문에 굳이 lock을 걸지않아도 생산자가 접근하는 동안에 또다른 생산자나 소비자가 접근해서 생기는 문제는 고려해볼 필요가 없다. 그래서 lock 을 거는 코드는 없다.

post-custom-banner

0개의 댓글