以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  南京大学操作系统PV和管程题交流专帖(请Logician指教)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=56265)


--  作者:p11y06d0
--  发布时间:12/1/2007 7:39:00 PM

--  南京大学操作系统PV和管程题交流专帖(请Logician指教)
1.(07CS)桌上有一只可以容纳两个水果的盘子,每次只能放入或取出一个水果。爸爸削苹果,削好苹果后放入盘子中,妈妈剥桔子,剥好桔子后放入盘子中,两个儿子专等吃盘子中的苹果,两个女儿专等吃盘子中的桔子。试用信号量和P、V操作,编写实现爸爸、妈妈、儿子和女儿间并发工作的程序。
var  B : array [0..1] of (apple, orange, empty) ;
sapp, sora, mutex, s: semaphore := 0, 0, 1, 2 ;
cobegin
process father
begin
   L1: 削一个apple;
    P(s);
   P(mutex);
   If B[0]=empty then B[0]:=apple
   else B[1]:=apple;
   V(mutex);
   V(sapp);
   goto L1;
end; 
process son_i(i:=1,2)    //两个儿子的处理法对不对?
begin
   L2 : P(sapp);
   P(mutex);
   If B[0]=apple then B[0]:=empty
   else B[1]:=empty;
   V(mutex);
   V(s);
   吃一个apple;
   goto L2;
end;
process mother
   begin
   L3: 剥一个orange;
    P(s);
    P(mutex);
    If B[0]=empty then B[0]:=orange
    else B[1]:=orange;
    V(mutex);
    V(sora);
    goto L3;
end; 
process daughter_j(j:=1,2)   //两个女儿的处理法对不对?
   begin
   L4: P(sora);
   P(mutex);
   If B[0]=orange then B[0]:=empty
   else B[1]:=empty;
   V(mutex);
   V(s);
   吃一个orange;
   goto L4;
end;
coend.
自己做的,不知对错,大家帮忙看看。


[此贴子已经被作者于2007-12-2 16:30:49编辑过]

--  作者:p11y06d0
--  发布时间:12/2/2007 4:29:00 PM

--  
2.(07,Soft)桌上有一只盘子,可以放入N只水果。爸爸每次向盘子中放入一只苹果(apple),妈妈每次向盘子中放入一只桔子(orange),一个儿子每次从盘子中取一只桔子吃,一个女儿每次从盘子里取一只苹果吃。请用PV操作写出保证它们正确运行的程序。

信号量和上题一样,s用于对盘子里的水果计数,mutex用于对放水果和取水果的互斥,另外两个同步信号量sapp和sora用于通知儿子、女儿.由于盘子可放N个水果,可把盘子看作环形缓冲区,向盘子里放水果父母各自放各自的,互不影响,但儿子女儿取水果时盘子里可能既有苹果,又有桔子,用if来检测,这样不知对不对?

var B : array[0..N-1] of (apple, orange);
   sapp, sora, mutex, s : semaphore := 0, 0, 1, N;
   in, out : integer := 0, 0;
   fruit : (apple, orange);
cobegin
process Father
begin
L1:P(s);
P(mutex);
B[in] := apple;
in := (in+1) mod N;
V(mutex);
V(sapp);
goto L1;
end; 
process Daughter
begin
   L2:P(sapp);
   P(mutex);
   if B[out]=apple then fruit := B[out];  //不知对不对?
   out := (out+1) mod N;
   V(mutex);
   V(s);
   eat an apple;
   goto L2;
end;
process Mother
begin
L3:P(s);
P(mutex);
B[in] := orange;
in := (in+1) mod N;
V(mutex);
V(sora);
goto L1;
end; 
process Son
begin
   L4:P(sora);
   P(mutex);
   if B[out]=orange then fruit := B[out];  ////不知对不对?
   out := (out+1) mod N;
   V(mutex);
   V(s);
   eat an orange;
   goto L4;
end;
coend.


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms