[OS]同期プロセス(3)
Classical Problems of Synchronization
Bounded-Buffer Problem
(=Producer-Consumer Problem、生産者消費者問題)
=共有バッファサイズが限られている環境での問題
生産者-消費者問題
共有バッファには、次の2つのプロセスがあります.
バッファにデータを入れる
Consumer(バッファからデータを取り出す)
Empty buffer(ポインタ)を追加
同期の問題はいつ発生しますか?
リソースへの同時アクセス
Producerの場合
Bounded Bufferによる問題
リソースの観点から
Producer
Consumer
Shared Data
// - Producer
do {
produce an item in x
...
P(empty); // 빈 퍼버가 있는지 확인
P(mutex); // 있다면, lock을 건다
...
add x to buffer
...
V(mutex); // lock을 푼다
V(full); // full buffer의 개수 1 증가
}
// - Consumer
do {
P(full); // full 버퍼가 있는지 확인
P(mutex); // 있다면, lock을 건다
...
remove an item from buffer to y
...
V(mutex); // lock을 푼다
V(empty); // empty buffer의 개수 1 증가
...
consume the item in y
}
リーダ-ライタの問題
=readerとwriterの2つのプロセスがデータベースを共有する環境
質問する
あるプロセスがデータベース(共有リソース)に書き込まれている場合、別のプロセスはにアクセスできません.
解決策
Shared Data
// - Writer
P(db); // writer가 들어가면 lock을 건다
...
writing DB is performed
...
V(db); // lock을 풀어줌
// - Reader
P(mutex); // readcount를 증가시키기 위한 lock 걸기
readcount++; // readcount 1 증가
if (readcount == 1) P(db); // 내가 처음 들어온 reader라면 DB lock 걸기
V(mutex); // readcount에 대한 lock 풀기
...
reading DB is performed
...
P(mutex); // readcount를 감소시키기 위한 lock 걸기
readecount--;
if (readcount == 0) V(db); // 내가 마지막 reader라면 DB lock 풀기
V(mutex); // readcount에 대한 lock 풀기
致命的な問題
飢餓が発生する可能性があります
△信号があれば、いつか過ごせる!
Dining Philosopher Problem(食事哲学者問題)
5人の哲学者は2つの行為をすることができる:思考と/または食事.
隣の哲学者の間で箸を共有するのは、左右の2つの箸を手に入れてこそ食事ができる.
Synchronization variables
Philosopher i
do {
P(chopstick[i]); // 왼쪽 젓가락을 잡는 행위
P(chopstick[(i+1) % 5]); // 오른쪽 젓가락을 잡는 행위
...
eat(); // 밥 먹는 중..
...
V(chopstick[i]) // 왼쪽 젓가락 놓기
V(chopstick[(i+1) % 5]) // 오른쪽 젓가락 놓기
...
think();
}
に質問
=デッドロックの可能性(すべての哲学者が同時にお腹が空いたら、左箸を取った)
ソリューション
enum { thinking, hungry, eating } state[5]; (상태표현)
semaphore self[5] = 0; (젓가락 두 개 확보 가능해 밥먹을 권리 부여)
semaphore mutex = 1; (상태를 동시에 바꾸지 못하도록 lock걸기)
// Philosopher i
do {
pickup(i);
eat();
putdown(i);
think();
}
void pickup(int i) {
P(mutex); // 상태 바꾸기 전 lock 걸기
state[i] = hungry; // hungry로 상태 변경
test(i); // 젓가락 둘 다 집을 수 있는지 테스트
V(mutex); // lock 풀고
P(self[i]); // 밥 먹을 수 있는 권리 해제(1->0)
}
void test(int i) {
if (state[(i+4)%5] != eating && state[i] == hungry && state[(i+1)%5] != eating) {// 양쪽 철학자가 먹고있지 않고 내가 배고플 때
state[i] = eating; // eating으로 상태 변경
V(self[i]); // 밥 먹을 수 있는 권리 부여(0->1)
}
}
void putdown(int i) {
P(mutex);
state[i] = thinking;
test((i+4)%5); // 혹시 나 땜에 못먹었는지 양쪽 철학자 테스트
test((i+1)%5);
V(mutex);
}
Semaphoreの質問
=V,P演算を誤って置き換えると,反発性が損なわれる.同じ演算をうっかり使うと、Deadlock.
Reference
この問題について([OS]同期プロセス(3)), 我々は、より多くの情報をここで見つけました https://velog.io/@youngminss/OS-프로세스-동기화-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol