一个小型的操作系统设计与实现_第1页
一个小型的操作系统设计与实现_第2页
一个小型的操作系统设计与实现_第3页
一个小型的操作系统设计与实现_第4页
一个小型的操作系统设计与实现_第5页
已阅读5页,还剩35页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统课程设计报告南通大学计算机科学与技术学院操作系统课程设计报告专业:计嵌151学生姓名:王志宏学号:1513052018时间:2017/6/28操作系统课程设计报告设计一个小型的操作系统设计要求将本学期三次的实验集成实现:1.中断处理2.作业调度3.PV原语4.死锁5.页面替换6.磁盘调度(一)设计流程图主流程图开始的图形界面中断处理作业调度PV原语死锁页面替换磁盘调度哲先时先银先L学来钟

来行进R家先

先家先U吃服

服算出算

通务务法算法心第1页共2页操作系统课程设计报告1.中断处理模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序。计算机系统工作过程中,若出现中断事件,硬件就把它记录在中断寄存器中。中断寄存器的每一位可与一个中断事件对应,当出现某中断事件后,对应的中断寄存器的某一位就被置成―1必须查中断寄存器,当中断寄存器内容不为―‖时,说明有中断事件发生。硬件把中断寄存器内容以及现行程序的断点存在主存的固定单元,且让操作系统的中断处理程序占用处理器来处理出现的中断事件。操作系统分析保存在主存固定单元中的中断寄存器内容就可知道出现的中断事件的性质,从而作出相应的处理。本实习中,用从键盘读入信息来模拟中断寄存器的作用,用计数器加1来模拟处理器执行了一条指令。每模拟一条指令执行后,从键盘读入信息且分析,当读入信息=0时,表示无中断事件发生,继续执行指令;当读入信息=1时,表示发生了时钟中断事件,转时钟中断处理程序2.作业调度1)先来先服务FCFS开始初始化进程控制块,让进程控制块按进程到达先后顺序让进程排队调度数组中首个进程,并让数组中的下一位移到首位计算并打印进程的完成时刻、周转时间、带权周转时间其中:周转时间=完成时间-到达时间带权周转时间=周转时间服务时间更改计时器的当前时间,即下一刻进程的开始时间当前时间=前一进程的完成时间+其服务时间N数组为空第2页共3页操作系统课程设计报告Y结束先来先服务算法流程3.PV原语1)哲学家吃通心面问题哲学家吃通心面:在这道题目里,每把叉子必须互斥使用,当一位哲学家吃通心面之前必须执行两个P操作,获得自己左右两边的叉子,在吃完通心面后必须执行两个V操作,放下叉子。第3页共4页操作系统课程设计报告4.死锁1)银行家算法5.页面替换第4页共5页操作系统课程设计报告1)先进先出FIFO开始FIFO的缺页中断处理查主存分块表Y有空闲块分配一块可用?NJ=p[HEAD]NJ的修改标志=1?Y输出“将J页复写入交换区”输出“装入L页”调整FIFO队列,将L插入队尾(HEAD=(HEAD+1)modM)修改主存分块表和页表终止FIFO淘汰算法流程2)LRU开始LRU的缺页中断处理第5页共6页操作系统课程设计报告查主存分块表Y有空闲块

分配一块

可用?N找到栈底元素:J=p[M-1]NJ的修改标志=1?Y输出“将J页送到入交换区”输出“装入L页”调整堆栈,使HEAD所指元素及以下的元素下移P[HEAD]=L修改主存分块表和页表终止LRU淘汰算法流程6.磁盘调度1)先来先服务算法FCFS)第6页共7页操作系统课程设计报告(二)实现原理主界面设计一个框架分别去链接处理机管理、存储器管理和缺页调度相关的程序。1.中断第7页共8页操作系统课程设计报告2.作业调度1)先来先服务FCFS(一)任务先来先服务的调度算法实现处理机调度。(二)要求1.实现对FCFS算法的模拟实现2.计算出该算法的平均作业周转时间、平均带权作业周转时间。(三)原理按作业到达CPU时间先后顺序进行非剥夺式调度,先到达CPU的作业先被执行。(四)数据结构structtask_struct{charname;/*进程名称*/intnumber;/*进程编号*/floatcome_time;/*到达时间*/floatrun_begin_time;/*开始运行时间*/

floatrun_time;/*运行时间*/floatrun_end_time;/*运行结束时间*/intpriority;/*优先级*/intorder;/*运行次序*/intrun_flag;/*调度标志*/}tasks[MAX];intfcfs()/*先来先服务算法*/进程名链接指针到达时间估计运行时间进程状态进程控制块结构(五)实现方法建立一个链表按照到达CPU的时间从小到大排列,只需从第一个作业(头结第8页共9页操作系统课程设计报告点)依次调度到最后一个作业(尾结点)。(六)运行界面测试数据:作业名到达时间运行时间A028B09C03执行FCFS算法如下:3.死锁假定本系统中的各个所需资源均是独占型资源,在进程运行的过程中不再释只要不大于系统中预设的即可,一旦进程所需的资源大于系统中的最大量,给予用户选择kill一进程,已达到释放资源的目的。死锁检测函数:voidsisuo()死锁解除函数:voidsafe()第9页共10页操作系统课程设计报告4.缺页调度1)先进先出FIFO(一)任务采用先进先出FIFO算法实现分页管理的缺页调度,并输出每次调入调出的页号和运行结果。(二)要求1.实现对FIFO算法的模拟实现2.输出每次执行的结果。(三)原理基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入主存的页面,即淘汰在主存中驻留时间最长的页面,认为驻留时间最长的页不再使用的可能性较大。(四)数据结构voidFIFO(){intlength;intfifo[100]={0};intpageLength;intfifoPage[100]={0};inti,j;cout<<"***********************先进先出算法**************************"<<endl;pageLength=3;length=9;for(i=1;i<=length;i++){intflag=0;for(j=1;j<=pageLength;j++){if(fifo[i]==fifoPage[j]){flag=1;j=pageLength+1;}elseif(fifoPage[j]==0){fifoPage[j]=fifo[i];j=pageLength+1;flag=1;}}if(flag==1){}else{cout<<"→淘汰"<<fifoPage[1]<<endl;for(j=1;j<=pageLength;j++){fifoPage[j]=fifoPage[j+1];}第10页共11页操作系统课程设计报告fifoPage[pageLength]=fifo[i];}(五)实现方法当采用先进先出算法时,用一个数组构成先进先出队列,数组中各个元素为进程已在主存的页号,其队列头指针初始化为0.假设分配给每个进程的内存块数固定。当队列满需淘汰时,淘汰最先进入主存的一页。若该页修改过,还有存并修改页表和存储分块表的对应标志。(六)运行界面测试数据:页表长度:;页框长度:;页面请求数列:4,4,3,5,1,1,2,3,2执行先进先出FIFO算法结果如下:2)LRU(一)任务采用先进先出LRU算法实现分页管理的缺页调度,并输出每次调入调出的页号和运行结果。(二)要求1.实现对算法的模拟实现2.输出每次执行的结果。(三)原理最近最少使用页面替换算法淘汰的页面是在最近一段时间内最久未被访问的那一页,它是基于程序局部性原理来考虑的,认为那些刚被使用过的页面可能还有立即被使用,而那些在较长时间内未被使用的页面可能不会立即使用。在分页虚拟存储系统中,当硬件发出缺页中断后转操作系统处理缺页中断。如果主存中已无空闲块,可采用LRU算法进行缺页处理。第11页共12页操作系统课程设计报告(四)数据结构voidLRU(){intlength;intlru[100]={0};intpageLength;intlruPage[100]={0};inti,j;cout<<"***********************最近最少使用LRU算法***********************"<<endl;pageLength=3;length=9;for(i=1;i<=length;i++){intflag=0;for(j=1;j<=pageLength;j++){if(lru[i]==lruPage[j]){for(intcc=j;cc>0;cc--){lruPage[cc]=lruPage[cc-1];}lruPage[1]=lru[i];flag=1;j=pageLength+1;}elseif(lruPage[j]==0){for(intvv=j;vv>0;vv--){lruPage[vv]=lruPage[vv-1];}lruPage[1]=lru[i];j=pageLength+1;flag=1;}}if(flag==1){}else{cout<<"→淘汰"<<lruPage[pageLength]<<endl;for(j=pageLength;j>0;j--){lruPage[j]=lruPage[j-1];}lruPage[1]=lru[i];}(五)实现方法第12页共13页操作系统课程设计报告当采用算法时,用一个数组构成堆栈,堆栈中各个元素为进程已在主存

的页号,为了进行页面置换,可设置一个栈指针,初始化为0.假定分配给每个进程的内存块数固定不变。当队列满需淘汰时,操作系统选择栈底元素淘汰,其他元素向下移一个位置,将新调入页放栈指针指示的栈顶。当访问的页在栈中时,还应调整页从当前位置到栈顶。(六)运行界面测试数据:页表长度:;页框长度:;页面请求数列:2,3,5,1,5,5,4,4,3执行最近最少使用LRU算法结果如下:5.磁盘调度1)先来先服务算法FCFS)这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。第13页共14页操作系统课程设计报告(三)总结与体会通过本次课程设计让我对于图形界面设计有了一定的思路和看法,同时我对先来先服务、时间片轮转、首次适应算法、最佳适应算法、先进先出和最近最少使用算法有了更详尽的认识。在编程的过程中发现会用到大量的指针,用指针来操作大量的数据比较方便,但最后应该记得释放资源。从这次实验中我发现我对于掌握也有所不足,程序经过了多次修改才得以完善,在以后应该注重编程方面的训练。此外我还更深入的理解了各个进程调度算法,及实现过程。在编写程序时查询了很多资料,间接提高了我的搜索能力。在此次课程设计过程中,对进程的相关知识有了一定的加深。特别是对进程的进程控制块的存在和价值有了更进一步的认识。在编写程序的过程之中,对进程自身信息的设计和管理以及调度的算法都有助于对书本知识的理解和掌握。特别是设计先来先服务调度算法和时间片轮转调度算法的时候,对进程的调度算法有了更好的深入理解。对进程管理中的等待队列,就绪队列,时间片等概念有了更深刻的印象。在设计此模拟操作系统的课设中,也加深了对知识的把握。解决了一些以往在编程中遇到了困难。通过此次的课程设计,不仅提高了对操作系统的认知,也在同时提高了编程的能力,加强了实践。另外,我觉得此次课程设计虽然主要问题是在编程上,但是经过不断的去调试,还是成功的调试了出来。但是这几个程序用了多天的时间进行分析和修改,虽然出现了不少问题,但收获颇多!源代码:#include<iostream>#include<cstring>#include<cstddef>#include<windows.h>第14页共15页操作系统课程设计报告#include<time.h>#include<string>#include<assert.h>#include<stdio.h>#include<stdlib.h>usingnamespacestd;intfcfsoutput();/*调度结果输出*/intfcfsinput();//进程参数的初始化voidkaishi();#define#definemaxsize1000structnode//建立链表来存放进程数据{charname[5];//进程名称intneed_time;//所需要的时间intallocation;//占用cpu的情况charstate;//目前的状态R为运行,E为运行完毕node*next;//链表的尾结点};structtask_struct{charname;/*进程名称*/intnumber;/*进程编号*/floatcome_time;/*到达时间*/floatrun_begin_time;/*开始运行时间*/floatrun_time;/*运行时间*/floatrun_end_time;/*运行结束时间*/intpriority;/*优先级*/intorder;/*运行次序*/intrun_flag;/*调度标志*/}tasks[intcounter;/*实际进程个数*/intfcfs()/*先来先服务算法*/{fcfsinput();floattime_temp=0;inti;intnumber_schedul;time_temp=tasks[0].come_time;for(i=0;i<counter;i++){第15页共16页操作系统课程设计报告tasks[i].run_begin_time=time_temp;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;time_temp=tasks[i].run_end_time;number_schedul=i;tasks[number_schedul].order=i+1;}fcfsoutput();return0;}intfcfsinput(){task_structtt;inti,j;//初始化进程数counter=3;//初始化每个到达系统的时间为5、、8tasks[0].come_time=rand()%9;tasks[1].come_time=rand()%9;tasks[2].come_time=rand()%9;for(i=1;i<3;i++){for(j=0;j<3-i;j++){if(tasks[j].come_time>tasks[j+1].come_time){tt=tasks[j];tasks[j]=tasks[j+1];tasks[j+1]=tt;}}}//初始化每个进程估计运行的时间tasks[0].run_time=28;tasks[1].run_time=9;tasks[2].run_time=3;//初始化每个进程的名字tasks[0].name='A';第16页共17页操作系统课程设计报告tasks[1].name='B';tasks[2].name='C';cout<<"************************先来先服务算法************************"<<endl<<endl;for(i=0;i<counter;i++){tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}return0;}intfcfsoutput()/*调度结果输出*/{inti;floatturn_round_time=0,f1,w=0;cout<<"***********************先来先服务**************************"<<endl;cout<<"作业名到达时间运行时间开始时间停止时间运行次序周转时间"<<endl;for(i=0;i<counter;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].come_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}cout<<"平均周转时间:"<<turn_round_time/counter<<endl;cout<<"平均带权周转时间:"<<w/counter<<endl;cout<<"";return0;}voidzuoyediaodu()//作业调度{intn;cout<<"\t1.先来先服务算法\t2.返回开始菜单"<<endl;第17页共18页操作系统课程设计报告cin>>n;switch(n){case1:fcfs();kaishi();break;case2:kaishi();kaishi();break;}}/**/voidFIFO(){intlength;intfifo[100]={0};intpageLength;intfifoPage[100]={0};inti,j;cout<<"***********************先进先出算法**************************"<<endl;pageLength=3;length=9;cout<<"时刻t"<<'\t';for(i=0;i<length;i++){cout<<i<<'\t';}cout<<endl<<"引用串"<<'\t';for(i=1;i<=length;i++){fifo[i]=rand()%5+1;cout<<fifo[i]<<'\t';}for(i=1;i<=length;i++){intflag=0;for(j=1;j<=pageLength;j++){if(fifo[i]==fifoPage[j]){flag=1;j=pageLength+1;}elseif(fifoPage[j]==0){fifoPage[j]=fifo[i];j=pageLength+1;flag=1;}}if(flag==1){}第18页共19页操作系统课程设计报告else{cout<<"→淘汰"<<fifoPage[1]<<endl;for(j=1;j<=pageLength;j++){fifoPage[j]=fifoPage[j+1];}fifoPage[pageLength]=fifo[i];}cout<<endl<<"t="<<i-1<<"时"<<'\t';for(intjk=1;jk<=pageLength;jk++){cout<<"P"<<jk<<'\t';}cout<<endl<<'\t';for(ints=1;s<=pageLength;s++){cout<<fifoPage[s]<<'\t';}cout<<endl;}}voidLRU(){intlength;intlru[100]={0};intpageLength;intlruPage[100]={0};inti,j;cout<<"***********************最近最少使用算法***********************"<<endl;pageLength=3;length=9;cout<<"时刻t"<<'\t';for(i=0;i<length;i++){cout<<i<<'\t';}cout<<endl<<"引用串"<<'\t';for(i=1;i<=length;i++){lru[i]=rand()%5+1;cout<<lru[i]<<'\t';第19页共20页操作系统课程设计报告}for(i=1;i<=length;i++){intflag=0;for(j=1;j<=pageLength;j++){if(lru[i]==lruPage[j]){for(intcc=j;cc>0;cc--){lruPage[cc]=lruPage[cc-1];}lruPage[1]=lru[i];flag=1;j=pageLength+1;}elseif(lruPage[j]==0){for(intvv=j;vv>0;vv--){lruPage[vv]=lruPage[vv-1];}lruPage[1]=lru[i];j=pageLength+1;flag=1;}}if(flag==1){}else{cout<<"→淘汰"<<lruPage[pageLength]<<endl;for(j=pageLength;j>0;j--){lruPage[j]=lruPage[j-1];}lruPage[1]=lru[i];}cout<<endl<<"t="<<i-1<<"时"<<'\t';for(intjk=1;jk<=pageLength;jk++){cout<<"P"<<jk<<'\t';}cout<<endl<<'\t';for(ints=1;s<=pageLength;s++){cout<<lruPage[s]<<'\t';}cout<<endl;第20页共21页操作系统课程设计报告}}voidqueye()//页面替换{intn;cout<<endl;cout<<"\t1.先进先出算法\t2.LRU算法\t3.返回开始菜单"<<endl;cin>>n;switch(n){case1:FIFO();kaishi();break;case2:LRU();kaishi();break;case3:kaishi();kaishi();break;}}/**//*********************判断输入数据是否有效**************************/intdecide(charstr[])//判断输入数据是否有效{inti=0;while(str[i]!='\0'){if(str[i]<'0'||str[i]>'9'){return0;break;}i++;}returni;}/******************将字符串转换成数字***********************/inttrans(charstr[],int//将字符串转换成数字{inti;intsum=0;for(i=0;i<i++){sum=sum+(int)((str[i]-'0')*pow(10,a-i-1));}returnsum;}第21页共22页操作系统课程设计报告/*********************先来先服务调度算法************************/voidFCFS(intcidao[],int//磁道号数组,个数为m{intnow;//当前磁道号intsum=0;//总寻道长度intj,i;inta;charstr[100];floatave;//平均寻道长度cout<<"***********************先来先服务**************************"<<endl;cout<<"磁盘请求序列为:";for(i=0;i<i++)//按先来先服务的策略输出磁盘请求序列{cout<<cidao[i]<<"";}cout<<endl;cout<<"请输入当前的磁道号:";B:cin>>str;//对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;gotoB;}elsenow=trans(str,a);//输入当前磁道号sum+=abs(cidao[0]-now);cout<<"磁盘扫描序列为:";for(i=0;i<i++)//输出磁盘扫描序列{cout<<cidao[i]<<"";}for(i=0,j=1;j<i++,j++)//求平均寻道长度{sum+=abs(cidao[j]-cidao[i]);ave=(float)(sum)/(float)(}cout<<endl;cout<<"平均寻道长度:"<<ave<<endl;}voidcipandiaodu()//磁盘调度{inta;第22页共23页操作系统课程设计报告intc;//菜单项intcidao[maxsize];inti=0,count;charstr[100];cout<<endl;cout<<"\t1.先来先服务\t2.返回开始菜单"<<endl;F:cin>>str;//对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;gotoF;//输入错误,跳转到,重新输入}elsec=trans(str,a);cout<<"请输入磁道序列(0结束):"<<endl;A:cin>>str;//对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;gotoA;//输入错误,跳转到,重新输入}elsecidao[i]=trans(str,a);i++;while(cidao[i-1]!=0){cin>>str;//对输入数据进行有效性判断a=decide(str);if(a==0)cout<<"输入数据的类型错误,请重新输入!"<<endl;else{cidao[i]=trans(str,a);i++;}}count=i-1;//要访问的磁道数cout<<"你输入的磁道序列为:";for(i=0;i<count;i++){cout<<cidao[i]<<"";//输出磁道序列第23页共24页操作系统课程设计报告}cout<<endl;switch(c){case1://使用FCFS算法FCFS(cidao,count);kaishi();break;case2:kaishi();kaishi();break;}}/**/booltools[5];//全局变量,用餐工具//信号量,在线程中使用,临界区classPhilosopher{private:intnumber;intstatus;//标记当前哲学家的状态,0表示正在等待//(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考public:Philosopher(int0):status(2),number({}constintfind(){returnnumber;}constintgetinfo(){returnstatus;}voidChange();//状态改变函数voiddead_lock();};voidPhilosopher::dead_lock(){EnterCriticalSection(&cs);//进入临界区strings;if(status==1){tools[number%5]=true;//tools[(number-1)%5]=true;status=2;第24页共25页操作系统课程设计报告}elseif(status==2){status=0;//tools[(number-1)%5]=false;//tools[(number-1)%5]=true;}elseif(status==0){tools[number%5]=false;tools[(number-1)%5]=false;status=1;}LeaveCriticalSection(&cs);//cout<<"*********";}voidPhilosopher::Change(){EnterCriticalSection(&cs);//进入临界区if(status==1)//正在进餐{tools[number%5]=true;//放下左手工具tools[(number-1)%5]=true;//放下右手工具status=2;//改变状态为思考}elseif(status==2)//思考中{status=0;//改变状态为等待}elseif(status==0)//等待中{if(tools[number%5]&&tools[(number-1)%5])//左右手两边工具均为空闲状态{tools[number%5]=false;//拿起左手工具tools[(number-1)%5]=false;//拿起右手工具status=1;}}LeaveCriticalSection(&cs);}stringprint(Philosopher*{//pA->Change();第25页共26页操作系统课程设计报告inti=stringstr;if(i==0)str="等待";elseif(i==1)str="就餐";elsestr="思考";returnstr;}stringtoolstatus(boola){stringstate;if(a==true)state="闲";if(a==false)state="用";returnstate;}voiddead_lock(){charcon='y';//判断是否继续//con='n';for(inti=0;i<5;i++)tools[i]=true;//筷子都未使用,初始化PhilosopherP1(1),P2(2),P3(3),P4(4),P5(5);InitializeCriticalSection(&cs);//初始化初始化临界区cout<<"***********************PV原语**************************"<<endl;cout<<"状态说明示意图:"<<endl;cout<<""<<"哲学家1号的状态"<<""<<endl;cout<<"筷子0的状态"<<""<<"筷子1的状态"<<endl;cout<<"哲学家5号的状态"<<""<<"哲学家2号的状态"<<endl;cout<<"筷子4的状态"<<""<<"筷子2的状态"<<endl;cout<<"哲学家4号的状态"<<""<<"哲学家3号的状态"<<endl;cout<<""<<"筷子3的状态"<<endl;//cout<<""<<"哲学家3号的状态"<<""<<endl;cout<<"筷子的状态,用表示使用中,闲表示空闲中。"<<endl;cout<<""<<endl;//cout<<"哲学家们开始生活:"<<endl;//cout<<"当前状态:";cout<<endl;//cin>>con;while(con=='y'){P1.Change();P2.Change();P3.Change();P4.Change();P5.Change();第26页共27页操作系统课程设计报告cout<<"当前状态为:"<<endl;cout<<""<<P1.find()<<print(&P1)<<""<<endl;cout<<""<<toolstatus(tools[0])<<""<<toolstatus(tools[1])<<endl;cout<<""<<P5.find()<<print(&P5)<<""<<P2.find()<<print(&P2)<<endl;cout<<""<<toolstatus(tools[4])<<""<<toolstatus(tools[2])<<endl;cout<<""<<P4.find()<<print(&P4)<<""<<P3.find()<<print(&P3)<<endl;cout<<""<<toolstatus(tools[3])<<endl;cout<<""<<endl;cout<<"若要继续下一状态,输入y;输入n进入死锁;输入其他,结束程序:";cin>>con;Sleep(20);}while(con=='n'){P1.dead_lock();P2.dead_lock();P3.dead_lock();P4.dead_lock();P5.dead_lock();cout<<"死锁情况"<<endl;cout<<""<<P1.find()<<print(&P1)<<""<<endl;cout<<""<<toolstatus(tools[0])<<""<<toolstatus(tools[1])<<endl;cout<<""<<P5.find()<<print(&P5)<<""<<P2.find()<<print(&P2)<<endl;cout<<""<<toolstatus(tools[4])<<""<<toolstatus(tools[2])<<endl;cout<<""<<P4.find()<<print(&P4)<<""<<P3.find()<<print(&P3)<<endl;cout<<""<<toolstatus(tools[3])<<endl;cout<<""<<endl;cout<<"输入n继续;输入其他,结束程序:";cin>>con;Sleep(20);}DeleteCriticalSection(&cs);//退出资源区}voidPV()//哲学家吃通心面问题{intn;cout<<endl;cout<<"\t1.开始\t2.返回开始菜单"<<endl;cin>>n;第27页共28页操作系统课程设计报告switch(n){case1:dead_lock();kaishi();break;case2:kaishi();kaishi();break;}}/**/voidZD(){doublep;inta,m,r,n,e,o,u;structtm*local;char*st,s[27];time_tt;t=time(local=localtime(&t);st=asctime(local);//记录初试时间for(inti=0;i<27;i++){s[i]=*st;st++;}cout<<"***********************中断模拟**************************"<<endl;cout<<"当前系统时间:";for(inti1=4;i1<27;i1++){cout<<s[i1];}cout<<endl<<endl;//设置为时钟闹铃为8,每个时钟间隔为2秒intcount=0,count1=0,k=8,w;while(k!=0){do{cout<<"已执行完一条指令\n";count++;cout<<"请输入一个数字(1表示中断,0表示无中断):";cin>>w;//读取键盘输入}while(w==0);//如果w一直为,则程序一直在此循环执行第28页共29页操作系统课程设计报告if(w==1)cout<<"现场保存完毕\n";count1++;k--;//对k--,当出现8次中断时if(k!=0)cout<<"处理器完成调度\n";}p=count1*2;a=(int)count1*2;if((p-a)>=0.5)p=a+1;elsep=a;//这段代码是对硬件的模拟,就是当count1出现偏差时的处理m=(int)p;cout<<"现在已过时间为:"<<m<<endl;r=s[17]-48;n=s[18]-48;e=r*10+n;p=p+e;//下面部分代码为ASCII码的转换if(p<60){s[17]=((int)p/10)+48;s[18]=((int)p%10)+48;for(inti=4;i<27;i++)cout<<s[i];cout<<endl;}else{s[14]=s[14]-48;s[15]=s[15]-48;o=s[14]*10+s[15];o=o+(int)p/60;}if(o<60){s[14]=(o/10)+48;s[15]=(o%10)+48;s[17]=((int)p%60)/10+48;s[18]=((int)p%60)%10+48;第29页共30页操作系统课程设计报告for(inti=4;i<27;i++){cout<<s[i];}cout<<endl;}else{s[11]=s[11]-48;s[12]=s[12]-48;u=s[11]*10+s[12];u=u+o/60;if(u<24){s[11]=u/10+48;s[12]=u%10+48;s[14]=(o%60)/10+48;s[15]=(o%60)%10+48;s[17]=((int)p%60)/10+48;s[18]=((int)p%60)%10+48;for(inti=4;i<27;i++){cout<<s[i];}cout<<endl;}}}voidzhongduan(){intn;cout<<endl;cout<<"\t1.开始\t2.返回开始菜单"<<endl;cin>>n;switch(n){case1:ZD();kaishi();break;case2:kaishi();kaishi();break;}}/**/structprocess{stringname;第30页共31页操作系统课程设计报告floatarrivetime;//到达时间floatruntime;//运行时间floatstarttime;//开始时间floatfinishtime;//完成时间boolflag=false;};//多道程序设计structprogram{processp[5];};voidinput(program&intn)//程序信息输入{cout<<"请您输入进程的\t名字\t服务时间\n";for(inti=0;i<n;i++){cout<<"请输入步骤"<<i+1<<"的信息:";cin>>>>p.p[i].runtime;cout<<endl;}}floatsearch(strings,programp,intn){for(inti=n-1;i>=0;i--){if(==s){return}}return0;}voidPrint(programp,int//最终结果输出{cout<<endl;cout<<"\n运行步骤开始时间完成时间到达时间运行时间\n";for(intk=0;k<n;k++){cout<<"\t"<<p.p[k].name<<"\t"<<p.p[k].starttime<<"\t\t"<<p.p[k].finishtime<<"\t\t"<<p.p[k].arrivetime<<"\t\t"<<<<endl;}第31页共32页操作系统课程设计报告}voidProgram(){intn1,n2;programa,b;cout<<"***********************多道程序设计**************************"<<endl;cout<<"输入程序A的运行步骤:";cin>>n1;cout<<endl;input(a,n1);cout<<"输入程序B的运行步骤:";cin>>n2;cout<<endl;input(b,n2);a.p[0].arrivetime=0;b.p[0].arrivetime=0;a.p[0].finishtime=0;b.p[0].finishtime=0;inti=0,j=0;floatf;do{if(a.p[i].arrivetime<=b.p[j].arrivetime){f=search(a.p[i].name,b,n2);if(f<=a.p[i].arrivetime){a.p[i].starttime=a.p[i].arrivetime;}else{a.p[i].starttime=f;}a.p[i].finishtime=a.p[i].starttime+a.p[i].runtime;a.p[i].flag=true;if(i<n1-1){a.p[i+1].arrivetime=a.p[i].finishtime;i++;}}if(a.p[i].arrivetime>=b.p[j].arrivetime){f=search(b.p[j].name,a,n1);第32页共33页操作系统课程设计报告if(f<=b.p[j].arrivetime){b.p[j].starttime=b.p[j].arrivetime;}else{b.p[j].starttime=f;}b.p[j].finishtime=b.p[j].starttime+b.p[j].runtime;b.p[j].flag=true;if(j<n2-1){b.p[j+1].arrivetime=b.p[j].finishtime;j++;}}}while(!a.p[n1-1].flag&&!b.p[n2-1].flag);while(a.p[n1-1].flag&&!b.p[n2-1].flag){b.p[j].starttime=b.p[j].arrivetime;b.p[j].finishtime=b.p[j].starttime+b.p[j].runtime;b.p[j].flag=true;if(j<n2-1){b.p[j+1].arrivetime=b.p[j].finishtime;j++;}}while(b.p[n2-1].flag&&!a.p[n1-1].flag){a.p[i].starttime=a.p[i].arrivetime;a.p[i].finishtime=a.p[i].starttime+a.p[i].runtime;a.p[i].flag=true;if(i<n1-1){a.p[i+1].arrivetime=a.p[i].finishtime;i++;}}Print(a,n1);Print(b,n2);system("pause");}第33页共34页操作系统课程设计报告voidduodaochengxu(){intn;cout<<endl;cout<<"\t1.开始\t2.返回开始菜单"<<endl;cin>>n;switch(n){case1:Program();kaishi();break;case2:kaishi();kaishi();break;}}/**/intavaResour[3]={3,3,2};intallocation[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};intmaxRequest[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};intnneed[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};voidrrequest();boolsafeTest();voidrrequest(){intsqjc=0,i=0,l=0,a=0,b=0,c=0;charcontn=0;cout<<endl<<"进程个数:5资源个数:3"<<endl<<"可用资源向量Available:"<<endl;for(i=0;i<3;i++)cout<<avaResour[i]<<"";cout<<endl<<"最大需求矩阵Max:"<<endl;for(i=0;i<5;i++){for(l=0;l<3;l++)cout<<maxRequest[i][l]<<"";cout<<endl;}cout<<"已分配矩阵Allocation:"<<endl;for(i=0;i<5;i++){for(l=0;l<3;l++)cout<<allocation[i][l]<<"";cout<<endl;}cout<<"需求矩阵Need:"<<endl;for(i=0;i<5;i++)第34页共35页操作系统课程设计报告{for(l=0;l<3;l++)cout<<nneed[i][l]<<"";cout<<endl;}cout<<"输入发起请求的进程(0-4):";cin>>sqjc;while(sqjc>4||sqjc<0){cout<<endl<<"不要乱输!^_^"<<endl;cout<<endl<<"输入发起请求的进程(0-4):";cin>>sqjc;}cout<<"输入请求资源的数目,按照这样的格式输入xxx:";cin>>a>>b>>c;if(a<=nneed[sqjc][0]&&b<=nneed[sqjc][1]&&c<=nneed[sqjc][2]){cout<<endl<<"开始执行银行家算法..."<<endl;if(a<=avaResour[0]&&b<=avaResour[1]&&c<=avaResour[2]){avaResour[0]=avaResour[0]-a;avaResour[1]=avaResour[1]-b;avaResour[2]=avaResour[2]-c;allocation[sqjc][0]=allocation[sqjc][0]+a;allocation[sqjc][1]=allocation[sqjc][1]+b;allocation[sqjc][2]=allocation[sqjc][2]+c;nneed[sqjc][0]=nneed[sqjc][0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论