操作系統實驗設備管理_第1頁
操作系統實驗設備管理_第2頁
操作系統實驗設備管理_第3頁
免費預覽已結束,剩余25頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、操作系統實驗名 稱 實驗六設備管理姓 名 專 業 學 號 日 期2015 年12月01日 指導老師一、實驗目的1. 理解設備管理的概念和任務。2. 掌握獨占設備的分配、回收等主要算法的原理并編程實現 二、實驗內容與要求該程序中1.在Windows系統中,編寫程序實現對獨占設備的分配和回收的模擬, 包括:建立設備類表和設備表、分配設備和回收設備的函數。三、實驗原理1獨占設備的分配、回收等主要算法的原理。為了提高操作系統的可適應性和可擴展性,現代操作系統中都毫無例外地實現了 設備獨立性,又叫做設備無關性。設備獨立性的含義是:應用程序獨立于具體使 用的物理設備。為了實現獨占設備的分配,系統設置數據表

2、格的方式也不相同,在實驗中只要設 計合理即可。這里僅僅是一種方案,采用設備類表和設備表。(1)數據結構設備物理名是否分 配占用進程001未分配002已分配J1003未分配設備類總臺數空閑臺 數設備表始址輸入機21打印機11設備類表控制器標識符控制器狀態:忙、閑與控制器相連的通道表指針控制器隊列的隊首指針控制器隊列的隊首指針設備表通道標識符通道狀態:忙、閑與通道相連的控制器表首址通道隊列的隊首指針 通道隊列的隊首指針操作系統設置“設備分配表”,用來記錄計算機系統所配置的獨占設備類型、臺 數以及分配情況。設備分配表可由“設備類表”和“設備表”兩部分組成,如下 圖: 通道表控制器表 設備隊列隊首指針

3、。凡因請求本設備而未得到滿足的進程,其PCB都應按照一定 的策略排成一個隊列,稱該隊列為設備請求隊列或簡稱設備隊列。其隊首指針指 向隊首PCB在有的系統中還設置了隊尾指針。設備狀態。當設備自身正處于使用狀態時,應將設備的忙 /閑標志置“ 1”。若與 該設備相連接的控制器或通道正忙, 也不能啟動該設備,此時則應將設備的等待 標志置“ T與設備連接的控制器表指針。 該指針指向該設備所連接的控制器的控制表。 在設 備到主機之間具有多條通路的情況下,一個設備將與多個控制器相連接。此時, 在DCT中還應設置多個控制器表指針。(2)設備分配1)當進程申請某類設備時,系統先查“設備類表” 。2)如果該類設備

4、的現存臺數可以滿足申請要求,則從該類設備的“設備表”始址 開始依次查該類設備在設備表中的登記項,找出“未分配”的設備分配給進程。3)分配后要修改設備類表中的現存臺數, 把分配給進程的設備標志改為 “已分配” 且填上占用設備的進程名。4)然后,把設備的絕對號與相對號的對應關系通知用戶,以便用戶在分配到的設 備上裝上存儲介質。(3)設備回收當進程執行結束撤離時應歸還所占設備, 系統根據進程名查設備表, 找出進程占 用設備的登記欄,把標志修改為“未分配” ,清除進程名。同時把回收的設備臺 數加到設備類表中的現存臺數中。設備分配程序的改進增加設備的獨立性:為了獲得設備的獨立性,進程應使用邏輯設備名I/

5、O。這樣, 系統首先從SDT中找出第一個該類設備的DCT若該設備忙,又查找第二個該類 設備的DCT,僅當所有該類設備都忙時,才把進程掛在該類設備的等待隊列上, 而只要有一個該類設備可用,系統便進一歩計算分配該設備的安全性。四、程序流程圖開始Y設備是否存在NN是否添加控制器結束輸入選擇指令A輸入設備類型輸入設備名稱輸入控制器名稱輸入選擇的通道顯示所有設備信息添加成功刪除設備設備獨立性開始.輸入選擇指令I$輸入設備名稱設置成功申請設備#in clude<iostream> using n amespace std;/數據結構typedef struct nodechar n ame10

6、;char dev name10; struct node *n ext;PCB;進程PCB * run;/ 執行隊列/typedef struct Nodechar ide ntify1O; 標識 int state;/ 設備狀態PCB *blocki ng; 阻塞隊列指針CHCT;通道控制表CHCT * CH1, * CH2;/ 設置兩個通道為 ch1,ch2/typedef struct NOdechar identify10;/ 標識 int state;/ 設備狀態 CHCT * chct;/CHCTPCB *blocking;/ 阻塞隊列指針 struct NOde *next;C

7、OCT;/ 控制器控制表COCT * cohead;typedef struct NODechar identify10;/ 標識char type;/ 設備類型int state;/設備狀態int times;/重復執行次數PCB *blocking;/ 阻塞隊列指針COCT * coct;/COCTDCT;/ 設備控制表 typedef struct NODEchar type;/ 類別char identify10;/ 標識DCT * dct;/DCT 設備控制表/ 驅動入口地址struct NODE *next;SDT;/ 系統設備表SDT * head;SDT * checkdel;

8、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; /= run=(PCB *)malloc(sizeof(PCB);run->next=NULL;CH1=(CHCT *)malloc(sizeof(CHCT);CH2=(CHCT *)malloc(sizeof(CHCT); str

9、cpy(CH1->identify,"ch1");strcpy(CH2->identify,"ch2");CH1->state=0;CH2->state=0;ch1block=(PCB *)malloc(sizeof(PCB);ch1block->next=NULL; ch2block=(PCB *)malloc(sizeof(PCB);ch2block->next=NULL;CH1->blocking=ch1block;CH2->blocking=ch2block; cohead=(COCT *)mall

10、oc(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 *)malloc(sizeof(COCT);CO2->next=CO3;CO3->next=NULL;CO1->state=0;CO2->state=0;CO3->state=0; co1block=

11、(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->identify,"co1");strcpy(CO2->identify,"co2");strcpy(CO3->identify,"co3");CO1->chc

12、t=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);d3block=(PCB *)malloc(sizeof(PCB);d4block=(PCB *)malloc(sizeof(PCB); d1block->next=NULL;d2block->next=NU

13、LL;d3block->next=NULL;d4block->next=NULL;表示打印機設備 表示顯示器設備 表示鍵盤設備 表示鼠標設備d2->coct=CO2;d3->coct=CO3; d4->coct=CO3; d1->state=0;/ d2->state=0; d3->state=0;d4->state=0; d1->type='o'/o d2->type='o' d3->type='i'/i d4->type='i'狀態表示輸出設備 ou

14、tput表示輸入設備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(sizeof(SDT);s3=(SDT *)malloc(sizeof(SDT);s4=(SDT *)malloc(sizeof(SDT); head->next=s1;s1->

15、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");d1=(DCT *)malloc(sizeof(DCT); strcpy(d1->identify,"P");/p d2=(DCT *)malloc(sizeof(DCT); strcpy(d2->identify,"T");/t d3=(DCT

16、*)malloc(sizeof(DCT); strcpy(d3->identify,"K");/k d4=(DCT *)malloc(sizeof(DCT); strcpy(d4->identify,"M");/m d1->coct=CO1; / 控制器 strcpy(s2->identify,"T"); strcpy(s3->identify,"K"); strcpy(s4->identify,"M");s1->type='o' s2-

17、>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->next;cotemp->next=temp; temp->next=NULL;/ 查看所有控制器,選擇所要連接的控制器 void

18、 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(temp->identify,a) return temp; temp=temp->next;return tem

19、p;/ 刪除設備時候,判斷是不是同時刪除控制器 ,等于 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;/ 刪除設備的時候同時刪除控制器void Deletecotrol(COCT *te)COCT * temp=cohead;w

20、hile(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;return 1; temp=temp->next;return 0;/ 申請設備時候,如果忙,將設備掛到

21、等待隊列 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,a)temp->next=temp2->next; delete(temp2);br

22、eak;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"<<" i/o"<<" C

23、OCT"<<" CHCT"<<endl; while(temp!=NULL) dtemp=temp->dct; cotemp=dtemp->coct; chtemp=cotemp->chct;cout<<dtemp->identify<<""<<dtemp->state<<""<<"t"<<dtemp->type<<"t"<<cot

24、 emp->identify<<""<<cotemp->state<<""<<"t"<<chtemp->identify<<""<<chtemp->state<<""<<endl; temp=temp->next; while(ptemp!=NULL)cout<<" 進程 "<<ptemp->name<&

25、lt;" 申請了設備 "<<ptemp->devname<<endl; ptemp=ptemp->next; cout<<endl;/ 設備獨立性時候查找要查找的類型是不是存在int sf_typeexist(char ch)SDT *temp; if(head->next=NULL)return 0;else temp=head->next; while(temp!=NULL) if(temp->type=ch) return 1;else temp=temp->next;return 0;/ 增加設

26、備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<<" 設備已存在 "<<endl;

27、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 *)malloc(sizeof(SDT);

28、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='y')|(cho

29、ice='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=cotempblock;

30、Addcotrol(cotemp);1 就是temp->coct=cotemp;cout<<" 請選擇連接的通道 :1/2"<<endl;/ 因為只定義了兩個通道,選 chi,選2就是ch2int i; cin>>i;if(i=1) cotemp->chct=CH1; elsecotemp->chct=CH2;else/ 不添加控制器Showallco();cout<<" 輸入連接控制器的名稱 :"<<endl;cin>>coary;cotemp=Findco(co

31、ary);temp->coct=cotemp;cout<<" 設備 "<<eqary<<" 添加成功 !"<<endl;/ 刪除設備void Deletedevice()/ 刪除設備的時候同時刪除 pcb Deletepcb cout<<" 刪除設備 "<<endl; COCT * temp;SDT * stemp; char chary10;char tempary10; cin>>chary; if(sf_exist(chary)=0) co

32、ut<<" 刪除設備不存在 !"<<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; Delet

33、ecotrol(temp); stemp=head; while(stemp->next!=checkdel) stemp=stemp->next; stemp->next=checkdel->next; delete(checkdel);cout<<" 設備 "<<chary<<" 刪除成功 !"<<endl; / 申請設備void Applydevice()cout<<" 申請設備 "<<endl;PCB *ptemp;DCT *dte

34、mp;COCT *cotemp; CHCT *chtemp; char pname10,eqname10; 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; /= 此處是否要考慮狀

35、態的改變 = if(dtemp->state=1) / 設備忙Addwaitpcb(dtemp->blocking,ptemp);cout<<" 進程 "<<ptemp->name<<" 被掛在設備 "<<dtemp->identify<<" 的等待隊 列上 !"<<endl;else/ 設備不忙 cotemp=dtemp->coct; if(cotemp->state=1) / 控制器忙Addwaitpcb(cotemp-&g

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

37、lt;ptemp->name<<" 被掛在通道 "<<chtemp->identify<<" 的等待隊列上 !"<<endl;else/ 通道不忙 Addwaitpcb(run,ptemp); dtemp->state=1; cotemp->state=1; chtemp->state=1; strcpy(ptemp->devname,eqname);cout<<"進程"<<pname<<"申請設備&quo

38、t;<<eqname<<"成功!"<<endl;/ 回收設備void Recycledevice()cout<<" 回收設備 "<<endl;/ char ch;char eqname10;DCT *dtemp;COCT *cotemp;CHCT *chtemp;PCB *pctemp1,*pctemp2;cin>>eqname;if(sf_exist(eqname)=0)/ 設備不存在cout<<" 要回收的設備不存在 !"<<endl;

39、else if(checkdel->dct->state=0)/ 設備存在,但是不需要回收cout<<" 設備處于閑狀態,不需要回收 !"<<endl; else/ 需要回收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)/ 如

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

41、1=cotemp->blocking; pctemp2=pctemp1->next; pctemp1->next=pctemp2->next; pctemp2->next=NULL; strcpy(pctemp2->devname,eqname); Addwaitpcb(run,pctemp2); dtemp->state=1;cotemp->state=1;chtemp->state=1;elseif(sf_pcbnull(dtemp->blocking)/ 如果設備的等待隊列不空 pctemp1=dtemp->blockin

42、g; pctemp2=pctemp1->next; pctemp1->next=pctemp2->next; pctemp2->next=NULL; strcpy(pctemp2->devname,eqname); Addwaitpcb(run,pctemp2); dtemp->state=1;cotemp->state=1;chtemp->state=1;cout<<" 設備 "<<eqname<<" 回收成功 !"<<endl;/ 設備獨立性 =void

43、Independence()cout<<" 設備獨立性 - 申請設備 :"<<endl;/cout<<" 申請設備 "<<endl;char type;char pname10;SDT * temp,* temp2;PCB *ptemp;DCT *dtemp;COCT *cotemp;CHCT *chtemp;cin>>pname>>type;if(type='o')|(type='i')/= 還得考慮要申請的類型是不是存在 = if(sf_typee

44、xist(type)=0)cout<<" 要申請的該類設備不存在 !"<<endl;elsetemp=head->next;while(temp!=NULL) if(temp->type=type)&&(temp->dct->state=0) / 當設備類型相同,并且設備空閑 temp2=temp;break;else if(temp->type=type)temp2=temp; temp=temp->next;sf_exist(temp2->identify);/=ptemp=(PCB *)

45、malloc(sizeof(PCB);strcpy(ptemp->name,pname);ptemp->next=NULL;dtemp=checkdel->dct;/ 要用了這個函數才可以if(temp2->dct->state=0)/ 當設備不忙時候cotemp=dtemp->coct;if(cotemp->state=1)/ 控制器忙 Addwaitpcb(cotemp->blocking,ptemp); cout<<" 進程 "<<ptemp->name<<" 被掛在控

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

47、隊列上 !"<<endl;else/ 通道不忙Addwaitpcb(run,ptemp);dtemp->state=1;cotemp->state=1;chtemp->state=1;strcpy(ptemp->devname,temp2->identify);cout<<"進程"<<pname<<"申請設備"<<temp2->identify<<" 功!"<<e ndl;else/ 當設備忙時候Addwaitpcb(dtemp->blocking,ptemp);的等cout<<" 進程 "<<ptemp->name<<" 被掛在設備 "<<dtemp->identify<<" 待隊列

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論