
ここでは,講義中に行った 模擬テスト を公開していく.
本講義の評価は,試験期間中に行うペーパー試験 により 評価するが,過去問,本模擬試験の問題を,何割か(現在考慮中)そのまま出題する. そのため,本模擬試験の解答は原則として各自の自習に任せる.
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()); }