跳到主要内容

東北大学 工学研究科 電気・情報系 2018年8月実施 専門科目 問題5 計算機2

Author

祭音Myyura (co-authored with GPT 5.6 SOL)

Description

日本語原文

複数のプロセスを並行に動作させるシステムを考える。各プロセスはそのプロセス自身に局所的なひとつのレジスタ RR を持つ。システムは全てのプロセスで共有する3個の大域記憶領域 S0,S1S_0,S_1、および S2S_2 を提供する。レジスタおよび大域記憶領域はそれぞれ整数値をひとつ保持し、11 に初期化される。システムにプログラム MM が与えられると、システムは起動し、MM を実行するプロセスがひとつ作られる。プログラムは命令の列である。命令 II およびプログラム MM の文法は以下の通りである。

I::=Si:=RR:=SiR++MPiVi,M::=I;;II::=S_i:=R\mid R:=S_i\mid R\texttt{++}\mid\langle M\rangle\mid P_i\mid V_i, \qquad M::=I;\cdots;I

ここで、i{0,1,2}i\in\{0,1,2\} である。各命令の意味は以下の通りである。Si:=RS_i:=R はレジスタ RR の値を大域記憶領域 SiS_i にコピーする。R:=SiR:=S_iSiS_i の値を RR にコピーする。R++R\texttt{++}RR11 を加える。M\langle M\rangleMM を実行する新しいプロセスをひとつ作成する。PiP_iViV_i は大域記憶領域をセマフォとして使用する命令である。PiP_iSiS_i の値が 11 以上のとき SiS_i から 11 を減じる。そうでないならばこの命令は実行可能ではなく、従ってプロセスは SiS_i の値が 11 以上になるまでブロックされる。ViV_iSiS_i11 を加える。プログラム中の各命令はプログラムの先頭から順に実行される。プロセスがプログラムの終端に達したとき、そのプロセスは終了する。全てのプロセスが終了したとき、システムは終了する。

動作できるプロセスは一度にひとつだけである。命令がひとつ実行された直後、システムは動作しているプロセスを切り替えることがある。次に動作するプロセスは次の命令が実行可能なプロセスの中から何らかの方法で選ばれる。次の命令は存在するがそのいずれも実行可能でないとき、システムはデッドロックに陥っており、従ってシステムは永久に終了しない。

このシステムにプログラム MM が与えられたとき、プロセスの切り替え方にかかわらずシステムが終了するならば、MM は常に終了すると言う。例えば、プログラム

〈R:=S0; S2:=R〉; 〈R:=S0; R++; S2:=R〉

は常に終了する。システムが終了した時の S2S_2 の値は 11 または 22 である。

以下の各プログラムについて、そのプログラムが常に終了するかどうか判定せよ。また、システムが終了したときに S2S_2 が取り得る値を全て求めよ。解答の根拠も示せ。

(1) 〈R:=S2; R++; S2:=R〉
(2) 〈R:=S2; R++; S2:=R〉; 〈R:=S2; R++; S2:=R〉
(3) 〈P0; R:=S2; R++; S2:=R; V0〉;
〈P0; R:=S2; R++; S2:=R; V0〉
(4) 〈P0; P1; R:=S2; R++; S2:=R; V0; V1〉;
〈P1; P0; R:=S2; R++; S2:=R; V0; V1〉
(5) P0; 〈P0; R:=S2; R++; S2:=R; V1〉;
〈P1; R:=S2; R++; S2:=R; V0〉

题目描述

每个进程有局部整数寄存器 RR,并共享整数 S0,S1,S2S_0,S_1,S_2,所有初值均为 11。指令 R:=SiSi:=RR++ 含义分别为读、写及加一;〈M〉 新建一个执行 MM 的进程。PiSi1S_i\ge1 时原子地减一,否则阻塞;Vi 原子地将 SiS_i 加一。每条指令后均可能切换进程。所有进程结束时系统结束;有未结束进程但无可执行指令时发生死锁。

对以下各程序,判断是否无论如何调度均结束,并列出结束时 S2S_2 的所有可能值,说明理由。

(1) 〈R:=S2; R++; S2:=R〉
(2) 〈R:=S2; R++; S2:=R〉; 〈R:=S2; R++; S2:=R〉
(3) 〈P0; R:=S2; R++; S2:=R; V0〉;
〈P0; R:=S2; R++; S2:=R; V0〉
(4) 〈P0; P1; R:=S2; R++; S2:=R; V0; V1〉;
〈P1; P0; R:=S2; R++; S2:=R; V0; V1〉
(5) P0; 〈P0; R:=S2; R++; S2:=R; V1〉;
〈P1; R:=S2; R++; S2:=R; V0〉

Kai

程序是否总结束结束时 S2S_2
(1)22
(2)2,32,3
(3)33
(4)33
(5)33

(1) 仅一个子进程执行一次加一。

(2) 两个进程均先读到 11 时,两次写入均为 22;若第二次读取发生在第一次写入之后,最后得到 33。所有指令均不阻塞。

(3) S0S_0 使两个读—改—写过程互斥,两次加一必顺序完成,且持锁进程总能执行到释放锁。

(4) 若第一个进程完成 P0,第二个完成 P1,二者随后互等而死锁。若最终结束,两个进程的加一仍在互斥区内,故 S2=3S_2=3

(5) 主进程先将 S0S_0 置为 00,第一个子进程在 P0 等待。第二个子进程取得初值为 11S1S_1,将 S2S_211 改为 22 后执行 V0;第一个子进程才可继续,将 S2S_2 改为 33。不存在循环等待。