最后交稿课程设计.doc

上传人:dwx****52 文档编号:3198424 上传时间:2019-05-25 格式:DOC 页数:12 大小:69.50KB
下载 相关 举报
最后交稿课程设计.doc_第1页
第1页 / 共12页
最后交稿课程设计.doc_第2页
第2页 / 共12页
最后交稿课程设计.doc_第3页
第3页 / 共12页
最后交稿课程设计.doc_第4页
第4页 / 共12页
最后交稿课程设计.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

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 ()和Customer()分别描述理发师和顾客的行为。当理发师睡觉时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉,因此理发师和

4、顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有 n 把,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。故引入 3 个信号量和一个控制变量:1)控制变量 waiting 用来记录等候理发的顾客数,初值均为 0;2)信号量 customers 用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为 0;3)信号量 barbers 用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为 0;4)信号量 mutex 用于互斥,初值为 1 当营业时,店门口挂上“营业中,欢迎光临” ,每来一个顾客响应“叮咚” ,计数多一,多来一个客人。如果有位置,顾客则坐下,待到

5、理发师完成手中的任务,理发师理下一个客人。如此,理发师就可以有条不稳的做好自己的工作。三.系统结构的说明Main()-chairs-waiting-count-finish当有顾客来时,理发师醒来。Count+1,理发师工作。没来一个顾客,count+1, 直到顾客数到 n 个,此时椅子坐满,不能再容纳顾4客。只有到理发师完成一个理发任务才能空出一个位子,容纳新来的顾客。如此,顾客在店里不断的流动。这个设计中,共包括的函数有:void cuthair() /理发函数void gethaircut() /取得下一个顾客进行理发int main(int argc, char* argv) 四.数据

6、结构的说明在此,我采用的是相互链接的关系数据。结点结构如下:int long waiting(0); /正在等待的顾客的数目 int chairs; /椅子的总数目 char open_door; /开门 char close_door; /关门 int count(0); /顾客的号码数 int finish(0); /理发完毕的顾客数目 count+; /来的是第几个顾客 每个结点存放作业的所有属性数据,所有结点通过头指针连接而成,结点与结点中由结点自带的指针相连,便于工作和记录。作业一HEAD头任务作业二 。 。 。 。作业 N五.各模块的算法流程图算法中,先来先服务,因为按照顾客到来的

7、先后顺利,理发师酌情给他们理发,没有捷径可走。容纳顾客数量最多为椅子的数量。理发算法中:当第一个顾客到来时,理发师需要从 sleep 状态醒来。如果完成一个任务,则 cuchair,而完成后,程序直接进行 getchaircut。响应比优先算法,首先是将 HEAD 整个链表复制过来形成高响应比链表,然后每执行一次就算出正在执行理发任务以后所有结点的响应比,查找出响应比最高的那个结点(最先到达的顾客) ,这样执行下一个结点时,必定是未执行所有结点中,响应比最高的结点.由于各种算法之间都有相似之处,都包括顺序执行,和节点指针的连接,而且在系统结构说明部分记数程序中:没来一个顾客,自动输出“叮咚”

8、,count+1,当理发师有任务在进行时,顾客则自动占用一张椅子等待。5这个程序包含的算法模块不多,所以在此不再详述。顾客流动作业中。 。 。理下一个顾客直到没有顾客Count+1六.程序运行及清单(其中包括书面源程序,实验的检查结果、程序的运行情况)(1).PV 操作代码如下: int waiting=0 ; /等候理发的顾客数 int chairs=n; /为顾客准备的椅子数 semaphore customers=0, barbers=0,mutex=1; barber() while(TRUE); /理完一人, 还有顾客吗? P(cutomers); /若无顾客,理发师睡眠 P(mut

9、ex); /进程互斥 waiting := waiting 1; /等候顾客数少一个 V(barbers); /理发师去为一个顾客理发 V(mutex); /开放临界区 cut-hair( ); /正在理发 customer() P(mutex); /进程互斥 if (waiting) void gethaircut()顾客理发停业休息6 waiting := waiting+1; / 等候顾客数加 1 V(customers); /必要的话唤醒理发师 V(mutex); /开放临界区 P(barbers); /无理发师 , 顾客坐着养神 get-haircut( ); /一个顾客坐下等理 /

10、 else V(mutex); /人满了,走吧! (2).详细实现: 椅子数目可以设置;程序采用用随机数产生顾客进程 ,也就是顾客按照随机数自动到来,这样更加接近现实生活;对于理发师,当顾客到来后去理发,如果没有顾客继续睡觉,当理完一个后,判断是否有等待,有则叫下一个来理发,没有的话去睡觉。对于客人,先看理发师是空闲还是忙,空闲则去理发,忙着的话则看是否有位置等待,有则坐下等,没有的话则离开。对于理发时间,是取系统时间来控制,设理发时间为 10 秒,当两次时间差大于等于 10 时表示理完叫下一位,小于则继续理发。并且还能控制是否开门营业,当理发师为 10 个以上顾客理发完成并且没有人在等待时,

11、可以决定是否关门休息. (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); /理发完毕的顾客数目 DWO

12、RD a; void cuthair() :Sleep (10000); coutchairs; coutopen_door; while (open_door!=y) coutopen_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); cout=

13、10 return close_door; else ; if (close_door=y) cout#include“stdio.h“#include“stdlib.h“#include“string.h“void 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(name,sizeof(name) = 0 )

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

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。