動態分區式存貯區管理_第1頁
動態分區式存貯區管理_第2頁
動態分區式存貯區管理_第3頁
動態分區式存貯區管理_第4頁
動態分區式存貯區管理_第5頁
已閱讀5頁,還剩10頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、  操作系統上機課程報告     姓 名: 姜 瑞 班號: 193151 學 號: 指導教師: 張求明 院(系): 計算機學院 專業: 網絡工程   2016 年 11 月獨立工作成果聲明 本人聲明所呈交的操作系統上機報告,是我個人在導師指導下進行的程序編制工作及取得的成果。盡我所知,除文中已經標明的引用內容,和已經標明的他人工作外,本報告未包含任何抄襲自他人的工作成果。對本報告的工作做出貢獻的個人,均已在文中以明確方式標明。本人完全意識到本聲明的法律結果由本人承擔。 報告作者簽名: 日期: 年 月 日實驗一 多級

2、隊列調度算法(1)課程設計題目:多級隊列調度算法(2)程序功能及設計思路程序功能:模擬CPU在處理程序時的進程調度,使用循環輪轉法和短進程優先調度的算法來完成一組請求。設計思路:1. 首先使用一個cpp文件將運行所需要的數據寫入一個文件名為”1.txt”的文本文件,格式是 “Pi need turn”,每組數據之間換行隔開,則可以在運行的cpp文件中得到所需要運行的內容。2. 在程序實現的過程中,按照題目所給要求從文件中讀取數據,前五項按照已等待時間排序成一個循環隊列(已等待時間長的放在隊伍的靠前的地方),后五項按照需要運行的時間排成一個隊列(運行時間短的放在隊伍靠前的地方)。然后按照實現的描

3、述來進行數據的處理。最后輸出每一個進程運行所需要的時間。(3)數據結構及算法設計數據結構:結構體struct tag_pcb隊列循環隊列文件流數據算法設計:對于循環隊列RQ1,從文件中依次讀取進程的信息,根據要求形成循環隊列,然后從隊首開始循環,每次使用一個時間片q的長度,看該進程是否運行完成,如果在時間片以內的時間運行完成,則僅耗費所需時間,然后將該進程的運行時間存入數組中,將該進程從隊列中移除,并將隊列連接完好,然后使用delete刪除該進程所占用的內存空間,接下來從下一個進程繼續,依次循環往復,直到所有的進程均運行完成。對于隊列RQ2中形成隊列時,按照要求形成單向隊列,然后從需要時間短的

4、開始運行,運行完之后將時間存入數組,然后將該進程使用delete刪除,然后將當前指針移到下一位置,進行下一個進程的處理。直到所有進程均運行完成,即隊列為空的狀態。在使用數組存放的時候ai對應相應的進程運行時耗費的時間,然后從a0輸出到a9,即可輸出對應時間。(4)程序運行情況(5)編程中遇到的困難及解決方法、實習心得或良好建議困難和解決方法:1.對于C+文件的寫入和讀取不是很熟練,在網上查找相關寫法之后按照格式試驗完成了文件的操作。2.對于鏈表形式的隊列原本不是很熟悉,在寫代碼的過程中遇到了很多的麻煩,可以處理一次的隊列操作,但是在寫成循環時時常出現隊列斷鏈或者連錯的情況,這個問題是經過自己多

5、次調試,反思原理之后改錯完成的。3.在字符型char和整型int的轉化中之前對于P10進程的判斷有一些錯誤,之后經過調試發現問題,然后對字符串長度進行判斷解決了這個問題。源代碼貼在下方:/*寫入數據.cpp*/#include<iostream>#include<fstream>using namespace std;struct tag_pcb char name8; int need; /需運行時間 int turn; /周轉時間 struct tag_pcb *next;PCB10;int main() int i; for(i=0;i<10;+i) PCB

6、0='P' PCB1=i+49; PCB9.name1='1',PCB9.name2='0',PCB9.name3='0' PCB0.need=16;PCB1.need=11;PCB2.need=14; PCB3.need=13;PCB4.need=15;PCB5.need=21; PCB6.need=18;PCB7.need=10;PCB8.need=7; PCB9.need=14; PCB0.turn=6;PCB1.turn=5;PCB2.turn=4; PCB3.turn=3;PCB4.turn=2;

7、PCB5.turn=1; PCB6.turn=2;PCB7.turn=3;PCB8.turn=4; PCB9.turn=5; cout<<"寫入文件的數據如下:"<<endl; for(i=0;i<10;+i) cout<<PCB<<' ' cout<<endl; for(i=0;i<10;+i) cout<<PCBi.need<<' ' cout<<endl; for(i=0;i<10;+i) cout<<

8、;PCBi.turn<<" "/接下來將數據以結構體的方式寫入文件 ofstream out("E:1.txt"); for(i=0;i<10;+i) out<<PCB<<' '<<PCBi.need<<' '<<PCBi.turn; out<<endl; out.close(); cout<<endl<<"已完成數據輸入文件"/*寫入數據.cpp*/*實驗1(操作系統).cpp

9、*/#include<iostream>#include<cstdlib>#include<cstring>#include<fstream>using namespace std;typedef struct tag_pcb char name8; int need; /需運行時間 int turn; /周轉時間 struct tag_pcb *next;PCB;PCB * filein1(PCB *RQ1,ifstream &in)/形成RQ1隊列 PCB *current,*pre; PCB *tmp=new PCB; RQ1=tm

10、p,RQ1->next=NULL; in>>tmp->name>>tmp->need>>tmp->turn; for(int i=0;i<4;+i) PCB *tmp=new PCB; in>>tmp->name>>tmp->need>>tmp->turn;/從文件寫入信息 current=RQ1; pre=NULL; /初始化while(current!=NULL&&current->turn>tmp->turn) pre=current;

11、 current=current->next; tmp->next=current; if(pre=NULL) /如果位置在表頭插入隊首 tmp->next=current; RQ1=tmp; else pre->next=tmp; /將隊尾的結點的next接到隊首,形成循環隊列 int i=4;current=RQ1; while(i-) current=current->next; current->next=RQ1; cout<<"RQ1隊列數據讀入完成"<<endl; return RQ1;PCB *fil

12、ein2(PCB *RQ2,ifstream &in)/形成RQ2隊列 PCB *current,*pre; PCB *tmp=new PCB; RQ2=tmp,RQ2->next=NULL; in>>tmp->name>>tmp->need>>tmp->turn; for(int i=0;i<4;+i) PCB *tmp=new PCB;in>>tmp->name>>tmp->need>>tmp->turn;/從文件寫入信息 current=RQ2; pre=NUL

13、L; /初始化while(current!=NULL&&current->need<tmp->need) pre=current; current=current->next; tmp->next=current; if(pre=NULL) /如果位置在表頭插入隊首 tmp->next=current; RQ2=tmp; else pre->next=tmp; cout<<"RQ2隊列數據讀入完成"<<endl; return RQ2;int main() PCB *RQ1,*RQ2; int

14、 clock=0,q=7,temp; int time10; ifstream in("E:1.txt"); if(!in) cerr << "open error!" << endl; exit(1); RQ1=filein1(RQ1,in); RQ2=filein2(RQ2,in); in.close(); /文件讀入數據完成,關閉數據流/進行RQ1隊列的調度 PCB *current=RQ1; PCB *pre=RQ1; while(pre->next!=current) pre=pre->next; while

15、(RQ1!=NULL) if(current->need-q>0) clock+=q; current->need-=q; else clock+=current->need; current->need=0; /將時間導入到數組中 temp=strlen(current->name); /計算序數的位數,便于轉化 if(temp=2) temp=current->name1-'1' else if(temp=3)temp=(current->name1-'0')*10+current->name2-'

16、;1'timetemp=clock+current->turn; /存入周轉時間 if(current->need=0) if(current->next=current) /如果循環隊列為空 delete current; RQ1=NULL; else pre->next=current->next; delete current; current=pre->next; else current=current->next; pre=pre->next; /進行RQ2隊列的調度 current=pre=RQ2; while(RQ2!=N

17、ULL) /RQ2已經排好序,直接模擬調度即可 while(current!=NULL) clock+=current->need; /將時間導入到數組中 temp=strlen(current->name); /計算序數的位數,便于轉化 if(temp=2) temp=current->name1-'1' else if(temp=3) temp=(current->name1-'0')*10+current->name2-'1' timetemp=clock+current->turn; /存入周轉時間 c

18、urrent=current->next; delete pre; pre=current; RQ2=NULL; /完成調度,輸出周轉時間數組的結果 cout<<endl<<endl; for(int i=0;i<10;+i) cout<<'P'<<i+1<<"的周轉時間為:"<<timei<<endl;/*實驗1(操作系統).cpp*/實驗二 銀行家算法(1)課程設計題目:銀行家算法(2)程序功能及設計思路程序功能:使用銀行家算法在動態分配資源的時候來

19、避免死鎖。銀行家算法要求進入系統的進程必須說明他對各類資源類型的實例的最大需求量。這一數量不能超過系統各類資源的總數。設計思路:先將數據寫入文件,在E:/2.txt文件中按如下格式進行存放數據,第一行放入Available的三類資源的數據,然后下面開始放入Pi的Alloc(已占用資源)和Need(還需要資源的最大需求量),然后記下來存放四次請求,按照發出請求的進程號+三類請求的數量作為一行,記錄下提供數據的四次請求。然后在運行時,依次讀取請求數據來進行請求的判斷,是否非法請求,是否阻塞,然后進行試探性分配,若滿足安全性狀態,則確定分配,否則取消試探性分配。(3)數據結構及算法設計數據結構:數組

20、文件流數據算法設計:首先從文件中讀取數據建立當前的系統狀態。然后從頭開始讀取請求,判斷請求是否結束(在文件流輸入的過程中判斷是否讀取到文件的尾部),若結束就退出程序,完成本次調度。否則判斷請求是否超過還需要的最大需求量,若超過就輸出該請求為非法請求,讀取下一次請求。否則判斷請求是否超過可用資源,若超過則輸出該請求會使Pi進程阻塞,讀取下一次請求,否則進行試探性分配。調用try_assign()函數,來將進程的資源進行分配。然后調用checksafe()函數來判斷狀態是否滿足安全性狀態的要求,若滿足要求,則輸出完成該請求,否則取消試探性分配,說明不滿足安全性狀態。在上一步驟完成后繼續讀取下一條請

21、求。(4)程序運行情況(5)編程中遇到的困難及解決方法、實習心得或良好建議遇到的困難和解決方法:在編程中遇到了request數組傳參的問題,因為另外幾數組都是以全局變量的形式存在,在最開始編寫代碼時沒有考慮傳遞參數的問題,導致在函數體中無法調用request數組的情況,導致了判斷的失效,修改后把request數組和指針p(代表發起請求的進程號)傳入函數體即可正常使用。在進行安全性狀態的判別時,因為理解問題沒有考慮到分配之后從頭(P1)開始判斷是否滿足安全性狀態,所以在碰到一個安全性狀態不滿足的情況也是直接跳出循環而使程序運行錯誤(例如P1不滿足時應判斷P2,若滿足則work=work+Allo

22、ci,再從P1開始從頭判斷是否滿足true或者false的條件),修改的方法是使用goto語句,在從P1開始判斷的地方加一個label標簽,讓進行了work=work+Alloci;則跳轉至開頭開始循環判斷。實習心得:使用函數體進行判斷非法和溢出的時候對于返回值true或者false的理解還有對if(!check2(request,*p)的真值判斷一直有些混淆,不知道到底為真還是為假,在實習中理清了思路和判斷。在安全性狀態判別的checksafe()函數中在查找Finishi=false且Needi<=work條件的時候對于Needi<=work使用了第一個check1()函數已經

23、寫的功能,改變傳入參數的變量即可完成所需要求,即if(finishi=false&&!check1(work,i),這樣的寫法減少了代碼量,比較巧妙。源代碼如下:/*寫入數據.cpp*/#include<iostream>#include<fstream>using namespace std;#define n 5 /進程個數#define m 3 /資源種類int Availablem=2,3,3;int Allocnm=2,1,2,4,0,2,3,0,5,2,0,4,3,1,4;int Neednm=3,4,7,1,3,4,0,0,3,2,2,1,

24、1,1,0;int request44=2,0,3,4,4,1,0,1,1,2,0,1,3,0,0,2;int main() int i,j;/顯示已分配資源和資源需求量 cout<<"已分配資源量t資源需求量"<<endl; cout<<" A B Ct A B C"<<endl; for(i=0;i<n;+i) cout<<'P'<<i+1<<' ' for(j=0;j<m;+j) cout<<Allocij&l

25、t;<' ' cout<<'t' for(j=0;j<m;+j) cout<<' '<<Needij; cout<<endl; /寫入文件操作 ofstream out("E:2.txt");/寫入已經存在的系統狀態 for(i=0;i<3;+i) out<<Availablei<<' ' out<<endl; for(i=0;i<5;+i) for(j=0;j<3;+j) out<<A

26、llocij<<' ' for(j=0;j<3;+j) out<<Needij<<' ' out<<endl; /寫入請求操作數據 for(i=0;i<4;+i) for(j=0;j<4;+j) out<<requestij<<' ' out<<endl; out.close();/顯示進程請求內容 for(i=0;i<4;+i) cout<<"進程P"<<requesti0<<&qu

27、ot;請求資源("<<requesti1 <<','<<requesti2<<','<<requesti3<<')'<<endl; cout<<"寫入文件操作成功"<<endl;/*寫入數據.cpp*/*實驗2(操作系統).cpp*/ #include<iostream>#include<fstream>#include<cstdlib>using namespace std

28、;#define n 5 /進程個數#define m 3 /資源種類int Availablem,Allocnm,Neednm;bool input(ifstream &in) int i,j; for(i=0; i<m; +i) in>>Availablei; for(i=0; i<n; +i) for(j=0; j<m; +j) in>>Allocij; for(j=0; j<m; +j) in>>Needij; / cout<<"已分配資源量t資源需求量"<<endl;/ c

29、out<<" A B Ct A B C"<<endl;/ for(i=0;i<n;+i)/ / cout<<'P'<<i+1<<' '/ for(j=0;j<m;+j)/ cout<<Allocij<<' '/ cout<<'t'/ for(j=0;j<m;+j)/ cout<<' '<<Needij;/ cout<<endl;/ return t

30、rue;bool read_req(ifstream &in,int *p,int *request) if(!in) return false; in>>*p; if(in.eof() return false; else for(int j=0; j<m; +j) in>>requestj; return true;bool check1(int *request,int p) /判斷request和Need的關系 for(int i=0; i<m; +i) if(requesti>Needpi) return false; return

31、true;bool check2(int *request,int p) for(int i=0; i<m; +i) if(requesti>Availablei) return false; return true;void try_assign(int *request,int p,int d)/試探性分配,1為試探性分配,0表示取消試探性分配 if(d=1) for(int i=0; i<m; +i) Availablei-=requesti; for(int i=0; i<m; +i) Allocpi+=requesti; for(int i=0; i<m

32、; +i) Needpi-=requesti; else for(int i=0; i<m; +i) Availablei+=requesti; for(int i=0; i<m; +i) Allocpi-=requesti; for(int i=0; i<m; +i) Needpi+=requesti; cout<<"進程P"<<p+1<<"的請求不能達到安全性狀態,取消分配"<<endl; bool checksafe() bool finishn=false; int workm,i

33、,j; for(i=0;i<m;+i) worki=Availablei;label: for(i=0;i<n;+i) if(finishi=false&&!check1(work,i) finishi=true; for(j=0;j<3;+j) workj+=Allocij; goto label; for(i=0;i<n;+i) if(finishi!=true) return false; return true;int main()/打開文件寫入數據 int requestm; ifstream in("E:2.txt");

34、if(!in) cerr << "open error!" << endl; exit(1); input(in); int *p=new int; /用來表示請求資源的進程號 while(1) if(!read_req(in,p,request) /如果請求結束 break; if(!check1(request,*p-1) cout<<"進程"<<*p<<"進行非法請求"<<endl; else if(!check2(request,*p) cout<&

35、lt;"進程"<<*p<<"阻塞"<<endl; else /進行試探性分配 try_assign(request,*p-1,1); if(checksafe() cout<<"進程P"<<*p<<"請求資源("<<request0 <<','<<request1<<','<<request2<<")已完成調度"<<endl; else try_assign(request,*p-1,0); /取消試探性分配 cout<<"已完成所有請求"<<endl; in.close(); delete p;/*實驗2(操作系統).cpp*/實驗三  動態分區式存貯區管理(1)課程設計題目:銀行家算法(2)程序功能及設計思路程序功能:模擬主存分區是存儲區管理的方式,對進程的提出的申請內存和釋放進程的請求進行處理,設計思路:(3)數據結構及算法設計數據結構:結構體鏈表算法

溫馨提示

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

評論

0/150

提交評論