250 likes | 393 Views
http://www0.info.kanagawa-u.ac.jp/~kaiya/os/. オペレーティングシステム 2014 演習問題 6/12 の解答例. 2014/7/3 木曜 2 限 2 年前期 海谷 治彦 永松 礼夫. 注意. 〆切 6/20 夕方 四問あります. 採点はしますが,一回の出席感想文の倍の配点 ( 感想文二回分の点 ) ですので,それほど大きくありません. 提出は毎回のアンケート同様,レポートシステムにお願いします. テキストファイルもしくは PDF でお願いします.
E N D
http://www0.info.kanagawa-u.ac.jp/~kaiya/os/ オペレーティングシステム 2014演習問題6/12の解答例 2014/7/3 木曜 2限 2年前期 海谷 治彦 永松 礼夫
注意 • 〆切 6/20 夕方 • 四問あります. • 採点はしますが,一回の出席感想文の倍の配点(感想文二回分の点)ですので,それほど大きくありません. • 提出は毎回のアンケート同様,レポートシステムにお願いします. • テキストファイルもしくはPDFでお願いします. • 11号館のコンピュータ演習室でMSワード,パワーポイント等が利用可能なようです. • 図表を記述したい場合には,そちらを利用してもらって結構です. • 手書きの図をスマフォやデジカメで撮影してはりつけてくれても結構です.
問題1 • OSが開発された後に,新しいディスクや入出力デバイス等の機器が開発されたとする.それらの機器をOSから操作可能とするためには,OS開発者は何をする必要があるか説明せよ.
解答 解答方針 • デバイスドライバを作る的なことを書けばよい. • 既存のブロックデバイス,もしくはキャラクタデバイスの動作を模倣するとアプリケーションにとって有益みたいな事が書いてあると尚よい. • 主に教科書5章 5回目のスライドに目を通してみてください.
問題2 • 下記のようなプロセスが動いていたとする.プロセス28384 の先祖となるプロセスのID番号を親,その親・・・の順番で全て列挙せよ. UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jun02 ? 00:00:00 /sbin/init root 2 0 0 Jun02 ? 00:00:00 [kthreadd] root 1885 1 0 Jun02 ? 00:00:00 /usr/sbin/sshd root 21476 502 0 08:00 ? 00:00:00 /sbin/udevd -d root 21477 502 0 08:00 ? 00:00:00 /sbin/udevd -d root 21523 1 0 08:00 ? 00:00:00 /usr/sbin/atd postfix 27388 1981 0 14:40 ? 00:00:00 pickup -l -t fifo -u root 28312 1885 0 16:02 ? 00:00:00 sshd: kaiya [priv] kaiya 28315 28312 0 16:02 ? 00:00:00 sshd: kaiya@pts/0 kaiya 28316 28315 0 16:02 pts/0 00:00:00 -csh root 28383 2 0 16:03 ? 00:00:00 [flush-0:24] kaiya 28384 28316 0 16:03 pts/0 00:00:00 ps -ef
解答 解答例 • 28384, 28316, 28315, 28312, 1885, 1, 0 • まぁ,PID と PPID の列を見れば自明. • 最後の0は無くてもOKとします. • できれば,このプロセス呼び出し順序自体にも興味をもってもらえるとうれしいです.
問題3 • 9回目に解説したスワッピング(教科書p.129)実現のため,メモリーを管理する二つの関数 swapin(intpid) と swapout() を疑似コードとして記述せよ. • swapin プロセスpidをメモリにロードしようとする関数.メモリに空きがなければ待たされる.プロセスに必要なメモリ量は一定とする. • swapout スワップアウト可能なプロセスをスワップアウトし,メモリの空き領域を作成する関数. • 疑似コード作成には以下の関数を用いよ. • void wait() 呼び出した処理を休止させる. • void notifyAll() 休止している処理全てを再開させる. • int isSwapable() スワップ可能なプロセスが存在する場合には1を,そうでない場合0を返す. • int isVacant()一つのプロセスに必要なメモリの空きがあれば1を返し,そうでなければ0を返す. • void useMem(int pid) 識別番号がpidのプロセスがメモリに読まれる. • void releaseMem() スワップ可能なプロセスをスワップアウトし,メモリーの空きが増える.
問題3の補足 1/2 それぞれ以下の処理を並列でOSが動かしているものとする. // 新しいプロセスを起動する処理 while(true){ int p; p=起動要求があったプロセスの識別番号; swapin(p); } // 空きメモリを作る処理 while(true){ swapout(); }
問題3の補足 2/2 • スライド os08.pdf の40ページあたりのコードを真似すればよい. • synchronize, catch 等,Java特有の文法は記述しなくてよい. • swapin, swapout関数内はそれぞれクリティカルセクションであり,実行中に他の処理に割り込まれないものとする. • ただし,休止中は他の処理が割り込める. • プロセスに必要なメモリの量は一定であると仮定する.すなわち,1個のプロセスがスワップアウトされると,他の1つがスワップインすることができる. • スワップアウトされたプロセスの復活は考慮しなくてよい. • 本問題を解く目的は,比較的小さなメモリ資源を多数のプロセスで融通し合う様子を,疑似コードの記述を通して理解することである. • 疑似コード: プログラムっぽいけど,完全に文法に合致していなくてもよいコード.
解答 解答方針 • メモリが資源, • swapinが資源を消費する処理 • swapoutが資源を生産する処理 • という意味が見えてくれば,8回目にやった生産者・消費者問題をほぼパクればよいことがわかる. • 実は完全なパクりだと若干マズいことが判明 • 問題中で準備した isSwapable, isVacant, useMem, releaseMemの関数が元問題のどの役割に合致するかを考える. • wait, notifyAll はそのまんまですね.
os08 p35より 生産者・消費者問題 • モニタ関係の超有名な例題 • 倉庫を介して,生産者(Producer)と消費者(Customer)が商品のやりとりをする. • 倉庫には商品をおける上限数がある. • 消費者達は倉庫に商品が無ければ,当然買えない. • 生産者達は倉庫が満杯の場合,生産を止めざるを得ない.
os08 p36より 図による例: 両方動ける 仮に3個しか置けないとする
os08 p37より 図による例: 生産停止 仮に3個しか置けないとする
os08 p38より 図による例: 消費停止 仮に3個しか置けないとする
os08 p39より プログラムの例 所謂,生産者・消費者問題 生産過剰気味の構成にしてあるので,すぐにストック上限(本プログラムでは30に固定)あたりをうろうろする. しかし,止まりはしない.
os08 p40より 倉庫 (Stock.java) class Stock extends IntLabel{ private static final int max=30; // 中略 // ストックから販売する synchronized void buy(){ while(empty()){ try{ wait(); } catch(Exception e){} } super.dec();// 在庫数を減 notifyAll(); } // ストックに補給する synchronized void supply(){ while(full()){ try{ wait(); } catch(Exception e){} } super.inc();// 在庫数を増 notifyAll(); } }
os08 p41より コード (Customer, Producer) class Customer extends LabelUpdater{ Customer(IntLabel l, Stock s){ super(l,s); } public void run(){ while(true){ stock().buy(); inc(); // 買った個数を記録 sleeping(1000); } } } class Producer extends LabelUpdater{ Producer(IntLabel l, Stock s){ super(l, s); } public void run(){ while(true){ stock().supply(); inc(); // 納品した個数を記録 sleeping(1000); } } } 双方Threadのサブ(サブ)クラス
解答 問題3 解答例1 // メモリを使う synchronized void swapin(int pid){ while(!isVacant()){ try{ wait(); } catch(Exception e){} } useMem (pid);// メモリ使います // notifyAll(); } // メモリを空ける synchronized void swapout(){ while( !isSwapable() ){ /* try{ wait(); } catch(Exception e){} */ } releaseMem ();// メモリ空けます notifyAll(); } 一番単純なパクり例.
解答 問題3 解答例2 // メモリを使う void swapin(int pid){ while(!isVacant()){ wait(); } useMem (pid);// メモリ使います // notifyAll(); } // メモリを空ける void swapout(){ while( !isSwapable() ){ // wait(); } releaseMem ();// メモリ空けます notifyAll(); } Javaっぽい細かな構文はとってもいいとあるので.
解答 TIPS • !isSwapable() 等は ¬ isSwapable() isSwapable() == 0 等でも無論OKです,疑似コードだし. • 「空きが無ければ,(空いた連絡が来るまで)待つしかないなぁ」という意味を考え, while(空きが無い){wait();} • 等の疑似コードを書くべし. • isSwapable, isVacant の否定を使わないとダメなのは多少の問題のひねり.
swapout側のwaitを除去した理由 • 以下のシナリオで,プロセスが長らくswapinできない場合がある. • あるプロセスxのためswapin(x)を要求するが,isVacantがfalseなのでwaitに入る. • isSwapableをチェックするが,falseなので,waitに入る. • 以降,双方の機能は止まったまま・・・ある意味,デッドロック.
解答 解答例1,2は若干ヤバい • swapout側は所謂 busy wait 状態で,とても負荷がかかる. • できれば,ポーリングで対処したいところ. // メモリを空ける void swapout(){ while( !isSwapable() ){ sleep(数ミリ秒); } releaseMem ();// メモリ空けます notifyAll(); }
問題4 • いままでのOSの授業に出現した用語で重要であると思うものを10個列挙し,それぞれに意味を説明せよ.用語は英語,日本語,頭字語(Acronym)の何れでもよいが,同じ意味の異なる語は複数個とカウントしないこと.
解答 解答例 • 無論,特に正解はありません. • 傾向として以下の感じがありました. • 「OS」が重要用語になってる orz まぁ間違いではないが. • UI関係のワードはわりとある. • 多重プロセス関係 • BIOS • ゾンビは人気があるなぁ • Bit, byte 等はちょと一般的過ぎるけど,まぁ,よしとしましょう.