操作系统报告.docx
- 文档编号:7792373
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:12
- 大小:415.46KB
操作系统报告.docx
《操作系统报告.docx》由会员分享,可在线阅读,更多相关《操作系统报告.docx(12页珍藏版)》请在冰豆网上搜索。
操作系统报告
操作系统课程设计报告书
一、实现界面的接口
本次课程设计总共做了四个小项目,分别是
(1)CPU调度中的时间片轮转算法
(2)死锁避免中的银行家算法(3)线程实现模拟超市购物(4)线城实现模拟停车场问题。
把以上四个小项目整合在一块儿,把时间片轮转算法与银行家算法写在C++头文件中即可,为了使界面更加美化,可以使用#include
为了显示这个界面我在C++中使用了switchcase语句来实现界面的选择,根据用户的具体要求,来选择需要进入的项目。
voidmain()
{SuperMarketsuMar;
intopr;
while
(1)
{
cout<<"**************菜单*****************************"< cout<<"**************1: CPU调度时间片轮转算法*********"< cout<<"**************2: 死锁避免银行家算*************"< cout<<"**************3: 线程模拟超市购物**********"< cout<<"**************4: PV信号量模拟停车场问题*******"< cout<<"***************0: 结束**************"< cout<<"请选择要进行的操作: "; cin>>opr; switch(opr) { case1: sjp(); system("pause"); break; case2: cout<<"银行家算法"< Yhj(); system("pause"); break; case3: cout<<"信号量模拟超市购物"< srand(time(0)); suMar.start(); suMar.WaitForCompletion(); system("pause"); break; case4: cout<<"停车"< che(); system("pause"); break; case0: cout<<"结束"< break; } } } 二、书本上的算法与代码的具体解释 (1)时间片轮转法进行CPU调度 代码: 见书P71 解释: 调度程序每次把CPU分配给就绪队列首进程使用规定的时间间隔,成为时间片,本次默认设置为时间片为2,就绪队列中的每个进程轮流地运行一个时间片,当时间片耗尽时,就强迫当前运行进程让出处理器,转而排列到就绪队列尾部,等候下一轮调度。 此种调度策略可以防止那些很少使用设备的进程/线程长时间地占用处理器,导致要使用设备的那些设备的那些进程/线程没有机会去启动设备。 此实例在C++中进行实现,主要使用指针来实现对就绪队列、运行队列、等待队列的控制。 首先使用结构体来定义进程名、运行时间、到达时间、进程状态、链接指针以及记录系统当前时间的变量,然后再分别定义建立进程的函数、判断是否有就绪进程的函数、运行进程的函数,检查就绪队列并准备运行进程的函数以及声明一个文件指。 最后,在主函数调用以上函数,并在屏幕上显示出来。 运行实例: 例如进程1、2、3、4、5五个进程同时进入CPU,运行时间分别10、6、2、4、8. 进程名 到达时间 运行时间 1 0 10 2 0 6 3 0 2 4 0 4 5 0 8 调试结果如下: (2)银行家算法实现资源分配 代码: 见书P80 解释: 算法描述如下,假定小城镇银行家拥有资金,数量为∑,被N个客户共享,银行家对客户提出下列约束条件: 1>每个客户必须预先说明所要的最大资金量 2>每个客户每次提出部分资金量的申请并获得分配 3>如果银行满足客户对资金的最大需求量,那么客户在资金运作后,应在有限的时间内全部归还银行。 只要客户遵守上述约束条件,银行家将保证做到: 若一个客户所要的最大资金量不超过∑,银行一定会接纳此客户,并满足其资金需求;银行在收到一个客户的资金申请时,可能会因资金不足而让客户等待,但保证在有限的时间内让客户获得资金。 在银行家算法中,客户可看做进程,资金可看做资源,银行家可看做操作系统。 银行家算法虽然能避免死锁,但实现时受到种种限制,要求所涉及的进程不相交,即不能有同步要求,事先要知道进程的总数和每个进程请求的最大资源数,这些都很难办到。 在书本上次实例代码中,需要先设定常数TASK_RUNNING为0,TASK_SUCCEED为1,TASK_WAITING为2,并将系统拥有的最大资源数为10,系统运行的最多进程数4。 并定义一个类PCB(进程控制块),其中在类中,在公共类中定义p_pid,p_stat,p_apply,p_occupy,p_issuc,p_require,并定义一个构造函数pcb,在类外定义一系列子函数。 最后在主函数中,输入各进程申请的资源总量,以及初始化各个进程,选择资源分配算法,判断能否满足进程的资源请求,若满足资源最大请求,进程成功完成,将其从进程队列中删除;判断能否满足进程的当前资源请求,假定对申请资源的进程分配资源,撤销模拟分配,若分配安全,可对进程进行实际的分配,归还全部系统资源,并唤醒等待进程,判断是否所有的进程都已结束。 之后输入进程的当前申请量,检查系统中是否所有进程都运行结束,且当有进程释放资源时,判断是否唤醒等待资源。 并设计一个算法,用于检查系统是否处于安全状态的算法,检查是否所有进程都能被设置成安全标志,若没有都设置成安全标志,则置该标志为假。 实例运行结果: 假设进程中有5个进程和A、B、C三类资源,在时刻T,系统资源分配情况如下: 进程 Allocation Claim Available ABC ABC ABC P0 010 753 332 P1 200 322 P2 302 902 P3 211 222 P4 002 433 T时刻的安全序列调试结果如下: (3)线程实现模拟超市购物 代码: 见书P273页 解释: 此实例用线程控制和线程同步机制来模拟超市购物的运转情况。 首先,需要创建和启动一个代表超市管理员的线程主要负责开放超市、创建各个顾客线程、关闭超市、等待所有顾客付钱离开。 其次,超市管理员线程创建一个顾客线程后,等待一段时间后,在创建一个顾客,顾客主要执行等待进入超市、进行数量随机的商品选购、到熟食柜台买肉、柜台排队等待付款、离开柜台、离开超市。 本例设计了3个文件,分别是vsm.cpp、vsm.h、main.cpp,其中vsm.h是基本的变量和函数的定义,vsm.cpp是核心运行部分,而main.cpp则是启动运行的一个框架。 其中在头文件vsm.h中,定义最多创建的顾客数目为20,最多进入超市的顾客数目为15,各种队列的最大长度为15,随机购物时的货物种类数为5,结账柜台的个数为5,专用毫秒为1000等。 并定义线程类、顾客类和超市管理员类的父类MyThread,超市线程主体SuperMarket。 在vsm.cpp中,实现顾客总体的初始化,创建各个顾客线程、运行各个顾客线程、等待各个顾客线程终止、关闭各个HANDLE,并使用strand(unsignedintseed)函数。 而main.cpp主要是为了可以通过调用头文件vsm.h中的函数,并在屏幕上显示。 实例调试结果如下: 三、自己修改后的算法及代码解释 最后一个小项目是用线程来实现停车场问题,通过略微笨拙的方法来实现 代码及解释如下: #include #include #include HANDLEEmpty,full,mutex;//声明3个信号量,互斥信号量mutex,计数信号量full和Empty intx=0; inty=0; char*buffer;//缓冲区buffer //输出buffer voidoutput() { for(inti=0;i<50;i++) { cout< } cout<<"\n"; } DWORDWINAPIimport(LPVOIDparam) { intj=1; do { WaitForSingleObject(Empty,INFINITE);//buffer空余量减一 WaitForSingleObject(mutex,INFINITE);//形成互斥,只能一个线程去生产 cout<<"入口号为"< buffer[(y++%10)]='A';//停车赋值为A output();//输出buffer cout< j++; ReleaseSemaphore(mutex,1,NULL);//取消互斥,允许其他线程生产 ReleaseSemaphore(full,1,NULL);//可以占用车位加1 }while(j! =11);//一个入口进入车辆10次 return0; } DWORDWINAPIexport(LPVOIDparam) { intj=1; do { WaitForSingleObject(full,INFINITE);//将占用车位减1 WaitForSingleObject(mutex,INFINITE);//形成互斥访问,只能一个线程可以访问。 cout<<"出口号为"< buffer[x++%10]='B';//车辆离开时赋值为B output();//输出buffer cout< j++; ReleaseSemaphore(mutex,1,NULL);//取消互斥,允许其他线程消费 ReleaseSemaphore(Empty,1,NULL);//buffer空余量加1 }while(j! =11);//一个出口可以通过车辆10次 return0; } intche() { inti; Empty=CreateSemaphore(NULL,10,10,NULL);//声明计数信号量,Empty初值为10 full=CreateSemaphore(NULL,0,10,NULL);//声明计数信号量,full初值为0 mutex=CreateSemaphore(NULL,1,1,NULL);//声明互斥信号量,初值为1 buffer=newchar[50];//初始化buffer数组,大小为0 for(i=0;i<50;i++) { buffer[i]='N'; } //HANDLEthread; DWORD*ThreadId=(DWORD*)malloc(2*sizeof(DWORD*)); HANDLE*ThreadHandle=(HANDLE*)malloc(2*sizeof(HANDLE*));//创建线程句柄,分配空间 //创建1个入口线程和1个出口线程 for(i=0;i<1;i++) {ThreadHandle[i+1]=CreateThread(NULL,0,import,NULL,0,&ThreadId[i+1]); ThreadHandle[i]=CreateThread(NULL,0,export,NULL,0,&ThreadId[i]); } //让所有线程在主线程main()执行完钱全部执行完毕。 WaitForMultipleObjects(2,ThreadHandle,TRUE,INFINITE); return0; } 本代码使用两个线程来实现,一个入口线程、一个出口线程,声明3个信号量,开始设置一个互斥信号量mutex,两个计数信号量full和Empty,声明计数信号量,Empty初值为10,声明计数信号量,full初值为0,声明互斥信号量,初值为1。 最后,让所有线程在主线程main()执行完钱全部执行完毕。 调试结果如下: 其中,A表示占用,N表示空闲,B表示车开离车库,有五十个车位,一个入口线程,一个出口线程。 四、心得体会 通过这次课程设计我大致了解了进程调度算法中的时间片轮转算法、银行家算法、线程调度的实现方法及他们的原理,并基于windows系统之上,将它们整合在一起,对如何整合一系列程序有了基本的了解与认识,更深层次地学习了C++语言,将本学期学习的操作系统与C++相结合,进一步了解了操作系统书本上的各种算法。 虽然在课设过程中也遇到了不少困难,在开始的头几天,我对有难度的代码,还是不知道如何下手,不懂如何分析此代码究竟是用来干嘛的,来实现什么的,不过最终通过请教同学和老师完成了本次课设,并在真正意义上明白了编程某段代码的原因及意义。 课设是一本将书本知识运用于实践的课程,我们都应该认真完成,因为毕竟最终步入社会时,使用的更多的实践能力而不是书本上的未经我们思考实践过的知识。 本次课设主要参考教材: 《操作系统实验教程及Linux和Windows系统调用编程》及《操作系统教程》(第4版)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)