본문 바로가기

운영체제

[운영체제] Process synchronization (2)

동기화 관련 문제와 해결방법에 대하여

Bounded-Buffer Problem => Shared-Memory Solution

  • 일반적으로 Producer, Consumer 문제라고 함
  • Producer는 데이터를 만들기만 하고, Consumer는 소비하기만 함
  • Producer가 Buffer에 데이터를 쓰면 Consumer가 거기에서 읽어감
  • Buffer 크기는 제한되어 있으며, 프로세스 간 공유함
  • Producer가 데이터를 쓸 때 Consumer가 읽어가면 안되고, Consumer가 읽어갈 때 Producer가 쓰면 안됨 -> semaphore로 해결 가능(Buffer에 들어갈 때 P 호출, 나올 때 V 호출)
  • Buffer가 한정된 크기를 가지므로 Producer가 필요할 때마다 데이터를 쓸 수 없음
  • Buffer에 접근해도 되는 상황이면 접근, 아니면 대기
  • 접근해도 되는 상황
    • Producer: empty buffer의 개수가 0보다 크면 Buffer 접근 가능
    • Consumer: full buffer의 개수가 0보다 크면 Buffer 접근 가능
    • empty buffer 개수, full buffer 개수에 대한 변수도 동시 접근 가능성이 있으므로 보호해야 됨 -> integer semaphore

Bounded-Buffer Problem
위의 그림 코드로 나타낸 것

Readers-Writers Problem; Scheduling

  • Readers: Read-Only여서 동시 접근 가능 -> 동기화 문제 X, Writers가 쓰고 있을 때만 안 읽으면 됨
  • Writers: Readers가 읽고 있을 때 쓰면 안됨
  • DB에 데이터를 쓸 것
  • Writer는 쓰기 전 Reader 있는지 확인, Reader는 쓰기 전 Writer 있는지 확인
  •  N readers, 1 writer가 기다리는 상황
  • Solution A: reader가 읽고 있다면, 다른 readers도 읽게 하고 다 읽으면 writer(먼저 왔어도 기다림) 시작 
    • semaphore mutex=1, db=1;
    • int readcount = 0; //reader 사이에서 동기화 필요->mutex 활용
    • first reader -> try P(db), last reader -> do V(db) 

Readers-Writers Problem

  • Solution B: 현재 reader가 빠져나가면 바로 writer가 쓰게 함

Dining-Philosophers Problem: deadlock

  • 원탁에 철학자들이 둥그렇게 있고, 젓가락을 사람 앞이 아니라 사이에 한 쪽씩 둠
  • '생각해라, 배고프면 양쪽의 젓가락 한쪽씩을 확보한 경우 먹어라'
  • 두 놈이 한꺼번에 젓가락을 잡으면 안됨

  • 모든 철학자가 한번에 배가 고파서, 왼쪽의 젓가락을 모두 잡았어 -> 오른쪽 젓가락은 모두 P에 걸려서 계속 대기해야 함 => Deadlock: 다른 프로세스가 잡은 자원을 기다리는데 원형 대기가 돼버림, 무한대기
    • Starvation: 누군가는 진도를 나가지만 나는 계속 기다려서 손해 봄, deadlock은 아니지
  • Deadlock 해결방법
    • 양쪽 젓가락을 하나의 자원으로 취급
    • 홀수번째 철학자는 왼쪽 젓가락을 먼저 들고, 짝수번째 철학자는 오른쪽 젓가락을 먼저 들도록
    • 5자리가 있으면 4명만 앉히기

Semaphore 문제점

  • 코딩하기 어려움
  • 코딩을 해도 올바르다는 걸 증명하기 어려움; 디버깅해야하는데 동기화 문제는 항상 일어나지 않기 때문에
  • 개발자 간 협력 필요
  • 한 번 잘못 사용하면 전체 시스템을 마비시키는 경우 발생

Monitors

  • c, c++ 같은 high level language에서 제공하는 툴
  • private data, public methods로 구성됨
  • 모니터에서 동작하는(active한) 프로세스는 오로지 1개뿐이라는 것을 보장해줌
  • 누군가 public methods 중 하나를 사용 중일 때 다른 프로세스가 호출 시 queue에서 대기

Monitor

  •  이미 모니터 안에 들어간 consumer가 기다리는 동안 busy waiting을 하면, producer는 모니터에 못 들어가서 결국 진도가 안 나감 -> 그래서 모니터 안에 대기할 공간이 생김
  • x.wait()를 호출하면 active한 프로세스가 없으므로 대기하던 프로세스가 모니터로 들어올 수 있음
  • x.signal()를 호출해 자던 놈 깨울 수 있음

  • Monitor - Dining Philosopher Problem

 

  • Monitor 사용 시 주의사항
    • 모니터 내 public methods를 호출할 때 순서관계에 따라 올바르게 호출할 것 (ex. pickup -> putdown)
    • private 변수들에 대한 접근을 public methods를 이용하지 않고 직접 접근하지 못하도록 할 것

 

한양대학교 강수용 교수님 운영체제 강의 내용 정리

'운영체제' 카테고리의 다른 글

[운영체제] Memory Management (1)  (0) 2024.03.20
[운영체제] Deadlocks  (0) 2024.03.12
[운영체제] Process Synchronizationtion (1)  (0) 2024.02.27
[운영체제] CPU Scheduling  (3) 2024.02.20
[운영체제] Process and Threads  (2) 2024.02.09