ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

操作系统PV操作习题

2021-11-28 10:32:57  阅读:159  来源: 互联网

标签:PV 操作系统 Bufempty Buffull chopstick 筷子 缓冲区 习题 mod5


1.两个进程PA 和PB通过两个FIFO缓冲区队列连接(如下图所示),每个缓冲区长度等于传送消息长度。进程PA和PB之间的通信满足如下条件:

(a)至少有一个空缓冲区存在时,相应的发送进程才能发送一个消息。

(b)当缓冲队列中至少存在一个 非空缓冲区时,相应的接收进程才能接收一个消息。

试描述发送过程send(i,m)和接收过程receive(i,m)。这里i代表缓冲队列。

      由题意可知,进程PA与PB之间进行通信时,过程send(i,m)和过程receive(i,m)必须同步执行,因为过程send(i,m)的执行结果是过程receive(i,m)的执行条件,而当缓冲队列全部装满数据时,receive(i,m)的执行结果又是send(i,m)的执行条件,满足同步定义。

      由于进程PA和PB通过俩个FIFO缓冲区队列连接,设Bufempty[0],Bufempty[1]为进程PA的私用信号量,Buffull[0]、Buffull[1]为进程PB的私用信号量。Bufempty[0],Bufempty[1]的初始值为n(n为缓冲队列的缓冲区个数),Buffull[0]、Buffull[1]的初始值为0。

send(i,m):

        begin local x

        P(Bufempty[i])

        按FIFO方式选择一个空缓冲区Buf[i](x)

        Buf[i](x) <- m

        Buf[i](x)置满标记位

        V(Buffull[i])

end

receive(i,m):

        begin local x

        P(Buffull[i])

        按FIFO方式选择一个装满数据的缓冲区Buf[i](x)

        m <- Buf[i](x)

        Buf[i](x)置空标记

        V(Bufempty[i])

End

2.有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。

在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。

 方法一:至多只允许四位哲学家同时去拿左筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用。

semaphore chopstick[5] = {1,1,1,1,1};         //初始化信号量

semaphore mutex=4;         //控制最多允许四位哲学家同时进餐

while(true){

        P(mutex);        //请求进餐

        P(chopstick[i]);        //先拿左手边的筷子

        P(chopstick[(i+1)mod5]);        //再拿右手边的筷子

        eat();

        V(chopstick[(i+1)mod5]);        //先放下右手的筷子

        V(chopstick[i]);        //再放下左手的筷子

        V(mutex);        //用餐完毕,其他哲学家可以进餐

        think();

}

方法二:规定奇数号哲学家先拿左筷子再拿右筷子,而偶数号哲学家相反。

while(true){

        if(i mod 2 ==0){

                P(chopstick[(i+1)mod5]);        //先拿右手边的筷子

                P(chopstick[i]);        //再拿左手边的筷子

                eat();

                V(chopstick[i]);        //先放下左手的筷子

                V(chopstick[(i+1)mod5]);        //再放下右手的筷子

        }

        else{

                P(chopstick[i]);        //先拿左手边的筷子

                P(chopstick[(i+1)mod5]);        //再拿右手边的筷子

                eat();

                V(chopstick[(i+1)mod5]);        //先放下右手的筷子

                V(chopstick[i]);        //再放下左手的筷子

        }

}

标签:PV,操作系统,Bufempty,Buffull,chopstick,筷子,缓冲区,习题,mod5
来源: https://blog.csdn.net/qq_27855345/article/details/121587755

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有