操作系统PV编程题目总结一
1.今有一个文件F供进程共享,现把这些进程分为A、B两组,规定同组的进程可以同时读文件F;但当有A组(或B组)的进程在读文件F时就不允许B组(或A组)的进程读文件F。试用P、V操作(记录型信号量)来进行管理。
这是读者-写者问题变形,文件F在A与B之间要进行互斥,设信号量Fmutex用来两组间互斥,显然每组的读者要进行计数,来说明有木有某组在读文件,需要2个计数变量c1和c2,再设信号量Asem和Bsem分别对2个计数变量c1和c2进行互斥访问。
Semaphore Fmutex=1,Asem=0,Bsem=0;
int c1=c2=0;
Cobegin
Pa(i=1,2,3...){
P(Asem)
c1++;
if(c1==1)P(Fmutex)
V(Asem)
reading F;
P(Asem)
c1--;
if(c1==0)V(Fmutex)
V(Asem)
}
Pb(i=1,2,3...){
P(Bsem)
c2++;
if(c2==1)P(Fmutex)
V(Bsem)
reading F;
P(Bsem)
c2--;
if(c2==0)V(Fmutex)
V(Bsem)
}
coend
2.过双道十字路口问题。
这个问题是读者-写着问题的变形,路口要在水平和垂直方向上进行互斥,但在p1和p3方向上不需要互斥;同样p2和p4方向上也不需要互斥。因此可以设p1和p3为一组,p2和p4为一组。设信号量mutex用来两组间互斥。每组上来车要进行计数,需要2个计数变量c1和c2,再设信号量sem13和sem24分别对2个计数变量c1和c2进行互斥访问。
Semaphore mutex=1,sem13=1,sem24=1;
int c1=2=0;
cobegin
p1(){
P(sem13)
c1++;
if(c1=1) P(mutex)
V(sem13)
P1通过路口;
P(sem13)
c1--;
if(c1==0)V(mutex)
V(sem13)
}
p2(){
P(sem24)
c2++;
if(c2==1)P(mutex)
V(sem24)
P2通过路口;
P(sem24)
c2--;
if(c2==0)V(mutex)
V(sem24)
}
p3(){
P(sem13)
c1++;
if(c1=1) P(mutex)
V(sem13)
P3通过路口;
P(sem13)
c1--;
if(c1==0)V(mutex)
V(sem13)
}
p4(){
P(sem24)
c2++;
if(c2==1)P(mutex)
V(sem24)
P4通过路口;
P(sem24)
c2--;
if(c2==0)V(mutex)
V(sem24)
}
coend
3.吃水果问题:桌上有一只盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子空,则爸爸或妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出四人之间的同步关系,并用P、V操作实现四人正确活动的程序。
父亲和母亲先放水果,儿子女儿再取水果;父亲与女儿,母亲与儿子是一个同步关系,父亲与母亲要竞争空盘子,但空盘子容量为2.
设信号量m1表示盘子空位,信号量m2表示儿子是否能取苹果,m3表示女儿能否取桔子。
int m1=2,m2=0,m3=0;
cobegin
p1(){
while(1){
洗桔子;
P(m1);
放桔子;
V(m3);
}
}
p2(){
while(1){
洗苹果;
P(m1);
放苹果;
V(m2);
}
}
p3(){
while(1){
P(m2);
取苹果;
V(m1);
吃苹果;
}
}
p4(){
while(1){
P(m3);
取桔子;
V(m1);
吃桔子;
}
}
coend
4.试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法。
解法一:
semaphore Chopstick[5],5;
chopstick[0].value=chopstick[1].value=1;
chopstick[2].value=chopstick[3].value=1;
chopstick[4].value=1;
S.value=4;//最多允许4个哲学家同时拿筷子
process Pi()(i=0,1,2,3,4){//第i个哲学家进程
while(true){
wait(5);//看是否允许拿筷子
wait(chopstick[i]);//拿起左边筷子
wait(chopstick[(i+1)%5]);//拿起右边筷子
eating;
signal(chopstick[i]);//放下左边筷子
signal(chopstick[(i+1)%5]);//放下右边筷子
signal(5);
thinking;
}
}
parbegin//进程并发执行
P0();
P1();
P2();
P3();
P4();
parend
解法二:奇数号哲学家先拿左边筷子,然后再拿右边筷子;偶数号哲学家先拿右边筷子,然后再拿左边筷子。
semaphore chopstick[5];
chopstick[0].value=chopstick[1].value=1;
chopstick[2].value=chopstick[3].value=1;
chopstick[4].value=1;
parbegin
process Pi()(i=0,2,4){
while(true){
wait(chopstick[(i+1)%5]);
wait(chopstick[i]);
eating;
signal(chopstick[(i+1)%5]);
signal(chopstick[i]);
thinking;
}
}
process Pi()(i=1,2){
while(true){
wait(chopstick[i]);
wait(chopstick[i+1]);
eating;
signal(chopstick[i]);
signal(chopstick[i+1]);
thinking;
}
}
parend
5.假定阅览室最多可同时容纳100个人阅读,读者进入时,必须在阅览室门口的一个登记表上登记,内容包括姓名、座位号等,离开时要撤掉登记内容。用P、V操作描述读者进程的同步算法。
6.公共汽车上司机和售票员问题。
设公共汽车上,司机和售票员的活动分别是:
司机: 售票员:
启动车辆 上下乘客
正常行车 关车门
到站停车 售票
开车门
上下乘客
在汽车不断到站,停车,行驶过程中,这两个活动的同步关系。
7.和尚打水问题。某寺庙,有小和尚和老和尚若干,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水。水桶总数为3个。每次入水、取水仅为一桶,且不可同时进行。请用PV原语写出协调小和尚和老和尚动作的程序。
操作系统PV编程题目总结一的更多相关文章
- OJ——华为编程题目:输入字符串括号是否匹配
package t0815; /* * 华为编程题目:输入字符串括号是否匹配 * 若都匹配输出为0,否则为1 * 样例输入:Terminal user [name | number (1)] * 样例 ...
- php实现 提取不重复的整数(编程题目能够最快的熟悉函数)
php实现 提取不重复的整数(编程题目能够最快的熟悉函数) 一.总结 一句话总结:编程题目能够最快的熟悉函数. 1.字符串反转函数? 没有str_revserse,有arr_reverse,这里是st ...
- 网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目
期末考试在线编程题目 返回考试 本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间 ...
- 小议 - 来自《XX时代XX公司》的笔试编程题目
经过几天的雾霾,魔都终于放晴了.哥投了几天的简历,希望找到一份.NET开发方面的岗位.也收到了几个面试邀请.这不应Ge老师的要求,选了个良辰吉日,带着身份证,学位证怀揣着2B青年的梦想来这个XX公司面 ...
- 关于C语言的几个考试编程题目
提交要求:1:邮件名称:学号后三位-题目编号-姓名-期中考试.例如:098-1-沈苗-期中考试2:不用附件提交,直接写邮件,内容包括编程思路(写一段自己对题目的认识.思路.技术细节等).源代码.运行结 ...
- 【编程题目】请修改 append 函数,利用这个函数实现两个非降序链表的并集
42.请修改 append 函数,利用这个函数实现(链表):两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5另外只能输出结 ...
- 【编程题目】栈的 push、pop 序列
29.栈的 push.pop 序列(栈)题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们假设 push 序列的任意两个整 ...
- 【编程题目】题目:定义 Fibonacci 数列 输入 n,用最快的方法求该数列的第 n 项。
第 19 题(数组.递归):题目:定义 Fibonacci 数列如下:/ 0 n=0f(n)= 1 n=1/ f(n-1)+f(n-2) n=2输入 n,用最快的方法求该数列的第 n 项. 思路:递归 ...
- 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点
第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...
随机推荐
- Python——合并指定文件夹下的所有excel文件
前提:该文件夹下所有文件有表头且具有相同的表头. import glob # 同下 from numpy import * #请提前在CMD下安装完毕,pip install numppy impor ...
- bzoj 4244 括号序列dp
将各种情况绕环等看作括号序列,括号内的区域上下都需要累加答案,左右也是 f[i][j] 代表 前i个车站已经处理完的有j个左括号的最小权值 我们可以发现,更新的来源来自于 i-1, 和 i 将上 描述 ...
- python和Java的几种容器比较
python里面有几种常用的容器用来存放数据 1.list 列表,在python中没有数据类型,所以可以在列表中存放各种类型的数据,比如把Java里面的整型和字符串放在一个容器里面如下所示 list ...
- PLSQL Developer 没有64位版本 + 找不到 msvcr71.dll
由于 PLSQL Developer 没有64位版本,所以在64位系统上运行该程链接64位Oracle时就会报错,笔者为这个问题纠结了好几天,后来通过请教Google + 动手实践,终于搞定了这个问题 ...
- MySQL命令行查询乱码解决方法
转自Agoly的博客,原文链接https://www.cnblogs.com/qmfsun/p/4846467.html 感谢博主Agoly这篇文章说的很详细很透彻. MySQL会出现中文乱码的原因不 ...
- java笔试要点(java多线程)
一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌 ...
- win10下安装Cygwin配置gcc编译环境
首先要说明的是,我个人安装cygwin的用途是为了使用kenlm工具训练通及语言模型. 注:统计语言模型工具有比较多的选择,目前比较好的有srilm以及kenlm,其中kenlm比srilm晚出来,训 ...
- Django --- 单表的增删改查
- SpringBoot 上传文件夹
前端代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 详解MariaDB数据库的存储过程
1.什么是存储过程 很多时候,SQL语句都是针对一个或多个表的单条语句.但是也有时候有的查询语句需要进行多次联表查询才能完成,此时就需要用到存储过程了. 存储过程(Stored Procedure)是 ...