操作系統 進程調度算法程序設計_第1頁
操作系統 進程調度算法程序設計_第2頁
操作系統 進程調度算法程序設計_第3頁
操作系統 進程調度算法程序設計_第4頁
操作系統 進程調度算法程序設計_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

華北科技學院計算機系綜合性實驗報告PAGE 第7頁華北科技學院計算機系綜合性實驗實驗報告課程名稱操作系統B實驗學期2011至2012學年第2學期學生所在系部基礎部年級09級專業班級計算B091班學生姓名張成林學號200909014101任課教師實驗成績計算機系制

《操作系統B》課程綜合性實驗報告開課實驗室:基礎六機房2012年6月7日實驗題目進程調度算法程序設計一、實驗目的通過對進程調度算法的模擬,進一步理解進程的基本概念,加深對進程運行狀態和進程調度過程、調度算法的理解。二、設備與環境1.硬件設備:PC機一臺2.軟件環境:安裝Windows操作系統或者Linux操作系統,并安裝相關的程序開發環境,如C\C++\Java等編程語言環境。三、實驗內容(1)用C語言(或其它語言,如Java)實現對N個進程采用短進程優先的算法的調度。(2)編寫SPF算法:.每個用來標識進程的進程控制塊PCB可用結構來描述,包括以下字段:進程(PRO_ID,arrive_time,sum_time,flag)每個進程需要賦予進程ID、進程到達時間、進程需要運行的總時間的屬性;(3)調試無誤后運行;(4)輸入需要排序的進程的相關參數;(5)查看執行結果,根據執行結果判斷實驗是否成功;四、實驗結果及分析1.實驗代碼#include"stdafx.h"#include"stdio.h"#definen5#definenum5#definemax65535typedefstructpro//結構體pro{ intPRO_ID;//進程號 intarrive_time;//進程到達時間 intsum_time;//進程完成時間 intflag;}Pro;//整數排序intpaixu(inttemp[]){ inti,j,tem=0; for(i=1;i<num;i++) { intlastX=1; for(j=0;j<num-i;j++) { if(temp[j]>temp[j+1])//按從小到大排序 { tem=temp[j]; temp[j]=temp[j+1]; temp[j+1]=tem; lastX=0; } } if(lastX==1)break; } returntemp[0];}//進程排序Propaixu(Prop[])//定義結構體的排序函數{ inti,j; Protemp={0}; Pros[num]; for(i=0;i<num;i++){ s[i]=p[i]; } for(i=1;i<num;i++) { intlastX=1; for(j=0;j<num-i;j++) { if(s[j].sum_time>s[j+1].sum_time) { temp=s[j]; s[j]=s[j+1]; s[j+1]=temp; lastX=0; } } if(lastX==1)break; } returns[0];}voidSPF(intp){ if(n>0) { inti,j,k,l,tc=0; Proseq[n]; Protemp_seq[n]; printf("短進程優先調度算法SPF\n"); printf("請依次輸入5個進程的進程號、到達時間和執行時間\n"); printf("成員變量用逗號隔開;進程間用回車隔開\n"); for(i=0;i<n;i++){ scanf("%d,%d,%d",&seq[i].PRO_ID,&seq[i].arrive_time,&seq[i].sum_time); } printf("調度順序是:\n"); //初始化tc inttemp[num];//定義中間變量 for(i=0;i<num;i++) { temp[i]=seq[i].arrive_time;//將每個進程的到達時間賦給temp[i] } tc=paixu(temp);//tc是斷點,將進程中服務時間最短的賦給tc //flag表示對應i的pro的隊列情況 //-1表示未進入過隊列,0表示在隊列中,1表示被清除了 for(i=0;i<n;i++){ seq[i].flag=-1;//將所有進程定義為未進入過 }for(i=0;i<n;i++){//選第一次執行的進程 for(j=0;j<n;j++){ if(seq[j].flag!=1&&seq[j].arrive_time<=tc){ seq[j].flag=0;//將滿足條件的進程定義為0 } } for(j=0;j<n;j++){//其他不滿足條件的進程,將其執行時間賦為最大值 temp_seq[j]=seq[j]; if(seq[j].flag!=0){ temp_seq[j].sum_time=max; } } l=paixu(temp_seq).PRO_ID;//利用結構體調用最小進程的id for(j=0;j<n;j++){ if(l==seq[j].PRO_ID){ k=j; } } tc=tc+paixu(temp_seq).sum_time;//更新tc seq[k].flag=1; printf("%d",l); } printf("\n"); }}voidmain(){ SPF(n);}2.實驗結果如下圖3.實驗結果分析調度順序為14253分析可知:短進程優先調度算法先由各進程的到達時間進行排序,然后對后進入系統的進程和系統中等待執行的進程進行計算、比較以服務時間由小到大排序,并按此順序進行調度,最后實現算法調度,具體設計思想如下:進程(PRO_ID,arrive_time,sum_time,flag)(1)比較停頓時間點,小于等于當前停頓時間點tc的到達時間點seq[i].arrive_time的進程seq[i]的PRO_ID加入到隊列中;(2)在現有更新后的隊列temp_seq中,用paixu函數選出最短執行時間的進程的PRO_ID;(3)選進程(算法核心L=paixu(inttemp[])),更新下一個停頓時間點tc就是當前停頓時間點tc+L的執行時間sum_time;(4)將已經執行過的進程X踢出隊列。seq[i].flag,-1表示未進入過隊列,0表示在隊列中,1表示被踢了;設當前時間點為tc,對pro.arr<=tc且seq[i].flag!=1的seq[i],將seq[i].flag標記為0;創建臨時變量temp_seq[]=seq[];對所有flag[i]==0的temp_seq[i],bubble(temp_seq),返回的是Pro進程類型。將tc更新,tc==tc+paixu(temp_seq).sum_time;找出該paixu(temp_seq)對應的原來seq[i],標記為1(這步最容易錯,注意下標和PRO_ID并不是一回事)。怎么選第一個tc:設tc=0;如果出現最小的pro.arr不是0的話,那么需要初始化:paixuseq[i].arrive_timetc=min{seq[i].arrive_time}4.實驗心得通過本次綜合實驗,我熟悉了短進程優先調度算法的原理,代碼實現了其算法和功能,收獲很大。開始設計之時完全沒頭緒,對與理論學習不夠扎實的我深感“書到用時方恨少”只好再把書上介紹的相關知識重新閱讀一遍,對知識進行了全面而系統的梳理,遇到難處首先是苦思冥想尋求方法,再向同學請教,終于熟練掌握了基本理論知識,而且領悟了諸多平時學習難以理解掌握的的較難的知識,如短進程算法的缺點、如何改正以及動態調度算法的優缺點和算法思想。這些是我在上課時我都似懂非懂的。我還學會了如何思

溫馨提示

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

評論

0/150

提交評論