下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 操作系统课程设计 理发师问题的实现

操作系统课程设计 理发师问题的实现.doc

操作系统课程设计 理发师问题的实现

Frank学凯
2017-10-21 0人阅读 举报 0 0 暂无简介

简介:本文档为《操作系统课程设计 理发师问题的实现doc》,可适用于高等教育领域

操作系统课程设计理发师问题的实现*******************实践教学*******************计算机与通信学院年秋季学期操作系统课程设计题目:理发师问题的实现专业班级:计算机科学与技术姓名:学号:指导教师:成绩:摘要理发师问题是一个利用信号量进行PV操作的经典问题。设计程序实现此问题要使得理发师的活动与顾客的活动得到各自真实的模拟。所执行的程序应体现:理发师在没有顾客的时候去睡觉有顾客则工作顾客在理发师工作时坐下等待无座时离开直至等到理发师自己理发。关键字:理发师顾客PV操作。目录摘要设计要求初始条件技术要求总体设计思想及开发环境与工具总体设计思想多线程编程原理创建一个线程等待一个线程结束信号量伪码实现开发环境与工具数据结构与模块说明数据结构函数的调用关系图主函数模块理发师模块顾客模块运行结果运行步骤测试结果编辑编译和运行的过程图错误部分截图正确运行结果图设计总结参考文献致谢附录(源程序代码)设计要求初始条件()操作系统:Linux()程序设计语言:C语言()设有一个理发师把椅子(另外还有一把理发椅)几把椅子可用连续存储单元。技术要求()为每个理发师,顾客产生一个线程设计正确的同步算法()每个顾客进入理发室后即时显示“Entered”及其线程自定义标识还同时显示理发室共有几名顾客及其所坐的位置。()至少有个顾客每人理发至少秒钟。()多个顾客须共享操作函数代码。总体设计思想及开发环境与工具总体设计思想题目中要求描述理发师和顾客的行为因此需要两类线程barber()和customer()分别描述理发师和顾客的行为。其中理发师有活动有理发和睡觉两个事件等待和理发二个事件。店里有固定的椅子数上面坐着等待的顾客顾客在到来这个事件时需判断有没有空闲的椅子理发师决定要理发或睡觉时也要判断椅子上有没有顾客。所以顾客和理发师之间的关系表现为:()理发师和顾客之间同步关系:当理发师睡觉时顾客近来需要唤醒理发师为其理发当有顾客时理发师为其理发没有的时候理发师睡觉。()理发师和顾客之间互斥关系:由于每次理发师只能为一个人理发且可供等侯的椅子有限只有n把即理发师和椅子是临界资源所以顾客之间是互斥的关系。()故引入个信号量和一个控制变量:控制变量waiting用来记录等候理发的顾客数初值为信号量customers用来记录等候理发的顾客数并用作阻塞理发师进程初值为信号量barbers用来记录正在等候顾客的理发师数并用作阻塞顾客进程初值为信号量mutex用于互斥初值为多线程编程原理此次在Linux下进行多线程编程需要用到pthreadcreate和pthreadjoin这两个函数。创建一个线程pthreadcreate用来创建一个线程原型为:externintpthreadcreate((pthreadt*thread,constpthreadattrt*attr,void*(*startroutine)(void*),void*arg))第一个参数为指向线程标识符的指针第二个参数用来设置线程属性第三个参数是线程运行函数的起始地址最后一个参数是运行函数的参数。函数thread不需要参数时最后一个参数设为空指针。第二个参数设为空指针时将生成默认属性的线程。创建线程成功后新创建的线程则运行参数三和参数四确定的函数原来的线程则继续运行下一行代码。等待一个线程结束pthreadjoin用来等待一个线程的结束函数原型为:externintpthreadjoinP((pthreadtth,void**threadreturn))第一个参数为被等待的线程标识符第二个参数为一个用户定义的指针它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数调用它的函数将一直等待到被等待的线程结束为止当函数返回时被等待线程的资源被收回。信号量()函数seminit()用来初始化一个信号量函数原型为:externintseminitP((semt*sem,intpshared,unsignedintvalue))sem为指向信号量结构的一个指针pshared不为,时此信号量在进程间共享否则只能为当前进程的所有线程共享value给出了信号量的初始值。()函数sempost(semt*sem)用来增加信号量的值。当有线程阻塞在这个信号量上时调用这个函数会使其中的一个线程不在阻塞选择机制同样是由线程的调度策略决定的。()函数semwait(semt*sem)被用来阻塞当前线程直到信号量sem的值大于解除阻塞后将sem的值减一表明公共资源经使用后减少。函数semtrywait(semt*sem)是函数semwait()的非阻塞版本它直接将信号量sem的值减一。伪码实现difinen为顾客准备的椅子数为semaphoremutex=用于互斥semaphorecustomers=等候理发的顾客数semaphorebarbers=正在等候顾客的理发师数intwaiting=等候理发的顾客数理发师线程voidbarber(){while(true)判断有无顾客{wait(customers)若无顾客,理发师睡眠wait(mutex)互斥waiting等候顾客数少一个signal(mutex)释放临界资源signal(barber)理发师去为一个顾客理发cuthair正在理发}}顾客线程voidcustomer(){wait(mutex)互斥if(waiting<n)如果有空椅子则等待{waiting等候顾客数加signal(mutex)释放临界资源signal(customers)如果理发师睡觉唤醒理发师wait(barber)理发师在理发,顾客等候gethaircut顾客坐下等理发师}elsesignal(mutex)店里人满了,顾客离开}}开发环境与工具系统平台:LINUX环境实现语言:C语言开发工具:NANO编辑器数据结构与模块说明数据结构通过分析课程设计要求定义以下的数据:semtmutex,customers,barbersdesignthreesemaphores:mutex,customer,barbersintwaiting=thenumberofwaitingcustomersintchair函数的调用关系图主函数模块主函数流程图如下:理发师模块理发师模块函数流程图如下:顾客模块顾客模块函数流程图如下:运行结果运行步骤()打开桌面上的puttyexe输入IP地址进入开发环境。创建一个用来写程序的文件这里用的是nano编辑器来编写c程序。创建SleepingBarberc的命令为:nano进入编辑环境输入代码结束后按ctrlx保存为SleepingBarberc进入文件的命令为:nanoSleepingBarberc然后可以对其进行修改。()编译源程序编译命令为:cclpthreadoSleepingBarberSleepingBarberc()编译无错误后运行程序命令为:SleepingBarber测试结果编辑编译和运行的过程图错误部分截图正确运行结果图第一次运行结果如下图:第二次运行结果如下图:第三次运行结果如下图设计总结两周的的操作系统课程设计终于完成了回想这两周的努力感触良多。拿到题目时我不知从何下手想想自己对Liunx一无所知无奈只好去查阅相关书籍并在网上查找了相关资料了解了linux多线程编程的原理应注意的问题及一些常用命令第一周先设计出了该程序的伪代码即其wait、signal操作。然后根据其要求进行编程由于使用的是多线程编程开始进行编译的时候编译命令输入错误没有输入lpthread程序总是出现错误。同时创建线程函数时由于对其格式输入错误导致程序无法运行。例如sbcsbc等都为本次调试时的程序。第二周主要是不断的调试并完善程序。程序可以运行但与要求总有些不符故不断的进行修改并对其输出的格式进行完善使其输出看起来美观一些容易观察一些。例如scbc等程序为此次调试结果。然后是在原有代码的基础上使程序更完整些。并进行结果的截图开始设计并编写课程设计说明书。通过本次编程我熟悉了linux下的多线程编程和信号量实现wait、signal操作的全过程对同步和互斥问题也有了更深一步的理解同时也使我对linux编程有了更多的了解在很多方面它与在windows下编程有着很大的不同对与多线程来说更方便一些。设计过程中也遇到不少困难尤其是对于多线程的实现结果总是不如想象中完美。比如其顾客编号的输出有时会不按顺序输入有点乱。另外有时输出结束后程序仍无法结束必须强制性关闭终端才可以结束程序这是本程序的一个不足之处。在本次课程设计中我深深感觉到自己掌握的知识还远远不够我明白光是知道书本上的知识是远远不够的一定要把理论知识和实践结合起来。同时要多多学习linux的操作。参考文献汤子瀛~哲凤屏《计算机操作系统》西安电子科技大学学出版社王清~李光明《计算机操作系统》冶金工业出版社孙钟秀等操作系统教程高等教育出版社曾明Linux操作系统应用教程陕西科学技术出版社张丽芬~刘利雄《操作系统实验教程》清华大学出版社孟静~操作系统教程,,原理和实例分析高等教育出版社周长林~计算机操作系统教程高等教育出版社张尧学~计算机操作系统教程~清华大学出版社任满杰~操作系统原理实用教程~电子工业出版社致谢在此次课程设计的过程中我首先要感谢我的指导老师张永老师给了我很大的帮助与此同时感谢宿舍的舍友对此次课程设计的程序的调试工作给予了大力的帮助。附录(源程序代码)#include<stdioh>#include<stdlibh>#include<unistdh>#include<pthreadh>#include<semaphoreh>#include<fcntlh>#include<errnoh>#definentheshophavefivechairsdesignthreesemaphores:mutex,customer,barberssemtmutex,customers,barbersintwaiting=thenumberofwaitingcustomersintchairvoid*barber()void*customer(void*arg)intmain(intargc,char*argv){createsemaphoresandoneBarbersemaphorepthreadtCustomerid,Barberidintiseminit(mutex,,)initmutexsemaphoretoseminit(customers,,)initsemaphorecustomerstoseminit(barbers,,)for(i=i<i)pthreadcreate(Barberid,,(void*)barber,)for(i=i<i)pthreadcreate(Customeridi,,(void*)customer,(void*)(i))for(i=i<i)pthreadjoin(Customeridi,)for(i=i<i)pthreadjoin(Barberid,)return}creatbarberpthreadvoid*barber(){intiintnextwait(customers),ifnocustomers,barbersleepingsemwait(customers)semwait(mutex)wait(mutex)waitingthenumerofwaitingreduceonefor(i=i<i){if(chairi!=){next=chairichairi=break}}printf("Thebarberiscuttingdthcustomer'shairn",next)sleep()sempost(mutex)sempost(barbers)}creatcustomerpthreadvoid*customer(void*arg){intisemwait(mutex)wait(mutex)if(waiting<n)if(waiting<n){waitingthenumerofwaitingplusonefor(i=i<i){if(chairi==){chairi=(int)argbreak}}printf("***************************************************n")printf("Entered:Numberdcustomercomes,andsitsatdchairn",(int)arg,(i))printf("Therearedcustomeronthechairn",waiting)printf("Thecustomers'locationare:")for(i=i<i)printf("d",chairi)printf("n")sleep()sempost(mutex)signal(mutex)sempost(customers)signal(customers)semwait(barbers)wait(barbers)}else{printf("Numberdcomes,therearenochairs,thecustomerdisleavingn",(int)arg,(int)arg)sempost(mutex)}}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/20

操作系统课程设计 理发师问题的实现

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利