通过海量题库、编程比赛和实时排名,系统化提升您的编程能力。
"考研真题" 试卷中 2019年考研408计算机统考真题在线评测(附答案) 中有题目如下:
第1题
有 n(n≥3)位哲学家围坐在一张圆桌边,每位哲学家交替地就餐和思考。在 圆桌中心有 m(m≥1)个碗,每两位哲学家之间有一根筷子。每位哲学家必须取到一个碗和两 侧的筷子后,才能就餐,进餐完毕,将碗和筷子放回原位,并继续思考。为使尽可能多的哲学 家同时就餐,且防止出现死锁现象,请使用信号量的 P、V 操作[wait()、signal()操作]描述上 述过程中的互斥与同步,并说明所用信号量及初值的含义。
【答案解析】 回顾传统的哲学家问题,假设餐桌上有 n 个哲学家、n 根筷子,那么可以用这种方法避免死 锁:限制至多允许 n-1 个哲学家同时“抢”筷子,那么至少会有 1 个哲学家可以获得两根筷 子并顺利进餐,于是不可能发生死锁的情况。本题可以用碗这个限制资源来避免死锁:当碗 的数量 m 小于哲学家的数量 n 时,可以直接让碗的资源量等于 m,确保不会出现所有哲学家 都拿一侧筷子而无限等待另一侧筷子进而造成死锁的情况;当碗的数量 m 大于等于哲学家的 数量 n 时,为了让碗起到同样的限制效果,我们让碗的资源量等于 n-1,这样就能保证最多只 有 n-1 个哲学家同时进餐,所以得到碗的资源量为 min{ n-1, m}。在进 PV 操作时,碗的资源 量起限制哲学家取筷子的作用,所以需要先对碗的资源量进行 P 操作。具体过程如下:
// 信号量 semaphore bowl; // 用于协调哲学家对碗的使用 semaphore chopsticks[n]; // 用于协调哲学家对筷子的使用 for(int i=0; i<n; i++) chopsticks[i]=1; // 设置两个哲学家之间筷子的数量 bowl=min(n-1,m); //bowl ≤ n-1,确保不死锁 CoBegin while(TRUE) { // 哲学家 i 的程序 思考; P(bowl); // 取碗 P(chopsticks[i]); // 取左边筷子 P(chopsticks[(i+1)%n]); // 取右边筷子 就餐; V(chopsticks[i]); V(chopsticks[(i+1)%n]); V(bowl); } CoEnd
所属试卷:2019年考研408计算机统考真题在线评测(附答案)
有定义及初始化int a=3,*p=&a;,*p的值是
条件表达式可以判断y是否为小写字母。
设二叉树如下:则中序遍历为( )。
函数fun功能是:将a、b中的两个两位正整数合并形成一
给定程序MODI1.C中函数fun的功能是:统计sub
若变量已正确定义则以上for循环。
写出下面程序的执行结果:1)2)#include<io
已知 vec =[[1,2],[3,4]],则表达式
已知字典 x= {i:str(i+3) for i i
已知列表x=[1,2],执行语句y=x[:]后,表达式
在C语言源程序中,一个变量代表____________
下面程序运行成果是( )。
表达式a+=a-=a=9的值是
关于Linux内核版本的说法,以下错误的是( )。
数据管理技术发展过程中,( )不是文件系统阶段的特点。
根节点的高度为1,一根拥有2023个节点的三叉树高度至
假设主机甲通过 TCP 向主机乙发送数据,部分过程如下
有实现xxy的两个C语言函数如下:unsigned u
设有以下共用体类型说明和变量定义,则变量c在内存所占字
在软件开发中,需求分析阶段产生的重要文档是( )
假设输入的x是不超过1000的自然数,init函数的时
函数fun的功能是:从三个形参a,b,c中找出中间的那
结构化程序所要求的基本结构不包括
软件需求规格说明的内容应包括
编写一个函数fun,从num个字符串中找出最长的一个字
输入 :62 6 3 4 5 1输出 :____
(快速幂)请完善下面的程序,该程序使用分治法求xp m
输出:( )
现有一只青蛙,初始时在 n 号荷叶上。当它某一时刻在
一个平面的法线是指与该平面垂直的直线。过点( 1,1,
更多选择题
更多填空题
第十章 C++流
第九章 C++模板
第八章 C++运算符重载
C++语言程序设计真题5
C++语言程序设计真题4
C++语言程序设计真题3
C++语言程序设计真题2