←講義のツボメニューへ
←OS論シラバスへ プロセス
【2001.10.22,10.26】【第7、8回】Petersonのアルゴリズム
・オランダの数学者T.DEKKERは、相互実行とロックのアイディアをあわせて、厳密な相互実行を必要としない方法を考案(1965)
・1981年、G.L.Petersonは、もっと簡単な解決方法を発見した
・クリティカルセクションに入る前にenter_regionを呼ぶ
・クリティカルセクションを出たらleave_regionを呼ぶ
#define FALSE 0
#define TRUE 1
#define N 2
int turn; /*誰の番か?*/
int interested[N]; /*初期値はすべて 0(FALSE)*/
void enter_region(int process)
/* processは、入るプロセスの番号 */
{
int other; /*他のプロセスの番号*/
other=1^precess; /*排他的論理和でビット反転*/
interested[process]=TRUE;
turn=process;
while(turn == process && interested[other] == TRUE);
}
void leave_region(int process)
{
ineterested[process]=FALSE;
/*クリティカルセクションから出る*/ }
Test and Set Lock命令(TSL命令)
多くのコンピューター(特にマルチプロセッサを念頭において設計されたコンピューター)には
以下の動作をするTSL命令が用意されている
1、あるアドレスのメモリのワードの内容を1つのレジスタに読み込む。
2、非ゼロの値を、そのアドレスのメモリに格納する。
読み込みと格納の操作は分割されないことが保証される。
TSL命令を使ったロック
架空の(だが典型的な)アセンブリ言語による方法
enter_region:
ts1 register, flag /* flagの内容をregisterへ読み取り、flagを1にセット */
cmp register, #0 /* flagが0か判定する */
jnz enter_region /* 0でなければ、ロックされているのでループする */
ret /* 呼び出し元に戻り、クリティカルセクションに入る */
leave_region:
mov flag, #0 /* flagに0を格納 */
ret /* 呼び出し元に戻る */
優先度逆転問題(priority inversion problem)
ビジーウェイト=密なループを実行しながら待機する。
●CPU時間を消費する
●予期せぬ結果を生む・・・優先度逆転問題
仮定)プロセスHは、プロセスLよりもスケジュールの優先度が高いとする セマフォ(semaphore)
↓
どちらもReady(or Running)ならば、プロセスHをスケジュールする
↓
プロセスH プロセスL Block
ReadyRunning
↓
クリティカルセクション≪プロセス切り替え≫ Running
busy wait
プロセスLがクリティカルセクションから
出るのを待ちつづけるReady
プロセスHが優先度が高いので、
スケジュールされない。
よって、クリティカルセクションから出ない従ってこのままの状態で凍りつく。
E.W.Dijkstraが導入(1965)
★セマフォ =wakeupすべきプロセスの個数を表す整数変数
二つの操作「up]と「down」(←wakeupとsleepを一般化)
2章終了 レポート課題
1、競合状態とは何か。
2、使用中待機(ビジーウェイト)とブロックとの違いを説明せよ
3、割り込みを無効にできるOSでは、どのようにセマフォを実装するのか、その概略を説明せよ
4、ラウンド・ロビン・スケジューリングは、一般に実行可能なプロセスのリストを管理している。リストにはそれぞれのプロセスが1回しか出現しない。プロセスがリスト中に2回出現した場合には何が発生するか。これを可能にする理由としてなにが考えられるか。
5、たいていのラウンド・ロビン・スケジューラーは、クォンタムの大きさに一定のものを使用している。小さなクォンタムが有利である点、大きなクォンタムが有利である点を議論せよ。
6(この問題は必須ではない)
AからEまでの5つのバッチジョブが、ほぼ同時にコンピューター・センターに到着する。各実行時間は、10分、6分、2分、4分、8分と予想された。これらの優先順位はそれぞれ、3,5,2,1,4と指定されており、5が最も高い優先順位である。次に示すスケジューリング・アルゴリズムの、プロセス・ターンアラウンド・タイムの平均を求めよ。なお、プロセスの切り替えオーバーヘッドは無視せよ。
(a)ラウンド・ロビン
(b)優先順位スケジューリング
(c)到着順サービス
(d)最短ジョブ優先
6aではシステムは多重プログラミングであり、それぞれのジョブはCPUを平等に共有するものとする。6bから6dについては、一度に1つのジョブのみを完了するまで実行するものとする。すべてのジョブは完全にCPUがネックとなっているものとする。