...

オペレーティングシステム・実習(第 3 回)資料 1 セマフォ

by user

on
Category: Documents
16

views

Report

Comments

Transcript

オペレーティングシステム・実習(第 3 回)資料 1 セマフォ
オペレーティングシステム・実習(第 3 回)資料
前回と同様,ひな形のファイル /src/s2.tar を展開せよ.
1 セマフォ
1.1 準備
1.1.1 セマフォの作成
• sema cre.c で初期値 1 のセマフォを 1 つ作成することができる.コンパイルして sema cre という
コマンドを作り,実行する.
• セマフォの一覧を表示するコマンド:ipcs
• セマフォを削除するコマンド:ipcrm -s
例: ipcrm -s 13235
• セマフォを 2 つ以上生成しておく.ID をノートに控えておく.
1.1.2 プログラムへの設定
• 1.1.1. のセマフォの ID 2 つを sema.h の SEMA1 および SEMA2 の値として設定する.
例:#define SEMA1 131072
1.1.3 セマフォの値の表示
sema print.c をコンパイルし,sema print コマンドを作成しておく sema print コマンドで設定したセ
マフォの値を表示することができる.実行し,確認せよ.sema init.c もコンパイルし,sema init コマン
ドを作成しておく.
1.1.4 プロセスの強制終了
• ps ax と入力し,停止したいプロセスの PID を調べる.出力が多すぎて見難いときは,ps ax| grep
"コマンド名" などでフィルタリングする.
• 調べた PID のコマンドを強制終了させるには kill "その PID" と入力する.
• デッドロックになってしまった場合などに使用する.
1.2 排他制御の演習
例題 1
disp1.c と disp2.c という画面に表示するプログラムが 2 つある.このプログラムを 2 つ同時に起動し
ても画面が乱れないように排他制御を行え.
操作手順
1. それぞれのプログラムをコンパイルし,それぞれ disp1, disp2 という名のコマンドとする.それぞ
れを個別に実行して画面への表示を確認せよ.
1
2. 2 つのプログラムを同時に実行するには次のように入力する.
./disp1 & ./disp2
3. 2. のようにして,画面が乱れることを確認せよ.
4. ipcs コマンドでセマフォが作成してあることを確認する.
5. 4. で確認した ID が sema.h に設定されていることを確認する.
6. ./sema print を使用して,セマフォの値が 1 であることを確認する.もしセマフォの値が 1 でない
場合には ./sema init を実行すると 1 に設定される.
7. disp1.c の 表 示 を 開 始 す る 前 の 行 に sema p(SEMA1); を 挿 入 し ,表 示 が 終 了 し た 後 の 行 に
sema v(SEMA1); を挿入せよ. また,最初に sema.h をインクルードせよ.(#include "sema.h")
8. 同様に disp2.c へも sema p(SEMA1); および sema v(SEMA1); の挿入と sema.h のインクルードを
行え.
9. disp1.c および disp2.c のコンパイルは次のように行う.
cc -o disp1 disp1.c sema.c
cc -o disp2 disp2.c sema.c
10. 2. と同様に 2 つのプログラムを同時に実行して結果を確認せよ.
演習 1
入出力基板の LED 出力を使用するプログラム led1.c と led2.c を同時に起動しても LED の表示が乱れ
ないように排他制御を行え. led1.c と led2.c の表示パターンは見分けがつくように明らかに別の表示
にすること.
2 メッセージ
2.1 マニュアル操作
2.1.1 メッセージキューの作成
ソースファイル名: msg cre.c,をコンパイルし,msg cre コマンドを作成する.実行し,表示された ID
のメモをとっておく.
2.1.2 確認・削除
確認は ipcs コマンド,削除は ipcrm -q コマンド
例: ipcrm -q 13124
2.1.3 メッセージ送信処理プログラム
ソースファイル名 msg send.c,動作は,キー入力された 1 文字をメッセージキューに入れる.#difine ID
の後にメモをとった ID を記入してコンパイルする.
2.1.4 メッセージ受信処理プログラム
ソースファイル名 msg rcv.c,動作は,キューからメッセージを 1 つ取り出して画面に表示を行う.#difine
ID の後にメモをとった ID を記入してコンパイルする.
2
2.1.5 送受信実験
ターミナルのファイルメニューから「端末を開く」で新しい端末を 2 個起動し,それぞれで su - os を行
い,3 枚の端末が使える状態にする.それぞれの端末でコマンドをコンパイルしたディレクトリに移動する.
以下の通り動作を確認せよ.受信と送信の順序を入れ代えた場合も確認してみよ.
1. 端末 1 で ipcs を実行し,キュー内のデータサイズを確認する
2. 端末 2 で msg send を実行する
3. 端末 1 で ipcs を実行し,キュー内のデータサイズを確認する
4. 端末 2 に 1 文字入力を行う
5. 端末 1 で ipcs を実行し,キュー内のデータサイズを確認する
6. 端末 3 で msg rcv を実行する
7. 端末 1 で ipcs を実行し,キュー内のデータサイズを確認する
2.2 例題 2
プロセス 1 でキー入力した文字列がプロセス 2 へ送られて画面に表示されるようにする.
2.2.1 プロセス 1 作成
• ソースファイル名: snd.c
• 処理の大まかな流れ
1. scanf("%s",buf) でキーボードから文字を入力する
2. 1 文字ずつメッセージとして送信する
3. 1, 2 を繰り返す
2.2.2 プロセス 2 作成
• ソースファイル名: rcv.c
• 処理の大まかな流れ
1. メッセージを受け取る
2. 画面に表示する
3. 1, 2 を繰り返す
2.3 演習 2 (時間があれば)
プロセス 1 (key.c)でキーボードからの入力を行い,1 から 3 の整数を入力する.その結果をプロセス 2
(led.c)へ送り,数字に合わせて 1 なら赤 LED,2 なら緑 LED, 3 なら黄 LED を 1 秒間点灯し,0.5 秒間
消灯するプログラムを作成せよ.
ひな形ソースファイル key.c および led.c は必要と思われる過去のプログラムをひとつのファイルにまと
めただけなので,不要部分の削除などの調整を行うこと.
3
3 デッドロック
• あえてデッドロックが発生するようにプロセスを生成し,デッドロックを起こせ.
• ただの長時間の処理待ちではなくデッドロックが発生しているということを,どのように判断すればよ
いか考え,試行せよ.
4
Fly UP