Homework‎ > ‎

Reader & Writer Problem

세마포를 이용하여 Lock과 Condition Variable을 만들어 구성된 Mesa Style Monitor로 Reader & Writer Problem을 구현하시오.
- Lock 만들 기 힌트 (참고 페이지)
     초기값이 1인 세마포를 만들어 P()는 Acquire()로 V()는 Release()로 활용한다.
     이 때 lock=initsem(semkey,1); 으로 lock이라는 ID의 세마포를 만든 후 lock.Acquire()는 Acquire(lock) 또는 P(lock)으로 표현한다.

- Condition Variable 만들기 힌트
     세마포의 waiting queue가 비어있는지를 간접적으로 알기 위해 별도의 카운터를 관리한다.
     Lock 과 유사하게 c1=initsem(semkey2,0); 으로 c1이라는 ID의 세마포를 만든 후 c1.wait(&lock)는 wait(c1,lock)로 표현한다.

- Reader, Writer가 협력하며 관리하는 4개의 카운터(AR,AW,WR,WW)는 4개의 화일에 기록하기로 한다.
     즉 각 화일의 초기값은 0이며 값이 변할 때 마다 변한 값을 추가하여 기록한다. 
     이 때 기록된 시간 및 기록한 프로세스의 ID(pid, getpid()로 획득)도 함께 기록한다.
     이 4개의 카운터값을 상황에 맞게 변경하는 것을 잘 동기화하는 것이 관건이다.
     실행이 끝난 후 4개의 화일을 통합하여 시간 순으로 정렬하면 실행동안 발생한 상황을 분석할 수 있다.

- reader, writer 구현
        예: reader 3 8      // 3초 후에 8초간 읽음
     바로 실행되지 않고 주어진 시간 만큼 지연되었다가 실행한다. (시작하자 마자 sleep(3);)
     실제로 읽고 쓰는 것이 아니라 메세지만 출력하고 주어진 시간만큼 sleep(8); 한다.
     여기서 사용하는 sleep()은 시간 지연을 목적으로 한 것이다. 
     즉 뭔가 중요한 일을 그 시간만큼 하고 있는 것으로 가정한다.

- 실행 및 분석
    $ reader 1 5 &
       reader 2 5 &
       writer  3 3 &
       reader 4 5 &
       reader 5 3 &
       writer  6 3 &

      위와 같이 실행할 때 전체 실행시간이 몇 초이며 누가 가장 늦게 끝나는가를 실제 실행된 기록으로 설명하시오.
       (실행시간 - 시간 지연을 위해 삽입된 sleep()으로만 계산, 4개 카운터 화일에 접근하는 시간은 무시)

- 주의!
   매번 실행 전에 세마포들을 모두 지워야 한다.
   $ ipcs                       // 남아 있는 세마포 확인
   $ ipcrm -s semid     // semid라는 세마포 제거

Comments