欢迎来到天天文库
浏览记录
ID:8797412
大小:262.00 KB
页数:13页
时间:2018-04-08
《操作系统课程设计---信号量的操作》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、《操作系统》课程设计专业:计算机科学与技术班级:学号姓名成绩题目名称:信号量的操作完成日期:2011年12月22日12目录第一章概述21.实验目的22、开发平台及实验环境:33、实验要求3第二章设计需求31.信号量的概念32.信号量的分类43.信号量于PV操作的关系4第三章实例分析51.设计思想53.运行结果截图104.总结11参考文献1212第一章概述1.实验目的了解信号量机制,了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。2、开发平台及实验环境:系统平台:windows环境实现语言:C++语言开发工具:MicrosoftVisualC
2、++6.03、实验要求通过对windows系统的内核同步对象mutexes和semaphores的使用来实现进程同步的控制。利用CreateSemaphore、WaitForSingleObject等函数检测内核同步对象的状态。第二章设计需求1.信号量的概念12信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个
3、信号量VI,然后将AcquireSemaphoreVI以及ReleaseSemaphoreVI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。2.信号量的分类信号量按其用途分为两种:(1)公用信号量:初值常常为1,用来实现进程间的互斥。相关进程均可对其执行P、V操作。(2)私有信号量:初值常常为可用资源数,多用来实现进程同步。拥有该信号量的一类进程可以对其执行P操作,而另一类进程可以对其执行V操作,多用于并发进程的同步。信号量按照取值可以分为两种:(1)二元信号量:仅允许取0和1,主要用于解决进程互斥;(2)一般信号量(计数信号量):允许取任意整
4、数值,主要用于解决进程同步问题。3.信号量于PV操作的关系P操作信号量的值减一如果满足if条件,执行了P操作的进程会挂起,P操作语句之后的语句都不会再执行。被挂起的进程,除非另一个进程调用V()来唤醒它,否则永远不会执行。V操作信号量的值加一如果满足if条件,执行V操作的进程会去唤醒另一个正在等待的进程(被挂起的进程)。执行V操作的进程不会自愿停止,V操作后面的语句会接着执行被唤醒的进程只是进入了就绪队列,并不一定有机会马上被执行12被唤醒的进程,从挂起点接着执行,也就是P操作之后的语句第三章实例分析1.设计思想假设某个饭店有一公共厕所,但是不分男女,老板规定,当有男生上厕所
5、时,其他男生可以进去,女生不能进入,有女生先进去的时候其他女生可以进去,男生不能进入2.程序代码#include#include#defineTHREADCOUNT40HANDLEghEvent;intiCurrentBoy=0;intiCurrentgirl=0;DWORDWINAPIBoyWereWCing(LPVOID);DWORDWINAPIgirlWereWCing(LPVOID);voidmain(){HANDLEaThread[THREADCOUNT];DWORDThreadID;inti;12//Createamutex
6、withnoinitialownerghEvent=CreateEvent(NULL,//defaultsecurityattributesFALSE,//beManualResetTRUE,//initiallynotownedNULL);//unnamedmutexif(ghEvent==NULL){printf("CreateEventerror:%d",GetLastError());return;}//Createworkerthreadsfor(i=0;i7、aultsecurityattributes0,//defaultstacksize(LPTHREAD_START_ROUTINE)BoyWereWCing,NULL,//nothreadfunctionarguments0,//defaultcreationflags&ThreadID);//receivethreadidentifierif(aThread[i]==NULL){printf("CreateThreaderror:%d",GetLastError());return;12}aThr
7、aultsecurityattributes0,//defaultstacksize(LPTHREAD_START_ROUTINE)BoyWereWCing,NULL,//nothreadfunctionarguments0,//defaultcreationflags&ThreadID);//receivethreadidentifierif(aThread[i]==NULL){printf("CreateThreaderror:%d",GetLastError());return;12}aThr
此文档下载收益归作者所有