Operating System Concepts 7장 Synchronization Example

[운영체제 정리] · 2024. 12. 17. 17:27

7.1.1 The Bounded  - Buffer problem

 

책상 60개를 10명에게 시킬 때

  • 한사람당 책상 6개씩 옮기라고 함 - parallel execution
  • 전달전달하는 형태 - pipe line(Producer/Consumer)
  • buffer는 임시 저장소

 

  • buffer에는 IN 포인터와 OUT 포인터가 있다.
  • Circular Buffer

 

생산자는 버퍼가 가득찼을 때 데이터를 추가하지 않는다.

소비자는 버퍼가 비었을 때 데이터를 가져오지 않는다.

Producer

  • Buf[IN] <- data
  • IN = (IN + 1) MOD size
  • count = count +1

 

Consumer

  • data <- Buf[OUT]
  • OUT = (OUT +1) MOD size
  • count = count-1

 

empty semaphore : 빈공간이 몇갠가 -> 초기값은 버퍼 사이즈 ex) 5

full semaphore : 얼마나 차있냐 -> 초기값은 0

 

Producer

  • wait(empty)
  • Buf[IN] <- data
  • IN = (IN + 1) MOD size             얘는 empty가 0이면 즉, 모두 차있으면 대기
  • count = count +1
  • signal(full)

=>이렇게 추가 가능

Consumer

  • wait(full)
  • data <- Buf[OUT]
  • OUT = (OUT +1) MOD size.       얘는 full이 0이면 즉, 비어 있으면 대기
  • count = count+1
  • signal(empty)

 

이것이 생산자 소비자 협력의 코드이다.

 

 

7.1.2 The Readers - Writers Problem

  • DB의 데이터에 접근하는 사용자가 두 그룹이다. reader, writer
  • writer는 상호배제를 지켜줘야하고 reader는 상관없다.

 

  • rw_mutex : 초기값 1

 

  • read_count는 reader가 들어가면 증가, 빠지면 감소 즉, 현재 있는 reader의 수
  • 따라서 reader가 나가면 signal 해줘야 한다.
  • 여기서 mutex가 쓰인 이유? 

 

  • writer가 대기가 들어가면 reader는 들어오면 안된다. 
  • ㄴ> reader는 수정된 데이터를 읽어야 하기 때문에

 

7.1.3 The Dining-Philosophers Problem