『オペレーティングシステムの精髄と設計原理』第6章同時:デッドロックと飢餓(学習ノート)


同時に解決しなければならない問題はデッドロックと飢餓である.解決策は検査、予防、回避です.

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,csignal
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])
}

6.7.2メッセージ


タイプのテキスト、msgsnd、msgrcvがあります.各プロセスには、それに関連するメッセージキューがあります.

6.8 Linuxカーネル同時メカニズム


6.8.1原子操作