![操作系統(tǒng)實驗 設備管理_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/4b95fa6b-ba73-49fa-aea8-c6e437263cb5/4b95fa6b-ba73-49fa-aea8-c6e437263cb51.gif)
![操作系統(tǒng)實驗 設備管理_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/4b95fa6b-ba73-49fa-aea8-c6e437263cb5/4b95fa6b-ba73-49fa-aea8-c6e437263cb52.gif)
![操作系統(tǒng)實驗 設備管理_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/4b95fa6b-ba73-49fa-aea8-c6e437263cb5/4b95fa6b-ba73-49fa-aea8-c6e437263cb53.gif)
![操作系統(tǒng)實驗 設備管理_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/4b95fa6b-ba73-49fa-aea8-c6e437263cb5/4b95fa6b-ba73-49fa-aea8-c6e437263cb54.gif)
![操作系統(tǒng)實驗 設備管理_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/4b95fa6b-ba73-49fa-aea8-c6e437263cb5/4b95fa6b-ba73-49fa-aea8-c6e437263cb55.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 操作系統(tǒng)實驗名 稱 實驗六 設備管理 姓 名 專 業(yè) 學 號 日 期 2015年12月01日 指導老師 1、 實驗目的1. 理解設備管理的概念和任務。2. 掌握獨占設備的分配、回收等主要算法的原理并編程實現(xiàn)。2、 實驗內容與要求1. 在Windows系統(tǒng)中,編寫程序實現(xiàn)對獨占設備的分配和回收的模擬,該程序中包括:建立設備類表和設備表、分配設備和回收設備的函數(shù)。3、 實驗原理1. 獨占設備的分配、回收等主要算法的原理。為了提高操作系統(tǒng)的可適應性和可擴展性,現(xiàn)代操作系統(tǒng)中都毫無例外地實現(xiàn)了設備獨立性,又叫做設備無關性。設備獨立性的含義是:應用程序獨立于具體使用的物理設備。為了實現(xiàn)獨占設備的分配,
2、系統(tǒng)設置數(shù)據表格的方式也不相同,在實驗中只要設計合理即可。這里僅僅是一種方案,采用設備類表和設備表。(1)數(shù)據結構設備物理名是否分配占用進程001未分配002已分配J1003未分配操作系統(tǒng)設置“設備分配表”,用來記錄計算機系統(tǒng)所配置的獨占設備類型、臺數(shù)以及分配情況。設備分配表可由“設備類表”和“設備表”兩部分組成,如下圖:設備類總臺數(shù)空閑臺數(shù)設備表始址輸入機21打印機11設備類表 設備表控制器標識符控制器狀態(tài):忙、閑與控制器相連的通道表指針控制器隊列的隊首指針控制器隊列的隊首指針通道標識符通道狀態(tài):忙、閑與通道相連的控制器表首址通道隊列的隊首指針通道隊列的隊首指針控制器表 通道表設備隊列隊首指
3、針。凡因請求本設備而未得到滿足的進程,其PCB都應按照一定的策略排成一個隊列,稱該隊列為設備請求隊列或簡稱設備隊列。其隊首指針指向隊首PCB。在有的系統(tǒng)中還設置了隊尾指針。設備狀態(tài)。當設備自身正處于使用狀態(tài)時,應將設備的忙/閑標志置“1”。若與該設備相連接的控制器或通道正忙,也不能啟動該設備,此時則應將設備的等待標志置“1”。與設備連接的控制器表指針。該指針指向該設備所連接的控制器的控制表。在設備到主機之間具有多條通路的情況下,一個設備將與多個控制器相連接。此時,在DCT中還應設置多個控制器表指針。(2)設備分配1)當進程申請某類設備時,系統(tǒng)先查“設備類表”。2)如果該類設備的現(xiàn)存臺數(shù)可以滿足
4、申請要求,則從該類設備的“設備表”始址開始依次查該類設備在設備表中的登記項,找出“未分配”的設備分配給進程。3)分配后要修改設備類表中的現(xiàn)存臺數(shù),把分配給進程的設備標志改為“已分配”且填上占用設備的進程名。4)然后,把設備的絕對號與相對號的對應關系通知用戶,以便用戶在分配到的設備上裝上存儲介質。(3)設備回收當進程執(zhí)行結束撤離時應歸還所占設備,系統(tǒng)根據進程名查設備表,找出進程占用設備的登記欄,把標志修改為“未分配”,清除進程名。同時把回收的設備臺數(shù)加到設備類表中的現(xiàn)存臺數(shù)中。設備分配程序的改進增加設備的獨立性:為了獲得設備的獨立性,進程應使用邏輯設備名I/O。這樣,系統(tǒng)首先從SDT中找出第一個
5、該類設備的DCT。若該設備忙,又查找第二個該類設備的DCT,僅當所有該類設備都忙時,才把進程掛在該類設備的等待隊列上,而只要有一個該類設備可用,系統(tǒng)便進一歩計算分配該設備的安全性。4、 程序流程圖開始結束輸入選擇指令A輸入設備名稱輸入設備類型是否添加控制器輸入控制器名稱輸入選擇的通道顯示所有設備信息添加成功NY設備是否存在NY刪除設備開始同時刪除控制器輸入選擇指令D輸入要刪除的設備名稱是否刪除控制器結束刪除控制器成功YN設備獨立性結束開始輸入選擇指令I輸入設備名稱設置成功申請設備開始輸入申請的進程判斷通道,控制器是否為忙輸入選擇指令S輸入申請的設備名稱將設備掛到等待隊列申請設備成功結束YN開始
6、輸入選擇指令H判斷設備是否存在設備不存在判斷設備是否需要回收設備不需要回收判斷通道等待隊列空不空輸入設備名稱設備回收成功結束五、實驗程序#include<iostream>using namespace std;/數(shù)據結構typedef struct nodechar name10;char devname10;struct node *next;PCB;/進程PCB * run;/執(zhí)行隊列/typedef struct Nodechar identify10;/標識int state;/設備狀態(tài)PCB *blocking;/阻塞隊列指針CHCT;/通道控制表CHCT * CH1,
7、 * CH2;/設置兩個通道為ch1,ch2/typedef struct NOdechar identify10;/標識int state;/設備狀態(tài)CHCT * chct;/CHCTPCB *blocking;/阻塞隊列指針struct NOde *next;COCT;/控制器控制表COCT * cohead;typedef struct NODechar identify10;/標識char type;/設備類型int state;/設備狀態(tài)int times;/重復執(zhí)行次數(shù)PCB *blocking;/阻塞隊列指針COCT * coct;/COCTDCT;/設備控制表typedef s
8、truct NODEchar type;/類別char identify10;/標識DCT * dct;/DCT設備控制表/驅動入口地址struct NODE *next;SDT;/系統(tǒng)設備表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;/狀態(tài)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)/添加控制器函數(shù)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;/查看所有設備狀態(tài)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;/=此處是否要考慮狀態(tài)的改變=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<<"設備處于閑狀態(tài),不需要回收!"<<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;/要用了這個函數(shù)才可以=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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學三年級口算題500道
- 2025年和田道路運輸從業(yè)資格證考哪些項目
- 企業(yè)成長與融資選擇
- 2024-2025學年高中英語閱讀理解五練習含解析新人教版必修2
- 2024年高中化學第三章有機化合物第二節(jié)第1課時乙烯精練含解析新人教版必修2
- 中藥與醫(yī)院合作協(xié)議
- 上學期學校工作計劃
- 公司出納人員個人工作計劃
- 村民糾紛協(xié)議書
- 騰訊廣告合作協(xié)議
- 客服百問百答
- GB/T 22133-2008流體流量測量流量計性能表述方法
- GB/T 19181-2018生咖啡分級方法導則
- GA/T 766-2020人精液PSA檢測金標試劑條法
- 胃食管反流病優(yōu)質課件
- 格力GMV多聯(lián)機安裝及維修手冊
- 農產品質量安全控制課件
- 尿失禁健康講座(SUI)
- lovo操作手冊中文翻譯版-professorgong
- 南網5S管理、四步法、八步驟
- 管道工程污水管網監(jiān)理規(guī)劃(共44)
評論
0/150
提交評論