且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

操作系统复习笔记(五)

更新时间:2022-09-02 10:36:23

14.从"互斥","空闲让进","有限等待"3个方面讨论它的正确性.若正确,则证明之.若不正确,说明理由。
 
program sample;
    var c1,c2:integer;
    procedure p1
        begin
        repeat
            other section 1;
            repeat
            c1 = 1-c2;
            until c2!=0
            critical section;//临界区
            c1 = 1;
        until false
        end
    procedure p2
        begin
        repeat
            other section 2;
            repeat
            c2 = 1-c1;
            until c1!=0
            critical section;//临界区
            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),用来统计观众个数.当然计数器是个共享变量,需要互斥使用。
var s=1,s0=1,s1=1,s2=1:semaphore;
var count0=0,count1=0,count2=0;

cobegin
process videoshow0 //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

process videoshow1 //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
process videoshow2 //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个座位.读者进入时必须在一张登记表上登记,该表为每一座位列一表目,包括座位号和读者姓名.读者离开时要消掉登记内容.

var mutex=1,count=1:semaphore;

cobegin
process Readeri(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;

var s1=1,s0=0:semaphore;

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

process p2
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.反之,对甲也是如此.

var sa=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) then goto L1
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) then goto L2
end
        v(s2);
    until false
end




本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/08/29/489488.html,如需转载请自行联系原作者