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

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

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

1、操作系统课程设计报告班 级 软件1001 学 号 姓 名 指导老师 完成时间:2013年 1 月 9日一、 课程设计题目某银行提供10个服务窗口(7个对私服务窗口,3个对公服务窗口)和100个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用,有对公和对私两类号,每位顾客只能选取其中一个。当营业员空闲时,通过叫号选取一位顾客,并为其服务。请用P、V操作写出进程的同步算法。二、 课程设计目的熟练掌握pv操作的相关知识;认识信号量的相关含义;加深对线程(进程)的认识;三、 课程设计要求要求打印:a) 初始状态b) 中间变化的状态信息c) 以

2、及最终状态信息。四、 原理及算法 目前,在以银行营业大厅为代表的窗口业务,大量客户的拥挤排队已成为了这些企事业单位改善服务品质、提升企业形象的主要障碍。排队叫号系统的使用将成为改变这种情况的有力手段。排队系统完全模拟了人群排队的全过程,通过取票进队。排队等待、叫号服务等功能,很好的解决了客户在服务机构办理业务是所遇到的各种排队、拥挤和混乱现象,代替了人们站队的辛苦,把顾客等待的烦恼变成了一段难得的休闲时光,使客户拥有了一个自由的空间和一份美好的心情。 排队过程大致流程为:4、顾客到窗口办理 休息区的顾客听到呼叫就到响应窗口进行一对一服务。3、营业员按钮呼叫 窗口操作员按“下一位”,当前窗口就显

3、示顾客排队号并语音呼叫“请XX到X号窗口”2、顾客休息等待 取到排队号的顾客在休息区休息等待,注意大厅的提示信息1、 顾客取号需要办理业务的顾客到取票机前取号,并获得打印出的排队号票本次的银行叫号系统有pv操作来模拟实现。1) 实验中用到的相关知识介绍(windows环境下)1同步对象同步对象是指Windows中用于实现同步与互斥的实体,包括信号量(Semaphore)、互斥量(Mutex)、临界区(Critical Section)和事件(Events)等。本实验中使用到信号量、互斥量和临界区三个同步对象。同步对象的使用步骤:l 创建/初始化同步对象。l 请求同步对象,进入临界区(互斥量上锁

4、)。l 释放同步对象(互斥量解锁)。这些对象在一个线程中创建,在其他线程中都可以使用,实现同步与互斥。2相关API的功能及使用利用Windows SDK提供的API编程实现实验题目要求,而VC中包含有Windows SDK的所有工具和定义。要使用这些API,需要包含堆这些函数进行说明的SDK头文件最常见的是Windows.h(特殊的API调用还需要包含其他头文件)下面给出的是本实验使用到的API的功能和使用方法简单介绍(1) CreateThread功能创建一个在调用进程的地址空间中执行的线程格式HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThre

5、adAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParamiter, DWORD dwCreationFlags, Lpdword lpThread)参数说明lpThreadAttributes指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize定义原始堆栈大小。lpStartAddress指向使LPTHRAED_START_ROUTINE类型定义的函数。lpParamiter定义一个给进程传递参数的指针。dwCreationFlags

6、定义控制线程创建的附加标志。lpThread保存线程标志符(32位)(2) CreateMutex功能创建一个命名或匿名的互斥量对象格式HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName);参数说明lpMutexAttributes必须取值NULL。bInitialOwner指示当前线程是否马上拥有该互斥量(即马上加锁)。lpName互斥量名称。(3) CreateSemaphore功能创建一个命名或匿名的信号量对象格式HANDLE CreateSemaph

7、ore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName );参数说明lpSemaphoreAttributes必须取值NULL。lInitialCount信号量的初始值。该值大于0,但小于lMaximumCount指定的最大值。lMaximumCount信号量的最大值。lpName信号量名称。(4) WaitForSingleObject功能使程序处于等待状态,直到信号量hHandle出现(即其值大于等于1)或超过规定的等待时间格式DWORD

8、WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);参数说明hHandle信号量指针。dwMilliseconds等待的最长时间(INFINITE为无限等待)。(5) ReleaseSemaphore功能对指定信号量加上一个指定大小的量。成功执行则返回非0值格式BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lppreviousCount );参数说明hSemaphore信号量指针。lReleaseCount信号量的增量。lppreviousCou

9、nt保存信号量当前值。(6) ReleaseMutex功能打开互斥锁,即把互斥量加1。成功调用则返回0格式 BOOL ReleaseMutex(HANDLE hMutex);参数说明 hMutex互斥量指针。(7) InitializeCriticalSection功能初始化临界区对象格式VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);参数说明 lpCriticalSection指向临界区对象的指针。(8) EnterCriticalSection功能等待指定临界区对象的所有权格式VOID enterCr

10、iticalSection(LPCRITICAL_SECTION lpCriticalSection);参数说明 lpCriticalSection指向临界区对象的指针。2) 实验中pv原语1. 实验中的信号量seats; /空座位信号量,初始值100cu1; /高级客户信号量,初始值0ser1; /对公服务窗口,初始值0cu2; /普通客户信号量,初始值0ser2; /对私服务窗口,初始值0h_mutex; /互斥量,初始值0五、 主要数据结构和流程:顾客到来,先看是否有空座等待对共窗口服务P(& SER1)得到服务V(& SEATS)P(& SEATS)P(& HMUTEX)到取号机取号V

11、(& HMUTEX)有座ZU对私服务客户对公服务客户等待对私窗口服务P(& SER2)得到服务V(& SEATS)普通客户线程高级客户线程创建线程WHILE(TRUE)P(& CU1)叫号服务V(& SER1)对私窗口线程WHILE(TRUE)P(& CU2)叫号服务V(& SER2)对公窗口线程六、 实验测试结果及分析七、 课程设计总结本次课程设计基本完成了银行较好系统问题的全部过程,结果满足设计要求,验证无误。我自己设计的是6个信号量,但是老师说只要4个信号量就行,我设计的多了两个队共对私窗口的信号量,所以我的程序可能略显繁琐。实验中也遇到了一些错误,刚开始写的程序在执行main函数时,程

12、序只能输出第一个高级(普通)客户的取号信息,然后程序就自动终止,我看了很久都没找到哪里错了,之后问了同学才想到,我的程序在输出第一个高级(普通)客户的取号信息已经结束,所以线程也就相应的终止了,所以就加了一句死循环的语句来解决。在程序能顺利执行的情况下也遇到了一些问题,如输出的客户号数大于我设置的最大值等,但问题都被我一一解决。由于时间紧促以及个人能力的不足,模拟系统在功能上尚存在一些问题, 在很多方面都有改进的空间。 但总体上是实现应有的功能。 对于巩固在操作系统 PV操作原理课上所学的知识, 加深对操作系统中进程同步和互斥、 临界区管理等问题认识和理解,有着很好的效果,同时也初步体会了软件

13、设计流程。八、 源程序清单#include /SDK头文件,提供API编程#include /字符数组定义头文件#include#include /日期和时间头文件using namespace std;#define MAXTHREADNUM 200 /每天来的顾客量HANDLE seats; /空座位信号量HANDLE cu1; /高级客户信号量HANDLE ser1; /对公服务窗口HANDLE cu2; /普通客户信号量HANDLE ser2; /对私服务窗口HANDLE h_mutex; /互斥量HANDLE shuzuMAXTHREADNUM; /存储线程句柄的数组int g=1;

14、 /高级客户号数int p=1; /普通客户号数DWORD WINAPI customer1(PVOID cu1pv)/高级客户线程代码int N;DWORD WaitForSemaphor,WaitForSemaphor1,WaitForMutex,m_delay=997,n_dalay=7099;/等待状态,等待时间WaitForSemaphor=WaitForSingleObject(seats,-1);/等待座位WaitForMutex= WaitForSingleObject(h_mutex,-1);/等待取号coutg号高级客户正在取号endl; /取号N=g; g+;coutN号

15、高级客户取号成功,等待服务endl; Sleep(m_delay); / 等待服务ReleaseMutex(h_mutex); /打开互斥锁ReleaseSemaphore(cu1,1,NULL); /WaitForSemaphor1=WaitForSingleObject(ser1,-1);coutN号高级客户得到服务endl;Sleep(n_dalay); /对高级客户进行服务时间ReleaseSemaphore(seats,1,NULL);coutN号高级客户已离开endl;coutendl;return 0;DWORD WINAPI server1(PVOID ser1pv) /营业员

16、(对共)线程代码while(true)DWORD WaitForSemaphor,m_delay=1000; WaitForSemaphor=WaitForSingleObject(cu1,-1);Sleep(m_delay); /叫号服务ReleaseSemaphore(ser1,1,NULL);/DWORD WINAPI customer2(PVOID cu2pv)/普通客户int M;DWORD WaitForSemaphor,WaitForSemaphor1,WaitForMutex,m_delay=997, n_dalay=6199;WaitForSemaphor=WaitForSi

17、ngleObject(seats,-1);/等待座位WaitForMutex= WaitForSingleObject(h_mutex,-1);/等待取号coutp号普通客户正在取号endl; /取号M=p;p+;coutM号普通客户取号成功,等待服务endl; Sleep(m_delay); ReleaseMutex(h_mutex); /打开互斥锁ReleaseSemaphore(cu2,1,NULL);WaitForSemaphor1=WaitForSingleObject(ser2,-1);coutM号普通客户得到服务endl;Sleep(n_dalay); /对普通客户进行服务cou

18、tM号普通客户已离开endl;coutendl;ReleaseSemaphore(seats,1,NULL);return 0;DWORD WINAPI server2(PVOID ser2pv) /营业员(对共)线程代码while(true)DWORD WaitForSemaphor,m_delay=1003; WaitForSemaphor=WaitForSingleObject(cu2,-1);Sleep(m_delay); /叫号服务ReleaseSemaphore(ser2,1,NULL);/int main()seats=CreateSemaphore(NULL,100,100,

19、NULL); /创建信号量cu1=CreateSemaphore(NULL,0,100,NULL);ser1=CreateSemaphore(NULL,0,100,NULL);cu2=CreateSemaphore(NULL,0,100,NULL);ser2=CreateSemaphore(NULL,0,100,NULL);h_mutex=CreateMutex(NULL,FALSE,NULL);for(int i=190;i193;i+) /创建对公服务窗口线程shuzui=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(server1),NULL,

20、0,NULL);for(int i=193;i200;i+) /创建对私服务窗口线程shuzui=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(server2),NULL,0,NULL);srand( (unsigned)time( NULL ) ); /产生一个随机数int x=0;int y=0;for(int i=0;i190;i+)int sui=rand();sui=sui%10;if(sui=3)shuzux=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(customer1),NULL,0,NULL);x+;elseshuzuy=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(customer2),NULL,0,NULL);y+;while(1); 时光荏苒,感谢教给我人生道理的老师。结语:

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号