版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计(信号量的操作)目录1题目内容及要求..........................................................................21.1题目名称...............................................................................31.2题目描述...............................................................................31.3解题思路...............................................................................41.4程序清单...............................................................................41.5提交结果框图.......................................................................82总结...........................................................................................103参考文献...................................................................................1111题目内容及要求信号量的操作(PV操作)实验目的:了解信号量机制,了解并掌握进行同步和机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。实验要求:通过对Windows系统的内核同步对象Mutexes和Semaphores的使用来实现进程同步的控制。利用CreateSemaphore、WaitForSingleObject等函数检测内核同步对象的状态。WindowsAPI:在本实验中涉及的API有:1ExitThread用于结束当前线程。VOIDExitThread(DWORDdwExitCode//exitcodeforthisthread);2信号量控制:WaitForSingleObject可在指定的时间内等待指定对象为可用状态;DWORDWaitForSingleObject(HANDLEhHandle,//handletoobjectDWORDdwMilliseconds//time-outinterval);hHandle为等待的对象,也就是实现同步或者互斥的对象。该函数一执行,相应的信号量就减去1,如果信号量小于等于0,那么他一直在循环。3实现信号量互斥和同步CreateSemaphore用于创建信号量,根据参数的不同可以利用它实现互斥和同步。ReleaseSemaphore用于释放信号量,使用后相应的信号量加121.1题目名称信号量的操作(PV操作)1.2题目描述假设某宿舍楼有一共用浴室,学校颁布法令:当有一个女生正在使用浴室,则其他女生可以进入,但是男生不行,反之亦然。在每个浴室门上有一个滑动指示符号,表示当前处于以下三种可能状态之一:1.空2.有女生3.有男生(1)构造记录浴室状态和人数的构造函数构造四个函数用来分别存放男女生的P,V信息woman_wants_to_enter,man_wants_to_enter,woman_leaves,man_leaves.(2)判断浴室处于什么状态woman_wants_to_enter,当浴室里没有人或者有女生的时候可以进去,当有男生的时候循环找另外的浴室是否有人,如果没人或者有女生的时候可以进去,否则等待。(3)对男女生进行P,V操作P操作,对浴室人数进行减1操作,判断结果是否大于等于0,如果大于等于0则进入浴室,反之等待。V操作,对顾客进行加1操作,判断结果是否大于0,如果大于0则进入等待,反之可以进入。(4)构造浴室人数函数当浴室有一个同性别人的话,责进入并人数加1,当有人从浴室出来时,人数减1。1)把信号量视为一个加锁标志位,实现对一个共享变量的互斥访问。实现过程:P(mutex);//mutex的初始值为1访问该共享数据;V(mutex);非临界区;2)把信号量视为是某种类型的共享资源的剩余个数,实现对一类共享资源的访问。3实现过程:P(resource);//resource的初始值为该资源的个数N使用该资源;V(resource);非临界区;3)把信号量作为进程间的同步工具实现过程:临界区C1;P(S);V(S);临界区C2;1.3解题思路(1)控制流程用HANDLEbathroomSemaphore函数检查浴室中是否有异性,使男女分开。如果有则寻找别的浴室或继续等待。(2)创建num[bathroomNum]创建num[bathroomNum]记录浴室里的人数,如果为异性则互斥P操作,如果为同性则进入浴室。(3)同步与互斥WaitForSingleObject(信号量名字,infinite)和ReleaseSemaphore(信号量名字,1,null)用于实现同步于互斥,执行WaitForSingleObject(信号量名字,infinite)信号量相应的信号量减1,执行ReleaseSemaphore(信号量名字,1,null)恢复1。信号量的定义:DWORDWINAPIwoman_wants_to_enter(LPVOID);//构造线程的函数DWORDWINAPIman_wants_to_enter(LPVOID);DWORDWINAPIman_leaves(LPVOID);DWORDWINAPIwoman_leaves(LPVOID);普通变量的定义:constintbathroomNum=4;//浴室数目constintNum=8;//等待的人数1.4程序清单#include<windows.h>#include<iostream>constintbathroomNum=4;constintNum=8;DWORDWINAPIwoman_wants_to_enter(LPVOID);//构造线程的函数DWORDWINAPIman_wants_to_enter(LPVOID);4DWORDWINAPIman_leaves(LPVOID);DWORDWINAPIwoman_leaves(LPVOID);DWORDWINAPIbegin(LPVOID);HANDLEMutex;//信号量互斥使用br数组HANDLEbathroomSemaphore;//同步使用浴室,使男女分开enumbathroomtype{empty=0,man=1,woman=2};typedefstruct{enumbathroomtypebt[bathroomNum];intnum[bathroomNum];}BathRoom;//纪录浴室状态和人数BathRoombr;boolg_continue=true;//循环变量usingnamespacestd;DWORDWINAPIwoman_wants_to_enter(LPVOIDlpPara){WaitForSingleObject(bathroomSemaphore,INFINITE);//同步pPWaitForSingleObject(Mutex,INFINITE);//互斥inta=rand()%bathroomNum;while(br.bt[a]==man){a=(++a)%bathroomNum;}br.bt[a]=woman;br.num[a]+=1;printf("woman进入%d浴室\n",a);printf("浴室%d这里有%d个woman\n",a,br.num[a]);for(inti=0;i<bathroomNum;i++)if(br.bt[i]==empty)printf("**--浴室%d没有人--**\n",i);elseif(br.bt[i]==man)printf("**--浴室%d有男生%d--**\n",i,br.num[i]);elseprintf("**--浴室%d有女生%d--**\n",i,br.num[i]);printf("\n");ReleaseMutex(Mutex);//互斥Vreturn0;}DWORDWINAPIman_wants_to_enter(LPVOIDlpPara){WaitForSingleObject(bathroomSemaphore,INFINITE);//PWaitForSingleObject(Mutex,INFINITE);//互斥Pinta=rand()%bathroomNum;while(br.bt[a]==woman){a=(++a)%bathroomNum;}5br.bt[a]=man;br.num[a]+=1;printf("man进入%d浴室\n",a);printf("浴室%d这里有%d个man\n",a,br.num[a]);for(inti=0;i<bathroomNum;i++)if(br.bt[i]==empty)printf("**--浴室%d没有人--**\n",i);elseif(br.bt[i]==man)printf("**--浴室%d有男生%d--**\n",i,br.num[i]);elseprintf("**--浴室%d有女生%d--**\n",i,br.num[i]);printf("\n");ReleaseMutex(Mutex);//互斥Vreturn0;}DWORDWINAPIman_leaves(LPVOIDlpPara){WaitForSingleObject(Mutex,INFINITE);//互斥Pinta=rand()%bathroomNum;while(br.bt[a]!=man){a=(++a)%bathroomNum;}br.num[a]-=1;if(br.num[a]==0){br.bt[a]=empty;ReleaseSemaphore(bathroomSemaphore,1,NULL);}printf("man离开%d浴室\n",a);printf("浴室%d还剩%d个man\n",a,br.num[a]);for(inti=0;i<bathroomNum;i++)if(br.bt[i]==empty)printf("**--浴室%d没有人--**\n",i);elseif(br.bt[i]==man)printf("**--浴室%d有男生%d--**\n",i,br.num[i]);elseprintf("**--浴室%d有女生%d--**\n",i,br.num[i]);printf("\n");ReleaseMutex(Mutex);//互斥vreturn0;}DWORDWINAPIwoman_leaves(LPVOIDlpPara){WaitForSingleObject(Mutex,INFINITE);inta=rand()%bathroomNum;while(br.bt[a]!=woman){6a=(++a)%bathroomNum;}br.num[a]-=1;if(br.num[a]==0){br.bt[a]=empty;ReleaseSemaphore(bathroomSemaphore,1,NULL);}printf("woman离开%d浴室\n",a);printf("浴室%d还剩%d个woman\n",a,br.num[a]);for(inti=0;i<bathroomNum;i++)if(br.bt[i]==empty)printf("**--浴室%d没有人--**\n",i);elseif(br.bt[i]==man)printf("**--浴室%d有男生%d--**\n",i,br.num[i]);elseprintf("**--浴室%d有女生%d--**\n",i,br.num[i]);printf("\n");ReleaseMutex(Mutex);return0;}DWORDWINAPIbegin1(LPVOIDlpPara){CreateThread(NULL,0,woman_wants_to_enter,NULL,0,NULL);Sleep(1000);CreateThread(NULL,0,woman_leaves,NULL,0,NULL);return0;}DWORDWINAPIbegin2(LPVOIDlpPara){CreateThread(NULL,0,man_wants_to_enter,NULL,0,NULL);Sleep(1000);CreateThread(NULL,0,man_leaves,NULL,0,NULL);return0;}DWORDWINAPIbegin(LPVOIDlpPara){intk=0,x=0;while(g_continue&&(x++)<Num){if(rand()%2==0)CreateThread(NULL,0,begin1,NULL,0,NULL);elseCreateThread(NULL,0,begin2,NULL,0,NULL);}return0;}7intmain(){for(inti=0;i<bathroomNum;i++){br.bt[i]=empty;br.num[i]=0;}Mutex=CreateMutex(NULL,FALSE,NULL);bathroomSemaphore=CreateSemaphore(NULL,bathroomNum+1,bathroomNum+1,NULL);CreateThread(NULL,0,begin,NULL,0,NULL);while(g_continue){if(getchar()){g_continue=false;}}return0;}1.5提交结果框图8图6.3运行结果如图所示,输出的结果是随机的,当有同性的人或者没人在浴室时可以进入,当有异性在浴室时到别的浴室查看或等待。92总结这次课程设计是关于信号量的操作,关于信号量的同步与互斥问题。通过这次设计使得我对线程以及其同步与互斥机制有了更深一步的理解。以前只是在使用操作系统,而对于其内部的工作原理并不了解,只有存在了操作系统才使得我们不用在裸机的环境下工作,让用户与计算机彻底的连接了起来。通过这次课程设计,我确实学到了很多东西,多年后我可能已经忘记这次课设最后打了多少分,但这些学到的东西却可以使我受益终生。除了知识技术上的东西,我更锻炼了自己的快速学习能力;我学会了如何快速有效地从图书馆、网络获取自己需要的信息;我尝到了在周围很多同学拷来拷去时孤军奋战的痛苦;我体会了夜以继日完成一个项目时中途过程的艰辛及最终完成后巨大的成就感……我更加深了人生的信心,以后面对任何一个困难的项目,我想我都不会惧怕,并最终能够成功地将其完成。当然最重要的还是老师的耐心指导,在此要感谢老师~
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学主题班会课件,中华传统与文化传承
- 健康饮食你我他小学主题班会课件
- 人工智能项目实施与技术应用方案
- 关于合作开展的确认函(3篇)范文
- 化妆品研发工程师产品效果及用户反馈KPI考核表
- 仓库管理单位主要负责人定期维护安全操作规程
- 养老护理员试题集及答案
- 商务出差准备指南函(3篇范文)
- 向客户解释服务延误原因函8篇
- 初级育婴员理论模拟试题(含答案)
- 江苏省建设工程施工项目部关键岗位人员变更申请表
- 电工(技师)资格考试题
- 人教版高一数学必修一全套教案设计
- GB/T 25112-2010焊接、切割及类似工艺用压力表
- 教研论文选题和撰写
- 实验三苯佐卡因的合成
- 隧道机械化施工交流
- 漂流旅游项目防洪评价报告
- 银行网点标准化服务培训课件
- (完整版)CJJ-1-2008-城镇道路工程施工与质量验收规范
- Q∕SY 1411-2011 地震叠前预测技术规范
评论
0/150
提交评论