设备管理算法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验五设备管理一、实验目的1、理解设备管理的概念和任务。2、掌握独占设备的分配、回收等主要算法的原理并编程实现。二、实验内容与基本要求1、在Windows系统中,编写程序实现对独占设备的分配和回收的模拟,该程序中包括:建立设备类表和设备表、分配设备和回收设备的函数。三、实验报告内容1、独占设备的分配、回收等主要算法的原理。2、程序流程图。3、程序及注释。4、运行结果以及结论。四、实验报告1、独占设备的分配、回收等主要算法的原理。为了提高操作系统的可适应性和可扩展性,现代操作系统中都毫无例外地实现了设备独立性,又叫做设备无关性。设备独立性的含义是:应用程序独立于具体使用的物理设备。为了实现独占设备的分配,系统设置数据表格的方式也不相同,在实验中只要设计合理即可。这里仅仅是一种方案,采用设备类表和设备表。(1)数据结构操作系统设置“设备分配表”,用来记录计算机系统所配置的独占设备类型、台数以及分配情况。设备分配表可由“设备类表”和“设备表”两部分组成。(2)设备分配1)当进程申请某类设备时,系统先查“设备类表”。2)如果该类设备的现存台数可以满足申请要求,则从该类设备的“设备表”始址开始依次查该类设备在设备表中的登记项,找出“未分配”的设备分配给进程。3)分配后要修改设备类表中的现存台数,把分配给进程的设备标志改为“已分配”且填上占用设备的进程名。4)然后,把设备的绝对号与相对号的对应关系通知用户,以便用户在分配到的设备上装上存储介质。(3)设备回收当进程执行结束撤离时应归还所占设备,系统根据进程名查设备表,找出进程占用设备的登记栏,把标志修改为“未分配”,清除进程名。同时把回收的设备台数加到设备类表中的现存台数中。2、程序流程图。1)申请设备2)删除设备3)释放设备4)添加设备3、程序及注释。(增加一个功能:显示当前正在使用的设备。一个进程申请多个设备?一个设备多个进程申请?)#includeiostream#includestring#includevectorusingnamespacestd;typedefstructnode{stringID;//进程名stringequipment;//申请的设备名structnode*next;}PCB;typedefstruct{stringchannelID;//通道标识符boolstate;//通道状态PCB*use;//正在使用该通道的进程PCB*blockqueue;//阻塞队首}CHCT;typedefstruct{stringcontrollerID;//控制器标示boolstate;//控制器状态CHCT*front;//通道表指针PCB*use;//正在使用该控制器的进程PCB*blockqueue;//阻塞队首}COCT;typedefstruct{chartype;//设备类型stringequipmentID;//设备名boolstate;//设备状态COCT*front;//控制器指针PCB*use;//正在使用该设备的进程PCB*blockqueue;//阻塞队首}DCT;typedefstruct{chartype;//设备类型stringequipmentID;//设备名DCT*dct;//设备的DCT}SDT;DCT*k=newDCT;//键盘的DCTDCT*m=newDCT;//mouseDCT*p=newDCT;//printerDCT*t=newDCT;//显示COCT*c1=newCOCT;//controlCOCT*c2=newCOCT;COCT*c3=newCOCT;CHCT*h1=newCHCT;//channelCHCT*h2=newCHCT;CHCT*h3=newCHCT;intcheck(charcmd){switch(cmd){case'c'://申请return1;case'C':return1;case'd'://删除return2;case'D':return2;case'a'://添加return3;case'A':return3;case'f'://释放freereturn4;case'F':return4;case'q':return-1;case'Q':return-1;case'p':return5;case'P':return5;default:return0;}}voidinit(vectorSDT&SDT_table){SDT_table[0].equipmentID=M;SDT_table[0].type='2';//鼠标是第二类设备SDT_table[0].dct=m;//设备的DCT表位置SDT_table[1].equipmentID=K;SDT_table[1].type='1';SDT_table[1].dct=k;SDT_table[2].equipmentID=P;SDT_table[2].type='3';SDT_table[2].dct=p;SDT_table[3].equipmentID=T;SDT_table[3].type='4';SDT_table[3].dct=t;h1-blockqueue=NULL;h1-channelID=通道1;h1-state=true;h1-use=NULL;h2-blockqueue=NULL;h2-channelID=通道2;h2-state=true;h2-use=NULL;c1-blockqueue=NULL;c1-controllerID=控制器1;c1-state=true;c1-front=h1;c1-use=NULL;c2-blockqueue=NULL;c2-controllerID=控制器2;c2-state=true;c2-front=h1;c2-use=NULL;c3-blockqueue=NULL;c3-controllerID=控制器3;c3-state=true;c3-front=h2;c3-use=NULL;k-blockqueue=NULL;k-equipmentID=K;k-state=true;//可用k-type='1';k-front=c1;k-use=NULL;m-blockqueue=NULL;m-equipmentID=M;m-state=true;m-type='2';m-front=c1;m-use=NULL;p-blockqueue=NULL;p-equipmentID=P;p-state=true;p-type='3';p-front=c2;p-use=NULL;t-blockqueue=NULL;t-equipmentID=T;t-state=true;t-type='4';t-front=c3;t-use=NULL;}intmain(){charcmd;DCT*temp_dct;COCT*temp_coct;CHCT*temp_chct;intl=0;stringID;stringname;vectorSDTSDT_table(4);//设备表vectorDCTDCT_table(4);//设备vectorCOCTCOCT_table(3);//控制器表//vectorSDT::size_typesize_SDT_table;//设备表长度init(SDT_table);//设备表的初始化DCTu=*k;DCT_table.push_back(u);u=*m;DCT_table.push_back(u);u=*p;DCT_table.push_back(u);u=*t;DCT_table.push_back(u);COCTcu=*c1;COCT_table.push_back(cu);cu=*c2;COCT_table.push_back(cu);cu=*c3;COCT_table.push_back(cu);cout目前设备:K:键盘(1)M:鼠标(2)P:打印机(3)T:显示器(4)endl;cout操作指令C申请使用设备。endl;cout操作指令D删除设备。endl;cout操作指令A添加设备。endl;cout操作指令F释放设备。endl;while(l!=-1){cout;cincmd;l=check(cmd);if(l==0){cout指令错误请重新输入。endl;continue;}elseif(l==1)//申请使用设备{cout想要使用的设备名:endl;cinID;cout申请设备的进程名:endl;cinname;PCB*head=newPCB;//申请PCB的创建和链接head-equipment=name;head-ID=ID;head-next=NULL;boolfind=false;vectorSDT::iteratorator0;for(ator0=SDT_table.begin();ator0!=SDT_table.end();ator0++){if(ator0-equipmentID==ID){find=true;//有该设备break;}}if(!find){cout没有该设备,请重新输入操作指令。endl;continue;}temp_dct=ator0-dct;if(!temp_dct-state)//设备忙{cout该设备目前处于忙状态,已经把请求加入等待队列。endl;if(!temp_dct-blockqueue)//阻塞的队列为空{temp_dct-blockqueue=head;}else//阻塞队列已经有内容{PCB*t=temp_dct-blockqueue;while(t)t=t-next;if(!t){temp_dct-blockqueue=NULL;}elset-next=head;}}else//设备空闲{temp_coct=temp_dct-front;temp_dct-state=false;temp_dct-use=head;//添加正在占用设备的进程if(!temp_coct-state)//控制器不可用{cout目前该设备连接的控制器忙,已经把请求加入等待队列.endl;if(!temp_coct-blockqueue)//阻塞的队列为空{temp_coct-blockqueue=head;}else//阻塞队列不空{PCB*t=temp_coct-blockqueue;while(t)t=t-next;if(!t){temp_dct-blockqueue=NULL;}elset-next=head;}}else//控制器可用{temp_coct-state=false;//控制器置忙temp_chct=temp_coct-front;temp_coct-use=head;if(!temp_chct-state)//通道不可用{cout目前该设备连接的通道忙,已经把请求加入等待队列.endl;if(!temp_chct-blockqueue)//阻塞队列为空{temp_chct-blockqueue=head;}else//阻塞队列不为空{PCB*t=temp_coct-blockqueue;while(t)t=t-next;if(!t){temp_dct-blockqueue=NULL;}elset-next=head;}}else//通道可用{temp_chct-use=head;temp_chct-state=false;//通道状态置忙cout该设备已经成功申请,请输入下一条指令.endl;}}}}elseif(l==2)//删除设备{vectorSDT::iteratorator;v

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功