欢迎来到天天文库
浏览记录
ID:20463679
大小:523.86 KB
页数:17页
时间:2018-10-10
《操作系统实验第六讲进程的同步》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、课程名称操作系统实验实验项目名称进程的同步学号班级20120616姓名专业计算机科学与技术学生所在学院计算机科学与技术学院指导教师初妍实验室名称地点21#428哈尔滨工程大学计算机科学与技术学院一、实验概述1.实验名称进程的同步1.实验目的使用EOS的信号量,编程解决生产者一消费者问题,理解进程同步的意义。调试跟踪EOS信号ii的工作过程,理解进程同步的原理。修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。2.实验类型验证+设计3.实验内容3.1准备实验3.2使用EOS的信号量解决
2、生产者一消费者问题3.3调试EOS信号呈的工作过程3.3.1创建信号量3.3.2等待、释放信号3.3.2.1等待信号量(不阻塞)3.3.2.2释放信号量(不唤醒)3.3.2.3等待信号量(阻塞)3.3.2.4释放信号量(唤醒)3.4修改EOS的信号呈算法二、实验环境操作系统windosxp编译器OSLab语言c语言三、实验过程1.设计思路和流程图准备实验使用EOS的信号量解决生产者一消费者问题调试EOS信号:W:的工作过程释号待信等放量->建号创信量等待信-►号:W:(不阻塞)释放信->号:W:(不唤醒)等待信■>号:
3、w:(附塞)释放信-►号:W:(唤醒〉修改EOS的信号量算法结束实验3.需要解决的问题及解答(1)生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢?答:这是因为临界资源的限制。临界资源的数值范围是0到10,只冇当临界资源不满10时才能让生产者生产东西,每次生产一个临界资源数量加一,当临界资源数值到10吋,无法继续生产,所以它必须等到消费者,消耗掉一个,临界资源数值才会减一并腾出空间,才能继续生
4、产14号产品。(2)修改EOS的信号量算法修改PsWaitForSemaphore函数:PsWaitForSemaphore(INPSEMAPHORESemaphore,INULONGMilliseconds)/*++功能描述:信号量的Wait操作(P操作)。参数:Semaphore--Wait操作的信兮量对象。MUliseconds--等待超时上限,单位毫秒。返M值:STATUS.SUCCESSo当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回STATUSTIMEOUT。BOOLIntState;STAT
5、USflag;//保存不同情况下的返回值,ASSERT(KeGetIntNesting()==O);//屮断环境下不能调用此函数。IntState二KeEnablelnterr叩ts(FALSE);//开始原子操作,禁止中断。if(Semaphore->Count>0){Semaphore->Count-;flag=STATUS_SUCCESS;}//如果信号量大于零,说明尚有资源,可以为线程分配elseflag=PspWait(&Semaphore->WaitListHead,Milliseconds);KeEnab
6、lelnterrupts(lntState);//原子操作完成,恢复中断。returnflag;}修改PsReleaseSemaphore函数:PsReleaseSemaphore(INPSEMAPHORESemaphore,INLONGReleaseCount,OUTPLONGPreviousCount)/*++功能描述:信号量的Signal操作(V操作)。参数.•Semaphore-Wait操作的信号量对象。ReleaseCount-信号量计数增加的数量。当前只能为1。当你修改信号量使之支持超时唤醒功能后,此参数的
7、值能够大于等于1。PreviousCount-返回信号量计数在增加之前的值。返回值:如果成功释放信号量,返MSTATUS_SUCCESS。__*/{STATUSStatus;BOOLIntState;IntState=KeEnableInterrupts(FALSE);//开始原子操作,禁止屮断。if(Semaphore->Count+ReleaseCount>Semaphore->MaximumCount){Status=STATUSSEMAPHORELIMITEXCEEDED;)else{//记录当前的信号量的值。
8、if(NULL!=PreviousCount){*PreviousCount=Semaphore->Count;)intmm=Semaphore->Count;while((!ListIsEmpty(&Semaphore->WaitListHead))&&(ReIea$eCount)){PspWakeThread(&Semapho
此文档下载收益归作者所有