動態(tài)分區(qū)分配管理系統(tǒng)(附源程序)_第1頁
動態(tài)分區(qū)分配管理系統(tǒng)(附源程序)_第2頁
動態(tài)分區(qū)分配管理系統(tǒng)(附源程序)_第3頁
動態(tài)分區(qū)分配管理系統(tǒng)(附源程序)_第4頁
動態(tài)分區(qū)分配管理系統(tǒng)(附源程序)_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、淮北師范大學 操作系統(tǒng)設計實驗報告題目動態(tài)分區(qū)分配管理系統(tǒng)班級:設計者:指導老師:時間: 2012/03/14-2012/03/15 目錄1程序設計的內容和相關的要求-2程序總的功能說明-3程序的模塊的說明-4程序設計的流程圖-5程序的操作說明及運行結果-6源程序的清單-7心得體會-1程序設計的內容和相關的要求課程設計的目的:操作系統(tǒng)課程設計是計算機學院重要的教學環(huán)節(jié),它為學生提供了一個既動手又動腦,將課本上的理論知識和實際有機的結合起來,獨立分析和解決實際問題的機會。l進一步鞏固和復習操作系統(tǒng)的基礎知識。l培養(yǎng)學生結構化程序、模塊化程序設計的方法和能力。l提高學生調試程序的技巧和軟件設計的能

2、力。l提高學生分析問題、解決問題以及綜合利用c語言進行程序設計的能力。實現(xiàn)的任務:編寫一個動態(tài)分區(qū)分配程序。設計內容:用高級語言編寫和調試一個動態(tài)分區(qū)內存分配程序,演示實現(xiàn)下列兩種動態(tài)分區(qū)分配算法1.首次適應算法2.循環(huán)首次適應算法設計要求:1.內存中有0-100m的空間為用戶程序空間,最開始用戶空間是空閑的;2.作業(yè)數(shù)量、作業(yè)大小、進入內存空間、運行時間需要通過界面進行輸入;3.可讀取樣例數(shù)據(jù)(要求存放在外部文件夾中)進行作業(yè)數(shù)量、作業(yè)大小、進圖內存時間、運行時間的初始化;4.根據(jù)作業(yè)進圖內存的時間,采用簡單的先進先出原則進行從外村到內存的調度,作業(yè)具有等待(從外存進入內存執(zhí)行)、裝入(在內

3、存可執(zhí)行)、結束(運行結束,退出內存)三種狀態(tài)。(為了簡化,不考慮cpu的調度與切換,運行時間為作業(yè)在內存中駐留的時間);5.能夠自動進行內存分配與回收,可根據(jù)需要自動進行緊湊與拼接操作,所有過程均有動態(tài)圖形變化的顯示;6.采用可視化界面,可隨時暫停顯示當前內存分配和使用情況圖。2程序總的功能說明:本程序可以從界面直接輸入作業(yè)并進行動態(tài)的內存分配,也可以自動地生成作業(yè)文件并自行調度進行內存分配,每次分配可以選擇兩種算法(首次適應算法和循環(huán)首次算法)中的一種,每次作業(yè)結束后可以進入操作主界面進行再次作業(yè)的操作。3程序各模塊的功能說明:(1) 界面顯示函數(shù):showinterface(pl p,j

4、ob job);顯示操作界面showjob(job job);顯示作業(yè)鏈表;showpartitiion(pl pl)顯示分區(qū)鏈表(2) 執(zhí)行練習的功能函數(shù):copyjob(job p);作業(yè)鏈表復制函數(shù)函數(shù)initpartitionlist(pl &p);鏈表初始化分區(qū)函數(shù)函數(shù)createjoblist(job &job,int count);創(chuàng)建作業(yè)鏈表函數(shù)insertnode(job p,job &job);按時間順序創(chuàng)建鏈表函數(shù)initpartitionlist(pl &p);初始化分區(qū)鏈表函數(shù)(3)文件函數(shù) openfile();打開文件函數(shù) readfile();讀取文件函數(shù)ran

5、domparameter();隨即參數(shù)讀入文件函數(shù) main()/主函數(shù)4程序設計的流程圖 : 總體設計流程圖:動態(tài)分區(qū)分配界面作業(yè)生成退出操作界面輸入自動生成文件生成方式12 3分配方式首次適應循環(huán)首次適應應123作為一個整體首次適應算法:開始接受作業(yè)作業(yè)n-執(zhí)行進入內存回收釋放空間結束intime=timewaitingjobstate (0或1) 空閑分區(qū)狀態(tài) (0或1)n=0作業(yè)等待序列ynyny0010回收函數(shù):回收函數(shù)回收區(qū)在空閑分區(qū)前不連接回收連接回收回收區(qū)在空閑分區(qū)間回收區(qū)在空閑分區(qū)后5程序操作說明書及結果在vc+6.0環(huán)境中運行本程序,先進行編譯,然后再進行鏈接,在進行執(zhí)行將

6、會出現(xiàn)顯示界面。按照顯示界面上顯示的提示進行操作,就可以實現(xiàn)相應的功能:1.運行進入操作主界面:6源程序清單#include#include #include#include#include #define memorysize 100/為空閑分區(qū)分配的最大空間(按題目要求)int workload;/輸入作業(yè)的數(shù)量;typedef struct joblistint id;/ 作業(yè)的name int size;/ 作業(yè)大?。ㄐ枰拇鎯臻g大小) int intime; /進入時間int runtime; /運行時間int state; /作業(yè)的狀態(tài)(0表示等待,1表示執(zhí)行,2表示結束并釋放)

7、struct joblist *next;/ 作業(yè)鏈表指針 *job;typedef struct partitionlistint id;int startaddress;/分區(qū)起始地址 int size;/分區(qū)大小int state; /分區(qū)的狀態(tài)struct partitionlist *prior;struct partitionlist *next;/ 分區(qū)鏈表指針 *pl;file *fp;/*打開文件*/void openfile()if(fp=(fopen(d:作業(yè)文件.txt,w)=null)printf(無法打開文件!n);exit(0);/*讀取文件*/void read

8、file()if(fp=(fopen(d:作業(yè)文件.txt,r)=null)printf(無法打開文件!n);exit(0);/*將隨機產(chǎn)生進程的參數(shù)寫入文件*/void randomparameter()openfile();for(int i=0;istartaddress,pl-id,pl-size,pl-state);printf(n);pl=pl-next;printf(t*n);sleep(1000);if(kbhit()=1)system(“pause”);/*按進入時間順序創(chuàng)建一個作業(yè)鏈表*/void insertnode(job p,job &job) /將創(chuàng)建的新結點插入到

9、鏈表中job q1,q2;q1=job;q2=job-next;int i=0;if(!q2)p-next=q2;q1-next=p; while(q2!=null&q2-intimeintime)q1=q2;q2=q2-next;i=1;if(!q2&i=1)p-next=q2;q1-next=p;if(q2!=null&p-intimeintime)p-next=q2;q1-next=p;job createjoblist(job &job,int count)/創(chuàng)建作業(yè)鏈表job=(job)malloc(sizeof(joblist);if(!job)exit(0);job-next=n

10、ull;job p;printf(idtsizetintimetruntimen);for(int i=0;iid,&p-size,&p-intime,&p-runtime);p-state=0;if(p-size100)printf(作業(yè)過大不能為之分配內存,請重新輸入的作業(yè):n); scanf(%dt%dt%dt%d,&p-id,&p-size,&p-intime,&p-runtime); p-state=0; insertnode(p,job); else insertnode(p,job);return job;/*從外部文件讀入數(shù)據(jù)并進行作業(yè)初始化*/job readinitjob(

11、job &job)readfile();job=(job)malloc(sizeof(joblist);if(!job)exit(0);job-next=null;job p;for(int i=0;iid,&p-size,&p-intime,&p-runtime,&p-state); insertnode(p,job);return job;/*初始化分區(qū)鏈表*/pl initpartitionlist(pl &p)p=(pl)malloc(sizeof(partitionlist);if(!p)exit(0);p-size=memorysize;printf(輸入分區(qū)首地址:);scanf

12、(%d,&p-startaddress);p-state=0;p-id=0;p-next=null;p-prior=null;return p;/*將一個作業(yè)鏈表復制到另一個鏈表*/job copyjob(job p) job q,l,s=p,r;l=(job)malloc(sizeof(joblist);l-next=null;r=l;s=s-next;while(s) q=(job)malloc(sizeof(joblist);q-id=s-id;q-state=0;q-intime=s-intime;q-runtime=s-runtime;q-size=s-size;r-next=q;q

13、-next=null;r=q;s=s-next;return l;/*將一個分區(qū)鏈表復制到另一個鏈表*/pl copypartition(pl p)pl q,l,s=p,r;l=(pl)malloc(sizeof(partitionlist);l-next=null;r=l;s=s-next;while(s) q=(pl)malloc(sizeof(partitionlist);q-size=s-size;q-startaddress=s-startaddress;q-state=s-state;r-next=q;q-next=null;r=q;s=s-next;return l;/*作業(yè)鏈表

14、*/void showjob(job job)job=job-next;printf(n將作業(yè)按進入時間排序表示:n);printf(t*n);printf(t* idtsizetintimetruntimetstate *n);printf(t*n);while(job)printf(t* %dt%dt%dt%dt%d *,job-id,job-size,job-intime,job-runtime,job-state);printf(n);job=job-next;printf(t*n);printf(n);/*回收內存*/void recover(pl pl3,pl &pl)while(

15、pl3) if(pl3-state=0) if(pl3-next&pl3-prior&pl3-prior-state=0&pl3-next-state=1)pl3-size+=pl3-prior-size; pl3-startaddress=pl3-prior-startaddress;pl3-state=0;pl3-id=0; if(pl3-prior-prior) pl3-prior-prior-next=pl3; pl3-prior=pl3-prior-prior;else pl3-prior=pl3-prior-prior;pl=pl3;pl3=pl;else if(pl3-prior

16、&pl3-next&pl3-next-state=0&pl3-prior-state=1)pl3-size+=pl3-next-size;pl3-state=0;pl3-id=0;if(pl3-next-next)pl3-next-next-prior=pl3;pl3-next=pl3-next-next;elsepl3-next=pl3-next-next;else if(!pl3-prior) if(pl3-next-state=0)pl3-size+=pl3-next-size;pl3-state=0;pl3-id=0; if(pl3-next-next)pl3-next-next-pr

17、ior=pl3;pl3-next=pl3-next-next;elsepl3-state=0;else if(!pl3-next)if(pl3-prior-state=0)pl3-size+=pl3-prior-size;pl3-state=0;pl3-id=0;pl3-startaddress=pl-startaddress; if(pl3-prior-prior)pl3-prior-prior-next=pl3; pl3-prior=pl3-prior-prior;elsepl3-prior=null;pl=pl3;pl3=pl;elsepl3-state=0;else if(pl3-ne

18、xt&pl3-prior&pl3-next-state=0&pl3-prior-state=0)pl3-size=pl3-size+pl3-next-size+pl3-prior-size;pl3-state=0;pl3-id=0;pl3-startaddress=pl3-prior-startaddress;if(pl3-next-next)pl3-next-next-prior=pl3;if(pl3-prior-prior)pl3-prior-prior-next=pl3;pl3-next=pl3-next-next;pl3-prior=pl3-prior-prior;elsepl3-ne

19、xt=pl3-next-next;pl3-prior=pl3-prior-prior;pl=pl3;pl3=pl;pl3=pl3-next;/*首次適應算法*/void cyclefirstfit(pl pl,job job)int t=0;int n=workload;while(t+1&n)pl pl1=pl,pl2;printf(時鐘:%dn,t);job job1=job;job1=job1-next;job j1=job;j1=j1-next;job j2=job;j2=j2-next;job j3=job;j3=j3-next;pl pl3=pl;while(j2)if(j2-in

20、time+j2-runtime=t)printf(作業(yè)id:%d運行結束,釋放內存!,j2-id);n=n-1;j2-state=2;showjob(job);showpartitiion(pl);j2=j2-next;while(j1)if(j1-intime=t)printf(作業(yè)id:%d開始運行,對其分配!,j1-id);j1-state=1;j1=j1-next;while(job1)if(t=job1-intime)while(pl1&(pl1-sizesize|pl1-state=1) pl1=pl1-next;if(pl1)pl2=(pl)malloc(sizeof(parti

21、tionlist);pl2-startaddress=pl1-startaddress+job1-size;pl2-state=0;pl2-id=0;pl2-size=pl1-size-job1-size;if(pl2-size5)pl1-size=job1-size;pl1-state=1;pl1-id=job1-id;if(pl1-next)pl1-next-prior=pl2;pl2-next=pl1-next;pl2-prior=pl1;pl1-next=pl2;pl1=pl;elsepl1-state=1;pl1-id=job1-id;showjob(job);showpartiti

22、ion(pl);elseprintf(內存不足,將作業(yè):%d置于等待狀態(tài)!等待內存釋放在進行分配!n,job1-id);job j=job1;while(j)j-intime+=1;j-state=0;j=j-next;job jj=job;jj=jj-next;while(jj)if(jj-state=2)while(pl3)if(pl3-id=jj-id)pl3-state=0;pl3=pl3-next;jj=jj-next;pl3=pl;recover(pl3,pl);job1=job1-next;t=t+1;sleep(500);pl p=pl;while(p)p-state=0;p=

23、p-next;showjob(job);showpartitiion(pl);printf(所有進程分配完畢!n);/*循環(huán)首次算法*/void firstfit(pl pl,job job)int t=0;int n=workload;while(t+1&n)pl pl1=pl,pl2;printf(時鐘:%dn,t);job job1=job;job1=job1-next;job j1=job;j1=j1-next;job j2=job;j2=j2-next;job j3=job;j3=j3-next;pl pl3=pl;while(j2)if(j2-intime+j2-runtime=t

24、)printf(作業(yè)id:%d運行結束,釋放內存!n,j2-id);n=n-1;j2-state=2;pl3=pl;while(pl3)if(pl3-id=j2-id)pl3-state=0;pl3=pl3-next;showjob(job);showpartitiion(pl);/進程運行結束時進行內存回收j2=j2-next;while(j1)if(j1-intime=t)printf(作業(yè)id:%d開始運行,對其進行分配!,j1-id);j1-state=1;j1=j1-next;while(job1)if(t=job1-intime)while(pl1&(pl1-sizesize|pl

25、1-state=1) pl1=pl1-next;if(pl1)pl2=(pl)malloc(sizeof(partitionlist);pl2-startaddress=pl1-startaddress+job1-size;pl2-state=0;pl2-id=0;pl2-size=pl1-size-job1-size;if(pl2-size=5)/碎片最大值設為 5pl1-size=job1-size;pl1-state=1;pl1-id=job1-id;if(pl1-next)pl1-next-prior=pl2;pl2-next=pl1-next;pl2-prior=pl1;pl1-ne

26、xt=pl2;pl1=pl;elsepl1-state=1;pl1-id=job1-id;showjob(job);showpartitiion(pl);elseprintf(內存不足,將作業(yè):%d置于等待狀態(tài)!等待內存釋放在進行分配!n,job1-id);job j=job1;while(j)j-intime+=1;j-state=0;j=j-next;pl3=pl;recover(pl3,pl);job1=job1-next;t=t+1;sleep(500);pl p=pl;while(p)p-state=0;p=p-next;showjob(job);showpartitiion(pl);printf(所有進程分配完畢!n);/*界面顯示*/void showinterface(pl p,job job)int a,con=0;job j1,j2;while(

溫馨提示

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

評論

0/150

提交評論