江蘇科技大學操作系統實驗_第1頁
江蘇科技大學操作系統實驗_第2頁
江蘇科技大學操作系統實驗_第3頁
江蘇科技大學操作系統實驗_第4頁
江蘇科技大學操作系統實驗_第5頁
已閱讀5頁,還剩62頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

操作系統實驗實驗一進程調度實驗目的多道程序設計中,經常是假設干個進程同時處于就緒狀態,必須依照某種策略來決定那個進程優先占有處理機。因而引起進程調度。本實驗模擬在單處理機情況下的處理機調度問題,加深對進程調度的理解。實驗要求設計進程調度算法,進程數不定包含幾種調度算法,并加以實現輸出進程的調度過程——進程的狀態、鏈表等。參考例題目——優先權法、輪轉法簡化假設進程為計算型的〔無I/O〕進程狀態:ready、running、finish進程需要的CPU時間以時間片為單位確定算法描述優先權法——動態優先權當前運行進程用完時間片后,其優先權減去一個常數。輪轉法開始鍵盤輸入進程數n,和調度方法的選擇開始鍵盤輸入進程數n,和調度方法的選擇優先權法?輪轉法產生n個進程,對每個進程產生一個PCB,并用隨機數產生進程的優先權及進程所需的CPU時間按優先權大小,把n個進程拉成一個就緒隊列初始化其他數據結構區鏈首進程投入運行時間片到,進程所需的CPU時間減1,優先權減3,輸出個進程的運行情況所需的CPU時間=0?撤銷進程就緒隊列為空?結束將進程插入就緒隊列NYNYYBN產生n個進程,對每個進程用隨機數產生進程的輪轉時間片數及進程所需的時間片數,已占用CPU產生n個進程,對每個進程用隨機數產生進程的輪轉時間片數及進程所需的時間片數,已占用CPU的時間片數置為0按進程產生的先后次序拉成就緒隊列鏈鏈首進程投入運行時間片到,進程所需時間片數減1,已占用CPU時間片數加1輸出各進程的運行情況進程所需時間片數=0?撤銷該進程就緒隊列為空嗎?占用CPU的時間片數=輪轉時間片數?占用CPU的時間片數置為0把該進程插入就緒隊列尾BNYNYY結束N產生的各種隨機數的取值范圍加以限制,如所需的CPU時間限制在1~20之間。進程數n不要太大通常取4~8個使用動態數據結構獨立編程至少三種調度算法假設有可能請在圖形方式下,將PCB的調度用圖形成動畫顯示。五.實驗過程:〔1〕輸入:進程流文件〔1.txt〕,其中存儲的是一系列要執行的進程,每個作業包括四個數據項:進程名進程狀態(1就緒2等待3運行)所需時間優先數(0級最高)進程01502進程12104進程21150進程33285進程42191進程5387輸出:進程執行流等待時間,平均等待時間本程序包括:FIFO算法,優先數調度算法,時間片輪轉調度算法程序代碼package進程調度;importjava.util.*;classPCB//創立進程塊{intId;//進程編號intUseTime;//效勞時間intNeedTime;//需要時間intPerior;//優先級StringStatus;//狀態PCB(){Id++;UseTime=0;NeedTime=(int)Math.round(Math.random()*6)+1;//隨機產生需要時間Perior=(int)Math.round(Math.random()*5)+1;//隨即產生優先級Status="Ready";//初始狀態為就緒}}classFound//定義系統處理方法類{ArrayList<PCB>sequnce;//創立就緒隊列PCBpcb[]=newPCB[5];intStartTime=0;intSystemTime=(int)(Math.random()*3)+1;//隨即產生系統時間Found(){sequnce=newArrayList<PCB>();for(inti=0;i<5;i++){pcb[i]=newPCB();pcb[i].Id=i+1;sequnce.add(pcb[i]);}}voidFCFS()//先來先效勞算法{PCBRunning=null;while(sequnce.size()>0)//就緒隊列不為空{ Running=sequnce.remove(0);Running.UseTime=Running.NeedTime;Running.NeedTime=0;Running.Perior=0;System.out.println("當前系統時間:"+SystemTime);SystemTime+=Running.UseTime;ShowMessages(Running);}}voidRR()//時間片輪換算法{PCBRunning=null;intTime=SystemTime;while(sequnce.size()>0){System.out.println("當前系統時間:"+SystemTime);Running=sequnce.remove(0);if(Running.NeedTime<=Time){Running.UseTime=Running.NeedTime;Running.NeedTime=0;Running.Perior=0;Running.Status="Finish";SystemTime+=Running.UseTime;}else{Running.UseTime+=Time;Running.NeedTime-=Time;Running.Perior--;Running.Status="Ready";sequnce.add(Running);SystemTime+=Time;}ShowMessages(Running);}}voidShowMessages(PCBp)//輸出信息{System.out.println("當前運行進程:"+p.Id+""+"效勞時間:"+p.UseTime+""+"需要時間:"+p.NeedTime+""+"優先級:"+p.Perior+""+"狀態:"+p.Status);if(sequnce.size()>0){System.out.println("當前就緒進程:");for(PCBp1:sequnce){System.out.println("進程編號:"+p1.Id+""+"效勞時間:"+p1.UseTime+""+"需要時間:"+p1.NeedTime+""+"優先級:"+p1.Perior+""+"狀態:"+p1.Status);System.out.println("");}}else{System.out.println("當前系統中已經沒有就緒進程!");}System.out.println('\n');}}classMenu//主界面菜單{Scannersc=newScanner(System.in);intprint(){System.out.println("********************************************");System.out.println("進調度算法演示");System.out.println("********************************************");System.out.println("1.先來先效勞〔FCFS〕算法");System.out.println("2.時間片輪換〔RR〕算法");System.out.println("3.退出該程序");System.out.print("請選擇所要采用的算法:");intflag=sc.nextInt();returnflag;}voidselect(){intflag=print();switch(flag){case1:FoundProcess1=newFound();Process1.FCFS();print();case2:FoundProcess2=newFound();Process2.RR();print();case3:System.exit(0);default:break;}}}package進程調度;publicclassProcessControl{publicstaticvoidmain(Stringargs[]){MenuTencent=newMenu();Tencent.select();}}運行結果:實驗二銀行家算法實驗目的死鎖會引起計算機工作僵死,因此操作系統中必須防止。本實驗的目的在于讓學生獨立的使用高級語言編寫和調試一個系統動態分配資源的簡單模擬程序,了解死鎖產生的條件和原因,并采用銀行家算法有效地防止死鎖的發生,以加深對課堂上所講授的知識的理解。實驗要求設計有n個進程共享m個系統資源的系統,進程可動態的申請和釋放資源,系統按各進程的申請動態的分配資源。系統能顯示各個進程申請和釋放資源,以及系統動態分配資源的過程,便于用戶觀察和分析;數據結構可利用資源向量Available,它是一個含有m個元素的數組,其中的每一個元素代表一類可利用的資源的數目,其初始值是系統中所配置的該類全部可用資源數目。其數值隨該類資源的分配和回收而動態地改變。如果Available〔j〕=k,標是系統中現有Rj類資源k個。最大需求矩陣Max,這是一個n×m的矩陣,它定義了系統中n個進程中的每一個進程對m類資源的最大需求。如果Max〔i,j〕=k,表示進程i需要Rj類資源的最大數目為k。分配矩陣Allocation,這是一個n×m的矩陣,它定義了系統中的每類資源當前一分配到每一個進程的資源數。如果Allocation〔i,j〕=k,表示進程i當前已經分到Rj類資源的數目為k。Allocationi表示進程i的分配向量,有矩陣Allocation的第i行構成。需求矩陣Need,這是一個n×m的矩陣,用以表示每個進程還需要的各類資源的數目。如果Need〔i,j〕=k,表示進程i還需要Rj類資源k個,才能完成其任務。Needi表示進程i的需求向量,由矩陣Need的第i行構成。上述三個矩陣間存在關系:Need〔i,j〕=Max〔i,j〕-Allocation〔i,j〕;銀行家算法Requesti是進程Pi的請求向量。Requesti〔j〕=k表示進程Pi請求分配Rj類資源k個。當Pi發出資源請求后,系統按下述步驟進行檢查:如果Requesti≤Need,那么轉向步驟2;否那么,認為出錯,因為它所請求的資源數已超過它當前的最大需求量。如果Requesti≤Available,那么轉向步驟3;否那么,表示系統中尚無足夠的資源滿足Pi的申請,Pi必須等待。系統試探性地把資源分配給進程Pi,并修改下面數據結構中的數值:Available=Available-RequestiAllocationi=Allocationi+RequestiNeedi=Needi-Requesti系統執行平安性算法,檢查此次資源分配后,系統是否處于平安狀態。如果平安才正式將資源分配給進程Pi,以完本錢次分配;否那么,將試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。假定系統有5個進程〔p0,p1,p2,p3,p4〕和三類資源〔A,B,C〕,各種資源的數量分別為10,5,7,在T0時刻的資源分配情況如以下圖:MaxAllocationNeedAvailableABCABCABCABCP0753010743332(230)P1322200122(302)(020)P2902302600P3222211011P4433002431平安性算法設置兩個向量。Work:它表示系統可提供應進程繼續運行的各類資源數目,它包含m個元素,開始執行平安性算法時,Work=Available。Finish:它表示系統是否有足夠的資源分配給進程,使之運行完成,開始Finish〔I〕=false;當有足夠資源分配給進程Pi時,令Finish〔i〕=true;從進程集合中找到一個能滿足下述條件的進程。Finish〔i〕==false;Needi≤work;如找到那么執行步驟3;否那么,執行步驟4;當進程Pi獲得資源后,可順利執行直到完成,并釋放出分配給它的資源,故應執行Work=work+AllocationiFinish〔i〕=true;轉向步驟2;假設所有進程的Finish〔i〕都為true,那么表示系統處于平安狀態;否那么,系統處于不平安狀態。六、系統流程圖開始開始輸入資源數m,及各類資源總數,初始化Available向量輸入進程數n,i=1輸入進程i的最大需求向量max。i≤nmax≤資源總數提示錯誤重新輸入i加1任選一個進程作為當前進程輸入該進程的資源請求量Request調用銀行家算法,及平安性算法,完成分配,或并給出提示該進程的Need向量為0該進程已運行結束Need矩陣為0所有進程運行都結束結束NYYNNY初始化need矩陣NY銀行家算法程序代碼packageyinhangjia;importjava.util.Scanner;publicclassbanker{privateintProcess=0;//定義最大進程數目privateintResource=0;//定義最大資源類數privateintWork[];//定義系統可提供應進程繼續運行所需的各類資源數目privateintMAX[][];//定義進程最大資源需求privateintAllocation[][];//定義進程當前已用資源數目privateintneed[][];//定義進程需要資源數目privateintRequest[][];//定義進程請求資源向量privatebooleanfinish[];//定義進程完成標志privateintAvailable[];privateintP[];privateScannerin=newScanner(System.in);//定義全局輸入流publicvoidclose(){in.close(); }//構造函數,初始化各向量publicbanker()throwsException{inti,j; System.out.print("請輸入當前進程的個數:");Process=in.nextInt(); System.out.print("請輸入系統資源種類的類數:");Resource=in.nextInt();//初始化各個數組Available=newint[Resource];Work=newint[Resource];MAX=newint[Process][Resource];Allocation=newint[Process][Resource];need=newint[Process][Resource];Request=newint[Process][Resource];finish=newboolean[Process];P=newint[Process]; System.out.println("請輸入每個進程最大資源需求量,按"+Process+"*"+Resource +"矩陣輸入:");for(i=0;i<Process;i++){ System.out.print("請輸入P"+(i+1)+"進程各類資源最大需求量:");for(j=0;j<Resource;j++)MAX[i][j]=in.nextInt(); } System.out.println("請輸入每個進程已分配的各資源數,也按照"+Process+"*"+Resource +"矩陣輸入:");for(i=0;i<Process;i++){ System.out.print("請輸入P"+(i+1)+"進程各類資源已分配的資源數:");for(j=0;j<Resource;j++){Allocation[i][j]=in.nextInt();need[i][j]=MAX[i][j]-Allocation[i][j];if(need[i][j]<0){ System.out.println("您輸入的第"+(i+1)+"個進程所擁有的第" +(j+1)+"個資源數錯誤,請重新輸入:"); j--;continue; } } } System.out.print("請輸入系統各類資源可用的數目:");for(i=0;i<Resource;i++){Available[i]=in.nextInt(); } }publicvoidBank()throwsException{intj,i;inttempAvailable[]=newint[Resource];inttempAllocation[]=newint[Resource];inttempNeed[]=newint[Resource]; System.out.println(""); System.out.print("請輸入要申請資源的進程號(當前共有"+Process+"個進程,如為進程P1申請,請輸入1,以此類推)"); i=in.nextInt()-1; System.out.print("請輸入P"+(i+1)+"進程申請的各資源的數量");for(j=0;j<Resource;j++){Request[i][j]=in.nextInt(); }for(j=0;j<Resource;j++){if(Request[i][j]>need[i][j]){ System.out.println("您輸入的申請的資源數超過進程的需求量!請重新輸入!");continue; }if(Request[i][j]>Available[j]){ System.out.println("您輸入的申請數超過系統可用的資源數!請重新輸入!");continue; } }for(j=0;j<Resource;j++){ tempAvailable[j]=Available[j]; tempAllocation[j]=Allocation[i][j]; tempNeed[j]=need[i][j];Available[j]=Available[j]-Request[i][j];Allocation[i][j]=Allocation[i][j]+Request[i][j];need[i][j]=need[i][j]-Request[i][j]; }if(Safe()){ System.out.println("分配給P"+i+"進程成功!"); System.out.print("分配前系統可用資源:");for(intk=0;k<Resource;k++) System.out.print(tempAvailable[k]+""); System.out.print("\n分配前進程P"+i+"各類資源已分配數量:");for(intk=0;k<Resource;k++) System.out.print(tempAllocation[k]+""); System.out.print("\n分配前進程P"+i+"各類資源需求數量:");for(intk=0;k<Resource;k++) System.out.print(tempNeed[k]+""); System.out.print("\n分配后系統可用資源:");for(intk=0;k<Resource;k++) System.out.print(Available[k]+""); System.out.print("\n分配后進程P"+i+"各類資源已分配數量:");for(intk=0;k<Resource;k++) System.out.print(Allocation[i][k]+""); System.out.print("\n分配后進程P"+i+"各類資源需求數量:");for(intk=0;k<Resource;k++) System.out.print(need[i][k]+""); System.out.println(); }else{ System.out.println("申請資源失敗!");for(j=0;j<Resource;j++){Available[j]=Available[j]+Request[i][j];Allocation[i][j]=Allocation[i][j]+Request[i][j];need[i][j]=need[i][j]+Request[i][j]; } }for(i=0;i<Process;i++){finish[i]=false; } }//平安性算法publicbooleanSafe(){inti,j,k,t=0;Work=newint[Resource];for(i=0;i<Resource;i++)Work[i]=Available[i];for(i=0;i<Process;i++){finish[i]=false; }for(i=0;i<Process;i++){if(finish[i]==true){continue; }else{for(j=0;j<Resource;j++){if(need[i][j]>Work[j]){break; } }if(j==Resource){finish[i]=true;for(k=0;k<Resource;k++){Work[k]+=Allocation[i][k]; }P[t++]=i; i=-1; }else{continue; } }if(t==Process){ System.out.print("當前系統是平安的,存在一平安序列:");for(i=0;i<t;i++){ System.out.print("P"+P[i]);if(i!=t-1){ System.out.print(""); } } System.out.println();returntrue; } } System.out.println("當前系統是不平安的,不存在平安序列");returnfalse; }publicstaticvoidmain(String[]args){try{ bankerb=newbanker(); b.Safe();for(inti=0;i<200;i++) b.Bank(); b.close(); }catch(Exceptione){ } }}運行結果實驗三存儲管理實驗目的存儲管理的主要功能之一是合理地分配空間。請求頁式管理是一種常用的虛擬存儲管理技術。本實驗的目的是通過請求頁式管理中頁面置換算法模擬設計,了解虛擬存儲技術的特點,掌握請求頁式存儲管理的頁面置換算法。實驗內容通過計算不同算法的命中率比擬算法的優劣。同時也考慮了用戶內存容量對命中率的影響。 頁面失效次數為每次訪問相應指令時,該指令所對應的頁不在內存中的次數。 在本實驗中,假定頁面大小為1k,用戶虛存容量為32k,用戶內存容量為4頁到32頁。produce_addstream通過隨機數產生一個指令序列,共320條指令。指令的地址按下述原那么生成:50%的指令是順序執行的25%的指令是均勻分布在前地址局部25%的指令是均勻分布在后地址局部具體的實施方法是:在[0,319]的指令地址之間隨機選取一起點m;順序執行一條指令,即執行地址為m+1的指令;在前地址[0,m+1]中隨機選取一條指令并執行,該指令的地址為m’;順序執行一條指令,地址為m’+1的指令在后地址[m’+2,319]中隨機選取一條指令并執行;重復上述步驟1〕~5〕,直到執行320次指令將指令序列變換稱為頁地址流在用戶虛存中,按每k存放10條指令排列虛存地址,即320條指令在虛存中的存放方式為:第0條~第9條指令為第0頁〔對應虛存地址為[0,9]〕;第10條~第19條指令為第1頁〔對應虛存地址為[10,19]〕;。。。。。。第310條~第319條指令為第31頁〔對應虛存地址為[310,319]〕;按以上方式,用戶指令可組成32頁。計算并輸出下屬算法在不同內存容量下的命中率。先進先出的算法〔FIFO〕;最近最少使用算法〔LRU〕;最正確淘汰算法〔OPT〕;最少訪問頁面算法〔LFR〕;其中3〕和4〕為選擇內容開始生成地址流開始生成地址流輸入算法號S1≤S≤4形成地址頁號用戶內存空間msize=2Msize≤32OPT()FIFO()LRU()LFU()Msize加1S=?是否用其他算法繼續結束NY1234YN提示出錯,重新輸入四、頁面置換算法程序代碼:package存儲管理;importjava.util.Random;publicclassMemoryManage_Operation{private String[][]dataStrings=newString[33][4];//數據傳遞數組privateint[]Addstream=newint[320];//地址流privateint[]Addspage=newint[320];//頁面流privateint[]phyBlock=newint[32];//物理塊數privateRandomrandom=newRandom();//隨機數privateintblockNum;//內存塊數privateintnpageNum;//缺頁數臨時變量privatefloatrate;//缺頁率privateinttempK,tempG,tempF;//臨時變量//產生隨機地址流和頁面流publicvoidsetProduceAddstream(){inttemp;for(inti=0;i<320;i+=3){ temp=random.nextInt(320)%320+0;Addstream[i]=temp+1; temp=random.nextInt(320)%(Addstream[i]+1);Addstream[i+1]=temp+1; temp=random.nextInt(320)%(319-Addstream[i+1])+(Addstream[i+1]+1);if(i+2>=320){break; }Addstream[i+2]=temp; }for(inti=0;i<320;i++){Addspage[i]=Addstream[i]/10; } }//用戶內存及相關數據初始化privatevoidinitialization(){for(inti=0;i<32;i++){phyBlock[i]=-1; }this.npageNum=0;this.rate=0;this.tempK=0;this.tempG=-1;this.tempF=-1; }publicvoidFIFO(){int[]time=newint[32];//定義進入內存時間長度數組intmax;//max表示進入內存時間最久的,即最先進去的 initialization();for(inti=0;i<blockNum;i++) time[i]=i+1;for(inti=0;i<320;i++) {this.tempK=0;for(intj=0;j<blockNum;j++)if(phyBlock[j]==Addspage[i]) {//表示內存中已有當前要調入的頁面this.tempG=j;break; }for(intj=0;j<blockNum;j++)if(phyBlock[j]==-1){//用戶內存中存在空的物理塊this.tempF=j;break; }if(this.tempG!=-1)this.tempG=-1;else{if(this.tempF==-1) {//找到最先進入內存的頁面 max=time[0];for(intj=0;j<blockNum;j++)if(time[j]>max){ max=time[j];this.tempK=j; }phyBlock[tempK]=Addspage[i]; time[tempK]=0;//該物理塊中頁面停留時間置零npageNum++;//缺頁數+1 }else {phyBlock[tempF]=Addspage[i]; time[tempF]=0;npageNum++;tempF=-1; } }for(intj=0;j<blockNum&&phyBlock[j]!=-1;j++) time[j]++;//物理塊中現有頁面停留時間+1 }this.rate=1-(float)npageNum/320;dataStrings[blockNum][1]=this.rate+""; }publicvoidLRU(){int[]time=newint[32];intmax; initialization();for(inti=0;i<blockNum;i++) time[i]=i+1;for(inti=0;i<320;i++){tempK=0;for(intj=0;j<blockNum;j++)if(phyBlock[j]==Addspage[i]){this.tempG=j;break; }for(intj=0;j<blockNum;j++)if(phyBlock[j]==-1){this.tempF=j;break; }if(this.tempG!=-1){ time[tempG]=0;this.tempG=-1; }else{if(this.tempF==-1){ max=time[0];for(intj=0;j<blockNum;j++)if(time[j]>max){this.tempK=j; max=time[j]; }phyBlock[tempK]=Addspage[i]; time[tempK]=0;npageNum++; }else{phyBlock[tempF]=Addspage[i]; time[tempF]=0;npageNum++;this.tempF=-1; } }for(intj=0;j<blockNum&&phyBlock[j]!=-1;j++) time[j]++; }this.rate=1-(float)npageNum/320;dataStrings[blockNum][2]=this.rate+""; }publicvoidLFR(){ initialization();int[]time_lru=newint[32];int[]time=newint[32];intmin,max_lru,t;for(inti=0;i<blockNum;i++){ time[i]=0; time_lru[i]=i+1; }for(inti=0;i<320;i++){this.tempK=0; t=1;for(intj=0;j<blockNum;j++)if(phyBlock[j]==Addspage[i]){this.tempG=j;break; }for(intj=0;j<blockNum;j++)if(phyBlock[j]==-1){this.tempF=j;break; }if(this.tempG!=-1){ time_lru[tempG]=0;this.tempG=-1; }else{if(this.tempF==-1){if(i<=20){//將最少使用的間隔時間定位個單位 max_lru=time_lru[0];//在未到達“一定時間”的要求時,先采用LRU進行頁面置換for(intj=0;j<blockNum;j++)if(time_lru[j]>max_lru){this.tempK=j; max_lru=time_lru[j]; }phyBlock[tempK]=Addspage[i]; time_lru[tempK]=0;npageNum++; }else{for(intj=0;j<blockNum;j++)//計算一定時間間隔內物理塊中的頁面使用次數for(inth=i-1;h>=i-1;h--)if(phyBlock[j]==Addspage[h]) time[j]++; min=time[0];for(intj=0;j<blockNum;j++)if(time[j]<min){ min=time[j];this.tempK=j; }for(intj=0;j<blockNum;j++)//應對出現頁面使用次數同樣少的情況if(time[j]==min) t++;if(t>1){//假設使用次數同樣少,將次數相同的頁面按照LRU進行頁面置換 max_lru=time_lru[tempK];for(intj=0;j<blockNum&&time[j]==min;j++)if(time_lru[j]>max_lru){this.tempK=j; max_lru=time_lru[j]; } }phyBlock[tempK]=Addspage[i]; time_lru[tempK]=0;npageNum++; } }else{phyBlock[tempF]=Addspage[i]; time_lru[tempF]=0;npageNum++;tempF=-1; } }for(intj=0;j<blockNum&&phyBlock[j]!=-1;j++) time_lru[j]++; }this.rate=1-(float)npageNum/320;dataStrings[blockNum][3]=this.rate+""; }publicintgetBlockNum(){returnblockNum; }publicvoidsetBlockNum(intblockNum){this.blockNum=blockNum; }publicString[][]getDataStrings(){returndataStrings; }publicvoidsetDataStrings(String[][]dataStrings){this.dataStrings=dataStrings; }}package存儲管理;importorg.eclipse.swt.widgets.Display;importorg.eclipse.swt.widgets.MessageBox;importorg.eclipse.swt.widgets.Shell;importorg.eclipse.swt.widgets.Menu;importorg.eclipse.swt.widgets.TableItem;importorg.eclipse.swt.SWT;importorg.eclipse.swt.widgets.MenuItem;importorg.eclipse.swt.widgets.Table;importorg.eclipse.swt.widgets.TableColumn;importorg.eclipse.swt.events.SelectionAdapter;importorg.eclipse.swt.events.SelectionEvent;publicclassManageSWT{ protectedShellshell; privateTabletable; publicstaticvoidmain(String[]args){ try{ ManageSWTwindow=newManageSWT(); window.open(); } catch(Exceptione){ e.printStackTrace(); } } publicvoidopen(){ Displaydisplay=Display.getDefault(); createContents(); shell.open(); shell.layout(); while(!shell.isDisposed()){ if(!display.readAndDispatch()){display.sleep();} } } protectedvoidcreateContents(){ shell=newShell(); shell.setSize(450,300); shell.setText("\u5B58\u50A8\u7BA1\u7406"); Menumenu=newMenu(shell,SWT.BAR); shell.setMenuBar(menu); MenuItemmenuItem=newMenuItem(menu,SWT.NONE); menuItem.addSelectionListener(newSelectionAdapter(){ @Override publicvoidwidgetSelected(SelectionEvente){ analysis(); } });menuItem.setText("\u547D\u4E2D\u7387\u5206\u6790"); MenuItemmenuItem_2=newMenuItem(menu,SWT.NONE); menuItem_2.addSelectionListener(newSelectionAdapter(){ @Override publicvoidwidgetSelected(SelectionEvente){ shell.dispose();} }); menuItem_2.setText("\u9000\u51FA"); MenuItemmenuItem_1=newMenuItem(menu,SWT.NONE); menuItem_1.addSelectionListener(newSelectionAdapter(){ @Override publicvoidwidgetSelected(SelectionEvente){ MessageBoxmessageBox=newMessageBox(shell,SWT.ICON_INFORMATION); messageBox.setText("關于"); messageBox.setMessage("存儲管理"); messageBox.open(); } });menuItem_1.setText("\u5173\u4E8E"); table=newTable(shell,SWT.BORDER|SWT.FULL_SELECTION); table.setBounds(0,0,434,242); table.setHeaderVisible(true); table.setLinesVisible(true); TableColumntblclmnNewColumn=newTableColumn(table,SWT.NONE); tblclmnNewColumn.setWidth(90); tblclmnNewColumn.setText("\u7269\u7406\u5757\u6570"); TableColumntblclmnNewColumn_1=newTableColumn(table,SWT.CENTER); tblclmnNewColumn_1.setWidth(100); tblclmnNewColumn_1.setText("\u5148\u8FDB\u5148\u51FA\u7684\u7B97\u6CD5"); TableColumntblclmnNewColumn_2=newTableColumn(table,SWT.CENTER); tblclmnNewColumn_2.setWidth(110); tblclmnNewColumn_2.setText("\u6700\u8FD1\u6700\u5C11\u4F7F\u7528\u7B97\u6CD5"); TableColumntblclmnLfu=newTableColumn(table,SWT.CENTER); tblclmnLfu.setWidth(110); tblclmnLfu.setText("\u6700\u5C11\u8BBF\u95EE\u9875\u9762\u7B97\u6CD5"); } publicvoidanalysis(){ table.removeAll(); MemoryManage_OperationmOperation=newMemoryManage_Operation(); mOperation.setProduceAddstream(); String[][]tempStrings=newString[33][4]; for(inti=2;i<=32;i++){ mOperation.setBlockNum(i); tempStrings[i][0]=i+"K"; mOperation.FIFO(); mOperation.LRU(); mOperation.LFR(); tempStrings[i][1]=mOperation.getDataStrings()[i][1]; tempStrings[i][2]=mOperation.getDataStrings()[i][2]; tempStrings[i][3]=mOperation.getDataStrings()[i][3]; } for(inti=2;i<33;i++){ TableItemitem=newTableItem(table,SWT.NULL); for(intj=0;j<4;j++){ item.setText(j,tempStrings[i][j]); } } }}五、運行結果實驗四磁盤調度實驗目的:磁盤是高速、大容量、旋轉型、可直接存取的存儲設備。它作為計算機系統的輔助存儲器,擔負著繁重的輸入輸出工作,在現代計算機系統中往往同時會有假設干個要求訪問磁盤的輸入輸出要求。系統可采用一種策略,盡可能按最正確次序執行訪問磁盤的請求。由于磁盤訪問時間主要受尋道時間T的影響,為此需要采用適宜的尋道算法,以降低尋道時間。本實驗要求學生模擬設計一個磁盤調度程序,觀察調度程序的動態運行過程。通過實驗讓學生理解和掌握磁盤調度的職能。實驗題目:模擬電梯調度算法,對磁盤進行移臂操作提示及要求:假設磁盤只有一個盤面,并且磁盤是可移動頭磁盤。磁盤是可供多個進程共享的存儲設備,但一個磁盤每個時刻只能為一個進程效勞。當有進程在訪問某個磁盤時,其它想訪問該磁盤的進程必須等待,直到磁盤一次工作結束。當有多個進程提出輸入輸出請求而處于等待狀態時,可用電梯調度算法從假設干個等待訪問者中選擇一個進程,讓它訪問磁盤。為此設置“驅動調度”進程。由于磁盤與處理器是并行工作的,所以當磁盤在為一個進程效勞時,占有處理器的其它進程可以提出使用磁盤〔這里我們只要求訪問磁道〕,即動態申請訪問磁道,為此設置“接受請求”進程。為了模擬以上兩個進程的執行,可以考慮使用隨機數來確定二者的允許順序,程序結構圖參考附圖:“接受請求”進程建立一張“進程請求I/O”表,指出等待訪問磁盤的進程要求訪問的磁道,表的格式如下:進程名要求訪問的磁道號“磁盤調度”的功能是查“請求I/O”表,當有等待訪問的進程時,按電梯調度算法〔SCAN算法〕從中選擇一個等待訪問的進程,按其指定的要求訪問磁道。SCAN算法參考課本第九章。算法模擬框圖略。圖1中的“初始化”工作包括:初始化“請求I/O”表,設置置當前移臂方向;當前磁道號。并且假設程序運行前“請求I/O”表中已有假設干進程〔4~8個〕申請訪問相應磁道。實驗報告:實驗題目。程序中用到的數據結構及其說明。打印源程序并附注釋。實驗結果內容如下:打印“請求I/O”表,當前磁道號,移臂方向,被選中的進程名和其要求訪問的磁道,看是否表達了電梯調度〔SCAN〕算法。體會與問題。附圖:開始開始初始化磁盤調度隨機數>1/2繼續?接受請求輸入在[0,1]區間內的隨機數結束六.磁盤調度的程序代碼:package磁盤調度;publicclassCSCAN{publicintm=0;//用來存放磁頭的初始位置publicbooleanRun=true;publicintsum=0;publicvoidCheck(inta[],intn,intposition){inttemp;for(inti=n;i>0;i--){//冒泡排序for(intj=0;j<i;j++){if(a[j]>a[j+1]){//按順序依次比擬大小 temp=a[j];//把大的數字往前面放 a[j]=a[j+1]; a[j+1]=temp; } } }while(Run){for(inti=0;i<=n;i++){if(a[i]==position){m=i;Run=false; } } } System.out.println("CSCAN算法序列:");for(inti=m+1;i<=n;i++){//磁頭向大號移動sum=sum+a[i]-a[i-1]; System.out.print(a[i]+""); }sum=sum+200-a[n];sum=sum+199;sum=sum+a[0]-1;for(inti=0;i<=m-1;i++){if(i!=m-1){sum=sum+a[i+1]-a[i]; } System.out.print(a[i]+""); } System.out.println(); System.out.println("尋道長度為"+sum); System.out.println("平均尋道長度為"+sum/n); } }package磁盤調度;publicclassSCAN{publicintm=0;//用來存放磁頭的初始位置publicbooleanRun=true;publicintsum=0;publicvoidCheck(inta[],intn,intposition){inttemp;for(inti=n;i>0;i--)//冒泡排序 {for(intj=0;j<i;j++){if(a[j]>a[j+1])//按順序依次比擬大小 { temp=a[j];//把大的數字往前面放 a[j]=a[j+1]; a[j+1]=temp; } } }while(Run){//此循環用來尋找磁頭的初始位置被排到了什么位置for(inti=0;i<=n;i++){if(a[i]==position){m=i;Run=false; } } } System.out.println("SCAN算法序列:");for(inti=m+1;i<=n;i++){//磁頭向大號移動sum=sum+a[i]-a[i-1]; System.out.print(a[i]+""); }sum=sum+200-a[n];sum=sum+200-a[m-1];for(inti=m-1;i>=0;i--){if(i!=0){sum=sum+a[i]-a[i-1]; } System.out.print(a[i]+""); } System.out.println(); System.out.println("尋到長度為"+sum); System.out.println("平均尋到長度為"+sum/n); }}package磁盤調度;publicclassSSTF{publicintm;//用來判斷排序后磁頭所在的初始位置的下標publicintb[];publicintrflag=0,lflag=0;publicdoubleSUM=0;publicintmleft,mright;publicSSTF(){b=newint[20]; }publicvoidCalculate(inta[],intn,intposition){inttemp;for(inti=n;i>0;i--)//冒泡排序 {for(intj=0;j<i;j++){if(a[j]>a[j+1])//按順序依次比擬大小 { temp=a[j];//把大的數字往前面放 a[j]=a[j+1]; a[j+1]=temp; } } }if(a[n]==position){//如果磁頭的初始位置在最大號 System.out.println("SSTF序列為:");for(inti=0;i<=n;i++){ System.out.print(a[i]+""); } }elseif(a[0]==position){ System.out.println("SSTF序列為:");for(inti=n;i>=0;i--){ System.out.print(a[i]+""); } }else{ System.out.println("SSTF序列為:"); Check(a,n,position); } }publicvoidCheck(inta[],intn,intposition){booleanRun=true,Running=true;while(Run){//此循環用來尋找磁頭的初始位置被排到了什么位置for(inti=0;i<=n;i++){if(a[i]==position){m=i; System.out.println("m的值為"+m);mleft=m-1;mright=m+1; Run=false; } } }while(Running){if(a[m]-a[mleft]>=a[mright]-a[m]&&rflag!=1){SUM=SUM+(a[mright]-a[m]);//用來統計尋到長度m=mright;mright++;if(mright>n){rflag=1; } System.out.print(a[m]+""); }elseif(a[m]-a[mleft]<a[mright]-a[m]&&lflag!=1){SUM=SUM+(a[m]-a[mleft]);m=mleft;mleft--;if(mleft<0){lflag=1; } System.out.print(a[m]+""); }if(mleft!=0&&mright>n){ Running=false;SUM=SUM+a[n]-a[mleft];for(intj=mleft;j>=0;j--){if(j!=0){SUM=SUM+a[j]-a[j-1]; } System.out.print(a[j]+""); } }if(mright!=n&&mleft<0){ Running=false;SUM=SUM+a[mright]-a[0];for(intk=mright;k<=n;k++){if(k!=0){SUM=SUM+a[k+1]-a[k]; } System.out.print(a[k]+""); } } } System.out.println(); System.out.println("sum的值為"+SUM); System.out.println("平均尋到長度為"+SUM/n); }}package磁盤調度;importjava.util.Scanner;publicclassDiskManage{publicstaticvoidmain(String[]args){inta[]=newint[20];intn=0;intm=0;doublesum=0;doubletemp=0;intposition=0; SSTFsstf=newSSTF(); SCANscan=newSCAN(); CSCANcscan=newCSCAN(); System.out.println("請輸入磁盤請求的個數:");try{ Scannerreader=newScanner(System.in); n=reader.nextInt(); }catch(Exceptione){ } System.out.println("請輸入磁盤請求序列:"); Scannerreader=newScanner(System.in);for(inti=1;i<=n;i++){try{ a[i]=reader.nextInt(); }catch(Exceptione){ } } System.out.print("請輸入磁頭的初始位置:");try{ Scannerre=newScanner(System.in); a[0]=re.nextInt(); position=a[0]; }catch( System.out.println("磁頭的初始位置為"+a[0]);for(inti=1;i<=n;i++){Exceptione){ } System.out.print(a[i]+""); } System.out.println("*****************************************************************"); System.out.println("提示:磁頭的序列范圍1~200!磁頭從小號到大號尋道!"); System.out.println("請輸入相應的選擇操作::"); System.out.println("1、先來先效勞算法〔FCFS〕"); System.out.println("2、最短尋道時間優先算法〔SSTF〕"); System.out.println("3、掃描算法〔SCAN〕"); System.out.println("4、循環掃描算法〔CSCAN〕"); Scannerread=newScanner(System.in);try{ m=read.nextInt(); }catch(Exceptione){ } System.out.println("m的值為"+m); read.close();switch(m){case1: sum=0; System.out.println("FCFS算法序列:");for(inti=1;i<=n;i++){ System.out.print(a[i]+""); temp=a[i]-a[i-1];if(temp>=0);elseif(temp<0){ temp=-temp; } sum=sum+temp; } System.out.println(); System.out.println("sum的值為"+sum); System.out.println("平均尋到長度為"+sum/n);break;case2: sstf.Calculate(a,n,position);break;case3: scan.Check(a,n,position);break;case4: cscan.Check(a,n,position);break; }}}七.運行結果:FCFS:SCAN:SSTF:CSCAN:實驗六模擬文件管理系統實驗學時:2學時實驗類型:設計實

溫馨提示

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

評論

0/150

提交評論