最后交稿课程设计.doc_第1页
最后交稿课程设计.doc_第2页
最后交稿课程设计.doc_第3页
最后交稿课程设计.doc_第4页
最后交稿课程设计.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络操作系统课程设计P、V操作及进程同步的实现与IP地址获取实现学号: 061007303 姓名: 陈雨玲 指导老师: 陈建辉 计算机科学与应用系目录:操作系统原理一、实验题目.3二、设计思想说明.3三、系统结构说明.3四、数据结构说明.4五、各模块的算法流程图.5六、程序运算及清单.5七、使用说明书.10网络程序设计八、IP地址程序及注释.10九、运行结果.11十、体会与建议.12操作系统课程设计一.实验题目.有一个理发师,一把理发椅和n把提供给等候理发的顾客座的椅子。如果没有顾客,则理发师便在理发椅子上睡觉;当第一个顾客到来时,必须唤醒该理发师进行理发;如果理发师正在理发时又有顾客到来,则如果有空椅子可坐,他就坐下来等待,如果没有空椅子,他就离开理发店。顾客不分优先级 此题可看作是n个生产者和1个消费者问题。顾客作为生产者,每到来一个就使计数器rc增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器rc获得)。题目要求:(1)定义信号量并将P、V操作定义为带参数(2)以输出字符串的形式表示理发师和顾客的行为。(3)设计适当的数据结构和函数描述顾客等待队列和“唤醒”理发师理发过程,以及没有顾客时的“阻塞”理发师过程。(4)编程时需考虑理发师和顾客对应的程序是并发操作的。提示:可利用随机函数模拟并发操作。(5)理发师和顾客两个进程各自调用一个函数模拟生产及消费的操作。消费者进程开始时首先测试生产者是否存在,若不存在,则循环测试直到生产者出现为止。消费者如果是第一次执行即转为睡眠状态,则直到生产者完成产品后再唤醒消费者,然后两者协调地工作下去。二.设计思想说明题目中要求描述理发师和顾客的行为,因此需要两类进程Barber ()和Customer()分别描述理发师和顾客的行为。当理发师睡觉时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n把,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。故引入3个信号量和一个控制变量:1)控制变量waiting用来记录等候理发的顾客数,初值均为0;2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;4)信号量mutex用于互斥,初值为1 当营业时,店门口挂上“营业中,欢迎光临”,每来一个顾客响应“叮咚”,计数多一,多来一个客人。如果有位置,顾客则坐下,待到理发师完成手中的任务,理发师理下一个客人。如此,理发师就可以有条不稳的做好自己的工作。三.系统结构的说明 Main()-chairs-waiting-count-finish 当有顾客来时,理发师醒来。Count+1,理发师工作。 没来一个顾客,count+1,直到顾客数到n个,此时椅子坐满,不能再容纳顾客。 只有到理发师完成一个理发任务才能空出一个位子,容纳新来的顾客。 如此,顾客在店里不断的流动。这个设计中,共包括的函数有:void cuthair() /理发函数void gethaircut() /取得下一个顾客进行理发int main(int argc, char* argv) 四.数据结构的说明在此,我采用的是相互链接的关系数据。结点结构如下:int long waiting(0); /正在等待的顾客的数目 int chairs; /椅子的总数目 char open_door; /开门 char close_door; /关门 int count(0); /顾客的号码数 int finish(0); /理发完毕的顾客数目 count+; /来的是第几个顾客 每个结点存放作业的所有属性数据,所有结点通过头指针连接而成,结点与结点中由结点自带的指针相连,便于工作和记录。作业一HEAD头任务作业二。作业N五.各模块的算法流程图 算法中,先来先服务,因为按照顾客到来的先后顺利,理发师酌情给他们理发,没有捷径可走。容纳顾客数量最多为椅子的数量。 理发算法中:当第一个顾客到来时,理发师需要从sleep状态醒来。如果完成一个任务,则cuchair,而完成后,程序直接进行getchaircut。响应比优先算法,首先是将HEAD整个链表复制过来形成高响应比链表,然后每执行一次就算出正在执行理发任务以后所有结点的响应比,查找出响应比最高的那个结点(最先到达的顾客),这样执行下一个结点时,必定是未执行所有结点中,响应比最高的结点.由于各种算法之间都有相似之处,都包括顺序执行,和节点指针的连接,而且在系统结构说明部分记数程序中:没来一个顾客,自动输出“叮咚”,count+1,当理发师有任务在进行时,顾客则自动占用一张椅子等待。 这个程序包含的算法模块不多,所以在此不再详述。void gethaircut()顾客理发顾客流动作业中。理下一个顾客直到没有顾客Count+1停业休息六.程序运行及清单(其中包括书面源程序,实验的检查结果、程序的运行情况)(1).PV操作代码如下: int waiting=0 ; /等候理发的顾客数 int chairs=n; /为顾客准备的椅子数 semaphore customers=0, barbers=0,mutex=1; barber() while(TRUE); /理完一人,还有顾客吗? P(cutomers); /若无顾客,理发师睡眠 P(mutex); /进程互斥 waiting := waiting 1; /等候顾客数少一个 V(barbers); /理发师去为一个顾客理发 V(mutex); /开放临界区 cut-hair( ); /正在理发 customer() P(mutex); /进程互斥 if (waiting) waiting := waiting+1; / 等候顾客数加1 V(customers); /必要的话唤醒理发师 V(mutex); /开放临界区 P(barbers); /无理发师, 顾客坐着养神 get-haircut( ); /一个顾客坐下等理/ else V(mutex); /人满了,走吧! (2).详细实现: 椅子数目可以设置;程序采用用随机数产生顾客进程,也就是顾客按照随机数自动到来,这样更加接近现实生活;对于理发师,当顾客到来后去理发,如果没有顾客继续睡觉,当理完一个后,判断是否有等待,有则叫下一个来理发,没有的话去睡觉。对于客人,先看理发师是空闲还是忙,空闲则去理发,忙着的话则看是否有位置等待,有则坐下等,没有的话则离开。对于理发时间,是取系统时间来控制,设理发时间为10秒,当两次时间差大于等于10时表示理完叫下一位,小于则继续理发。并且还能控制是否开门营业,当理发师为10个以上顾客理发完成并且没有人在等待时,可以决定是否关门休息. (3)代码如下: #include windows.h #include iostream.h #include math.h #define random (rand()*10000)/RAND_MAX /定义一个随机函数来产生顾客,并且使两个顾客间的时间少于10秒 int long waiting(0); /正在等待的顾客的数目 int chairs; /椅子的总数目 char open_door; /开门 char close_door; /关门 int count(0); /顾客的号码数 int finish(0); /理发完毕的顾客数目 DWORD a; void cuthair() :Sleep (10000); cout理发完成 !endl; /理发师理发函数,用时10秒 void gethaircut() :Sleep (10001); /顾客被理发的函数,为了和理发师之间有所区别,比理发师理发时间长0.001秒。 cout第finish个顾客理发完毕,离开 endl; HANDLE Mutex=:CreateMutex(NULL, FALSE, Mutex); /用来实现进程的互斥 HANDLE barbers=:CreateSemaphore(NULL, 1,1, barbers);/定义信号量来进行线程间的同步 HANDLE customers=:CreateSemaphore(NULL,0,3,customers); DWORD WINAPI customer(LPVOID pParm2) /顾客的线程 :WaitForSingleObject(Mutex ,INFINITE); /p(mutex)来进行互斥操作 count+; /来的是第几个顾客 cout叮咚!第 count 个顾客来了 endl; if (waitingchairs) /如果还有椅子可以坐 if (waiting!=0) cout此时有waiting 个人在等待理发endl; else cout没有人在等待endl; /输出有多少人在等待 waiting+; cout还有chairs-waiting+1个座位endl; cout有座位,顾客已经坐下endl; :ReleaseSemaphore(customers,1,NULL);/v(customer) :ResumeThread(customers);/唤醒理发师进程 :ReleaseMutex(Mutex);/释放互斥量,以便其他线程使用 :WaitForSingleObject(barbers,INFINITE);/等待理发 gethaircut(); /理发并离开 else cout座位已满,第count个顾客离开endl; /没有椅子,顾客直接离开 :ReleaseMutex(Mutex); return 0; DWORD WINAPI barber(LPVOID pParm1) /理发师的线程 while(true) /一直执行 :WaitForSingleObject(customers,INFINITE);/p(customers),等待顾客 :WaitForSingleObject(Mutex,INFINITE); /等待互斥量 waiting-; /等待的人数减一 :ReleaseSemaphore(barbers,1,NULL); /释放信号量 :ResumeThread(barbers); /唤醒顾客进程 :ReleaseMutex(Mutex); /v(mutex); cuthair(); /理发 finish+; /理发完毕的顾客数目加一 return 0; int main(int argc, char* argv) coutchairs; cout理发店共有chairs把椅子endl; /设置椅子数目 cout开门接待顾客吗?Y/Nopen_door; while (open_door!=y) coutendl*对不起,尚未开门!*endl; cout开门接待顾客吗?Y/Nopen_door; HANDLE hThread1; HANDLE hThread2; hThread2=:CreateThread (NULL,0,barber,NULL,0,NULL); /产生一个理发师进程 while(close_door!=y) :Sleep(random); /顾客随机到来 hThread1=:CreateThread(NULL,0,customer,NULL,a,NULL); coutendl*营业中,欢迎光临!*=10&waiting=0) /如果完成数超过10并且没有人等待 cout已经为finish个顾客理发了,要关门下班吗?close_door; return close_door; else ; if (close_door=y) cout*对不起,暂停营业!*endl; return 0; 七.使用说明书(即用户手册)(内容包含如何登录、退出、读、写、等操作说明)这个课程设计是用C+BUIDER 6来编写的,用C+写只是为了能单步实验中的源程序名为: 执行程序名为: 网络程序设计八、IP地址程序及注释includestdafx.h#includewindows.h#include#includestdio.h#includestdlib.h#includestring.hvoid CheckIP(void) /定义check函数,用于取本机的ip地址WORD wVersionRequested; /WORD类型变量,用于存放WINDSOCk版本WSADATA wsaData;char name255;/定义用于存放获得主机名的变量CString ip;/定义IP地址变量PHOSTENT hostinfo;wVersionRequested = MAKEWORD(2,0);/调用MAKEWORD()获得Winsocl版本的正确值,用于下面的加载Winscok库if ( WSAStartup ( wVersionRequested , &wsaData ) = 0 ) /加载Winsock库,如果WSAStartup()函数返回值为0,说明加载成功,程序可以继续往下执行 if( gethostname(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论