版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 操作系統(tǒng)課程設計報告</p><p> 時間:2010-12-20~2010-12-31</p><p> 地點:信息技術實驗中心</p><p><b> 目 錄</b></p><p> 一、課程設計的目的和意義2</p><p> 二、進程調(diào)度算法模擬
2、2</p><p><b> 1、設計目的2</b></p><p><b> 2、設計要求2</b></p><p> 3、時間片輪轉算法模擬3</p><p><b> 實現(xiàn)思想:3</b></p><p><b> ?。?/p>
3、1)流程圖4</b></p><p><b> ?。?)程序代碼4</b></p><p><b> ?。?)運行結果6</b></p><p> 4、先來先服務算法模擬7</p><p><b> 算法思想7</b></p><p
4、><b> ?。?)流程圖8</b></p><p><b> ?。?)程序代碼8</b></p><p> ?。?)運行結果12</p><p> 三、主存空間的回收與分配13</p><p><b> 1、設計目的13</b></p>&l
5、t;p><b> 2、設計要求13</b></p><p> 3、模擬算法的實現(xiàn)15</p><p><b> ?。?)流程圖15</b></p><p> ?。?)程序代碼15</p><p> ?。?)運行結果30</p><p> 四、模擬DOS文
6、件的建立和使用30</p><p><b> 1 設計目的30</b></p><p><b> 2 設計要求30</b></p><p> 3、模擬算法實現(xiàn)33</p><p><b> ?。?)流程圖33</b></p><p>
7、(2)程序代碼33</p><p> ?。?)運行結果38</p><p> 五、磁盤調(diào)度算法模擬38</p><p><b> 1.設計目的38</b></p><p><b> 2.實驗原理39</b></p><p><b> 3.設計要求
8、39</b></p><p> 4、模擬算法的實現(xiàn)40</p><p> ?。?)各算法流程圖40</p><p> ?。?)程序代碼41</p><p> ?。?)運行結果47</p><p><b> 六、總結47</b></p><p>
9、一、課程設計的目的和意義</p><p> 本次操作系統(tǒng)課程設計的主要任務是進行系統(tǒng)級的程序設計。本課程設計是操作系統(tǒng)原理課程的延伸。通過該課程設計,使學生更好地掌握操作系統(tǒng)各部分結構、實現(xiàn)機理和各種典型算法,加深對操作系統(tǒng)的設計和實現(xiàn)思路的理解,培養(yǎng)學生的系統(tǒng)設計和動手能力,學會分析和編寫程序。課程設計的實施將使學生在以下幾個方面有所收獲:</p><p> (1)加深對操作系統(tǒng)原理
10、的理解,提高綜合運用所學知識的能力;</p><p> ?。?)培養(yǎng)學生自主查閱參考資料的習慣,增強獨立思考和解決問題的能力;</p><p> ?。?)通過課程設計,培養(yǎng)嚴謹?shù)目茖W態(tài)度和協(xié)作精神。</p><p> 二、進程調(diào)度算法模擬</p><p><b> 1、設計目的</b></p><
11、p> ?。?)要求學生設計并實現(xiàn)模擬進程調(diào)度的算法:時間片輪轉及先來先服務。</p><p> ?。?)理解進程控制塊的結構。</p><p> ?。?)理解進程運行的并發(fā)性。</p><p> (4)掌握進程調(diào)度算法。</p><p><b> 2、設計要求</b></p><p>
12、 在多道程序運行環(huán)境下,進程數(shù)目一般多于處理機數(shù)目,使得進程要通過競爭來使用處理機。這就要求系統(tǒng)能按某種算法,動態(tài)地把處理機分配給就緒隊列中的一個進程,使之運行,分配處理機的任務是由進程調(diào)度程序完成的。一個進程被創(chuàng)建后,系統(tǒng)為了便于對進程進行管理,將系統(tǒng)中的所有進程按其狀態(tài),將其組織成不同的進程隊列。于是系統(tǒng)中有運行進程隊列、就緒隊列和各種事件的進程等待隊列。進程調(diào)度的功能就是從就緒隊列中挑選一個進程到處理機上運行。進程調(diào)度的算法有多種
13、,常用的有優(yōu)先級調(diào)度算法、先來先服務算法、時間片輪轉算法。</p><p> 進程是程序在處理機上的執(zhí)行過程。進程存在的標識是進程控制塊(PCB),進程控制塊結構如下:</p><p> typedef struct node </p><p><b> { </b></p><p> char name[10]
14、; /* 進程標識符 */ </p><p> int prio; /* 進程優(yōu)先數(shù) */ </p><p> int round; /* 進程時間輪轉時間片 */ </p><p> int cputime;
15、 /* 進程占用 CPU 時間*/ </p><p> int needtime; /* 進程到完成還需要的時間*/ </p><p> int count; /* 計數(shù)器*/ </p><p> char state;
16、 /* 進程的狀態(tài)*/ </p><p> struct node *next /*鏈指針*/ </p><p><b> }PCB; </b></p><p> 系統(tǒng)創(chuàng)建一個進程,就是由系統(tǒng)為某個程序設置一個PCB,用于對該進程進行控制和管理,進程任務完成,由系統(tǒng)收回其PCB,該
17、進程便消亡。每個進程可以有三個狀態(tài):運行狀態(tài)、就緒狀態(tài)和完成狀態(tài)。</p><p> 用C語言、C++或者Java語言編寫一個程序?qū)崿F(xiàn)進程調(diào)度的算法,模擬進程調(diào)度的過程,加深對進程控制塊概念和進程調(diào)度算法的理解。</p><p> 本任務要求完成時間片輪轉及先來先服務兩個算法。</p><p> 3、時間片輪轉算法模擬</p><p>
18、<b> 實現(xiàn)思想:</b></p><p> 每次調(diào)度時,系統(tǒng)吧處理機分配給隊列首進程讓器執(zhí)行一個時間片,當執(zhí)行的時間片用完時,由一個計時器發(fā)出時鐘中斷請求,調(diào)度根據(jù)這個請求停止該進程的運行將其送到就緒隊列的末尾,再把處理機分給就緒隊列中新的隊首進程,同時讓它執(zhí)行一個時間片。</p><p><b> ?。?)流程圖</b></p&g
19、t;<p><b> ?。?)程序代碼</b></p><p> #include <iostream.h></p><p> #include <cstdlib></p><p> using namespace std;</p><p> typedef struct P
20、Node </p><p><b> { </b></p><p><b> // PCB</b></p><p> struct PNode *next; // 定義指向下一個節(jié)點的指針</p><p> char name[10]; // 定義進程名,并分配空間</p>
21、<p> int All_Time; // 定義總運行時間</p><p> int Runed_Time; // 定義已運行時間</p><p> char state; // 定義進程狀態(tài) Ready / End</p><p><b> }</b></p><p>
22、 * Proc; // 指向該PCB的指針</p><p> int ProcNum; // 總進程個數(shù)</p><p> void InitPCB(Proc &H)// 初始化就緒隊列 </p><p><b> { </b></p><p> cout<<"請輸入總進程個數(shù): &
23、quot;;</p><p> cin>>ProcNum; // 進程總個數(shù)</p><p> int Num=ProcNum;</p><p> H=(Proc)malloc(sizeof(PNode)); // 建立頭節(jié)點 </p><p> H->next=NULL;</p><p&g
24、t; Proc p=H; //定義一個指針</p><p> cout<<"總進程個數(shù)為 "<<ProcNum<<" 個,請依次輸入相應信息\n\n"; </p><p> while (Num--) </p><p><b> {</b></p&
25、gt;<p> p=p->next=(Proc)malloc(sizeof(PNode)); </p><p> cout<<"進程名 總運行時間 已運行時間 :";</p><p> cin>>p->name>>p->All_Time>>p->Runed_Time; &l
26、t;/p><p> p->state='R';</p><p> p->next=NULL;</p><p><b> }</b></p><p> p->next=H->next; </p><p><b> }</b><
27、;/p><p> void DispInfo(Proc H) //輸出運行中的進程信息</p><p><b> { </b></p><p> Proc p=H->next;</p><p><b> do </b></p><p><b> {<
28、;/b></p><p> if (p->state != 'E') //如果該進程的狀態(tài)不是End的話</p><p><b> {</b></p><p> cout<<"進程名:"<<p->name<<"\t總運行時間:"
29、;<<p->All_Time</p><p> <<"\t已運行時間:"<<p->Runed_Time</p><p> <<"\t狀態(tài):"<<p->state<<endl;</p><p> p=p->next;</p
30、><p><b> }</b></p><p> else p=p->next;</p><p><b> } </b></p><p> while (p != H->next); // 整個進程鏈條始終完整,只是狀態(tài)位有差異</p><p><b&g
31、t; }</b></p><p> void SJP_Simulator(Proc &H) // 時間片輪轉法</p><p><b> { </b></p><p> cout<<endl<<"-------------------START--------------------
32、\n";</p><p> int flag=ProcNum; // 記錄剩余進程數(shù)</p><p> int round=0; // 記錄輪轉數(shù)</p><p> Proc p=H->next;</p><p> while (p->All_Time > p->Runed_Time) </p&
33、gt;<p><b> { </b></p><p> // 即未結束的進程</p><p> round++; </p><p> cout<<endl<<"Round "<<round<<"--正在運行 "<<p-
34、>name<<" 進程"<<endl;</p><p> p->Runed_Time++; // 更改正在運行的進程的已運行時間</p><p> DispInfo(H); // 輸出此時為就緒狀態(tài)的進程的信息</p><p> if (p->All_Time == p->Run
35、ed_Time) { // 并判斷該進程是否結束</p><p> p->state='E'; </p><p><b> flag--;</b></p><p> cout<<p->name<<" 進程已運行結束,進程被刪除!\n";</p>&
36、lt;p><b> }</b></p><p> p=p->next;</p><p> while (flag && p->All_Time == p->Runed_Time)</p><p> p=p->next; // 跳過先前已結束的進程</p><p>&l
37、t;b> }</b></p><p> cout<<endl<<"--------------------END---------------------\n";</p><p><b> }</b></p><p> void main() </p><
38、p><b> {</b></p><p><b> Proc H;</b></p><p> InitPCB(H); // 數(shù)據(jù)初始化</p><p> DispInfo(H); // 輸出此刻的進程狀態(tài)</p><p> SJP_Simulator(H); // 時間片輪轉法<
39、;/p><p> system("pause");</p><p><b> }</b></p><p><b> ?。?)運行結果</b></p><p><b> 輸入相關進程信息:</b></p><p><b>
40、 輸出相關運行結果:</b></p><p> 4、先來先服務算法模擬</p><p><b> 算法思想</b></p><p> 按照進程的某種順序進行排序,然后按照這個順序進行調(diào)度。例如:可以按照作業(yè)提交時間或進程變?yōu)榫途w狀態(tài)的先后次序來分派處理器,讓排在后面的進程占用處理器,知道該進程執(zhí)行完或者由于某種原因被阻塞才讓出
41、處理器。</p><p> 在該調(diào)度策略中還規(guī)定,當有一個事件發(fā)生(如一個I/O操作完成)時,會有一些進程被喚醒,這些被喚醒的進程并不能立即恢復執(zhí)行,而是要等到當前運行的進程出讓處理器后才可以被調(diào)度執(zhí)行。采用此算法存在以下幾個特點:</p><p> 周轉時間:對進程i來說,假設Tei是進程的完成時間,Tsi是進程的提交時間,那么進程i的周轉時間Ti=進程完成時間-進程提交時間;<
42、;/p><p> 進程平均周轉時間:T=1/nETi;</p><p> 進程帶權周轉時間=進程等待時間+進程運行時間。</p><p><b> ?。?)流程圖</b></p><p><b> (2)程序代碼</b></p><p> #include "s
43、tdio.h" </p><p> #include <stdlib.h> </p><p> #include <conio.h> </p><p> #define getpch(type) (type*)malloc(sizeof(type)) </p><p> #define NULL 0
44、</p><p> struct pcb { /* 定義進程控制塊PCB */ </p><p> char name[10]; </p><p> char state; </p><p> int super; </p><p> int ntime; </p><p> int
45、 rtime; </p><p> struct pcb* link; </p><p> }*ready=NULL,*p; </p><p> typedef struct pcb PCB; </p><p> void sort() /* 建立對進程進行優(yōu)先級排列函數(shù)*/ </p><p><b>
46、; { </b></p><p> PCB *first, *second; </p><p> int insert=0; </p><p> if((ready==NULL)||((p->super)>(ready->super))) /*優(yōu)先級最大者,插入隊首*/ </p><p><b>
47、; { </b></p><p> p->link=ready; </p><p><b> ready=p; </b></p><p><b> } </b></p><p> else /* 進程比較優(yōu)先級,插入適當?shù)奈恢弥?/ </p><p&g
48、t;<b> { </b></p><p> first=ready; </p><p> second=first->link; </p><p> while(second!=NULL) </p><p><b> { </b></p><p> if(
49、(p->super)>(second->super)) /*若插入進程比當前進程優(yōu)先數(shù)大,*/ </p><p> { /*插入到當前進程前面*/ </p><p> p->link=second; </p><p> first->link=p; </p><p> second=NULL; </
50、p><p> insert=1; </p><p><b> } </b></p><p> else /* 插入進程優(yōu)先數(shù)最低,則插入到隊尾*/ </p><p><b> { </b></p><p> first=first->link; </p>
51、;<p> second=second->link; </p><p><b> } </b></p><p><b> } </b></p><p> if(insert==0) first->link=p; </p><p><b> } </
52、b></p><p><b> } </b></p><p> void input() /* 建立進程控制塊函數(shù)*/ </p><p><b> { </b></p><p> int i,num; </p><p> printf("\n 請輸入
53、進程數(shù):"); </p><p> scanf("%d",&num); </p><p> for(i=0;i<num;i++) </p><p><b> { </b></p><p> printf("\n 進程號No.%d:\n",i+1);
54、</p><p> p=getpch(PCB); </p><p> printf("\n 輸入進程名:"); </p><p> scanf("%s",p->name); </p><p> printf("\n 輸入進程優(yōu)先數(shù):"); </p><
55、;p> scanf("%d",&p->super); </p><p> printf("\n 輸入進程運行時間:"); </p><p> scanf("%d",&p->ntime); </p><p> printf("\n"); </
56、p><p> p->rtime=0;p->state='w'; </p><p> p->link=NULL; </p><p> sort(); /* 調(diào)用sort函數(shù)*/ </p><p><b> } </b></p><p><b> }
57、</b></p><p> int space() </p><p><b> { </b></p><p> int l=0; PCB* pr=ready; </p><p> while(pr!=NULL) </p><p><b> { </b>&
58、lt;/p><p><b> l++; </b></p><p> pr=pr->link; </p><p><b> } </b></p><p> return(l); </p><p><b> } </b></p>&
59、lt;p> void disp(PCB * pr) /*建立進程顯示函數(shù),用于顯示當前進程*/ </p><p><b> { </b></p><p> printf("\n qname \t state \t super \t ndtime \t runtime \n"); </p><p> printf
60、("|%s\t",pr->name); </p><p> printf("|%c\t",pr->state); </p><p> printf("|%d\t",pr->super); </p><p> printf("|%d\t",pr->ntime)
61、; </p><p> printf("|%d\t",pr->rtime); </p><p> printf("\n"); </p><p><b> } </b></p><p> void check() /* 建立進程查看函數(shù) */ </p>&
62、lt;p><b> { </b></p><p><b> PCB* pr; </b></p><p> printf("\n **** 當前正在運行的進程是:%s",p->name); /*顯示當前運行進程*/ </p><p><b> disp(p); </b&
63、gt;</p><p> pr=ready; </p><p> printf("\n ****當前就緒隊列狀態(tài)為:\n"); /*顯示就緒隊列狀態(tài)*/ </p><p> while(pr!=NULL) </p><p><b> { </b></p><p> d
64、isp(pr); </p><p> pr=pr->link; </p><p><b> } </b></p><p><b> } </b></p><p> void destroy() /*建立進程撤消函數(shù)(進程運行結束,撤消進程)*/ </p><p>
65、;<b> { </b></p><p> printf("\n 進程 [%s] 已完成.\n",p->name); </p><p><b> free(p); </b></p><p><b> } </b></p><p> void
66、running() /* 建立進程就緒函數(shù)(進程運行時間到,置就緒狀態(tài)*/ </p><p><b> { </b></p><p> (p->rtime)++; </p><p> if(p->rtime==p->ntime) </p><p> destroy(); /* 調(diào)用destroy
67、函數(shù)*/ </p><p><b> else </b></p><p><b> { </b></p><p> (p->super)--; </p><p> p->state='w'; </p><p> sort(); /*調(diào)用s
68、ort函數(shù)*/ </p><p><b> } </b></p><p><b> } </b></p><p><b> int </b></p><p> main() /*主函數(shù)*/ </p><p><b> { </b
69、></p><p> int len,h=0; </p><p><b> char ch; </b></p><p><b> input(); </b></p><p> len=space(); </p><p> while((len!=0)&
70、&(ready!=NULL)) </p><p><b> { </b></p><p> ch=getchar(); </p><p><b> h++; </b></p><p> printf("\n The execute number:%d \n",h)
71、; </p><p><b> p=ready; </b></p><p> ready=p->link; </p><p> p->link=NULL; </p><p> p->state='R'; </p><p><b> check(
72、); </b></p><p> running(); </p><p> printf("\n 按任一鍵繼續(xù)......"); </p><p> ch=getchar(); </p><p><b> } </b></p><p> printf(&q
73、uot;\n\n 進程已經(jīng)完成.\n"); </p><p> ch=getchar(); </p><p><b> }</b></p><p><b> ?。?)運行結果</b></p><p><b> 輸入相關進程信息:</b></p>&
74、lt;p><b> 輸出相關運行結果:</b></p><p> 三、主存空間的回收與分配</p><p><b> 1、設計目的</b></p><p> 主存是中央處理器能直接存取指令和數(shù)據(jù)的存儲器,能否合理地利用主存,在很大程度上將影響到整個計算機系統(tǒng)的性能。主存分配是指在多道作業(yè)和多進程環(huán)境下,如何共
75、享主存空間。主存回收是指當作業(yè)執(zhí)行完畢或進程運行結束后將主存空間歸還給系統(tǒng)。主存分配與回收的實現(xiàn)是與主存儲器的管理方式有關。本次設計主要是為了幫助學生深入理解主存空間的分配與回收的幾種算法。</p><p> ?。?)掌握最先適應分配算法</p><p> ?。?)掌握最優(yōu)適應分配算法</p><p> ?。?)掌握最壞適應分配算法</p><p
76、><b> 2、設計要求</b></p><p> 用戶提出內(nèi)存空間請求,系統(tǒng)根據(jù)申請者要求,按照最先適應分配算法的分配策略分析內(nèi)存空間的使用情況,找出能滿足請求的空閑區(qū),分給申請者,當程序執(zhí)行完畢時,系統(tǒng)要收回它所占用的內(nèi)存空間。建立空閑數(shù)據(jù)文件,空閑區(qū)數(shù)據(jù)文件包括若干行,每行有兩個字段:起始地址、內(nèi)存塊大?。ň鶠檎麛?shù)),各字段以逗號隔開。下面是一個空閑區(qū)數(shù)據(jù)文件的示例:<
77、/p><p><b> 0,10 </b></p><p><b> 10,08 </b></p><p><b> 18,10 </b></p><p><b> 28,06 </b></p><p><b>
78、; 34,10 </b></p><p><b> 44,09 </b></p><p> 讀取空閑區(qū)數(shù)據(jù)文件,建立空閑區(qū)表并在屏幕上顯示空閑內(nèi)存狀態(tài),空閑區(qū)表記錄了可供分配的空閑內(nèi)存的起始地址和大小,用標志位指出該分區(qū)是否是未分配的空閑區(qū)。</p><p> 接收用戶的內(nèi)存申請,格式為:作業(yè)名、申請空間的大小。<
79、/p><p> 按照內(nèi)存分配算法中的一種方法選擇一個空閑區(qū),分割并分配,修改空閑區(qū)表,填寫內(nèi)存已分配區(qū)表(起始地址、長度、標志位),其中標志位的一個作用是指出該區(qū)域分配給哪個作業(yè)。</p><p> 進程結束后回收內(nèi)存。</p><p> 空閑區(qū)表的結構如下:</p><p> typedef struct node{ </p>
80、;<p> int start; </p><p> int length; </p><p> char tag[20]; </p><p><b> }job; </b></p><p> 本次設計要求完成如下算法:</p><p> ?。?)設計一個內(nèi)存分配回收的程序
81、使用最先適應分配算法</p><p> ?。?)設計一個內(nèi)存分配回收的程序使用最優(yōu)適應分配算法</p><p> (3)設計一個內(nèi)存分配回收的程序使用最壞適應分配算法</p><p> 用戶提出內(nèi)存空間請求,系統(tǒng)根據(jù)申請者要求,選擇上述算法的一種分配策略分析內(nèi)存空間的使用情況,找出合適的空閑區(qū),分給申請者,當進程執(zhí)行完畢時,系統(tǒng)收回它所占用的內(nèi)存空間。</
82、p><p><b> 3、模擬算法的實現(xiàn)</b></p><p><b> (1)流程圖</b></p><p><b> ?。?)程序代碼</b></p><p> #include<stdio.h></p><p> #include
83、<malloc.h></p><p> #define LEN sizeof(struct area)</p><p> #define LEN_POINTER_LIST sizeof(struct AreaPointer_list)</p><p> struct area{</p><p> int start;/
84、/分區(qū)的其始地址</p><p> int length;//分區(qū)的長度</p><p> int job;//若被作業(yè)占用值為作業(yè)號,若空閑值為0</p><p> struct area * next;</p><p><b> };</b></p><p><b>
85、//分區(qū)指針的鏈表</b></p><p> //當把空閑分區(qū)鏈表和占用分區(qū)鏈表按照地址先后順序合并</p><p> //以顯示整個內(nèi)存情況的時候使用</p><p> struct AreaPointer_list{</p><p> struct area * data;</p><p>
86、struct AreaPointer_list * next;</p><p><b> };</b></p><p> struct area * idle;//全局變量,空閑分區(qū)鏈表頭指針</p><p> struct area * used;//全局變量,占用分區(qū)鏈表頭指針</p><p
87、> struct AreaPointer_list * whole = NULL;//全局變量,分區(qū)指針鏈表頭指針</p><p> //p(previcious) n(next)指出在鏈表中的何處插入新生成的元素</p><p> //p==NULL 在鏈表頭插入,返回頭指針</p><p> //p!=NULL 在鏈表中或鏈表尾插入,返回當前
88、插入的元素的指針</p><p> struct area * insert(int s,int l,int j,struct area * p,struct area * n)</p><p><b> {</b></p><p> struct area * current = (struct area * )malloc(LEN);
89、</p><p> current->start = s;</p><p> current->length = l;</p><p> current->job = j;</p><p> if(p == NULL){//在鏈表頭插入</p><p> current->next =
90、 n;</p><p> return current;</p><p><b> }</b></p><p><b> else{</b></p><p> if(p->next == NULL){//在鏈表尾插入</p><p> current->
91、next = NULL;</p><p> p->next = current;</p><p><b> }</b></p><p> else{//在鏈表中插入</p><p> current->next = p->next;</p><p> p->nex
92、t = current;</p><p><b> }</b></p><p> return current;</p><p><b> }</b></p><p><b> }</b></p><p> //此模塊居于次要地位,只被使用一次
93、</p><p><b> //打印分區(qū)鏈表</b></p><p> void print(struct area * head)</p><p><b> {</b></p><p> if(head == NULL){</p><p> printf(&quo
94、t;Area list is null...\n");</p><p><b> }</b></p><p><b> else{</b></p><p> while(head != NULL)</p><p><b> {</b></p>&
95、lt;p> if(head->job == 0)</p><p> printf("begin:%dK\tlength:%dK\t空閑\t\t|\n",head->start,head->length);</p><p><b> else</b></p><p> printf("
96、begin:%dK\tlength:%dK\tuse:Job%d\t|\n",head->start,head->length,head->job);</p><p> head = head->next;</p><p><b> }</b></p><p><b> }</b>&
97、lt;/p><p><b> }</b></p><p> void file_print(struct area * head,FILE * file)</p><p><b> {</b></p><p> if(head == NULL){</p><p> fp
98、rintf(file,"Area list is null...\n");</p><p><b> }</b></p><p><b> else{</b></p><p> while(head != NULL)</p><p><b> {</b&g
99、t;</p><p> if(head->job == 0)</p><p> fprintf(file,"begin:%dK\tlength:%dK\t空閑\t\t|\n",head->start,head->length);</p><p><b> else</b></p><
100、;p> fprintf(file,"begin:%dK\tlength:%dK\tuse:Job%d\t|\n",head->start,head->length,head->job);</p><p> head = head->next;</p><p><b> }</b></p><p
101、><b> }</b></p><p><b> }</b></p><p><b> //打印分區(qū)鏈表</b></p><p> //釋放分區(qū)鏈表空間</p><p> void free_AreaList(struct area * head)</p&
102、gt;<p><b> {</b></p><p> struct area * temp;</p><p> while(head != NULL){</p><p> temp = head;</p><p> head = head->next;</p><p>
103、; free(temp);</p><p><b> }</b></p><p><b> }</b></p><p> //釋放分區(qū)鏈表空間</p><p> //在分區(qū)鏈表中搜索插入位置</p><p> //flag==0 表明分區(qū)鏈表按起始地址從小到大排列
104、</p><p> //flag==1 表明分區(qū)鏈表按分區(qū)長度從小到大排列</p><p> //輸入?yún)?shù) element 不能為NULL</p><p> struct area * search_pos(struct area * element,struct area * head,int flag)</p><p><b&
105、gt; {</b></p><p> struct area * p = NULL;</p><p> while(head != NULL){</p><p> if(flag == 0)</p><p><b> {</b></p><p> if(element-&g
106、t;start < head->start)</p><p><b> break;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>
107、<p> if(element->length < head->length)</p><p><b> break;</b></p><p><b> }</b></p><p><b> p = head;</b></p><p> h
108、ead = head->next;</p><p><b> }</b></p><p><b> return p;</b></p><p><b> }</b></p><p> //返回值p==NULL表明插入位置在鏈表頭</p><p&
109、gt; //返回值p!=NULL表明插入位置在p 之后</p><p> //進行分區(qū)鏈表的實際插入工作</p><p> //flag==0 表明分區(qū)鏈表按起始地址從小到大排列</p><p> //flag==1 表明分區(qū)鏈表按分區(qū)長度從小到大排列</p><p> //輸入?yún)?shù) element->next 要為NULL&
110、lt;/p><p> struct area * insert_list(struct area * element,struct area * list,int flag)</p><p><b> {</b></p><p> if(list == NULL)</p><p> list = element;&l
111、t;/p><p><b> else{</b></p><p> struct area * pos = search_pos(element,list,flag);</p><p> if(pos == NULL){</p><p> element->next = list;</p><
112、p> list = element;</p><p><b> }</b></p><p><b> else{</b></p><p> element->next = pos->next;</p><p> pos->next = element;</p&
113、gt;<p><b> }</b></p><p><b> }</b></p><p> return list;</p><p> }//返回插入元素之后新鏈表的頭指針</p><p> //進行查詢空閑分區(qū)鏈表動態(tài)分配分區(qū)的實際工作,算法步驟:</p>&
114、lt;p> //1。查詢空閑分區(qū)鏈表中是否有長度大于或等于申請長度的分區(qū),若沒有返回FALSE</p><p> //2。若查找到符合條件的分區(qū),把它從空閑鏈表中取出</p><p> //3。根據(jù)請求把取出的空閑分區(qū)分塊,把新的占用分區(qū)和剩余空閑分區(qū)分別插入鏈表</p><p> //注意:插入占用分區(qū)鏈表按照固定的地址先后順序,插入空閑分區(qū)鏈表的方
115、式要根據(jù)flag的值</p><p> int memory_alloc(int length,int job,int flag)</p><p><b> {</b></p><p> struct area * used_element;</p><p> struct area * free_element
116、;</p><p> struct area * head = idle;</p><p> struct area * head_temp = used;</p><p> struct area * p = NULL;</p><p> //檢測輸入的作業(yè)號是否存在</p><p> while(head
117、_temp != NULL)</p><p><b> {</b></p><p> if(head_temp->job == job)</p><p><b> return 2;</b></p><p> head_temp = head_temp->next;</p&
118、gt;<p><b> }</b></p><p> //在空閑分區(qū)鏈表中查找</p><p> while(head != NULL)</p><p><b> {</b></p><p> if(head->length >= length)</p>
119、;<p><b> break;</b></p><p><b> p = head;</b></p><p> head = head->next;</p><p><b> }</b></p><p> if(head != NULL)<
120、/p><p><b> {</b></p><p> //從空閑區(qū)鏈表中取出</p><p> if(p == NULL)//鏈表中的第一個分區(qū)符合條件</p><p><b> {</b></p><p> idle = idle->next;</p>
121、;<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> p->next = head->next;</p><p><b> }</b><
122、/p><p> head->next = NULL;</p><p><b> }</b></p><p> else return 0;</p><p> //生成新的占用區(qū)鏈表元素并插入占用區(qū)鏈表</p><p> used_element = (struct area * )ma
123、lloc(LEN);</p><p> used_element->start = head->start;</p><p> used_element->length = length;</p><p> used_element->job = job;</p><p> used_element->n
124、ext = NULL;</p><p> used = insert_list(used_element,used,0);</p><p> //若空閑分區(qū)分塊后有剩余,生成新的空閑區(qū)鏈表元素并插入空閑區(qū)鏈表</p><p> if(head->length > length){</p><p> free_element
125、 = (struct area * )malloc(LEN);</p><p> free_element->start = head->start + length;</p><p> free_element->length = head->length - length;</p><p> free_element->job
126、 = 0;</p><p> free_element->next = NULL;</p><p> idle = insert_list(free_element,idle,flag);</p><p><b> }</b></p><p><b> //釋放空間</b></p
127、><p> free(head);</p><p><b> return 1;</b></p><p><b> }</b></p><p> //進行查詢占用分區(qū)鏈表動態(tài)釋放分區(qū)的實際工作,算法步驟:</p><p> //1。根據(jù)作業(yè)號查詢到占用分區(qū)鏈表中要釋放的
128、分區(qū),若沒有返回FALSE</p><p> //2。若查找到要釋放的分區(qū),把它從空閑鏈表中取出</p><p> //3。根據(jù)取出的分區(qū)的數(shù)據(jù)建立新的空閑分區(qū)</p><p> //4。在空閑分區(qū)鏈表中查詢是否有和新空閑分區(qū)相鄰的空閑分區(qū),有則合并</p><p> //5。根據(jù)flag的取值按照特定方式插入空閑分區(qū)鏈表</p
129、><p> int memory_free(int job,int flag)</p><p><b> {</b></p><p> struct area * used_element;</p><p> struct area * free_element;</p><p> stru
130、ct area * head = used;</p><p> struct area * p = NULL;</p><p> struct area * previcious1 = NULL;</p><p> struct area * current1 = NULL;</p><p> struct area * previc
131、ious2 = NULL;</p><p> struct area * current2 = NULL;</p><p> //根據(jù)作業(yè)號在占用分區(qū)鏈表中查找</p><p> while(head != NULL)</p><p><b> {</b></p><p> if(hea
132、d->job == job)</p><p><b> break;</b></p><p><b> p = head;</b></p><p> head = head->next;</p><p><b> }</b></p><p
133、> if(head != NULL)</p><p><b> {</b></p><p> //從占用區(qū)鏈表中取出</p><p> if(p == NULL)//鏈表中的第一個分區(qū)符合條件</p><p><b> {</b></p><p> used
134、 = used->next;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> p->next = head->next;</p><p>
135、<b> }</b></p><p> head->next = NULL;</p><p><b> }</b></p><p> else return 0;</p><p> //建立新的空閑分區(qū)</p><p> used_element = hea
136、d;</p><p> free_element = (struct area * )malloc(LEN);</p><p> free_element->start = used_element->start;</p><p> free_element->length = used_element->length;</p&g
137、t;<p> free_element->job = 0;</p><p> free_element->next = NULL;</p><p> //從空閑區(qū)鏈表查找和新的空閑分區(qū)相鄰分區(qū)</p><p> head = idle;</p><p><b> p = NULL;</b&g
138、t;</p><p> while(head != NULL)</p><p><b> {</b></p><p> if(head->start + head->length == used_element->start)</p><p><b> {</b></
139、p><p> previcious1 = p;</p><p> current1 = head;</p><p><b> }</b></p><p> if(used_element->start + used_element->length == head->start)</p>
140、<p><b> {</b></p><p> previcious2 = p;</p><p> current2 = head;</p><p><b> }</b></p><p><b> p = head;</b></p><
141、p> head = head->next;</p><p><b> }</b></p><p> //合并相鄰空閑分區(qū)</p><p> if( current1 != NULL )</p><p><b> {</b></p><p> //把和新
142、分區(qū)相鄰的分區(qū)從空閑分區(qū)鏈表中取出</p><p> if( previcious1 == NULL )</p><p> idle = idle->next;</p><p><b> else</b></p><p> previcious1->next = current1->next;&
143、lt;/p><p> current1->next = NULL;</p><p> //修改新空閑分區(qū)的相關數(shù)據(jù)</p><p> free_element->start = current1->start;</p><p> free_element->length = free_element->len
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機操作系統(tǒng)課程設計報告
- 計算機操作系統(tǒng)課程設計
- 計算機操作系統(tǒng)實踐教學課程報告
- 計算機操作系統(tǒng)實踐教學課程報告
- 計算機操作系統(tǒng)實踐教學課程報告
- 計算機操作系統(tǒng)課程設計--銀行家算法
- “計算機操作系統(tǒng)”課程輔導
- 《計算機操作系統(tǒng)》課程實驗大綱
- 計算機操作系統(tǒng)課程設計報告---win32sdk下聊天程序
- 計算機操作系統(tǒng)
- 操作系統(tǒng)課程設計任務書(計算機、軟件、網(wǎng)絡)
- 計算機08級操作系統(tǒng)課程設計任務書
- 計算機專業(yè)操作系統(tǒng)課程設計 存儲管理地址換算演示
- 操作系統(tǒng)課程設計——操作系統(tǒng)課程設計模擬操作系統(tǒng)
- 計算機操作系統(tǒng)課程教學大綱
- 計算機操作系統(tǒng)教案
- 計算機操作系統(tǒng)試題
- 計算機操作系統(tǒng)題庫
- 計算機操作系統(tǒng)課程設計---銀行家算法的設計與實現(xiàn)
- 操作系統(tǒng)課程設計報告
評論
0/150
提交評論