




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE14操作系统实验报告课程名称操作系统实验课程编号0906553实验项目名称进程的同步学号2011061324年级2011姓名张耀专业计算机科学与技术学生所在学院计算机科学与技术指导教师印桂生实验室名称地点21B276哈尔滨工程大学计算机科学与技术学院
第五讲进程的同步一、实验概述1.实验名称进程的同步2.实验目的(1)使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义;(2)调试跟踪EOS信号量的工作过程,理解进程同步的原理;(3)修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。3.实验类型验证型和设计型实验4.实验内容(1)准备实验;(2)使用EOS的信号量解决生产者-消费者问题;(3)调试EOS信号量的工作过程;创建信号量等待释放信号量等待信号量(不阻塞)释放信号量(不唤醒)等待信号量(阻塞)释放信号量(唤醒)(4)修改EOS的信号量算法。二、实验环境(1)OSLab集成实验环境;(2)EOS操作系统;(2)C语言。三、实验过程1.设计思路和流程图mainmain函数开始创建Mutex对象创建Empty信号量对象创建Full信号量对象创建生产者线程创建消费者线程等待生产者线程和消费者线程结束关闭句柄main函数结束Producer函数开始生产完毕?等待Empty信号量对象等待Mutex对象生产一个产品,占用一个缓冲区循环向后移动缓冲区指针释放Mutex对象释放Full信号量对象等待500毫秒Producer函数结束Consumer函数开始消费完毕毕?等待Full信号量对象等待Mutex对象消费一个产品,清空一个缓冲区循环向后移动缓冲区指针释放Mutex对象释放Empty信号量对象前10个产品?等待2000毫秒等待100毫秒Consumer函数结束图3.1.12.需要解决的问题及解答(1)生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢?答:因为临界资源的访问限制,程序中限定了缓冲池的大小为10,只有缓冲池有空余时生产者才能向里边放产品,同时只有缓冲池有产品时消费者才能向外取东西。当生产者生产了13号产品后,共生产了从0到13的14个产品,但是只消费了从0到3的4个产品,所以缓冲池中的10个缓冲区就都被占用了,所以不能继续生产14号产品,而要等到消费者消费掉一个产品后,缓冲池有空余位置,才能继续生产14号产品。当生产者线程生产了13号产品后,此时Full信号量的值为10,而Empty信号量的值为0,此时若生产者线程要再生产一个产品,先对Empty减1,此时Empty值小于零,生产者线程进入等待队列;而此时若有一个消费者线程要消费一个产品,先对Full减1,此时Full值为9,大于0,如果没有线程占用缓冲池,消费者可以消费一个产品。这样,生产者和消费者就能实现同步过程了。生产者线程和消费者线程是如何使用Mutex、Empty信号量和Full信号量来实现同步的?在两个线程函数中对这三个同步对象的操作能够改变顺序吗?答:Mutex、Empty、Full三个信号量的初始值分别为1、10、0,当存在一个生产者线程访问缓冲池时,首先对Empty减1,如果大于0,则说明还有剩余缓冲区可以让生产者放入产品,否则生产者线程进入等待队列;再对Mutex减1,如果大于等于0,则说明没有线程占用缓冲池,否则生产者线程进入等待队列。生产完产品后,对Mutex加1,解除封锁;再对Full加1,说明生产了一个产品占用了一个缓冲区。消费者线程同理,对信号量的操作顺序与生产者线程相反。不能对这三个同步对象的操作改变顺序,否则可能造成死锁。(3)思考在ps/semaphore.c文件内的PsWaitForSemaphore和PsReleaseSemaphore函数中,为什么要使用原子操作?答:在执行PsWaitForSemaphore和PsReleaseSemaphore函数的时候,不允许cpu响应外部中断,如果此时cpu响应了外部中断,会产生不可预料的结果,无法正常完成函数的功能。(4)绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图。PsWaitForSemaphore流程图:图3.2.1PsReleaseSemaphore函数的流程图:图3.2.2(5)根据本实验3.3.2节中设置断点和调试的方法,自己设计一个类似的调试方案来验证消费者线程在消费24号产品时会被阻塞,直到生产者线程生产了24号产品后,消费者线程才被唤醒并继续执行的过程。答:调试方案如下:①删除所有的断点。②按F5启动调试。OSLab会首先弹出一个调试异常对话框。③在调试异常对话框中选择“是”,调试会中断。④在Consumer函数中等待Full信号量的代码行(第173行) WaitForSingleObject(FullSemaphoreHandle,INFINITE);添加一个断点。⑤在“断点”窗口(按Alt+F9打开)中此断点的名称上点击右键。⑥在弹出的快捷菜单中选择“条件”。⑦在“断点条件”对话框(按F1获得帮助)的表达式编辑框中,输入表达式“i==24”。⑧点击“断点条件”对话框中的“确定”按钮。⑨按F5继续调试。只有当消费者线程尝试消费24号产品时才会在该条件断点处中断。3.主要数据结构、实现代码及其说明修改PsWaitForSemaphore函数: if(Semaphore->Count>0)//如果信号量大于零,说明尚有资源,可以为线程分配Semaphore->Count--; else//否则,说明资源数量不够,不能再为线程分配资源,因此要使线程等待if(Semaphore->Count==0)s=PspWait(&Semaphore->WaitListHead,Milliseconds);修改PsReleaseSemaphore函数: if(ReleaseCount>0)//ReleaseCount大于0才执行释放操作 { Semaphore->Count++; while((!ListIsEmpty(&Semaphore->WaitListHead))&&(ReleaseCount)){ PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS);//唤醒线程 PspThreadSchedule();//线程调度 ReleaseCount--; }//循环唤醒线程 Semaphore->Count=Semaphore->Count+ReleaseCount; Status=STATUS_SUCCESS; }elseprintf("Error:ReleaseCountisnegative!"); }//否侧输出ReleaseCount值错误修改Producer函数:WaitForSingleObject(EmptySemaphoreHandle,INFINITE);替换为while(WAIT_TIMEOUT==WaitForSingleObject(EmptySemaphoreHandle,300)){printf("Producerwaitforemptysemaphoretimeout\n");}//超时300ms则输出Producerwaitforemptysemaphoretimeout修改Consumer函数:WaitForSingleObject(FullSemaphoreHandle,INFINITE);替换为while(WAIT_TIMEOUT==WaitForSingleObject(FullSemaphoreHandle,300)){printf("Consumerwaitforfullsemaphoretimeout\n");}//超时300ms则输出Consumerwaitforfullsemaphoretimeout4.源程序并附上注释STATUSPsWaitForSemaphore( INPSEMAPHORESemaphore, INULONGMilliseconds )/*++功能描述: 信号量的Wait操作(P操作)。参数: Semaphore--Wait操作的信号量对象。 Milliseconds--等待超时上限,单位毫秒。返回值: STATUS_SUCCESS。 当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回STATUS_TIMEOUT。--*/{ BOOLIntState; STATUSs=STATUS_SUCCESS; ASSERT(KeGetIntNesting()==0);//中断环境下不能调用此函数。 IntState=KeEnableInterrupts(FALSE);//开始原子操作,禁止中断。 // //目前仅实现了标准记录型信号量,不支持超时唤醒功能,所以PspWait函数 //的第二个参数的值只能是INFINITE。 // //Semaphore->Count--; //if(Semaphore->Count<0){ // PspWait(&Semaphore->WaitListHead,INFINITE); //} if(Semaphore->Count>0)//如果信号量大于零,说明尚有资源,可以为线程分配Semaphore->Count--; else//否则,说明资源数量不够,不能再为线程分配资源,因此要使线程等待if(Semaphore->Count==0)s=PspWait(&Semaphore->WaitListHead,Milliseconds); KeEnableInterrupts(IntState);//原子操作完成,恢复中断。 //returnSTATUS_SUCCESS; returns;}STATUSPsReleaseSemaphore( INPSEMAPHORESemaphore, INLONGReleaseCount, OUTPLONGPreviousCount )/*++功能描述: 信号量的Signal操作(V操作)。参数: Semaphore--Wait操作的信号量对象。 ReleaseCount--信号量计数增加的数量。当前只能为1。当你修改信号量使之支持 超时唤醒功能后,此参数的值能够大于等于1。 PreviousCount--返回信号量计数在增加之前的值。返回值: 如果成功释放信号量,返回STATUS_SUCCESS。--*/{ STATUSStatus; BOOLIntState; IntState=KeEnableInterrupts(FALSE);//开始原子操作,禁止中断。 if(Semaphore->Count+ReleaseCount>Semaphore->MaximumCount){ Status=STATUS_SEMAPHORE_LIMIT_EXCEEDED; }else{ // //记录当前的信号量的值。 // if(NULL!=PreviousCount){ *PreviousCount=Semaphore->Count; } // //目前仅实现了标准记录型信号量,每执行一次信号量的释放操作 //只能使信号量的值增加1。 // //Semaphore->Count++; //if(Semaphore->Count<=0){ // PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS); //} if(ReleaseCount>0)//ReleaseCount大于0才执行释放操作 { Semaphore->Count++; while((!ListIsEmpty(&Semaphore->WaitListHead))&&(ReleaseCount)){ PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS);//唤醒线程 PspThreadSchedule();//线程调度 ReleaseCount--; }//循环唤醒线程 Semaphore->Count=Semaphore->Count+ReleaseCount; Status=STATUS_SUCCESS; }elseprintf("Error:ReleaseCountisnegative!"); }//否侧输出ReleaseCount值错误 KeEnableInterrupts(IntState);//原子操作完成,恢复中断。 returnStatus;}5.程序运行时的初值和运行结果修改PsWaitForSemaphore函数,先用计数值和0比较,当计数值大于0时,将计数值减1后直接返回成功;当计数值等于0时,调用PspWait函数阻塞线程的执行(将参数Milliseconds做为PspWait函数的第二个参数,并使用PspWait函数的返回值做为返回值)。如图3.1所示。图3.5.1修改PsReleaseSemaphore函数,编写一个使用ReleaseCount做为计数器的循环体,在循环体中完成下面的工作:1.如果被阻塞的线程数量大于等于ReleaseCount,则循环结束后,有ReleaseCount个线程会被唤醒,而且信号量计数的值仍然为0;2.如果被阻塞的线程数量(可以为0)小于ReleaseCount,则循环结束后,所有被阻塞的线程都会被唤醒,并且信号量的计数值=ReleaseCount-之前被阻塞线程的数量+之前信号量的计数值。如图3.2所示。图3.5.2使用修改完毕的EOSKernel项目生成完全版本的SDK文件夹,并覆盖之前的生产者-消费者应用程序项目的SDK文件夹。按F5调试执行原有的生产者-消费者应用程序项目,结果与原来一致,如下图所示。图3.5.3修改Producer函数中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《工作分析final》课件
- 铁路旅客运输服务车票知识课件
- 《广东专升本计算机》课件
- 铁道机车专业教学湖南铁道左继红57课件
- 双语客运值班员客运工作基本要求课件
- 铁路工程安全技术石家庄铁路87课件
- 铁路客运站售票岗位作业李秀聪课件
- 中国书画文化课件
- 中华文化课件党课
- 电动车短期出租合同
- 30电导率仪作业指导书
- 给水厂毕业设计正文(全)
- 初高中生物衔接课课件
- KET词汇表(英文中文完整版)
- DBJ61-T 112-2021 高延性混凝土应用技术规程-(高清版)
- JJF(闽)1097-2020总溶解固体(TDS)测定仪校准规范-(现行有效)
- 推拉门定制安装合同协议书范本
- 麦迪床边重症系统操作指南
- 机械完整性专题知识讲座
- 《生态环境规划》课程教学大纲
- DB43∕T 1817-2020 公路货运车辆不停车超限超载检测系统建设与使用技术规范
评论
0/150
提交评论