void f2() {
y=6; ③
} main() { }
4、何谓临界区?下面给出的实现两个进程互斥的算法安全吗?为什么? #define TRUE 1 #define FALSE 0 int flag[2];
flag[0]=flag[1]=FALSE; enter-crtsec(int i) { }
leave-crtsec(int i); { }
flag[i]=FALSE; while(flag[1-i]; flag[i]=TRUE;
cobegin{f1();f2();} x=x+1; ④
15
process 0 {
.....
enter-crtsec(0); IN CRITICAL SECTION
leave-crtsec(0); ..... }
process 1 {
.....
enter-crtsec(1); IN CRITICAL SECTION
leave-crtsec(1); ..... }
5、某车站售票厅,任何时刻最多可容纳10名购票者进入,当售票厅中少于10名购票者时,则厅外的购票者可立即进入,否则需在外面等待。若把一个购票者看作一个进程,请回答下列问题:
(1)若用信号量机制来管理这些并发进程时,写出信号量的初值以及信号量各种取值的含义。
(2)根据所定义的信号量,把应执行的wait和signal操作填入下面程序Pi中,以保证进程能够正确地并发执行。
parbegin P1 ∶ Pi ∶ P10 parend
16
procedure Pi (i = 1,2, ? ,10) begin 进入售票厅; 购票; 退出; end
(3)若欲购票者最多为n个人,写出信号量可能的变化范围(最大值和最小值)。
6、在解决“生产者—消费者”问题时,设信号量mutex用于生产者与消费者的互斥,初值为1;设 empty是生产者的信号量,表示缓冲区中空单元数,初值为n;设 full是消费者的信号量,表示缓冲区中非空单元数,初值为0。
(1)用下列算法在解决“生产者—消费者”同步问题时会产生死锁吗?
parbegin producer ; consumer ; parend
procedure producer begin
procedure consumer
begin repeat 生产数据; wait(mutex) ; wait(empty);
wait(mutex);
wait(full);
repeat
送数据到空缓冲区中; signal(full); signal(mutex);
取缓冲区某单元数据;
signal(empty); signal(mutex);
消费数据;
forever
forever end
end
(2)若有可能,则说明在什么情况下会产生死锁?
17
7、有一个售票厅只能容纳200人,当少于200人时,可以进入;否则需要在外等候。若将每一个购票者作为一个进程Pi,请用wait和signal操作描述购票者的行为。 Pi { }
8、有一个阅览室,共有100个座位,读者进入后必须先在一张登记表上登记,登记表要求互斥使用,读者离开时要删掉登记的信息。试问: (1) 为描述读者的动作,应设置几个信号量,初值为多少? (2) 用wait()和signal()操作描述并发读者进程之间的关系。
读者() {
while(1) {
填写登记表;
进入阅览室; 读书;
退出浏览室;
删除登记表; } }
9、某由西向东的单行车道有一卡脖子的路段AB,为保证行车的安全需设计一个自动管理系统,管理原则如下:
当AB段之间无车行驶时,可让到达A点的一辆车进入AB段行驶;当AB段有车行驶时,让到达A点的车等待;当在AB段行驶的车驶出B点后,可让等待在A点的一辆车进入AB段。 请回答下列问题:
(1)把每一辆需经过AB段的车辆看作是一个进程,则这些进程在AB段执行时,它们之间的关系应是同步还是互斥?
(2)用信号量操作管理AB段时,应怎样定义信号量,给出信号量的初值以及用信号量对
18
进入购票厅; 买票; 退出;
车辆行为的描述。
10、假设有三个进程:P1、P2、P3以及两个缓冲区Buf1和Buf2。每个缓冲区每次都只能存放一个数据。
进程P1不断生产数据并填入第一个缓冲区Buf1(每次生产一个数据);
进程P2不断从第一个缓冲区Buf1中取出一个数据,然后填入第二个缓冲区Buf2中; 进程P3不断地从第二个缓冲区Buf2中取出数据并消费掉(每次取出一个)。 如图所示。三个进程并发执行时,需要采取同步措施: P1等到Buf1为空的时候才可以填入数据,否则就需要等待;
P2需要等Buf1中有数据以后才可以将数据取出,并且P2需要等Buf2为空的时候再将数据填入Buf2中。而P3需要等Buf2有数据的时候将数据取出。
由于每个缓冲区每次都只能存取一个数据,所以三个进程之间不需要考虑互斥。现采用信号量机制来保证三个程序的同步。信号量的定义如下,请将这些信号量的wait、signal操作填入下面程序中适当的位置。
定义信号量并给出初值: P1() { While (TRUE) { 生产1个数据; 将数据填入Buf1中; } } }
19
P1 P2 P3 Buf1 Buf2 P2() { While(TRUE) { 从Buf1中取一个数据; 将数据填入Buf2中; } P3() { While (TRUE) { 从Buf2中取1个数据; 消费掉该数据; }