`
dato0123
  • 浏览: 914018 次
文章分类
社区版块
存档分类
最新评论

操作系统复习笔记(五)

 
阅读更多
14.从"互斥","空闲让进","有限等待"3个方面讨论它的正确性.若正确,则证明之.若不正确,说明理由。

programsample;
varc1,c2:integer;
procedurep1
begin
repeat
othersection
1;
repeat
c1
=1-c2;
untilc2
!=0
criticalsection;
//临界区
c1=1;
until
false
end
procedurep2
begin
repeat
othersection
2;
repeat
c2
=1-c1;
untilc1
!=0
criticalsection;
//临界区
c2=1;
until
false
end
begin
c1
=1;
c2
=1;
cobegin
p1;
p2;
//进程p1,p2并行执行
end

分析:
1)互斥:不能实现互斥进入临界区.比如:进程p1,p2都可以在判断到c1,c2为1的时候而进入临界区.
2)空闲让进:可以实现.当一个进程离开临界区后,进程p2还未来得及执行c2 = 1-c1操作时,进程p1再次先执行c1 = 1-c2,可以立即进入临界区,可能会造成进程p2长时间等待,出现"饥饿"现象.

15.解释彩票调度算法

答:彩票调度算法是一种模拟现实世界发行彩票的方法的计算机资源分配算法.其实现的基本思想是:为进程发放针对系统各种资源(如cpu占用时间)的彩票.当调度程序需要做出决策时,随机选择一张彩票,持有该彩票的进程将获得系统资源.所有的进程都是平等的.它们有相同的运行机会.若某些进程需要更多的机会,就可以被给予更多的额外彩票,以增加其中将(获得资源)的机会.

16.假设一个电影院有0,1,2三种不同的影片由观众选择放映.放映规则是:1)任一时刻最多只能放映一种影片,正在放映的影片是自动循环放映的,最后一个观众主动离开时结束当前影片的放映.2)选择当前正在放映影片的观众可立即进入,允许同时有多位选择同一影片的观众同时观看,同时观看的观众数量不受限制;3)等待观看其他影片的观众按到达顺序排队,当一中新的影片开始放映时,所有等待观看该影片的观众可以依次序进入电影院同时观看.

分析:电影院一次只能放映一部影片,希望观看的观众可能有不同的爱好,但每次只能满足部分观众的需求,即希望观看另外两部影片的用户只能等待.分别为三部影片设置三个信号量s0,s1,s2,初值分别为1,1,1电影院一次只能放一部影片,因此需要互斥使用.由于观看影片的观众有多个,因此必须分别设置三个计数器(初值都是0),用来统计观众个数.当然计数器是个共享变量,需要互斥使用。
vars=1,s0=1,s1=1,s2=1:semaphore;
varcount0
=0,count1=0,count2=0;

cobegin
processvideoshow0
//vcd_id=0
begin
repeat
p(s0);
count0
=count0+1;
if(count0=1)p(s);
v(s0);
看影片;
p(s0);
count0
=count0-1;
if(count0=1)v(s);
v(s0);
until
false
end

processvideoshow1
//vcd_id=1
begin
repeat
p(s1);
count1
=count1+1;
if(count1=1)p(s);
v(s1);
看影片;
p(s1);
count1
=count1-1;
if(count1=1)v(s);
v(s1);
until
false
end
processvideoshow2
//vcd_id=2
begin
repeat
p(s2);
count2
=count2+1;
if(count2=1)p(s);
v(s2);
看影片;
p(s2);
count1
=count1-1;
if(count2=1)v(s);
v(s2);
until
false
end
coend

17.图书馆有100个座位.读者进入时必须在一张登记表上登记,该表为每一座位列一表目,包括座位号和读者姓名.读者离开时要消掉登记内容.

varmutex=1,count=1:semaphore;

cobegin
processReaderi(i
=1,2)
begin
repeat
进入图书馆;
p(count);
p(mutex);
i
=获取座位号;
登记i项表目(名字,座位号);
v(mutex);
坐下阅读;
p(mutex);
消去登记项(名字,座位号)
v(mutex);
v(count);
离开;
until
false
end

18.盒子里装着数量相等的白子和黑子,两个进程p1,p2,p1捡白子,p2捡黑子,规定每一个进程轮流捡子且只捡一子.当一个进程正在捡子时,不允许另一个进程去捡,并设捡白子的进程先手.

分析:可以设置两个信号量s1,s2协调进程p1,p2之间的同步,由于不存在进程p1,p2之间同时取子的竞争,所以不必设置互斥信号量.又由于白先,所以信号量s1,s2的初值分别为1,0;

vars1=1,s0=0:semaphore;

cobegin
processp1
begin
repeat
p(s1);
捡白子;
v(s2);
until
false
end

processp2
begin
repeat
p(s2);
捡黑子;
v(s1);
until
false
end

19,有100名毕业生去甲,乙两公司求职,两公司合用一间接待室,其中甲公司准备招收10人,乙公司准备要15人,招完即止.两公司各有一位主管接待毕业生,每位主管每次只可接待一人,其他毕业生在接待室外排成一队等待,

分析:由于毕业生只排一队,所以只需要设置一个队列数据结构,在队列中不含甲,乙都接待过的毕业生和已被录用了的毕业生,只含标志为"A"(被甲接待过)或标志为"B"(被乙接待过)以及无标志的毕业生,此外,设置s1和s2分别为队列中甲乙正在面试的毕业生i(i=1,..100)标志,即此刻另一方不得面试该毕业生i.k1,k2为甲,乙所录取的毕业生计数,c1,c2为甲乙面试过的毕业生计数.mutex为访问队列互斥信号量,sa,sb分别为访问c1,c2的互斥信号量.需要注意的,若甲录取了一名学生,且乙没有面试过该学生,则乙的面试学生数将减少1人.可以采取如下方法:若甲所录取的学生没有被乙面试过时,给乙面试计数器c2加1(相当于乙已经面试过该生);即始终保持乙面试的人数值为100.反之,对甲也是如此.

varsa=1,sb=1,mutex=1,c1=0,c2=0,k1=0,k2=0:semaphore;

cobegin

process甲
begin
L1:p(mutex);
p(sa);
c1
=c1+1;
v(sa);
if(c1<=100)then
begin
从标志为“B
"且不为”Sb"或无标识的毕业生队列中选第i个学生将学生i标识为"A""sa"
end
v(mutex);
面试;
p(mutex);
if合格then
begin
k1
=k1+1;
if(学生i的标识不含"B")then
begin
p(sb);
c2
=c2+1;
v(sb);
将学生i从队列上摘除;
end
else
将学生i从队列上摘除;
else
if(学生i的标识含“B”)then
将学生i从队列上摘除
else
取消学生i的
"sa"标识;
v(mutex);
if(k1<10)and(c1<100)thengotoL1
end
v(s2);
until
false
end

process乙
begin
L2:p(mutex);
p(sa);
c2
=c2+1;
v(sb);
if(c2<=100)then
begin
从标志为“A
"且不为”Sa"或无标识的毕业生队列中选第i个学生将学生i标识为"B""sb"
end
v(mutex);
面试;
p(mutex);
if合格then
begin
k2
=k2+1;
if(学生i的标识不含"A")then
begin
p(sa);
c1
=c1+1;
v(sa);
将学生i从队列上摘除;
end
else
将学生i从队列上摘除;
else
if(学生i的标识含“A”)then
将学生i从队列上摘除
else
取消学生i的
"sb"标识;
v(mutex);
if(k2<10)and(c2<100)thengotoL2
end
v(s2);
until
false
end
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics