欢迎来到天天文库
浏览记录
ID:45408214
大小:3.01 MB
页数:19页
时间:2019-11-12
《操作系统实验5》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、操作系统实验报告课程名称操作系统实验实验项目名称进程的同步学号2012201425班级20122014姓名颜凡腾专业软件工程学生所在学院软件学院指导教师曹雪实验室名称地点21b哈尔滨工程大学软件学院一、实验概述1.实验名称进程的同步2.实验目的使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。调试跟踪EOS信号量的工作过程,理解进程同步的原理。修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。3.实验类型设计二、实验环境OSLab三、实验过程使用EOS的信号量
2、解决生产者—消费者问题:立即激活虚拟机窗口查看生产者-消费者同步执行的过程17调试EOS信号量的工作过程:创建信号量17按F5继续调试,到断点处中断。观察PsInitializeSemaphore函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开“调用堆栈”窗口,查看函数的调用层次。17等待、释放信号量:等待信号量(不阻塞)按F10单步调试,直到完成PsWa
3、itForSemaphore函数中的所有操作。可以看到此次执行并没有进行等待,只是将Empty信号量的计数减少了1(由10变为了9)就返回了。17释放信号量(不换醒)按F10单步调试,直到完成PsReleaseSemaphore函数中的所有操作。可以看到此次执行没有唤醒其它线程(因为此时没有线程在Full信号量上被阻塞),只是将Full信号量的计数增加了1(由0变为了1)。1717等待信号量(阻塞)由于开始时生产者线程生产产品的速度较快,而消费者线程消费产品的速度较慢,所以当缓冲池中所有的缓冲区都被产品占用时,生
4、产者在生产新的产品时就会被阻塞.在“调用堆栈”窗口中双击Producer函数所在的堆栈帧,绿色箭头指向等待Empty信号量的代码行,查看Producer函数中变量i的值为14,表示生产者线程正在尝试生产14号产品。17在“调用堆栈”窗口中双击PsWaitForSemaphore函数的堆栈帧,查看Empty信号量计数(Semaphore->Count)的值为-1,所以会调用PspWait函数将生产者线程放入Empty信号量的等待队列中进行等待(让出CPU)。激活虚拟机窗口查看输出的结果。生产了从0到13的14个产品
5、,但是只消费了从0到13的14个产品,所以缓冲池中的10个缓冲区就都被占用了,这与之前调试的结果是一致的。17释放信号量(唤醒)只有当消费者线程从缓冲池中消费了一个产品,从而产生一个空缓冲区后,生产者线程才会被唤醒并继续生产14号产品。查看Consumer函数中变量i的值为4。查看PsReleaseSemaphore函数中Empty信号量计数(Semaphore->Count)的值为-1,和生产者线程被阻塞时的值是一致的。17按F10单步调试PsReleaseSemaphore函数,直到在代码行(第132行)Ps
6、pWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS)处中断。此时Empty信号量计数的值已经由-1增加为了0,需要调用PspWakeThread函数唤醒阻塞在Empty信号量等待队列中的生产者线程(放入就绪队列中),然后调用PspSchedule函数执行调度,这样生产者线程就得以继续执行。查看PsWaitForSemaphore函数中Empty信号量计数(Semaphore->Count)的值为0,和生产者线程被唤醒时的值是一致的。17在“调用堆栈”窗口中可以看
7、到是由Producer函数进入的。激活Producer函数的堆栈帧,查看Producer函数中变量i的值为14,表明之前被阻塞的、正在尝试生产14号产品的生产者线程已经从PspWait函数返回并继续执行了。修改EOS的信号量算法在目前EOSKernel项目的ps/semaphore.c文件中,PsWaitForSemaphore函数的Milliseconds参数只能是INFINITE,PsReleaseSemaphore函数的ReleaseCount参数只能是1。现在要求同时修改PsWaitForSemaphor
8、e函数和PsReleaseSemaphore函数中的代码,使这两个参数能够真正起到作用,使信号量对象支持等待超时唤醒功能和批量释放功能。修改PsWaitForSemaphore函数:17修改PsReleaseSemaphore函数测试:按F5调试执行原有的生产者-消费者应用程序项目,其结果如下所示17将Producer函数中等待Empty信号量的代码行WaitForSin
此文档下载收益归作者所有