课程设计任务书
学生姓名: 丁光明 专业班级: 计算机0506 指导教师: 何克右 工作单位: 计算机科学与技术学院
题 目: 进程同步模拟设计——司机和售票员问题 初始条件:
1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写
等具体要求)
1.模拟公共汽车司机和售票员开关门及行车操作的同步模型。 2.设计报告内容应说明: ⑴ 课程设计目的与功能;
⑵ 需求分析,数据结构或模块说明(功能与框图); ⑶ 源程序的主要部分;
⑷ 测试用例,运行结果与运行情况分析; ⑸ 自我评价与总结:
i)你认为你完成的设计哪些地方做得比较好或比较出色; ii)什么地方做得不太好,以后如何改正;
iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训); iv)完成本题是否有其他的其他方法(如果有,简要说明该方法); v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。 周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日
题 目: 进程同步模拟设计——司机和售票员问题 1.初始条件:
1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
2要求完成的主要任务:
2.1.模拟公共汽车司机和售票员开关门及行车操作的同步模型。
在汽车行驶过程中,司机活动与售票员活动之间的同步关系为:售票员关车门后,向司机发开车信号,司机接到开车信号后启动车辆,在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开门让乘客上下车。因此,司机启动车辆的动作必须与售票员关车门的动作取得同步;售票员开车门的动作也必须与司机停车取得同步。
司机 P1 售票员 P2
①启动 ②关门 ③到站停 ④开门
正常运行-售票-关门-启动-行驶-停-开门 为了安全起见:
(1)关车门后才能启动车辆 -启动在关门之后
(2)到站停车后,才能开车门 -开车门在到站停车之后
在计算机系统中可以将司机和售票员分别看作P1、P2两个进程,当它们并发地向前推进时,计算机系统所接受到的实际上是司机活动与售票员活动的许多交叉中的任意一个交叉,这些交叉有些满足上述要求,有些则不满足,而操作系统必须保证不发生不满足上述要求的交叉,即:
如P2尚未推进到②处时,而P1已推进到①处,则P1应等待直到P2推进到②处为止;
如P1尚未推进到③时,P2已到④,则P2应等待直到P1推进到③处为止。
P1在①处发生了等待,则P2执行到②处时应将P1唤醒;
P2在④处发生了等待,P1到③处应将P2唤醒
应设置两个信号量:S1 、S2 ;
S1 表示是否允许司机启动汽车(其初值为0 ) ; S2 表示是否允许售票员开门(其初值为0 )。 用P 、v 原语描述如下:
int s1=O; int s2=O;
main() {
cobegin driver(); conductor(); coend }
driver() {
while(1) {
p(s1); 启动车辆; 正常行车; 到站停车; v(s2); } }
conductor() {
while(1) {
关车门; v(s1); 售票; p(s2); 开车门; 上下乘客; } }
2.2.设计报告内容应说明:
2.2.1课程设计目的与功能; 实验目的:
对进程的同步和互斥,以及信号量机制度有深入的理解。
一组相互合作的并发进程,为了协调其推进速度,有时需要相互等待与相互唤醒,进程之间这种相互制约的关系称作进程同步,虽然进程同步仅发生在相互有逻辑关系的进程之间,这种相互制约的关系称作进程同步,进程同步现象仅发生在相互有逻辑关系的进程之间,这点与进程互斥不同,进程互斥现象
发生在任意两个进程之间。
与进程同步相关的另一概念是进程合作,一组进程如果它们单独执行不能正常进行,但并发执行可以正常进行,这种现象称为进程合作,参与进程合作的进程称为合作进程,如司机与售票员的例子,二者单独执行都不能正常进行,但二者并发反可以正常进行,成为合作进程,这种进程合作的现象在操作系统中经常发生。
实验功能:
编写完程序后,通过输入程序给定的操作符对程序进行操作来实现司机与
售票员之间的进程同步关系。对输入的错误操作符有识别功能给予正确的提示,对于那些不符合实际情况的操作给予限制和提示。例如车上人满的时候要给予不能再上车的提示,车上没人的时候要给予不能在下车的提示等等。
2.2.2. 需求分析,数据结构或模块说明(功能与框图); 问题描述:
有两组并发进程:司机和售票员,共享一组数据区,进行司机开车和乘客上下车操作,要求任一时刻“只允许司机开车或乘客上下车操作。
规则:
允许乘客同时执行上下车操作;
不允许司机开车、乘客上下车同时操作; 司机和售票员的相互关系:
司机开车——乘客上下车 互斥关系 乘客上车——乘客下车 允许
具体分析:
? 司机进程:产生一个数据,当要送入缓冲区时,要检查缓冲区是否已满(),若未满,则可将数据送入缓冲区,并通知售票员进程;否则,等待;
? 售票员进程:当它去取数据时,要检查缓冲区中是否有数据可取,若不为空,则取走一个数据,并通知司机进程,否则,等待。
? 因为缓冲区是个临界资源,诸进程对缓冲区进行操作的临界区,需要进行 ? 互斥操作的处理。
程序流程图如下:
其中buffer表示进程同步信号量 n表示车上的空余作为数 p1表示司机进程 p2表示售票员进程 a为输入的操作符
开始 buffer=1,n=36 P2 N buffer=1 Y 输入操作数a Y a=1&& n>0 n-- n++ buffer=0 a=4 buffer=1 Y 结束 N a=2&& n<36 n<=0 n>=36 a<=0// a>4 a=3 a=4 buffer=1
2.2.3. 源程序的主要部分; #include
int buffer=1;//进程同步信号量 #define SIZE 36 int n=SIZE; char a; int p1(); int p2();
int p1()//司机开车进程 {
if(buffer==0) {
cout<<\汽车启动准备离站\ cout<<\汽车正在行驶\ cout<<\汽车到站了\
P1