




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、實驗三 進(jìn)程調(diào)度一、 實驗?zāi)康亩嗟莱绦蛟O(shè)計中,經(jīng)常是若干個進(jìn)程同時處于就緒狀態(tài),必須依照某種策略來決定那個進(jìn)程優(yōu)先占有處理機(jī)。因而引起進(jìn)程調(diào)度。本實驗?zāi)M在單處理機(jī)情況下的處理機(jī)調(diào)度問題,加深對進(jìn)程調(diào)度的理解。二、 實驗要求1 設(shè)計進(jìn)程調(diào)度算法,進(jìn)程數(shù)不定2 包含幾種調(diào)度算法,并加以實現(xiàn)3 輸出進(jìn)程的調(diào)度過程進(jìn)程的狀態(tài)、鏈表等。三、 參考例1 題目優(yōu)先權(quán)法、輪轉(zhuǎn)法簡化假設(shè)1) 進(jìn)程為計算型的(無I/O)2) 進(jìn)程狀態(tài):ready、running、finish3) 進(jìn)程需要的CPU時間以時間片為單位確定2 算法描述1) 優(yōu)先權(quán)法動態(tài)優(yōu)先權(quán)當(dāng)前運行進(jìn)程用完時間片后,其優(yōu)先權(quán)減去一個常數(shù)。2) 輪轉(zhuǎn)
2、法開始鍵盤輸入進(jìn)程數(shù)n,和調(diào)度方法的選擇優(yōu)先權(quán)法?輪轉(zhuǎn)法產(chǎn)生n個進(jìn)程,對每個進(jìn)程產(chǎn)生一個PCB,并用隨機(jī)數(shù)產(chǎn)生進(jìn)程的優(yōu)先權(quán)及進(jìn)程所需的CPU時間按優(yōu)先權(quán)大小,把n個進(jìn)程拉成一個就緒隊列初始化其他數(shù)據(jù)結(jié)構(gòu)區(qū)鏈?zhǔn)走M(jìn)程投入運行時間片到,進(jìn)程所需的CPU時間減1,優(yōu)先權(quán)減3,輸出個進(jìn)程的運行情況所需的CPU時間=0?撤銷進(jìn)程就緒隊列為空?結(jié)束將進(jìn)程插入就緒隊列NYNYYBN四、 實驗流程圖產(chǎn)生n個進(jìn)程,對每個進(jìn)程用隨機(jī)數(shù)產(chǎn)生進(jìn)程的輪轉(zhuǎn)時間片數(shù)及進(jìn)程所需的時間片數(shù),已占用CPU的時間片數(shù)置為0按進(jìn)程產(chǎn)生的先后次序拉成就緒隊列鏈鏈?zhǔn)走M(jìn)程投入運行時間片到,進(jìn)程所需時間片數(shù)減1,已占用CPU時間片數(shù)加1輸出各
3、進(jìn)程的運行情況進(jìn)程所需時間片數(shù)=0?撤銷該進(jìn)程就緒隊列為空嗎?占用CPU的時間片數(shù)=輪轉(zhuǎn)時間片數(shù)?占用CPU的時間片數(shù)置為0把該進(jìn)程插入就緒隊列尾BNYNYY結(jié)束N注意:1 產(chǎn)生的各種隨機(jī)數(shù)的取值范圍加以限制,如所需的CPU時間限制在120之間。2 進(jìn)程數(shù)n不要太大通常取48個3 使用動態(tài)數(shù)據(jù)結(jié)構(gòu)4 獨立編程5 至少三種調(diào)度算法6 若有可能請在圖形方式下,將PCB的調(diào)度用圖形成動畫顯示。五實驗過程:(1)輸入:進(jìn)程流文件(1.txt),其中存儲的是一系列要執(zhí)行的進(jìn)程, 每個作業(yè)包括四個數(shù)據(jù)項:進(jìn)程名 進(jìn)程狀態(tài)(1就緒 2等待 3運行) 所需時間 優(yōu)先數(shù)(0級最高)進(jìn)程0 1 50 2進(jìn)程1 2
4、 10 4進(jìn)程2 1 15 0進(jìn)程3 3 28 5 進(jìn)程4 2 19 1進(jìn)程5 3 8 7輸出: 進(jìn)程執(zhí)行流等待時間,平均等待時間本程序包括:FIFO算法,優(yōu)先數(shù)調(diào)度算法,時間片輪轉(zhuǎn)調(diào)度算法(2)程序代碼#include<stdio.h> #include<string.h> #include<iostream.h>const int block_time=10; /定義時間片的長度為10秒 const int MAXPCB=100; /定義最大進(jìn)程數(shù)/定義進(jìn)程結(jié)構(gòu)體 typedef struct nodechar name20; int status;in
5、t time; int privilege;int finished; int wait_time; pcb;pcb pcbsMAXPCB; int quantity;/初始化函數(shù) void initial() int i;for(i=0;i<MAXPCB;i+) strcpy(,""); pcbsi.status=0; pcbsi.time=0;pcbsi.privilege=0;pcbsi.finished=0; pcbsi.wait_time=0; quantity=0;/讀數(shù)據(jù)函數(shù) int readData() FILE *fp; char
6、 fname20; int i;cout<<"請輸入進(jìn)程流文件名:" cin>>fname; if(fp=fopen(fname,"r")=NULL) cout<<"錯誤,文件打不開,請檢查文件名"<<endl; else while(!feof(fp) fscanf(fp,"%s %d %d %d",,&pcbsquantity.status,&pcbsquantity.time,&pcbsquantity.
7、privilege); quantity+; /輸出所讀入的數(shù)據(jù) cout<<"輸出所讀入的數(shù)據(jù)"<<endl; cout<<"進(jìn)程名 進(jìn)程狀態(tài) 所需時間 優(yōu)先數(shù)"<<endl; for(i=0;i<quantity;i+) cout<<" "<<<<" "<<pcbsi.status<<" "<<pcbsi.time<<" &q
8、uot;<<pcbsi.privilege<<endl; return(1); return(0);/重置數(shù)據(jù),以供另一個算法使用 void init() int i;for(i=0;i<MAXPCB;i+)pcbsi.finished=0; pcbsi.wait_time=0; /先進(jìn)先出算法 void FIFO() int i,j; int total;/輸出FIFO算法執(zhí)行流 cout<<endl<<"*"<<endl; cout<<"FIFO算法執(zhí)行流:"<<
9、;endl; cout<<"進(jìn)程名 等待時間"<<endl; for(i=0;i<quantity;i+) cout<<" "<<<<" "<<pcbsi.wait_time<<endl; for(j=i+1;j<quantity;j+) pcbsj.wait_time+=pcbsi.time; total=0; for(i=0;i<quantity;i+) total+=pcbsi.wait_time; cout
10、<<"總等待時間:"<<total<<" 平均等待時間:"<<total/quantity<<endl;/優(yōu)先數(shù)調(diào)度算法 void privilege() int i,j,p; int passed_time=0; int total;int queueMAXPCB; int current_privilege=1000;for(i=0;i<quantity;i+) current_privilege=1000; for(j=0;j<quantity;j+) if(pcbsj.fin
11、ished=0)&&(pcbsj.privilege<current_privilege) p=j; current_privilege=pcbsj.privilege; queuei=p;pcbsp.finished=1; pcbsp.wait_time+=passed_time; passed_time+=pcbsp.time; /輸出優(yōu)先數(shù)調(diào)度執(zhí)行流 cout<<endl<<"*"<<endl; cout<<"優(yōu)先數(shù)調(diào)度執(zhí)行流:"<<endl; cout<<
12、;"進(jìn)程名 等待時間"<<endl; for(i=0;i<quantity;i+) cout<<" "<<<<" "<<pcbsqueuei.wait_time<<endl; total=0; for(i=0;i<quantity;i+) total+=pcbsi.wait_time; cout<<"總等待時間:"<<total<<" 平均等待時間:&quo
13、t;<<total/quantity<<endl;/時間片輪轉(zhuǎn)調(diào)度算法 void timer() int i,j,number,flag=1; int passed_time=0; int max_time=0; int round=0; int queue1000; int total=0;while(flag=1) flag=0; number=0;for(i=0;i<quantity;i+) if(pcbsi.finished=0) number+; j=i; if(number=1) queuetotal=j; total+; pcbsj.finished
14、=1; if(number>1)for(i=0;i<quantity;i+) if(pcbsi.finished=0) flag=1; queuetotal=i; total+; if(pcbsi.time<=block_time*(round+1) pcbsi.finished=1; round+; if(queuetotal-1=queuetotal-2) total-; cout<<endl<<"*"<<endl; cout<<"時間片輪轉(zhuǎn)調(diào)度執(zhí)行流:"<<endl; f
15、or(i=0;i<total;i+) cout<<<<" "cout<<endl;/顯示void version() cout<<" /* 進(jìn)程調(diào)度 */" cout<<endl<<endl; /主函數(shù) void main() int flag;version();initial();flag=readData();if(flag=1) FIFO(); init();privilege(); init();timer(); (3)運行結(jié)果:輸入進(jìn)程
16、流文件名1.txt即可得出以下輸出結(jié)果: 實驗二 銀行家算法一、 實驗?zāi)康乃梨i會引起計算機(jī)工作僵死,因此操作系統(tǒng)中必須防止。本實驗的目的在于讓學(xué)生獨立的使用高級語言編寫和調(diào)試一個系統(tǒng)動態(tài)分配資源的簡單模擬程序,了解死鎖產(chǎn)生的條件和原因,并采用銀行家算法有效地防止死鎖的發(fā)生,以加深對課堂上所講授的知識的理解。二、 實驗要求設(shè)計有n個進(jìn)程共享m個系統(tǒng)資源的系統(tǒng),進(jìn)程可動態(tài)的申請和釋放資源,系統(tǒng)按各進(jìn)程的申請動態(tài)的分配資源。系統(tǒng)能顯示各個進(jìn)程申請和釋放資源,以及系統(tǒng)動態(tài)分配資源的過程,便于用戶觀察和分析;三、 數(shù)據(jù)結(jié)構(gòu)1 可利用資源向量Available ,它是一個含有m個元素的數(shù)組,其中的每一個元
17、素代表一類可利用的資源的數(shù)目,其初始值是系統(tǒng)中所配置的該類全部可用資源數(shù)目。其數(shù)值隨該類資源的分配和回收而動態(tài)地改變。如果Available(j)=k,標(biāo)是系統(tǒng)中現(xiàn)有Rj類資源k個。2 最大需求矩陣Max,這是一個n×m的矩陣,它定義了系統(tǒng)中n個進(jìn)程中的每一個進(jìn)程對m類資源的最大需求。如果Max(i,j)=k,表示進(jìn)程i需要Rj類資源的最大數(shù)目為k。3 分配矩陣Allocation,這是一個n×m的矩陣,它定義了系統(tǒng)中的每類資源當(dāng)前一分配到每一個進(jìn)程的資源數(shù)。如果Allocation(i,j)=k,表示進(jìn)程i當(dāng)前已經(jīng)分到Rj類資源的數(shù)目為k。Allocation i表示進(jìn)程
18、i的分配向量,有矩陣Allocation的第i行構(gòu)成。4 需求矩陣Need,這是一個n×m的矩陣,用以表示每個進(jìn)程還需要的各類資源的數(shù)目。如果Need(i,j)=k,表示進(jìn)程i還需要Rj類資源k個,才能完成其任務(wù)。Need i表示進(jìn)程i的需求向量,由矩陣Need的第i行構(gòu)成。上述三個矩陣間存在關(guān)系:Need(i,j)=Max(i,j)-Allocation(i,j);四、 銀行家算法Request i 是進(jìn)程Pi 的請求向量。Request i (j)=k表示進(jìn)程Pi請求分配Rj類資源k個。當(dāng)Pi發(fā)出資源請求后,系統(tǒng)按下述步驟進(jìn)行檢查:1 如果Request i Need,則轉(zhuǎn)向步驟
19、2;否則,認(rèn)為出錯,因為它所請求的資源數(shù)已超過它當(dāng)前的最大需求量。2 如果Request i Available,則轉(zhuǎn)向步驟3;否則,表示系統(tǒng)中尚無足夠的資源滿足Pi的申請,Pi必須等待。3 系統(tǒng)試探性地把資源分配給進(jìn)程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:Available = Available - Request iAllocation i= Allocation i+ Request iNeed i= Need i - Request i4 系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。如果安全才正式將資源分配給進(jìn)程Pi,以完成本次分配;否則,將試探分配作廢,恢復(fù)原來的資源
20、分配狀態(tài),讓進(jìn)程Pi等待。假定系統(tǒng)有5個進(jìn)程(p0,p1,p2,p3,p4)和三類資源(A,B,C),各種資源的數(shù)量分別為10,5,7,在T0時刻的資源分配情況如下圖: Max Allocation Need Available A B C A B C A B C A B CP0 7 5 3 0 1 0 7 4 3 3 3 2 ( 2 3 0 )P1 3 2 2 2 0 0 1 2 2 (3 0 2 ) (0 2 0 )P2 9 0 2 3 0 2 6 0 0P3 2 2 2 2 1 1 0 1 1P4 4 3 3 0 0 2 4 3 1五、 安全性算法1 設(shè)置兩個向量。Work:它表示系統(tǒng)可
21、提供給進(jìn)程繼續(xù)運行的各類資源數(shù)目,它包含m個元素,開始執(zhí)行安全性算法時,Work = Available。Finish:它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運行完成,開始Finish(I)=false;當(dāng)有足夠資源分配給進(jìn)程Pi時,令Finish(i)=true;2 從進(jìn)程集合中找到一個能滿足下述條件的進(jìn)程。Finish(i)= = false;Need i work;如找到則執(zhí)行步驟3;否則,執(zhí)行步驟4;3 當(dāng)進(jìn)程Pi獲得資源后,可順利執(zhí)行直到完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行Work = work + Allocation i Finish(i)=true;轉(zhuǎn)向步驟2;4 若所有
22、進(jìn)程的Finish(i)都為true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。六、 系統(tǒng)流程圖開 始輸入資源數(shù)m, 及各類資源總數(shù),初始化Available向量輸入進(jìn)程數(shù)n,i=1輸入進(jìn)程i的最大需求向量max。inmax資源總數(shù)提示錯誤重新輸入i加1任選一個進(jìn)程作為當(dāng)前進(jìn)程輸入該進(jìn)程的資源請求量Request 調(diào)用銀行家算法,及安全性算法,完成分配,或并給出提示該進(jìn)程的Need向量為0該進(jìn)程已運行結(jié)束Need矩陣為0所有進(jìn)程運行都結(jié)束結(jié) 束NYYNNY初始化need 矩陣NY 七銀行家算法程序代碼#include<stdio.h>#include<conio.h&
23、gt;#include<iostream>using namespace std;typedef struct Max1 / 資源的最大需求量int m_a;int m_b;int m_c;Max; typedef struct Allocation1 /已分配的資源數(shù)int a_a;int a_b;int a_c;Allocation; typedef struct Need1 /還需要的資源數(shù)int n_a;int n_b;int n_c;Need; struct Available1 /可利用的資源量int av_a;int av_b;int av_c; q;struct p
24、r /定義一個結(jié)構(gòu)char name;Max max;Allocation allocation;Need need;int finishflag;p5;char na5;/*void init() /讀入文件"1.txt"cout<<"各進(jìn)程還需要的資源數(shù)NEED:"<<endl;FILE *fp;fp=fopen("1.txt","r+"); / 打開文件"1.txt"for(int i=0;i<5;i+)fscanf(fp,"%c,%d,%d,%d,
25、%d,%d,%dn",&,&pi.max.m_a,&pi.max.m_b,&pi.max.m_c,&pi.allocation.a_a,&pi.allocation.a_b,&pi.allocation.a_c);pi.need.n_a=pi.max.m_a-pi.allocation.a_a;pi.need.n_b=pi.max.m_b-pi.allocation.a_b;pi.need.n_c=pi.max.m_c-pi.allocation.a_c;cout<<<<&qu
26、ot;: "<<pi.need.n_a<<" "<<pi.need.n_b<<" "<<pi.need.n_c<<endl;fclose(fp); /關(guān)閉文件/*int fenpei()/分配資源cout<<"Available:"cout<<q.av_a<<" "<<q.av_b<<" "<<q.av_c<<endl;int fi
27、nishcnt=0,k=0,count=0;for(int j=0;j<5;j+)pj.finishflag=0;while(finishcnt<5)for(int i=0;i<5;i+)if(pi.finishflag=0&&q.av_a>=pi.need.n_a&&q.av_b>=pi.need.n_b&&q.av_c>=pi.need.n_c)q.av_a+=pi.allocation.a_a;q.av_b+=pi.allocation.a_b;q.av_c+=pi.allocation.a_c;pi.f
28、inishflag=1;finishcnt+;nak+=;break;count+;/禁止循環(huán)過多if(count>5)return 0;return 1;/*int shq() /申請資源int m=0,i=0,j=0,k=0; /m為進(jìn)程號; i,j,k為申請的三類資源數(shù) cout<<"請輸入進(jìn)程號和請求資源的數(shù)目!"<<endl;cout<<"如:進(jìn)程號 資源A B C"<<endl;cout<<" 0 2 0 2"<<endl;cin&
29、gt;>m>>i>>j>>k;if(i<=pm.need.n_a&&j<=pm.need.n_b &&k<=pm.need.n_c)if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c)pm.allocation.a_a+=i;pm.allocation.a_b+=j;pm.allocation.a_c+=k;pm.need.n_a=pm.max.m_a-pm.allocation.a_a;pm.need.n_b=pm.max.m_b-p
30、m.allocation.a_b;pm.need.n_c=pm.max.m_c-pm.allocation.a_c;cout<<"各進(jìn)程還需要的資源數(shù)NEED:"<<'n'for(int w=0;w<5;w+) cout<<<<": "<<pw.need.n_a<<" "<<pw.need.n_b<<" "<<pw.need.n_c<<endl;return 1
31、;elsecout<<"Request>Available讓進(jìn)程"<<m<<"等待."<<endl;else cout<<"Request>Need,讓進(jìn)程"<<m<<"等待."<<endl;return 0;/*void main()int flag;char c;cout<<" /* 銀 行 家 算 法*/ "<<endl;cout<<"確
32、認(rèn)已經(jīng)在"1.txt"文檔中正確輸入各進(jìn)程的有關(guān)信息后按回車鍵"<<endl;getch();init();q.av_a=10; /各種資源的數(shù)量q.av_b=5;q.av_c=7;while(flag)for(int i=0;i<5;i+)q.av_a-= pi.allocation.a_a;q.av_b-= pi.allocation.a_b;q.av_c-= pi.allocation.a_c;if(fenpei()cout<<"這樣配置資源是安全的!"<<endl;cout<<&qu
33、ot;其安全序列是: "for(int k=0;k<5;k+)cout<<"->"<<nak;cout<<endl;cout<<"有進(jìn)程發(fā)出Request請求向量嗎?(Enter y or Y)"<<endl;cout<<endl;c=getch();if(c='y'|c='Y')if(shq()continue;else break;else flag=0;else flag=0;cout<<"不安全!&q
34、uot;<<endl;八運行結(jié)果實驗三 存儲管理一 實驗?zāi)康拇鎯芾淼闹饕δ苤皇呛侠淼胤峙淇臻g。請求頁式管理是一種常用的虛擬存儲管理技術(shù)。本實驗的目的是通過請求頁式管理中頁面置換算法模擬設(shè)計,了解虛擬存儲技術(shù)的特點,掌握請求頁式存儲管理的頁面置換算法。二 實驗內(nèi)容(1) 通過計算不同算法的命中率比較算法的優(yōu)劣。同時也考慮了用戶內(nèi)存容量對命中率的影響。頁面失效次數(shù)為每次訪問相應(yīng)指令時,該指令所對應(yīng)的頁不在內(nèi)存中的次數(shù)。在本實驗中,假定頁面大小為1k,用戶虛存容量為32k,用戶內(nèi)存容量為4頁到32頁。(2) produce_addstream通過隨機(jī)數(shù)產(chǎn)生一個指令序列,共320條指
35、令。A、 指令的地址按下述原則生成:1) 50%的指令是順序執(zhí)行的2) 25%的指令是均勻分布在前地址部分3) 25%的指令是均勻分布在后地址部分B、 具體的實施方法是:1) 在0,319的指令地址之間隨機(jī)選取一起點m;2) 順序執(zhí)行一條指令,即執(zhí)行地址為m+1的指令;3) 在前地址0,m+1中隨機(jī)選取一條指令并執(zhí)行,該指令的地址為m;4) 順序執(zhí)行一條指令,地址為m+1的指令5) 在后地址m+2,319中隨機(jī)選取一條指令并執(zhí)行;6) 重復(fù)上述步驟1)5),直到執(zhí)行320次指令C、 將指令序列變換稱為頁地址流在用戶虛存中,按每k存放10條指令排列虛存地址,即320條指令在虛存中的存放方式為:第
36、0條第9條指令為第0頁(對應(yīng)虛存地址為0,9);第10條第19條指令為第1頁(對應(yīng)虛存地址為10,19);。第310條第319條指令為第31頁(對應(yīng)虛存地址為310,319);按以上方式,用戶指令可組成32頁。(3) 計算并輸出下屬算法在不同內(nèi)存容量下的命中率。1) 先進(jìn)先出的算法(FIFO);2) 最近最少使用算法(LRU);3) 最佳淘汰算法(OPT);4) 最少訪問頁面算法(LFR);其中3)和4)為選擇內(nèi)容開 始生成地址流輸入算法號S1S4形成地址頁號用戶內(nèi)存空間msize=2Msize32 OPT()FIFO()LRU()LFU()Msize加1S=? 是否用其他算法繼續(xù)結(jié) 束NY1
37、234YN提示出錯,重新輸入三 系統(tǒng)框圖四頁面置換算法程序代碼:#include<stdio.h> #include<string.h> #include<iostream.h>const int MAXSIZE=1000;/定義最大頁面數(shù) const int MAXQUEUE=3;/定義頁框數(shù)typedef struct node int loaded; int hit; page;page pagesMAXQUEUE; /定義頁框表 int queueMAXSIZE; int quantity; /初始化結(jié)構(gòu)函數(shù) void initial() int i
38、; for(i=0;i<MAXQUEUE;i+) pagesi.loaded=-1; pagesi.hit=0; for(i=0;i<MAXSIZE;i+) queuei=-1; quantity=0; /初始化頁框函數(shù) void init() int i; for(i=0;i<MAXQUEUE;i+) pagesi.loaded=-1; pagesi.hit=0; /讀入頁面流void readData() FILE *fp; char fname20;int i;cout<<"請輸入頁面流文件名:" cin>>fname;if(
39、fp=fopen(fname,"r")=NULL) cout<<"錯誤,文件打不開,請檢查文件名" else while(!feof(fp) fscanf(fp,"%d ",&queuequantity);quantity+; cout<<"讀入的頁面流:" for(i=0;i<quantity;i+)cout<<queuei<<" " /FIFO調(diào)度算法void FIFO() int i,j,p,flag;int absence=0
40、;p=0;cout<<endl<<"-"<<endl; cout<<"先進(jìn)先出調(diào)度算法(FIFO)頁面調(diào)出流:" for(i=0;i<quantity;i+) flag=0; for(j=0;j<MAXQUEUE;j+) if(pagesj.loaded=queuei) flag=1; if(flag=0) if(absence>=MAXQUEUE) cout<<pagesp.loaded<<" " pagesp.loaded=queuei; p
41、=(p+1)%MAXQUEUE; absence+; absence-=MAXQUEUE; cout<<endl<<"總?cè)表摂?shù):"<<absence<<endl; /最近最少使用調(diào)度算法(LRU)void LRU() int absence=0; int i,j; int flag;for(i=0;i<MAXQUEUE;i+) pagesi.loaded=queuei; cout<<endl<<"-"<<endl; cout<<"最近最少使用調(diào)
42、度算法(LRU)頁面流:"for(i=MAXQUEUE;i<quantity;i+) flag=-1; for(j=0;j<MAXQUEUE;j+) if(queuei=pagesj.loaded) flag=j; /CAUTION pages0是隊列頭if(flag=-1) /缺頁處理cout<<pages0.loaded<<" " for(j=0;j<MAXQUEUE-1;j+) pagesj=pagesj+1; pagesMAXQUEUE-1.loaded=queuei;absence+; else /頁面已載入 p
43、agesquantity=pagesflag;for(j=flag;j<MAXQUEUE-1;j+) pagesj=pagesj+1; pagesMAXQUEUE-1=pagesquantity;cout<<endl<<"總?cè)表摂?shù):"<<absence<<endl; /顯示 void version() cout<<" /*虛擬存儲管理器的頁面調(diào)度*/"<<endl;cout<<endl; void main() version(); initial();readD
44、ata();FIFO(); init();LRU(); init(); init();四 運行結(jié)果運行程序前先新建一個頁面流文件文件(格式為*.txt),在文件中存儲的是一系列頁面號(頁面號用整數(shù)表示,用空格作為分隔符),用來模擬待換入的頁面。例如: 14 5 18 56 20 25 6 3 8 17實驗四 磁盤調(diào)度一、 實驗?zāi)康模捍疟P是高速、大容量、旋轉(zhuǎn)型、可直接存取的存儲設(shè)備。它作為計算機(jī)系統(tǒng)的輔助存儲器,擔(dān)負(fù)著繁重的輸入輸出工作,在現(xiàn)代計算機(jī)系統(tǒng)中往往同時會有若干個要求訪問磁盤的輸入輸出要求。系統(tǒng)可采用一種策略,盡可能按最佳次序執(zhí)行訪問磁盤的請求。由于磁盤訪問時間主要受尋道時間T的影響,
45、為此需要采用合適的尋道算法,以降低尋道時間。本實驗要求學(xué)生模擬設(shè)計一個磁盤調(diào)度程序,觀察調(diào)度程序的動態(tài)運行過程。通過實驗讓學(xué)生理解和掌握磁盤調(diào)度的職能。二、 實驗題目:模擬電梯調(diào)度算法,對磁盤進(jìn)行移臂操作三、 提示及要求:1、 假設(shè)磁盤只有一個盤面,并且磁盤是可移動頭磁盤。2、 磁盤是可供多個進(jìn)程共享的存儲設(shè)備,但一個磁盤每個時刻只能為一個進(jìn)程服務(wù)。當(dāng)有進(jìn)程在訪問某個磁盤時,其它想訪問該磁盤的進(jìn)程必須等待,直到磁盤一次工作結(jié)束。當(dāng)有多個進(jìn)程提出輸入輸出請求而處于等待狀態(tài)時,可用電梯調(diào)度算法從若干個等待訪問者中選擇一個進(jìn)程,讓它訪問磁盤。為此設(shè)置“驅(qū)動調(diào)度”進(jìn)程。3、 由于磁盤與處理器是并行工作
46、的,所以當(dāng)磁盤在為一個進(jìn)程服務(wù)時,占有處理器的其它進(jìn)程可以提出使用磁盤(這里我們只要求訪問磁道),即動態(tài)申請訪問磁道,為此設(shè)置“接受請求”進(jìn)程。4、 為了模擬以上兩個進(jìn)程的執(zhí)行,可以考慮使用隨機(jī)數(shù)來確定二者的允許順序,程序結(jié)構(gòu)圖參考附圖:5、 “接受請求”進(jìn)程建立一張“進(jìn)程請求I/O”表,指出等待訪問磁盤的進(jìn)程要求訪問的磁道,表的格式如下:進(jìn)程名要求訪問的磁道號6、 “磁盤調(diào)度”的功能是查“請求I/O”表,當(dāng)有等待訪問的進(jìn)程時,按電梯調(diào)度算法(SCAN算法)從中選擇一個等待訪問的進(jìn)程,按其指定的要求訪問磁道。SCAN算法參考課本第九章。算法模擬框圖略。7、 圖1中的“初始化”工作包括:初始化“
47、請求I/O”表,設(shè)置置當(dāng)前移臂方向;當(dāng)前磁道號。并且假設(shè)程序運行前“請求I/O”表中已有若干進(jìn)程(48個)申請訪問相應(yīng)磁道。四、 實驗報告:1、 實驗題目。2、 程序中用到的數(shù)據(jù)結(jié)構(gòu)及其說明。3、 打印源程序并附注釋。4、 實驗結(jié)果內(nèi)容如下:打印“請求I/O”表,當(dāng)前磁道號,移臂方向,被選中的進(jìn)程名和其要求訪問的磁道,看是否體現(xiàn)了電梯調(diào)度(SCAN)算法。5、 體會與問題。五、 附圖:開始初始化磁盤調(diào)度隨機(jī)數(shù)1/2繼續(xù)?接受請求輸入在0,1區(qū)間內(nèi)的隨機(jī)數(shù)結(jié)束六磁盤調(diào)度的程序代碼:#include<iostream>#include<cmath>using namespa
48、ce std;typedef struct nodeint data;struct node *next;Node;void main()void fcfs(Node *,int,int);/聲明先來先服務(wù)函數(shù)FCFSvoid sstf(Node *,int,int);/聲明最短尋道時間優(yōu)先函數(shù)SSTFvoid scan(Node *,int,int);/聲明掃描函數(shù)SCANvoid print(Node *); /輸出鏈表函數(shù)Node *head,*p,*q; /建立一個鏈表int it,c=0,f,s; /c為鏈表長度,f是開始的磁道號,s是選擇哪個算法head=(Node *)mallo
49、c(sizeof(Node);head->next=NULL;q=head;cout<<" /*磁盤調(diào)度算法*/"<<endl;cout<<endl;cout<<"新建一個單鏈表,以0作為結(jié)束標(biāo)志:"cin>>it;while(it!=0)p=(Node *)malloc(sizeof(Node);p->next=NULL;p->data=it;q->next=p;q=p;cin>>it;c+;cout<<"從幾號磁道開始:"c
50、in>>f; /f為磁道號print(head);cout<<"鏈表長度為:"<<c<<endl;cout<<"1、先來先服務(wù)算法FCFS"<<endl;cout<<"2、最短尋道時間優(yōu)先算法SSTF"<<endl;cout<<"3、電梯調(diào)度算法(掃描算法SCAN)"<<endl;cout<<"0、退出"<<endl;cout<<"
51、請選擇:"cin>>s;while(s!=0) switch(s) case 1:cout<<"你選擇了:先來先服務(wù)算法FCFS"<<endl;fcfs( head,c,f);break; case 2:cout<<"你選擇了:最短尋道時間優(yōu)先算法SSTF"<<endl;sstf( head,c,f);break; case 3:cout<<"你選擇了:電梯調(diào)度算法(掃描算法SCAN)"<<endl;scan( head,c,f);break; cout<<"退出請選0,繼續(xù)請選1,2,3:" cin>>s;/*/void fcfs(Node *head,int c,int f)/先來先服務(wù)算法void print(Node *);Node *l;/*m,*n;float num=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品推廣方案范文5篇
- 代購合同書【5篇】
- 2025簡約家居裝修設(shè)計合同
- 學(xué)校支教工作總結(jié)【10篇】
- 獸藥欠賬銷售合同標(biāo)準(zhǔn)文本
- 保安工作計劃文化藝術(shù)圖書館部門
- 確保工作質(zhì)量的年度計劃
- 公司借款購車合同標(biāo)準(zhǔn)文本
- 農(nóng)業(yè)機(jī)具投放合同標(biāo)準(zhǔn)文本
- 二人合伙合同標(biāo)準(zhǔn)文本
- 小學(xué)一年級數(shù)學(xué)-100以內(nèi)加減法口算填空題(含答案)
- 化工總控工(高級工)理論知識考試題庫附答案
- Do you have a dream瘋狂動物城英文版
- 中醫(yī)給藥護(hù)理課件
- 銷售人員財務(wù)知識培訓(xùn)課件
- 采購需求預(yù)測與物料計劃
- GB/T 4303-2023船用救生衣
- 101種心理防御機(jī)制
- 醫(yī)院培訓(xùn)課件:《醫(yī)療安全(不良)事件報告制度培訓(xùn)》
- 拆除電桿施工方案
- 村(居)民房屋翻建(新建)申請表
評論
0/150
提交評論