操作系统课程设计报告11.doc

上传人:仙人指路1688 文档编号:3243147 上传时间:2023-03-12 格式:DOC 页数:12 大小:95KB
返回 下载 相关 举报
操作系统课程设计报告11.doc_第1页
第1页 / 共12页
操作系统课程设计报告11.doc_第2页
第2页 / 共12页
操作系统课程设计报告11.doc_第3页
第3页 / 共12页
操作系统课程设计报告11.doc_第4页
第4页 / 共12页
操作系统课程设计报告11.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《操作系统课程设计报告11.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计报告11.doc(12页珍藏版)》请在三一办公上搜索。

1、操作系统课程设计报告一 实验题目:理发师问题:理发店由一个等待室和一个理发室组成,等待室有N把椅子而理发室只有一把理发椅。如果没有顾客,理发师就会在理发椅睡觉。如果一个顾客走进理发店,发现理发师正在理发,如果有空椅子可坐,他就坐下来等,如果没有空椅子,他就离开;如果理发师正在理发椅上睡觉,就唤醒理发师进行理发。二 实验目的:1、 掌握基本的同步与互斥算法2、 学会用pv操作来描述算法思想3、 真正理解信号量的作用,理解临界区4、 掌握相关的API的使用方法5、 了解Windows中的多线程的并发执行机制,实现进程的同步与互斥三 实验要求:采用系统调用信号量、p、v操作来描述解决理发师问题的算法

2、思想,并编程实现该算法。四 实验环境1、 操作系统:Windows 72、 编译环境:VS2008五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( ); /理发 cus

3、tomer() P(mutex); /进程互斥 if (waiting) waiting := waiting+1; V(customers); /之前无顾客,此时有顾客时,唤醒理发师 V(mutex); /开放临界区 P(barbers); /无理发师, 顾客等待 get-haircut( ); /顾客理发完走下理发椅 else V(mutex); /没座位了六 源代码#include #include #include #include #define CUSNUM 8#define CHAIRS 5char customer_name=WAIT_CUSTOMERS;char barker

4、_name=SLEEP_BARKER;char cutting_name=CUTTING_HAIR;char mutex_name=MUTEX_SLEEP_BARKER;HANDLE customer,barker,cutting;HANDLE mutex;BOOL IsOpen=true;DWORD WINAPI Barker( LPVOID lpParam );DWORD WINAPI Customer( LPVOID lpParam );int waitting = 0;int finishNum = 0;void cutting_hair()Sleep(rand()%3000);pri

5、ntf(理发师已完成理发.n);finishNum+;ReleaseSemaphore(cutting,1,NULL);WaitForSingleObject(customer,INFINITE);if ( waitting=0 & finishNum=6)IsOpen = false;ReleaseMutex(mutex);printf(理发师已理完至少六人,且没人在等待,所以理发店关门.n);elseReleaseMutex(mutex);void hair_cut(int i)printf(顾客%d 已经完成理发.nn,i);WaitForSingleObject(cutting,INF

6、INITE);printf(顾客%d 完成理发离开了.nn,i);VOID main( VOID ) DWORD dwThreadId, dwThrdParam = 1; HANDLE hBarkerThread;HANDLE hCustomerThread8;customer=CreateSemaphore(NULL,0,CUSNUM,customer_name);barker=CreateSemaphore(NULL,0,1,barker_name);cutting=CreateSemaphore(NULL,0,1,cutting_name);mutex=CreateMutex(NULL,

7、FALSE,mutex_name); hBarkerThread = CreateThread( NULL, 0, Barker, &dwThrdParam, 0, &dwThreadId); int num8;int i=1;while(i=CUSNUM)numi=i;hCustomerThreadi-1 = CreateThread( NULL, 0, Customer,&numi, 0, &dwThreadId); i+;if (hBarkerThread = NULL) printf(创建理发师线程失败);else WaitForSingleObject(hBarkerThread,I

8、NFINITE);CloseHandle( hBarkerThread ); DWORD WINAPI Barker( LPVOID lpParam ) while(IsOpen)WaitForSingleObject(customer,INFINITE);WaitForSingleObject(mutex,INFINITE);waitting = waitting - 1;ReleaseSemaphore(barker,1,NULL);ReleaseMutex(mutex);cutting_hair(); return 0;DWORD WINAPI Customer( LPVOID lpPa

9、ram ) int i=*(int*)lpParam;Sleep(rand()%45000);LONG WaitingNum;if (!IsOpen)printf(理发店已经关门了.n);elseWaitForSingleObject(mutex,INFINITE);if(waittingCHAIRS)printf(顾客%d 进店且等待.nn,i);waitting = waitting + 1;ReleaseSemaphore(customer,1,&WaitingNum);ReleaseMutex(mutex);WaitForSingleObject(barker,INFINITE);pr

10、intf(理发师准备为顾客%d理发.n,i);hair_cut(i);elseprintf(这儿没有位置给顾客%d ,所以他离开了.,i);ReleaseMutex(mutex);return 0; 七 运行结果截图八 流程图九 课程设计总结这次课设收获很多,之前在课上学的都是那些纯理论的东西,感觉无法跟实际相连。所以刚开始拿到这题目感到无从下手,但是后来不断的通过上网搜索和同学的讨论才有点眉目,刚开始我就想开始写程序,但发现问题很多,后来在同学的指导下,首先完成了理发师问题的PV操作原理,这样在清晰了脉络之后,感觉就好多了。而且这次课设老师特别严厉,给了我们压力的同时,也给了我们更多的机会。总之,这次课设学到了很多东西!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号