操作系统实验 设备管理_第1页
操作系统实验 设备管理_第2页
操作系统实验 设备管理_第3页
操作系统实验 设备管理_第4页
操作系统实验 设备管理_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、 操作系统实验名 称 实验六 设备管理 姓 名 专 业 学 号 日 期 2015年12月01日 指导老师 1、 实验目的1. 理解设备管理的概念和任务。2. 掌握独占设备的分配、回收等主要算法的原理并编程实现。2、 实验内容与要求1. 在Windows系统中,编写程序实现对独占设备的分配和回收的模拟,该程序中包括:建立设备类表和设备表、分配设备和回收设备的函数。3、 实验原理1. 独占设备的分配、回收等主要算法的原理。为了提高操作系统的可适应性和可扩展性,现代操作系统中都毫无例外地实现了设备独立性,又叫做设备无关性。设备独立性的含义是:应用程序独立于具体使用的物理设备。为了实现独占设备的分配,

2、系统设置数据表格的方式也不相同,在实验中只要设计合理即可。这里仅仅是一种方案,采用设备类表和设备表。(1)数据结构设备物理名是否分配占用进程001未分配002已分配J1003未分配操作系统设置“设备分配表”,用来记录计算机系统所配置的独占设备类型、台数以及分配情况。设备分配表可由“设备类表”和“设备表”两部分组成,如下图:设备类总台数空闲台数设备表始址输入机21打印机11设备类表 设备表控制器标识符控制器状态:忙、闲与控制器相连的通道表指针控制器队列的队首指针控制器队列的队首指针通道标识符通道状态:忙、闲与通道相连的控制器表首址通道队列的队首指针通道队列的队首指针控制器表 通道表设备队列队首指

3、针。凡因请求本设备而未得到满足的进程,其PCB都应按照一定的策略排成一个队列,称该队列为设备请求队列或简称设备队列。其队首指针指向队首PCB。在有的系统中还设置了队尾指针。设备状态。当设备自身正处于使用状态时,应将设备的忙/闲标志置“1”。若与该设备相连接的控制器或通道正忙,也不能启动该设备,此时则应将设备的等待标志置“1”。与设备连接的控制器表指针。该指针指向该设备所连接的控制器的控制表。在设备到主机之间具有多条通路的情况下,一个设备将与多个控制器相连接。此时,在DCT中还应设置多个控制器表指针。(2)设备分配1)当进程申请某类设备时,系统先查“设备类表”。2)如果该类设备的现存台数可以满足

4、申请要求,则从该类设备的“设备表”始址开始依次查该类设备在设备表中的登记项,找出“未分配”的设备分配给进程。3)分配后要修改设备类表中的现存台数,把分配给进程的设备标志改为“已分配”且填上占用设备的进程名。4)然后,把设备的绝对号与相对号的对应关系通知用户,以便用户在分配到的设备上装上存储介质。(3)设备回收当进程执行结束撤离时应归还所占设备,系统根据进程名查设备表,找出进程占用设备的登记栏,把标志修改为“未分配”,清除进程名。同时把回收的设备台数加到设备类表中的现存台数中。设备分配程序的改进增加设备的独立性:为了获得设备的独立性,进程应使用逻辑设备名I/O。这样,系统首先从SDT中找出第一个

5、该类设备的DCT。若该设备忙,又查找第二个该类设备的DCT,仅当所有该类设备都忙时,才把进程挂在该类设备的等待队列上,而只要有一个该类设备可用,系统便进一歩计算分配该设备的安全性。4、 程序流程图开始结束输入选择指令A输入设备名称输入设备类型是否添加控制器输入控制器名称输入选择的通道显示所有设备信息添加成功NY设备是否存在NY删除设备开始同时删除控制器输入选择指令D输入要删除的设备名称是否删除控制器结束删除控制器成功YN设备独立性结束开始输入选择指令I输入设备名称设置成功申请设备开始输入申请的进程判断通道,控制器是否为忙输入选择指令S输入申请的设备名称将设备挂到等待队列申请设备成功结束YN开始

6、输入选择指令H判断设备是否存在设备不存在判断设备是否需要回收设备不需要回收判断通道等待队列空不空输入设备名称设备回收成功结束五、实验程序#include<iostream>using namespace std;/数据结构typedef struct nodechar name10;char devname10;struct node *next;PCB;/进程PCB * run;/执行队列/typedef struct Nodechar identify10;/标识int state;/设备状态PCB *blocking;/阻塞队列指针CHCT;/通道控制表CHCT * CH1,

7、 * CH2;/设置两个通道为ch1,ch2/typedef struct NOdechar identify10;/标识int state;/设备状态CHCT * chct;/CHCTPCB *blocking;/阻塞队列指针struct NOde *next;COCT;/控制器控制表COCT * cohead;typedef struct NODechar identify10;/标识char type;/设备类型int state;/设备状态int times;/重复执行次数PCB *blocking;/阻塞队列指针COCT * coct;/COCTDCT;/设备控制表typedef s

8、truct NODEchar type;/类别char identify10;/标识DCT * dct;/DCT设备控制表/驱动入口地址struct NODE *next;SDT;/系统设备表SDT * head;SDT * checkdel;void Init()PCB * ch1block,* ch2block,* co1block,* co2block,* co3block,* d1block,* d2block,* d3block,* d4block;/进程控制块COCT * CO1,* CO2,* CO3;DCT *d1,*d2,*d3,*d4;SDT *s1,*s2,*s3,*s4

9、;/=run=(PCB *)malloc(sizeof(PCB);run->next=NULL;CH1=(CHCT *)malloc(sizeof(CHCT);CH2=(CHCT *)malloc(sizeof(CHCT);strcpy(CH1->identify,"ch1");strcpy(CH2->identify,"ch2");CH1->state=0;CH2->state=0;ch1block=(PCB *)malloc(sizeof(PCB);ch1block->next=NULL;ch2block=(PCB

10、 *)malloc(sizeof(PCB);ch2block->next=NULL;CH1->blocking=ch1block;CH2->blocking=ch2block;cohead=(COCT *)malloc(sizeof(COCT);cohead->next=NULL;CO1=(COCT *)malloc(sizeof(COCT);cohead->next=CO1;CO1->next=NULL;CO2=(COCT *)malloc(sizeof(COCT);CO1->next=CO2;CO2->next=NULL;CO3=(COCT

11、*)malloc(sizeof(COCT);CO2->next=CO3;CO3->next=NULL;CO1->state=0;CO2->state=0;CO3->state=0;co1block=(PCB *)malloc(sizeof(PCB);co1block->next=NULL;co2block=(PCB *)malloc(sizeof(PCB);co2block->next=NULL;co3block=(PCB *)malloc(sizeof(PCB);co3block->next=NULL;strcpy(CO1->identi

12、fy,"co1");strcpy(CO2->identify,"co2");strcpy(CO3->identify,"co3");CO1->chct=CH1;CO2->chct=CH1;CO3->chct=CH2;CO1->blocking=co1block;CO2->blocking=co2block;CO3->blocking=co3block;/=d1block=(PCB *)malloc(sizeof(PCB);d2block=(PCB *)malloc(sizeof(PCB)

13、;d3block=(PCB *)malloc(sizeof(PCB);d4block=(PCB *)malloc(sizeof(PCB);d1block->next=NULL;d2block->next=NULL;d3block->next=NULL;d4block->next=NULL;d1=(DCT *)malloc(sizeof(DCT);strcpy(d1->identify,"P");/p表示打印机设备d2=(DCT *)malloc(sizeof(DCT);strcpy(d2->identify,"T");

14、/t表示显示器设备d3=(DCT *)malloc(sizeof(DCT);strcpy(d3->identify,"K");/k表示键盘设备d4=(DCT *)malloc(sizeof(DCT);strcpy(d4->identify,"M");/m表示鼠标设备d1->coct=CO1; /控制器d2->coct=CO2; d3->coct=CO3;d4->coct=CO3;d1->state=0;/状态d2->state=0;d3->state=0;d4->state=0;d1->t

15、ype='o'/o表示输出设备outputd2->type='o'd3->type='i'/i表示输入设备d4->type='i'd1->blocking=d1block;d2->blocking=d2block;d3->blocking=d3block;d4->blocking=d4block;/=head=(SDT *)malloc(sizeof(SDT);head->next=NULL;s1=(SDT *)malloc(sizeof(SDT);s2=(SDT *)malloc(

16、sizeof(SDT);s3=(SDT *)malloc(sizeof(SDT);s4=(SDT *)malloc(sizeof(SDT);head->next=s1;s1->next=s2;s2->next=s3;s3->next=s4;s4->next=NULL;s1->dct=d1;s2->dct=d2;s3->dct=d3;s4->dct=d4;strcpy(s1->identify,"P");strcpy(s2->identify,"T");strcpy(s3->ident

17、ify,"K");strcpy(s4->identify,"M");s1->type='o's2->type='o's3->type='i's4->type='i'/testSDT *temp=head->next;/=/添加设备时候,添加新控制器,把控制器加到最后void Addcotrol (COCT *temp)/添加控制器函数COCT *cotemp=cohead;while(cotemp->next!=NULL)cotemp=cotemp-

18、>next;cotemp->next=temp;temp->next=NULL;/查看所有控制器,选择所要连接的控制器void Showallco()COCT *temp=cohead->next;while(temp!=NULL)cout<<temp->identify<<" "temp=temp->next;cout<<endl;/查找要连接的控制器COCT * Findco(char a)COCT * temp=cohead->next;while(temp!=NULL)if(!strcmp

19、(temp->identify,a)return temp;temp=temp->next;return temp;/删除设备时候,判断是不是同时删除控制器,等于1删,0不删int sf_deleteco(char a,char b)SDT *temp;temp=head->next;while(temp!=NULL)if(strcmp(temp->identify,a)&&(!strcmp(temp->dct->coct->identify,b)return 0;temp=temp->next;return 1;/删除设备的时候

20、同时删除控制器void Deletecotrol(COCT *te)COCT * temp=cohead;while(temp->next!=te)temp=temp->next;temp->next=te->next;delete(te);/添加设备,查找设备是不是已经存在int sf_exist(char a)SDT *temp;if(head->next=NULL)return 0;elsetemp=head->next;while(temp!=NULL)if(!strcmp(a,temp->identify)checkdel=temp;retu

21、rn 1;temp=temp->next;return 0;/申请设备时候,如果忙,将设备挂到等待队列void Addwaitpcb(PCB * p1,PCB * p2)PCB *temp=p1;while(temp->next!=NULL)temp=temp->next;temp->next=p2;p2->next=NULL;/回收设备时候,对PCB的操作void Deletepcb(char a)PCB * temp2=run->next,* temp=run;while(temp2!=NULL)if(!strcmp(temp2->devname,

22、a)temp->next=temp2->next;delete(temp2);break;temp=temp2;temp2=temp->next;/判断等待队列是不是空int sf_pcbnull(PCB *temp)if(temp->next=NULL)return 0;else return 1;/查看所有设备状态void Showmenu()PCB * ptemp=run->next;SDT * temp=head->next;DCT * dtemp;COCT * cotemp;CHCT * chtemp;cout<<"SDT&q

23、uot;<<" i/o"<<" COCT"<<" CHCT"<<endl;while(temp!=NULL)dtemp=temp->dct;cotemp=dtemp->coct;chtemp=cotemp->chct;cout<<dtemp->identify<<""<<dtemp->state<<""<<"t"<<dtemp-

24、>type<<"t"<<cotemp->identify<<""<<cotemp->state<<""<<" t"<<chtemp->identify<<""<<chtemp->state<<""<<endl;temp=temp->next;while(ptemp!=NULL)cout<<"

25、;进程"<<ptemp->name<<"申请了设备"<<ptemp->devname<<endl;ptemp=ptemp->next;cout<<endl;/设备独立性时候查找要查找的类型是不是存在int sf_typeexist(char ch)SDT *temp;if(head->next=NULL)return 0;elsetemp=head->next;while(temp!=NULL)if(temp->type=ch)return 1;else temp=te

26、mp->next;return 0;/增加设备void Adddevice()cout<<"增加设备"<<endl;/写入设备名称SDT * stemp,* s2temp;COCT *cotemp;DCT *temp;char temptype;PCB *tempblock,* cotempblock;char choice;char eqary10,coary10;cin>>eqary;/此处查找SDT,看是否所要添加的设备已经存在if(sf_exist(eqary)=1)/设备已经存在cout<<"设备已存

27、在"<<endl;else/设备不存在tempblock=(PCB *)malloc(sizeof(PCB);tempblock->next=NULL;temp=(DCT *)malloc(sizeof(DCT);strcpy(temp->identify,eqary);temp->blocking=tempblock;temp->state=0;cout<<"输入设备类型"<<endl;cin>>temptype;temp->type=temptype;stemp=(SDT *)mal

28、loc(sizeof(SDT);stemp->next=NULL;stemp->dct=temp;stemp->type=temptype;strcpy(stemp->identify,eqary);s2temp=head;while(s2temp->next!=NULL)s2temp=s2temp->next;s2temp->next=stemp;stemp->next=NULL;cout<<"是否添加控制器?(y/n)"<<endl;cin>>choice;if(choice='

29、y')|(choice='Y')/添加新控制器cout<<"输入控制器名称:"<<endl;cin>>coary;cotempblock=(PCB *)malloc(sizeof(PCB);cotempblock->next=NULL;cotemp=(COCT *)malloc(sizeof(COCT);cotemp->next=NULL;strcpy(cotemp->identify,coary);cotemp->state=0;cotemp->blocking=cotempbloc

30、k;Addcotrol(cotemp);temp->coct=cotemp;cout<<"请选择连接的通道:1/2"<<endl;/因为只定义了两个通道,选1就是ch1,选2就是ch2int i;cin>>i;if(i=1)cotemp->chct=CH1;elsecotemp->chct=CH2;else/不添加控制器Showallco();cout<<"输入连接控制器的名称:"<<endl;cin>>coary;cotemp=Findco(coary);temp

31、->coct=cotemp;cout<<"设备"<<eqary<<"添加成功!"<<endl;/删除设备void Deletedevice()/删除设备的时候同时删除pcb Deletepcbcout<<"删除设备"<<endl;COCT * temp;SDT * stemp;char chary10;char tempary10;cin>>chary;if(sf_exist(chary)=0)cout<<"删除设备不存在!

32、"<<endl;else if(checkdel->dct->state=1)cout<<"设备正在使用无法删除"<<endl;else/sf_deleteco();Deletepcb(chary);strcpy(tempary,checkdel->dct->coct->identify);if(sf_deleteco(chary,tempary)/删除控制器temp=checkdel->dct->coct;Deletecotrol(temp);stemp=head;while(stem

33、p->next!=checkdel)stemp=stemp->next;stemp->next=checkdel->next;delete(checkdel);cout<<"设备"<<chary<<"删除成功!"<<endl;/申请设备void Applydevice()cout<<"申请设备"<<endl;PCB *ptemp;DCT *dtemp;COCT *cotemp;CHCT *chtemp;char pname10,eqname

34、10;cin>>pname>>eqname;if(sf_exist(eqname)=0)cout<<"设备不存在!"<<endl;else/checkdel(对应要申请设备的指针)ptemp=(PCB *)malloc(sizeof(PCB);strcpy(ptemp->name,pname);ptemp->next=NULL;dtemp=checkdel->dct;/=此处是否要考虑状态的改变=if(dtemp->state=1)/设备忙Addwaitpcb(dtemp->blocking,pt

35、emp);cout<<"进程"<<ptemp->name<<"被挂在设备"<<dtemp->identify<<"的等待队列上!"<<endl;else /设备不忙cotemp=dtemp->coct;if(cotemp->state=1)/控制器忙Addwaitpcb(cotemp->blocking,ptemp);cout<<"进程"<<ptemp->name<<&qu

36、ot;被挂在控制器"<<cotemp->identify<<"的等待队列上!"<<endl;else/控制器不忙chtemp=cotemp->chct;if(chtemp->state=1)/通道忙Addwaitpcb(chtemp->blocking,ptemp);cout<<"进程"<<ptemp->name<<"被挂在通道"<<chtemp->identify<<"的等待队列上!

37、"<<endl;else/通道不忙Addwaitpcb(run,ptemp);dtemp->state=1;cotemp->state=1;chtemp->state=1;strcpy(ptemp->devname,eqname);cout<<"进程"<<pname<<"申请设备"<<eqname<<"成功!"<<endl;/回收设备void Recycledevice()cout<<"回收设备&

38、quot;<<endl;/char ch;char eqname10;DCT *dtemp;COCT *cotemp;CHCT *chtemp;PCB *pctemp1,*pctemp2;cin>>eqname;if(sf_exist(eqname)=0)/设备不存在cout<<"要回收的设备不存在!"<<endl;else if(checkdel->dct->state=0)/设备存在,但是不需要回收cout<<"设备处于闲状态,不需要回收!"<<endl;else/需

39、要回收Deletepcb(eqname);/dtemp=checkdel->dct;cotemp=dtemp->coct;chtemp=cotemp->chct;dtemp->state=0;cotemp->state=0;chtemp->state=0;if(sf_pcbnull(chtemp->blocking)/如果通道等待队列不空pctemp1=chtemp->blocking;pctemp2=pctemp1->next;pctemp1->next=pctemp2->next;pctemp2->next=NULL;

40、strcpy(pctemp2->devname,eqname);Addwaitpcb(run,pctemp2);dtemp->state=1;cotemp->state=1;chtemp->state=1;elseif(sf_pcbnull(cotemp->blocking)/如果控制器的等待队列不空pctemp1=cotemp->blocking;pctemp2=pctemp1->next;pctemp1->next=pctemp2->next;pctemp2->next=NULL;strcpy(pctemp2->devnam

41、e,eqname);Addwaitpcb(run,pctemp2);dtemp->state=1;cotemp->state=1;chtemp->state=1;elseif(sf_pcbnull(dtemp->blocking)/如果设备的等待队列不空pctemp1=dtemp->blocking;pctemp2=pctemp1->next;pctemp1->next=pctemp2->next;pctemp2->next=NULL;strcpy(pctemp2->devname,eqname);Addwaitpcb(run,pct

42、emp2);dtemp->state=1;cotemp->state=1;chtemp->state=1;cout<<"设备"<<eqname<<"回收成功!"<<endl;/设备独立性=void Independence()cout<<"设备独立性-申请设备:"<<endl;/cout<<"申请设备"<<endl;char type;char pname10;SDT * temp,* temp2;PC

43、B *ptemp;DCT *dtemp;COCT *cotemp;CHCT *chtemp;cin>>pname>>type;if(type='o')|(type='i')/=还得考虑要申请的类型是不是存在=if(sf_typeexist(type)=0)cout<<"要申请的该类设备不存在!"<<endl;elsetemp=head->next;while(temp!=NULL)if(temp->type=type)&&(temp->dct->state

44、=0)/当设备类型相同,并且设备空闲temp2=temp;break;else if(temp->type=type)temp2=temp;temp=temp->next;sf_exist(temp2->identify);/=ptemp=(PCB *)malloc(sizeof(PCB);strcpy(ptemp->name,pname);ptemp->next=NULL;dtemp=checkdel->dct;/要用了这个函数才可以=if(temp2->dct->state=0)/当设备不忙时候cotemp=dtemp->coct;if

45、(cotemp->state=1)/控制器忙Addwaitpcb(cotemp->blocking,ptemp);cout<<"进程"<<ptemp->name<<"被挂在控制器"<<cotemp->identify<<"的等待队列上!"<<endl;else/控制器不忙chtemp=cotemp->chct;if(chtemp->state=1)/通道忙Addwaitpcb(chtemp->blocking,ptemp);cout<<"进程"<<ptemp->name<<"被挂在通道"<<chtemp->identi

温馨提示

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

最新文档

评论

0/150

提交评论