『オペレーティングシステムの精髄と設計原理』第6章同時:デッドロックと飢餓(学習ノート)
5376 ワード
同時に解決しなければならない問題はデッドロックと飢餓である.解決策は検査、予防、回避です.
6.1デッドロックの原理
6.1デッドロックの原理
プロセスAとプロセスBは、リソースXとYを必要とするが、プロセスAはリソースXを占有し、プロセスBはリソースYを占有する.両方のプロセスが実行できなくなり、デッドロックが発生します.
プロセスAは実行するためにリソースXを必要とするが、プロセスBはリソースXを占有すると中断され、より優先度の高いプロセスAが実行を開始する.デッドロックも発生します.
6.6哲学者の食事問題
5人の哲学者で、フォークは5本しかありません.デッドロックや飢餓を避ける.
6.7 UNIXの同時メカニズム
6.7.1配管
パイプはリングバッファであり,2つのプロセスを消費者と生産者のモデルで通信させる.1つのプロセスが書き、1つのプロセスが読みます.関数:cwait,csignalfork_ready[5]
fork[5]={true}
void get_forks(int pid)
{
left =pid
right = ++pid %5;
//
if(!fork[left])
cwait(fork_ready[left]); // queue
fork[left]=false;
//
if(!fork[rigth])
cwait(fork_ready[right]); // queue
fork[right]=false;
}
void release_forks(int pid)
{
left =pid
right = ++pid %5;
//
if(empty(fork_ready[left])) //
fork_ready[left] = ture; //
else
csignal(fork_ready[left]) // ,
//
if(empty(fork_ready[right]))
fork_ready[right] = ture;
else
csignal(fork_ready[right])
}
6.7.2メッセージ
タイプのテキスト、msgsnd、msgrcvがあります.各プロセスには、それに関連するメッセージキューがあります.
6.8 Linuxカーネル同時メカニズム
6.8.1原子操作
5人の哲学者で、フォークは5本しかありません.デッドロックや飢餓を避ける.
6.7 UNIXの同時メカニズム
6.7.1配管
パイプはリングバッファであり,2つのプロセスを消費者と生産者のモデルで通信させる.1つのプロセスが書き、1つのプロセスが読みます.関数:cwait,csignalfork_ready[5]
fork[5]={true}
void get_forks(int pid)
{
left =pid
right = ++pid %5;
//
if(!fork[left])
cwait(fork_ready[left]); // queue
fork[left]=false;
//
if(!fork[rigth])
cwait(fork_ready[right]); // queue
fork[right]=false;
}
void release_forks(int pid)
{
left =pid
right = ++pid %5;
//
if(empty(fork_ready[left])) //
fork_ready[left] = ture; //
else
csignal(fork_ready[left]) // ,
//
if(empty(fork_ready[right]))
fork_ready[right] = ture;
else
csignal(fork_ready[right])
}
6.7.2メッセージ
タイプのテキスト、msgsnd、msgrcvがあります.各プロセスには、それに関連するメッセージキューがあります.
6.8 Linuxカーネル同時メカニズム
6.8.1原子操作
fork_ready[5]
fork[5]={true}
void get_forks(int pid)
{
left =pid
right = ++pid %5;
//
if(!fork[left])
cwait(fork_ready[left]); // queue
fork[left]=false;
//
if(!fork[rigth])
cwait(fork_ready[right]); // queue
fork[right]=false;
}
void release_forks(int pid)
{
left =pid
right = ++pid %5;
//
if(empty(fork_ready[left])) //
fork_ready[left] = ture; //
else
csignal(fork_ready[left]) // ,
//
if(empty(fork_ready[right]))
fork_ready[right] = ture;
else
csignal(fork_ready[right])
}