ここでは,講義中に行った 模擬テスト を公開していく.
本講義の評価は,試験期間中に行うペーパー試験 により 評価するが,過去問,本模擬試験の問題を,何割か(現在考慮中)そのまま出題する. そのため,本模擬試験の解答は原則として各自の自習に任せる.
long n = 0; main_xinu() { int procA(), procB(); resume(create(procA, 200, 20, "prod", 0)); resume(create(procB, 200, 20, "cons", 0)); } procA() { long i; for(i=1;i<=2000000;i++) n++; } procB() { long i; for(i=1;i<=2000000;i++) printf("n is %d\n",n); }
このプログラムをコンパイルし,実行すると,以下のような実行結果となる.
n is 3423 n is 3423 n is 4876 n is 4876 . . .
順に値が出力されずに,飛び飛びの値となってしまう.その理由を, 「コンテキストスイッチ」という言葉を用いて論述せよ.
long n = 0; main_xinu() { int procA(), procB(); int prod, cons; prod = screate(1); cons = screate(0); resume(create(procA,200,20,"prod",2,prod,cons)); resume(create(procB,200,20,"cons",2,prod,cons)); } procA(int prod,int cons) { long i; for( i=1; i<=2000; i++ ) { wait(prod); n++; signal(cons); } } procB(int prod,int cons) { long i; for( i=1; i<=2000; i++ ) { wait(cons); printf("n is %d\n",n); signal(prod); } }
ここで,2 つのセマフォの初期値を以下のように 10 と,0 にした場合, どのような結果となるか予想し,その理由を論述せよ.ただし,n++; に比べ, printf 関数の処理は非常に遅いと仮定せよ.
prod = screate(10); cons = screate(0);
for(i=0; isstate = SFREE; sptr->sqtail=1+(sptr->sqhead=newqueue()); }