最后交稿课程设计

上传人:kms****20 文档编号:40512770 上传时间:2018-05-26 格式:DOC 页数:11 大小:69.50KB
返回 下载 相关 举报
最后交稿课程设计_第1页
第1页 / 共11页
最后交稿课程设计_第2页
第2页 / 共11页
最后交稿课程设计_第3页
第3页 / 共11页
最后交稿课程设计_第4页
第4页 / 共11页
最后交稿课程设计_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《最后交稿课程设计》由会员分享,可在线阅读,更多相关《最后交稿课程设计(11页珍藏版)》请在金锄头文库上搜索。

1、网络操作系统课程设计网络操作系统课程设计P、V 操作及进程同步的实现与 IP 地址获取实现学号:学号: 061007303 姓名:姓名: 陈雨玲陈雨玲 指导老师:指导老师: 陈建辉陈建辉 计算机科学与应用系计算机科学与应用系2目录:目录:操作系统原理一、实验题目.3二、设计思想说明.3三、系统结构说明.3四、数据结构说明.4五、各模块的算法流程图.5六、程序运算及清单.5七、使用说明书.10网络程序设计八、IP 地址程序及注释.10九、运行结果.11十、体会与建议.123操作系统课程设计操作系统课程设计一一.实验题目实验题目.有一个理发师,一把理发椅和 n 把提供给等候理发的顾客座的椅子。如果

2、没 有顾客,则理发师便在理发椅子上睡觉;当第一个顾客到来时,必须唤醒该理 发师进行理发;如果理发师正在理发时又有顾客到来,则如果有空椅子可坐, 他就坐下来等待,如果没有空椅子,他就离开理发店。顾客不分优先级 此题可看作是 n 个生产者和 1 个消费者问题。 顾客作为生产者,每到来一个就使计数器 rc 增加 1,以便让理发师理发 (相当于消费)至最后一个顾客(相当于产品) 。并且,第 1 个到来的顾客应负 责唤醒理发师;如果不是第 1 个到达的顾客,则在有空椅子的情况下坐下等待, 否则离开理发店(该消息可由计数器 rc 获得) 。 题目要求:(1)定义信号量并将 P、V 操作定义为带参数 (2)

3、以输出字符串的形式表示理发师和顾客的行为。 (3)设计适当的数据结构和函数描述顾客等待队列和“唤醒”理发师理发 过程,以及没有顾客时的“阻塞”理发师过程。 (4)编程时需考虑理发师和顾客对应的程序是并发操作的。 提示:可利用随机函数模拟并发操作。 (5)理发师和顾客两个进程各自调用一个函数模拟生产及消费的操作。 消费者进程开始时首先测试生产者是否存在,若不存在,则循环测试直到生产 者出现为止。消费者如果是第一次执行即转为睡眠状态,则直到生产者完成产 品后再唤醒消费者,然后两者协调地工作下去。二二.设计思想说明设计思想说明 题目中要求描述理发师和顾客的行为,因此需要两类进程 Barber ()和

4、 Customer()分别描述理发师和顾客的行为。当理发师睡觉时顾客近来需要唤醒理 发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉,因此理 发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等 侯的椅子有限只有 n 把,即理发师和椅子是临界资源,所以顾客之间是互斥的 关系。故引入 3 个信号量和一个控制变量:1)控制变量 waiting 用来记录等候理 发的顾客数,初值均为 0;2)信号量 customers 用来记录等候理发的顾客数,并 用作阻塞理发师进程,初值为 0;3)信号量 barbers 用来记录正在等候顾客的理 发师数,并用作阻塞顾客进程,初值为 0;

5、4)信号量 mutex 用于互斥,初值为 1 当营业时,店门口挂上“营业中,欢迎光临” ,每来一个顾客响应“叮咚” , 计数多一,多来一个客人。如果有位置,顾客则坐下,待到理发师完成手中的 任务,理发师理下一个客人。如此,理发师就可以有条不稳的做好自己的工作。三三.系统结构的说明系统结构的说明Main()-chairs-waiting-count-finish当有顾客来时,理发师醒来。Count+1,理发师工作。没来一个顾客,count+1,直到顾客数到 n 个,此时椅子坐满,不能再容纳顾4客。只有到理发师完成一个理发任务才能空出一个位子,容纳新来的顾客。如此,顾客在店里不断的流动。这个设计中

6、,共包括的函数有: 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+; /来的是第几个顾客 每个

7、结点存放作业的所有属性数据,所有结点通过头指针连接而成,结点与结 点中由结点自带的指针相连,便于工作和记录。作业一HEAD 头任务作业二。 。 。 。 。作业 N五五.各模块的算法流程图各模块的算法流程图算法中,先来先服务,因为按照顾客到来的先后顺利,理发师酌情给他们理 发,没有捷径可走。容纳顾客数量最多为椅子的数量。理发算法中:当第一个顾客到来时,理发师需要从 sleep 状态醒来。如果完 成一个任务,则 cuchair,而完成后,程序直接进行 getchaircut。响应比优先算法,首先是将 HEAD 整个链表复制过来形成高响应比链表,然后每执行一次就算出正在执行理发任务以后所有结点的响应

8、比,查找出响应比最高的那个结点(最先到达的顾客) ,这样执行下一个结点时,必定是未执行所有结点中,响应比最高的结点.由于各种算法之间都有相似之处,都包括顺序执行,和节点指针的连接,而且在系统结构说明部分 记数程序中:没来一个顾客,自动输出“叮咚” ,count+1,当理发师有任务 在进行时,顾客则自动占用一张椅子等待。5这个程序包含的算法模块不多,所以在此不再详述。顾客流动 作业中。 。 。理下一个顾客 直到没有顾客Count+1六六.程序运行及清单(其中包括书面源程序,实验的检查结果、程序程序运行及清单(其中包括书面源程序,实验的检查结果、程序 的运行情况)的运行情况) (1).PV 操作代

9、码如下: 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 (wa

10、iting) void gethaircut() 顾客理发停业休息6 waiting := waiting+1; / 等候顾客数加 1 V(customers); /必要的话唤醒理发师 V(mutex); /开放临界区 P(barbers); /无理发师, 顾客坐着养神 get-haircut( ); /一个顾客坐下等理/ else V(mutex); /人满了,走吧! (2).详细实现: 椅子数目可以设置;程序采用用随机数产生顾客进程,也就是顾客按照随机数 自动到来,这样更加接近现实生活;对于理发师,当顾客到来后去理发,如果没有 顾客继续睡觉,当理完一个后,判断是否有等待,有则叫下一个来理发

11、,没有 的话去睡觉。对于客人,先看理发师是空闲还是忙,空闲则去理发,忙着的话 则看是否有位置等待,有则坐下等,没有的话则离开。对于理发时间,是取系 统时间来控制,设理发时间为 10 秒,当两次时间差大于等于 10 时表示理完叫 下一位,小于则继续理发。并且还能控制是否开门营业,当理发师为 10 个以上 顾客理发完成并且没有人在等待时,可以决定是否关门休息. (3)代码如下: #include “windows.h“ #include “iostream.h“ #include “math.h“ #define random (rand()*10000)/RAND_MAX /定义一个随机函数来产

12、生顾客,并 且使两个顾客间的时间少于 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); coutchairs; coutopen_door; while (open_door!=y) coutopen_door; HANDLE hThread1; HANDLE hThread

13、2; hThread2=:CreateThread (NULL,0,barber,NULL,0,NULL); /产生一个理发师进程 while(close_door!=y) :Sleep(random); /顾客随机到来 hThread1=:CreateThread(NULL,0,customer,NULL,a,NULL); cout=10 return close_door; else ; if (close_door=y) cout #include“stdio.h“ #include“stdlib.h“ #include“string.h“void CheckIP(void) /定义 c

14、heck 函数,用于取本机的 ip 地址 WORD wVersionRequested; /WORD 类型变量,用于存放 WINDSOCk 版本 WSADATA wsaData;char name255; /定义用于存放获得主机名的变量 CString ip; /定义 IP 地址变量 PHOSTENT hostinfo; wVersionRequested = MAKEWORD(2,0); /调用 MAKEWORD()获得 Winsocl 版本的正确值,用于下面的加载 Winscok 库if ( WSAStartup ( wVersionRequested , /=inet_ntoa()函数的

15、用法。 。/调用 inet_ntoa()函数,将 hostinfo 结构变量中的 h_addr_list 转化为标准的 IP 地址(如 192.124.20.0.)printf(“%sn“,ip);/输出 IP 地址WSACleanup(); /卸载 Winsock 库,并释放所有资源 int man(int argc,char* argv) /主函数,程序的入口 CheckIP(); /调用 CheckIP()函数获得,输出 IP 地址 return 0; =第一次编译后出现错误信息,说是找不到 stdafx.h 文件此文件为 MFC 自动生成因为这个程序选择的是 WIN32 CONSOLE APPLICATION 程序它不会生成 stdafx.h 文件 解决方法为,再建立一 MFC APPWIZARD 程序,把下边的 STDAFX.H 拷到工 程目录下,然后再加进工程就可以了12九、运行结果九、运行结果

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号