操作系统实验--进程的同步heu讲解.docx

上传人:李医生 文档编号:11658326 上传时间:2021-08-28 格式:DOCX 页数:22 大小:160.31KB
返回 下载 相关 举报
操作系统实验--进程的同步heu讲解.docx_第1页
第1页 / 共22页
操作系统实验--进程的同步heu讲解.docx_第2页
第2页 / 共22页
操作系统实验--进程的同步heu讲解.docx_第3页
第3页 / 共22页
操作系统实验--进程的同步heu讲解.docx_第4页
第4页 / 共22页
操作系统实验--进程的同步heu讲解.docx_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《操作系统实验--进程的同步heu讲解.docx》由会员分享,可在线阅读,更多相关《操作系统实验--进程的同步heu讲解.docx(22页珍藏版)》请在三一文库上搜索。

1、操作系统实验报告课程名称操作系统实验课程编号0906553实验项目名称进程的同步学号年级姓名专业学生所在学院指导教师实验室名称地点哈尔滨工程大学计算机科学与技术学院第六讲进程的同步一、实验概述1 .实验名称进程的同步2 .实验目的(1)使用EOS的信号量编程解决生产者一消费者问题,理解进程同步的意义。(2)调试跟踪 EOS的信号量的工作过程,理解进程同步的原理。(3)修改EOS的信号量算法,使之支持等待超时唤醒功能 (有限等待),加深理解进程同步的原理3.实验类型验证型实验,设计性实验4.实验内容(1)准备实验(2)使用EOS的信号量解决生产者消费者问题(3)调试EOS信号量的工作过程6)1)

2、创建信号量 2)等待释放信号量 3)等待信号量(不阻塞) 4)释放信号量(不唤醒) 5)等待信号量(阻塞)释放信号量(唤醒)(4)修改EOS的信号量算法二、实验环境操作系统集成实验环境OS Lab三、实验过程1 .设计思路和流程图(bW准备卖脸*创建信号量,修改EOS的信号量算法2 .算法实现3 .需要解决的问题及解答(1) . P14牲产者在生产了 13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者 消费了 4号产品后,才能生产14号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢?答:此时生产了 0-13号14个产品,消费了 0-3号4个产品,缓冲区都占满了

3、。只有缓冲区有空闲生产者才能生产东西,有权向里面放东西。所以它必须等到消费者,取走产品,有空闲缓冲区时,才继续生产14号产品。(2) . P145-3.4修改EOS勺信号量算法(只看一次消费1个产品的,一次消费2个产品的可以写到实验报告中)答:见三,四部分(3) . 思考在 ps/semaphore.c 文件内的 PsWaitForSemaphore 和PsReleaseSemaphore函数中,为什么要使 用原子操作?答:原子操作要求一旦开始就要运行到结束,不能有中断。在执行等待信号量和释放信号量的时候, 不允许cpu响应外部中断,所以使用原子操作。(4) . 绘制 ps/semaphore

4、.c 文件内 PsWaitForSemaphore 和PsReleaseSemaphore函数的流程图。PsWaitForSemaphoreP操作结束Ps Release Semaphore4.主要数据结构、实现代码及其说明1)修改 PsWaitForSemaphore 函数if (Semaphore-Count0)Semaphore-Count-;flag=STATUS_SUCCESS;/如果信号量大于零,说明尚有资源,可以为线程分配elseflag=PspWait(&Semaphore-WaitListHead, Milliseconds);原子操作完成,恢复中断。KeEnableInte

5、rrupts(IntState); / return flag;/ 否则,说明资源数量不够,不能再为线程分配资源,因此要使线程等待2)修改 PsReleaseSemaphore函数if (Semaphore-Count + ReleaseCount Semaphore-MaximumCount) Status = STATUS_SEMAPHORE_LIMIT_EXCEEDED; else / 记录当前的信号量的值。/if (NULL != PreviousCount) *PreviousCount = Semaphore-Count;int mm=Semaphore-Count;/ 目前仅实现

6、了标准记录型信号量,每执行一次信号量的释放操作/ 只能使信号量的值增加1 。/while (!ListIsEmpty(&Semaphore-WaitListHead)&(ReleaseCount)PspWakeThread(&Semaphore-WaitListHead, STATUS_SUCCESS);PspThreadSchedule();ReleaseCount-;Semaphore-Count=mm+ReleaseCount;/ 可能有线程被唤醒,执行线程调度。/Status = STATUS_SUCCESS;5 . 源程序并附上注释#include psp.hVOIDPsInitia

7、lizeSemaphore(IN PSEMAPHORE Semaphore,IN LONG InitialCount,IN LONG MaximumCount功能描述:初始化信号量结构体。参数:Semaphore - 要初始化的信号量结构体指针。InitialCount - 信号量的初始值,不能小于0 且不能大于MaximumCount 。MaximumCount - 信号量的最大值,必须大于0。返回值:无。-*/ASSERT(InitialCount = 0 & InitialCount 0);Semaphore-Count = InitialCount;Semaphore-MaximumC

8、ount = MaximumCount;ListInitializeHead(&Semaphore-WaitListHead);STATUSPsWaitForSemaphore(IN PSEMAPHORE Semaphore,IN INT Milliseconds,IN STATUS i)/*+功能描述:信号量的 Wait 操作( P 操作) 。参数:Semaphore - Wait 操作的信号量对象。Milliseconds - 等待超时上限,单位毫秒。返回值:STATUS_SUCCESS当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回 STATUS_TIMEOUT-*/BOOL

9、 IntState;ASSERT(KeGetIntNesting() = 0); / 中断环境下不能调用此函数。IntState = KeEnableInterrupts(FALSE); / 开始原子操作,禁止中断。/ 目前仅实现了标准记录型信号量,不支持超时唤醒功能,所以PspWait 函数/ 的第二个参数的值只能是 INFINITE 。/if(Semaphore-Count 0) Semaphore-Count-;i=STATUS_SUCCESS;elsei=PspWait(&Semaphore-WaitListHead,Milliseconds );KeEnableInterrupts(

10、IntState); / 原子操作完成,恢复中断。return i;STATUSPsReleaseSemaphore(IN PSEMAPHORE Semaphore,IN LONG ReleaseCount,OUT PLONG PreviousCount)/*+功能描述:信号量的 Signal 操作( V 操作) 。参数:Semaphore - Wait 操作的信号量对象。ReleaseCount - 信号量计数增加的数量。当前只能为1。当你修改信号量使之支持超时唤醒功能后,此参数的值能够大于等于1。PreviousCount - 返回信号量计数在增加之前的值。返回值:如果成功释放信号量,返回

11、STATUS_SUCCESS。-*/STATUS Status;BOOL IntState;IntState = KeEnableInterrupts(FALSE); / 开始原子操作,禁止中断。if (Semaphore-Count + ReleaseCount Semaphore-MaximumCount) Status = STATUS_SEMAPHORE_LIMIT_EXCEEDED; else / 记录当前的信号量的值。/if (NULL != PreviousCount) *PreviousCount = Semaphore-Count;/INT j=Semaphore-Count

12、;/ 目前仅实现了标准记录型信号量,每执行一次信号量的释放操作/ 只能使信号量的值增加1。/while(!ListIsEmpty(&Semaphore-WaitListHead)&(ReleaseCount)PspWakeThread(&Semaphore-WaitListHead, STATUS_SUCCESS);PspThreadSchedule();ReleaseCount-;Semaphore-Count=j+ReleaseCount;Status = STATUS_SUCCESS;KeEnableInterrupts(IntState); / 原子操作完成,恢复中断。return S

13、tatus;POBJECT_TYPE PspSemaphoreType = NULL;/ 用于初始化 semaphore 结构体的参数结构体。/typedef struct _SEM_CREATE_PARAMLONG InitialCount;LONG MaximumCount;SEM_CREATE_PARAM, *PSEM_CREATE_PARAM;/ semaphore 对象的构造函数,在创建新semaphore 对象时被调用。/VOIDIN PVOID SemaphoreObject,IN ULONG_PTR CreateParam)PsInitializeSemaphore( (PSE

14、MAPHORE)SemaphoreObject,(PSEM_CREATE_PARAM)CreateParam)-InitialCount,(PSEM_CREATE_PARAM)CreateParam)-MaximumCount );/ semaphore 对象类型的初始化函数。/VOIDPspCreateSemaphoreObjectType(VOID)STATUS Status;OBJECT_TYPE_INITIALIZER Initializer;Initializer.Create = PspOnCreateSemaphoreObject;Initializer.Delete = NUL

15、L;Initializer.Wait = (OB_WAIT_METHOD)PsWaitForSemaphore;Initializer.Read = NULL;Initializer.Write = NULL;Status = ObCreateObjectType(SEMAPHORE, &Initializer, &PspSemaphoreType);if (!EOS_SUCCESS(Status) KeBugCheck(Failed to create semaphore object type!);/ / semaphore 对象的构造函数。/STATUSPsCreateSemaphore

16、Object(IN LONG InitialCount,IN LONG MaximumCount,IN PSTR Name,OUT PHANDLE SemaphoreHandle)STATUS Status;PVOID SemaphoreObject;SEM_CREATE_PARAM CreateParam;if(InitialCount 0 | MaximumCount MaximumCount) return STATUS_INVALID_PARAMETER;/ 创建信号量对象。/CreateParam.InitialCount = InitialCount;CreateParam.Max

17、imumCount = MaximumCount;Status = ObCreateObject( PspSemaphoreType,Name,sizeof(SEMAPHORE),(ULONG_PTR)&CreateParam, &SemaphoreObject);if (!EOS_SUCCESS(Status) return Status;Status = ObCreateHandle(SemaphoreObject, SemaphoreHandle);if (!EOS_SUCCESS(Status) ObDerefObject(SemaphoreObject);return Status;

18、/ semaphore 对象的 signal 操作函数。/STATUSPsReleaseSemaphoreObject(IN HANDLE Handle,IN LONG ReleaseCount,IN PLONG PreviousCount)STATUS Status;PSEMAPHORE Semaphore;if (ReleaseCount fiD3hkEDIni t i UC xt无法计宜表达式的植,MixiiimCffunt无法计尊表达式的值口5曜加可卜。=铝。皿t0x93)释放信号量(不唤醒)1删除所有的断点(防止有些断点影响后面的调试)。Q)在eosapp.c 文件的Producer

19、函数中,释放Full 信号量的代码行(第152行)ReleaseSemaphore(FullSemaphoreHandle, 1, NULL);添加一个断点。按F5继续调试,到断点处中断。(4按 F11 调试进入 ReleaseSemaphore 函数。(5)继续按 F11 调试进入 PsReleaseSemaphoreObject 函数。(6先使用F10单步调试,当黄色箭头指向第269行时使用F11单步调试,进入PsReleaseSemaphore 函数。按F10单步调试,直到完成 PsReleaseSemaphore函数中的所有操作。可以看到此次执行没 有唤醒其它线程(因为此时没有线程在F

20、ull信号量上被阻塞),只是将Full信号量的计数增加了 1(由0变为了 1 )。有徨名痂与电的tphair*Ini tiWaitListHead, INFINITE); 代码行(第 78 行)添加一个断点。(6按F5继续调试,并立即激活虚拟机窗口查看输出。开始时生产者、消费者都不会被信号量阻塞,同步执行一段时间后才在断点处中断。中断后,查看“调用堆栈”窗口,有 Producer函数对应的堆栈帧,说明此次调用是从生产者 线程函数进入的。在 的代码行,“调用堆栈”窗口中双击 Producer函数所在的堆栈帧,绿色箭头指向等待查看 Producer函数中变量i的值为14 ,表示生产者线程正在尝试生

21、产Empty 信号量14号产品。Sanaphar a- 4。皿 1无法计苴表达式的值.i佰无法过菖表法式的值, 无械计麻际庖 无法计宜表达式的值,与电MoiKin-unC auntEmpty 信Empty 信调用堆栈窗口中双击PsWaitForSemaphore 函数的堆栈帧,查号量的等待队列中进行等待(让出号量计数(Semaphore-Count)的值为-1 ,所以会调用PspWait函数将生产者线程放入塔规 Q X名班信Swapkorci(PSENATHDRE) 口两口 fhafDliu. ti alCouBt无法讨罪友达式的值.H 潞皿 t无法计宜表达式的值.OsfffffEffi无法计

22、算表达式的值.CPU)。砥激活虚拟机窗口查看输出的结果。生产了从0到13的14个产品,但是只消费了从0到3的4个产品,所以缓冲池中的 10个缓冲区就都被占用了,这与之前调试的结果是一致的。05 LabrciCEDSdftTirtualrc 20Q7斥E.4i tD口吁py MtlpCONSOLE-1(Press CtrlFffH to switclh cofieoIc uindou .)klE ICOIeJ EOS;shellpAutonuki A:DDSAp.eKeproduct a0ConsumeA 0ndux d1ffrodwee a2product Q3brndlii ri4Consu

23、ihca 1Troduce a5ProdkiE w6Priodwce a7ffirodwee a8Conswnea ZProdiice a9prodii匚t a10Frocljiicc a11P才MILiM d12Constunca 3produce aU5)释放信号量(唤醒)。删除所有断点。(2在eosapp.c 文件的Consumer函数中,释放 Empty信号量的代码行(第 180行)ReleaseSemaphore(EmptySemaphoreHandle, 1, NULL);添加一个断点。按F5继续调试,到断点处中断。查看Consumer函数中变量i的值为4,说明已经消费了 4号产品

24、。T t X名说i肉Sn-aplioTIiti ti alCeunt无法计苴志迭式酎宿. 无法计苴表达式酎值.H wc i rmui。心皿土无法叶苴表达式的位.Stn-aptcirt-X?iiJLt无法计其表达式的但.i口工4(5按照3.3.2.2中的方法使用 F10 和F11调试进入PsReleaseSemaphore 函数。(6查看 PsReleaseSemaphore 函数中 Empty 信号量计数(Semaphore-Count)的值为-1 ,和生线程被阻塞时的值是一致的即t a :若赫值力“phar中 Ini tialCcwt.CrsEHtfunM) m叩3fb*fn 无法计H表这式

25、酎值.n&Mim-unCemt无法计苴表达式的佗.Stnuph.orD-XTULtOiffffffi无法计箕表达式的值按F10单步调试PsReleaseSemaphore函数,直到在代码行(第 132行)PspWakeThread(&Semaphore-WaitListHead, STATUS_SUCCESS);处中断。此时 Empty信号量计数的值已经由-1增加为了 0,需要调用 PspWakeThread函数 唤醒阻塞在Empty信号量等待队列中的生产者线程(放入就绪队列中),然后调用PspSchedule函数行调度,这样生产者线程就得以继续执行。名称Sen-iptiGirEIn.Lt 3

26、皿匚皿*MwinnrC。皿匕SnCount)的值为 0,和生产者线 程被唤醒时的值是一致的。在调用堆栈窗口中可以看到是由Producer函数进入的。激活 Producer函数的堆栈帧,查看Producer函数中变量i的值为14,表明之前被阻塞的、正在尝试生产 14号产品的生产者线程已 经从PspWait函数返回并继续执行了。名称与电FIIax iniinC dim ISafiapkar a-空 oiml无法i+史表法式的伯, 无法计麻即制同 无法计宜表达式的值, 无法i十官表达式的值.结束此次调试。(4)修改EOS的信号量算法1)修改 PsWaitForSemaphore 函数2)修改 PsR

27、eleaseSemaphore 函数3)使用修改完毕的EOS Kernel项目生成完全版本的 SDK文件夹,并覆盖之前的生产者消费者应 用程序项目的SDK文件夹。4)按F5调试执行原有的生产者-消费者应用程序项目,结果必须仍然与图13-2 一致。如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤1。5)将Producer函数中等待Empty信号量的代码行WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 替换为while(WAIT_TIMEOUT = WaitForSingleObject(EmptySemaphore

28、Handle, 300)printf(Producer wait for empty semaphore timeoutn);6)将Consumer函数中等待Full信号量的代码行WaitForSingleObject(FullSemaphoreHandle, INFINITE);替换为while(WAIT_TIMEOUT = WaitForSingleObject(FullSemaphoreHandle, 300)printf(Consumer wait for full semaphore timeoutn);7)启动调试新的生产者一消费者项目,查看在虚拟机中输出的结果,验证信号量超时等待

29、功能是否能够正常执行。如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改, 并重复步骤18)如果超时等待功能已经能够正常执行,可以考虑将消费者线程修改为一次消费两个产品,来测试ReleaseCount参数是否能够正常使用。使用实验文件夹中NewConsumer.c文件中的Consumer函数替换原有的Consumer函数 9) 一次性消费一个产品Prmdluce a 0Preduce a 1Prindluce & ZF rod uice a 3Pradu.Ec a 4FrodiiDE a 5PrcduEe a 6Produce 也 7FroduDC aProduce a 3Produ

30、ce a 10Caresuroe 鞋CansurwR a 1UftSULE 1 (Frcsa CtrliFliy to suitrh cdiisi roduvec a 11 reduce aCnc;Dutreduce ii 13CemsvF i, hPireducc a 16 rrodiiGcr writ FfMli匪r ui,i I Produce忙 uait rroducer mit FfMli匪r ui,i Irreduce m 17 FfMli匪r ui,i I Produce忙 uait rroducer mit FfMli匪r ui,i I Produce忙 uaitF广加曲d f

31、H Produce忙 uait rroducer wiitfor enpty senaphort: tiHEDutT力?emjiljij kfiqph口E I for enpty stHaphorc timcLNit for enpty wnApharc timrmit T力?emjiljij kfiqph口E I Ijncitit Ccmsiuic 社?T4?Kn|lUj KFldpIhtire I EnKCHlt for enpty stHaphorc timcLNit for enpty wnApharc timrmit T力?Knjiljj KFidpIhtire I Ijncitit

32、 for enpty stHaphorc timcLNit GOflEUflC . Bfor enpty stHaphorc timcLNit for enpty wnApharc timrmitrciducerunitforEnptysemaphoret imeantroduceruaitforsnptysemaphoret imeantroducerforenptysemaphoret imcDiitreducerua itforEnptysemapIbDret imeoiitreduceruaitforenptyscmaplkarct imeoiitCDnsune a 另|Trcilucr a 19Consunc- a IDrcduacc a 20ConsLine a 11Consuiw a 1ZConsunc- 13Consume & 14ConELine m 15mdui3 0 Z1Consurwe a 16Cansurwe- a 17Cennsurte 口 10Consurtc 口 ISComsurfcc

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1