6.プロセス同期
Process Synchronization
同期が必要な理由
いつオペレーティングシステムでRace Conditionが発生しますか?
割り込みハンドラはKernelモードの実行中に割り込みが発生しました
→両方ともカーネルコードなのでkernel address spaceを共有
→ソリューション:disable/enable割り込み機能
プロセスはシステム呼び出しでkernelモードで実行されていますが、コンテキスト切替が発生します.
→解決策:カーネルモードでCPUを奪わない
マルチプロセッサ共有メモリ内のカーネルデータ
→ソリューション1:一度に1つのCPUしかカーネルに入れない方法
→ソリューション2:カーネル内の共有データにアクセスするたびにデータをロック/ロック解除する方法
プロセス同期の問題
クリティカルセキュリティ問題(臨界領域問題)
Initial Attempts to Solve Problem
2つのプロセスがあると仮定する:P 0,P 1
プロセスの一般的な構造
do{
entry section - 이용해서 critical section을 락 걸어줌
critical section
exit section - 다쓰면 락 풀어줌
remainder section
} while (1);
プロセスは、同期→同期変数を実行するためにいくつかの変数を共有できます.計画ソリューションの条件を満たす
Mutual Exclusion(反発)
Progress(進捗)
Bounded Waiting(有限キュー)
家庭
解決アルゴリズム
回転の使用
上記のアルゴリズムは,P 0が臨界セグメントを用いた後,P 1が臨界セグメントを聞くだけで再び反転する.
タグを使用したチェック
回転とマークを同時に使用
ピーターソンアルゴリズム
→3つの条件はすべて満たすが、CPUとメモリ待ちを継続する.(Busy Waiting = spin lock)
Synchronization Hardware
Semaphores
P(S)→データ共有のプロセス
V(S)→返却プロセス
Critical Section of n Processes
Synchronization variable
semaphore mutex; // mutual exclusion / initially 1: 1개가 CS에 들어갈 수 있다
Process Pi
do {
P(mutex); // if positive, dec-&-enter, Otherwise, wait.
critical section
V(mutex); // Increment semaphore
remainder section
} while (1);
busy-wait効率低下Block / Wakeup Implementation
typedef struct
{
int value; // semaphore
struct process *L; // process wait queue
} semaphore;
Implementation
→通常、Block/wakeupの方が良い
→非常保護の長さが短い場合、Block/Wakeupのオーバーヘッドはビジー-待機オーバーヘッドよりも大きい可能性があります
Two Types of Semaphores
Deadlock and Starvation
Classical Problems of Synchronization
Bounded-Buffer Problem(Producer-Consumer Problem)
Shared data
Synchronization variables
semaphore full = 0, empty = n, mutex = 1;
Producer
do{
produce an item in x
P(empty);
P(mutex);
add x to buffer
V(mutex);
V(full);
}while(1);
Consumer
do{
P(full);
P(mutex);
remove an item from buffer to y
V(mutex);
V(empty);
consumer the item in y
}while(1);
Readers-Writers Problem
→首都コード
Shared data
int readcount = 0;
DB;
Synchronization variables
semaphore mutex = 1, db = 1;
Writer
P(db);
writing DB is performed
V(db);
!Starvation 발생 가능
Reader
P(mutex);
readcount++;
if(readcount == 1) P(db); //block writer
V(mutex); // readers follow
reading DB is performed
P(mutex);
readcount--;
if(readcount == 0) V(db); // enable writer
V(mutex);
書き込み側が読み取り可能な状態になる前に、書き込みを続けると、書き込み側が餓死する可能性があります→優先度をキューに入れて、徐々にwriterの優先度を上げていけばいい
Dining-Philosophers Problem
Synchronization variables
semaphore chopstick[5];
//initially all values are 1
Philosopher i
do {
P(chopstick[i]);
P(chopstick[i+1]%5);
eat();
V(chopstick[i]);
V(chopstick[i+1]%5);
think();
} while (1);
Sol 2水道コード
enum{thinking, hungry, eating} state[5];
semaphore self[5] = 0;
semaphore mutex=1;
Philosopher i
do{
pickup(i);
eat();
putdown(i);
think();
} while(1);
Monitor
Reference
この問題について(6.プロセス同期), 我々は、より多くの情報をここで見つけました https://velog.io/@mraz0210/6.-프로세스-동기화テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol