동기화 관련 문제와 해결방법에 대하여
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
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)
- 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에서 대기
- 이미 모니터 안에 들어간 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 |