スライド 1

第9回 プロセスの協調と排他制御
並行プロセスと資源の競合
 競合問題
 セマフォ

−

不可分命令の実装
−

PV命令
Test & Set
プロセス間通信
並行プロセス
並行実行(concurrent processing)されてい
るプロセスの集合を並行プロセスを呼ぶ
 並行プロセスの実行には様々な問題がある

−
−
−
−
資源の競合
クリティカルセクション
競合問題(Racing Conditions)
プロセス間通信
資源の競合




ブロッキング : 他のプロセスが使用している共有資
源が解放されるのを待機している状態
ライブロック:共有資源を複数プロセスが譲り合う無
限待機状態
デッドロック:資源の依存関係がプロセス間で環状
につながれている状態で、各プロセスが他のプロセ
スの占有している資源の解放を待っている無限待
機状態
飢餓状態: 永久にブロッキングされている状態
資源の待ち行列

OSの扱うスケジューリングは、プロセススケ
ジューリング(CPUの割り当て)の他に、入出
力装置の割り当ても含まれる
入出力待ち行列
入出力装置
入出力装置
CPU
入出力装置
CPU待ち行列
入出力装置
資源競合の解決

防止策
−
−

資源を獲得できたら実行
複数の資源を獲得することを禁止
解決策
−
−
ロールバック(rollback) ... いったん確保した資源
を元に戻す
プロセスの強制終了
プロセス間の同期
(Process Synchronization)
• 並行プロセスのプリミティブセット – parabegin ... paraend
parabegin
s1 // s2 // --- // Sn
paraend
• 以下の状態では、様々な値をとる可能性がある(プロセス間にデータ依存)
parabegin
a = b + c // c = i + j // j = a + b
paraend
競合問題(Racing Conditions)

一般に、並行プロセスでは、2つのプロセス間
のread setとwrite setが空集合でない場合、
競合状態(Racing Conditions)を持つことに
なる
Read Set
Write Set
Critical Section(きわどい領域)



Racing Conditionsを回避するため、ただ1
つのプロセスのみが実行可能なプログラム
区間
この区間によって、read setとwrite setの重
なりを無くす
この区間を実現するためには
1.
2.
3.
相互排除(mutual exclusion)
前進(progress)
有限待機(bounded waiting)
相互排除(mutual exclusion)
ビジーウェイト ... lock – unlock
 Test & Set 命令
 セマフォ

Spin Lock (lock – unlock)
lock
L: if x then goto L else w <- true fi;
unlock
w <- false;
• 共有変数によって、Critical Section (CS)の使用を示し、共有変数が真である
場合は使用中で、偽である場合は空いている
• lock 命令は、共有変数が偽であれば、真にして自分がCSに入るが、偽である場
合は、真にセットされるまでビジーウェイティングする(spin lock)
• unlock 命令で、共有変数を偽にセットして、CSを他のプロセスに解放する
• ただし、共有変数の値のチェックと値のセットは、不可分命令で実装されてないと
2 つのプロセスが同時にCSに入れる可能性がある
• シングルプロセッサの場合は、lock 操作時に割込み禁止(プロセスに切り替
え禁止)にすればよい
Test & Set Primitives
マルチプロセッサシステムでは、プロセス間の同期をとるためには、同期
変数の値のチェックとセットを不可分(atomic)に行わなければならない
 このためハードウェア側で、同期変数(共有変数)のチェックと値のセット
を一括処理する命令をTest & Set 命令(不可分命令)として用意している
 Test & Set 命令は、値をセットし、セットする前の値を同時に読み込む
enter_CS:
tsl
register
flag
cmp
register
#0
jnz
enter_CS
ret
leave_CS:
mov flag
#0
ret

enter_CS();
Critical Section
leave_CS();
セマフォ


P命令とV命令の2つの同期基本命令によってクリティカルセクションをは
さむ
P命令 ... P(s) :
P(s): if ( s <= 0 ) 待ち行列にプロセスを登録して休眠状態(sleep)へ;
else
s = s – 1;

V命令 ... V(s) :
V(s):
P(s)
s = s + 1;
待ち行列から一つ
プロセス取り出す(wakeup)
P命令, V命令は不可分
に処理されなければなら
ない
 sが1のとき、2値セマフォ
(binary semaphore)といい、
lock, unlock 命令として適用
可能である
 資源の解放を待つ間、プロセスは
自らCPUを手放して休眠する
(サスペンドロック)
Critical Section

V(s)
プロセス協調における競合問題
生産者-消費者問題
 Reader-Writer Problem
 哲学者の食事問題
 相互排除の問題

−
−
ピーターソンのアルゴリズム
Test & Set Primitive
プロセス間通信



プロセス同士がデータの受け渡しを行いながら協調処
理する
割込み、シグナルを使うプリミティブなもの
共有メモリ方式
−

複数のプロセスがアクセス可能なshared memory を用意し、
この領域を利用してデータの受け渡しを実現する
メッセージパッシング方式
−
あるプロセスからメッセージの形で他のプロセスへデータの
受け渡しを行う
メッセージパッシング方式

直接通信方式 ... link は一つのみ
−
−

間接通信方式 ... link は複数
−
チャネル(channe)
ポート(port)
メールボックス(mailbox)
−
send(チャネル、message), receive(チャネル、message)
−
−

send(pid,message)
receive(pid,message)
総称してチャネル
通信相手
−
1対多通信 ... 受信者多数。プロセスグループ or チャネルで定義
マルチキャスト(multicast)
−
−
多対1通信 ... 送信者多数。送信者を特定しない
多対多通信
同期式通信と非同期式通信

同期式通信(synchronous communication)
−
−

メッセージの受け渡しが完了(確認)されるまで待ち続け
る
blocking
非同期式通信(asynchronous communication)
−
−
−
メッセージの受け渡し完了を待たず、メッセージをバッファ
リングして先に処理を進める
non blocking
バッファ式通信
パイプ(pipe)



バイト単位のデータの読み出し/書き込みをプロセス間通信
に拡張したもの
一度読み出したデータは再び読み出すことはできない
(stream:ストリーム)
Unixのパイプでは、入出力とプロセス間通信のインター
フェースを統一
プロセスA
プロセスB
パイプ
write
read
ソフトウェア割込み




プロセスにおいて、プロセスの実行とは独立して、
個々の命令の実行によって発生する様々な事象を
とらえる仕組み。
ソフトウェア割込みでは、ハードウェア割込みと同様
に個々の事象ごとに処理をするハンドラが定義され
る。
定義された事象がプロセスの実行において発生す
ると、プロセスを中断して、ハンドラの処理を行い、
その後、中断プロセスを再開するかそのままプログ
ラムを終了させる
シグナル: Unix やOS/2では、シグナル(signal)とし
て実装されている
−
SIGINT, SIGHUP,SIGSEGV,SIGKILL など
RPC(遠隔手続き呼び出し)

RPC(Remote Procedure Call)
クライアント・サーバ型通信で用いられる
− クライアントがサーバの手続き(関数)をローカル
(自分持ち)の手続き(関数)を呼び出すのと同じよう
に呼び出す
− スタブ(stub)
−


クライアントスタブ ... 1.RPCから要求メッセージの作成と送信
2.応答メッセージを受信してRPCに返す
サーバスタブ... 1. 要求メッセージを受信してサーバプログラムへ
(RPC受理)
2. RPCの実行結果を応答メッセージにして送信