版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 操作系統(tǒng)課程設(shè)計(jì)報(bào)告</p><p> 時(shí)間:2010-12-20~2010-12-31</p><p> 地點(diǎn):信息技術(shù)實(shí)驗(yàn)中心</p><p><b> 目 錄</b></p><p> 一、課程設(shè)計(jì)的目的和意義2</p><p> 二、進(jìn)程調(diào)度算法模擬
2、2</p><p><b> 1、設(shè)計(jì)目的2</b></p><p><b> 2、設(shè)計(jì)要求2</b></p><p> 3、時(shí)間片輪轉(zhuǎn)算法模擬3</p><p><b> 實(shí)現(xiàn)思想:3</b></p><p><b> ?。?/p>
3、1)流程圖4</b></p><p><b> ?。?)程序代碼4</b></p><p><b> (3)運(yùn)行結(jié)果6</b></p><p> 4、先來先服務(wù)算法模擬7</p><p><b> 算法思想7</b></p><p
4、><b> ?。?)流程圖8</b></p><p><b> (2)程序代碼8</b></p><p> ?。?)運(yùn)行結(jié)果12</p><p> 三、主存空間的回收與分配13</p><p><b> 1、設(shè)計(jì)目的13</b></p>&l
5、t;p><b> 2、設(shè)計(jì)要求13</b></p><p> 3、模擬算法的實(shí)現(xiàn)15</p><p><b> ?。?)流程圖15</b></p><p> ?。?)程序代碼15</p><p> ?。?)運(yùn)行結(jié)果30</p><p> 四、模擬DOS文
6、件的建立和使用30</p><p><b> 1 設(shè)計(jì)目的30</b></p><p><b> 2 設(shè)計(jì)要求30</b></p><p> 3、模擬算法實(shí)現(xiàn)33</p><p><b> ?。?)流程圖33</b></p><p>
7、(2)程序代碼33</p><p> ?。?)運(yùn)行結(jié)果38</p><p> 五、磁盤調(diào)度算法模擬38</p><p><b> 1.設(shè)計(jì)目的38</b></p><p><b> 2.實(shí)驗(yàn)原理39</b></p><p><b> 3.設(shè)計(jì)要求
8、39</b></p><p> 4、模擬算法的實(shí)現(xiàn)40</p><p> (1)各算法流程圖40</p><p> ?。?)程序代碼41</p><p> ?。?)運(yùn)行結(jié)果47</p><p><b> 六、總結(jié)47</b></p><p>
9、一、課程設(shè)計(jì)的目的和意義</p><p> 本次操作系統(tǒng)課程設(shè)計(jì)的主要任務(wù)是進(jìn)行系統(tǒng)級的程序設(shè)計(jì)。本課程設(shè)計(jì)是操作系統(tǒng)原理課程的延伸。通過該課程設(shè)計(jì),使學(xué)生更好地掌握操作系統(tǒng)各部分結(jié)構(gòu)、實(shí)現(xiàn)機(jī)理和各種典型算法,加深對操作系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)思路的理解,培養(yǎng)學(xué)生的系統(tǒng)設(shè)計(jì)和動手能力,學(xué)會分析和編寫程序。課程設(shè)計(jì)的實(shí)施將使學(xué)生在以下幾個(gè)方面有所收獲:</p><p> ?。?)加深對操作系統(tǒng)原理
10、的理解,提高綜合運(yùn)用所學(xué)知識的能力;</p><p> (2)培養(yǎng)學(xué)生自主查閱參考資料的習(xí)慣,增強(qiáng)獨(dú)立思考和解決問題的能力;</p><p> ?。?)通過課程設(shè)計(jì),培養(yǎng)嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度和協(xié)作精神。</p><p> 二、進(jìn)程調(diào)度算法模擬</p><p><b> 1、設(shè)計(jì)目的</b></p><
11、p> (1)要求學(xué)生設(shè)計(jì)并實(shí)現(xiàn)模擬進(jìn)程調(diào)度的算法:時(shí)間片輪轉(zhuǎn)及先來先服務(wù)。</p><p> (2)理解進(jìn)程控制塊的結(jié)構(gòu)。</p><p> (3)理解進(jìn)程運(yùn)行的并發(fā)性。</p><p> (4)掌握進(jìn)程調(diào)度算法。</p><p><b> 2、設(shè)計(jì)要求</b></p><p>
12、 在多道程序運(yùn)行環(huán)境下,進(jìn)程數(shù)目一般多于處理機(jī)數(shù)目,使得進(jìn)程要通過競爭來使用處理機(jī)。這就要求系統(tǒng)能按某種算法,動態(tài)地把處理機(jī)分配給就緒隊(duì)列中的一個(gè)進(jìn)程,使之運(yùn)行,分配處理機(jī)的任務(wù)是由進(jìn)程調(diào)度程序完成的。一個(gè)進(jìn)程被創(chuàng)建后,系統(tǒng)為了便于對進(jìn)程進(jìn)行管理,將系統(tǒng)中的所有進(jìn)程按其狀態(tài),將其組織成不同的進(jìn)程隊(duì)列。于是系統(tǒng)中有運(yùn)行進(jìn)程隊(duì)列、就緒隊(duì)列和各種事件的進(jìn)程等待隊(duì)列。進(jìn)程調(diào)度的功能就是從就緒隊(duì)列中挑選一個(gè)進(jìn)程到處理機(jī)上運(yùn)行。進(jìn)程調(diào)度的算法有多種
13、,常用的有優(yōu)先級調(diào)度算法、先來先服務(wù)算法、時(shí)間片輪轉(zhuǎn)算法。</p><p> 進(jìn)程是程序在處理機(jī)上的執(zhí)行過程。進(jìn)程存在的標(biāo)識是進(jìn)程控制塊(PCB),進(jìn)程控制塊結(jié)構(gòu)如下:</p><p> typedef struct node </p><p><b> { </b></p><p> char name[10]
14、; /* 進(jìn)程標(biāo)識符 */ </p><p> int prio; /* 進(jìn)程優(yōu)先數(shù) */ </p><p> int round; /* 進(jìn)程時(shí)間輪轉(zhuǎn)時(shí)間片 */ </p><p> int cputime;
15、 /* 進(jìn)程占用 CPU 時(shí)間*/ </p><p> int needtime; /* 進(jìn)程到完成還需要的時(shí)間*/ </p><p> int count; /* 計(jì)數(shù)器*/ </p><p> char state;
16、 /* 進(jìn)程的狀態(tài)*/ </p><p> struct node *next /*鏈指針*/ </p><p><b> }PCB; </b></p><p> 系統(tǒng)創(chuàng)建一個(gè)進(jìn)程,就是由系統(tǒng)為某個(gè)程序設(shè)置一個(gè)PCB,用于對該進(jìn)程進(jìn)行控制和管理,進(jìn)程任務(wù)完成,由系統(tǒng)收回其PCB,該
17、進(jìn)程便消亡。每個(gè)進(jìn)程可以有三個(gè)狀態(tài):運(yùn)行狀態(tài)、就緒狀態(tài)和完成狀態(tài)。</p><p> 用C語言、C++或者Java語言編寫一個(gè)程序?qū)崿F(xiàn)進(jìn)程調(diào)度的算法,模擬進(jìn)程調(diào)度的過程,加深對進(jìn)程控制塊概念和進(jìn)程調(diào)度算法的理解。</p><p> 本任務(wù)要求完成時(shí)間片輪轉(zhuǎn)及先來先服務(wù)兩個(gè)算法。</p><p> 3、時(shí)間片輪轉(zhuǎn)算法模擬</p><p>
18、<b> 實(shí)現(xiàn)思想:</b></p><p> 每次調(diào)度時(shí),系統(tǒng)吧處理機(jī)分配給隊(duì)列首進(jìn)程讓器執(zhí)行一個(gè)時(shí)間片,當(dāng)執(zhí)行的時(shí)間片用完時(shí),由一個(gè)計(jì)時(shí)器發(fā)出時(shí)鐘中斷請求,調(diào)度根據(jù)這個(gè)請求停止該進(jìn)程的運(yùn)行將其送到就緒隊(duì)列的末尾,再把處理機(jī)分給就緒隊(duì)列中新的隊(duì)首進(jìn)程,同時(shí)讓它執(zhí)行一個(gè)時(shí)間片。</p><p><b> ?。?)流程圖</b></p&g
19、t;<p><b> (2)程序代碼</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; // 定義指向下一個(gè)節(jié)點(diǎn)的指針</p><p> char name[10]; // 定義進(jìn)程名,并分配空間</p>
21、<p> int All_Time; // 定義總運(yùn)行時(shí)間</p><p> int Runed_Time; // 定義已運(yùn)行時(shí)間</p><p> char state; // 定義進(jìn)程狀態(tài) Ready / End</p><p><b> }</b></p><p>
22、 * Proc; // 指向該P(yáng)CB的指針</p><p> int ProcNum; // 總進(jìn)程個(gè)數(shù)</p><p> void InitPCB(Proc &H)// 初始化就緒隊(duì)列 </p><p><b> { </b></p><p> cout<<"請輸入總進(jìn)程個(gè)數(shù): &
23、quot;;</p><p> cin>>ProcNum; // 進(jìn)程總個(gè)數(shù)</p><p> int Num=ProcNum;</p><p> H=(Proc)malloc(sizeof(PNode)); // 建立頭節(jié)點(diǎn) </p><p> H->next=NULL;</p><p&g
24、t; Proc p=H; //定義一個(gè)指針</p><p> cout<<"總進(jìn)程個(gè)數(shù)為 "<<ProcNum<<" 個(gè),請依次輸入相應(yīng)信息\n\n"; </p><p> while (Num--) </p><p><b> {</b></p&
25、gt;<p> p=p->next=(Proc)malloc(sizeof(PNode)); </p><p> cout<<"進(jìn)程名 總運(yùn)行時(shí)間 已運(yùn)行時(shí)間 :";</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) //輸出運(yùn)行中的進(jìn)程信息</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') //如果該進(jìn)程的狀態(tài)不是End的話</p><p><b> {</b></p><p> cout<<"進(jìn)程名:"<<p->name<<"\t總運(yùn)行時(shí)間:"
29、;<<p->All_Time</p><p> <<"\t已運(yùn)行時(shí)間:"<<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); // 整個(gè)進(jìn)程鏈條始終完整,只是狀態(tài)位有差異</p><p><b&g
31、t; }</b></p><p> void SJP_Simulator(Proc &H) // 時(shí)間片輪轉(zhuǎn)法</p><p><b> { </b></p><p> cout<<endl<<"-------------------START--------------------
32、\n";</p><p> int flag=ProcNum; // 記錄剩余進(jìn)程數(shù)</p><p> int round=0; // 記錄輪轉(zhuǎn)數(shù)</p><p> Proc p=H->next;</p><p> while (p->All_Time > p->Runed_Time) </p&
33、gt;<p><b> { </b></p><p> // 即未結(jié)束的進(jìn)程</p><p> round++; </p><p> cout<<endl<<"Round "<<round<<"--正在運(yùn)行 "<<p-
34、>name<<" 進(jìn)程"<<endl;</p><p> p->Runed_Time++; // 更改正在運(yùn)行的進(jìn)程的已運(yùn)行時(shí)間</p><p> DispInfo(H); // 輸出此時(shí)為就緒狀態(tài)的進(jìn)程的信息</p><p> if (p->All_Time == p->Run
35、ed_Time) { // 并判斷該進(jìn)程是否結(jié)束</p><p> p->state='E'; </p><p><b> flag--;</b></p><p> cout<<p->name<<" 進(jìn)程已運(yùn)行結(jié)束,進(jìn)程被刪除!\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; // 跳過先前已結(jié)束的進(jìn)程</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); // 輸出此刻的進(jìn)程狀態(tài)</p><p> SJP_Simulator(H); // 時(shí)間片輪轉(zhuǎn)法<
39、;/p><p> system("pause");</p><p><b> }</b></p><p><b> (3)運(yùn)行結(jié)果</b></p><p><b> 輸入相關(guān)進(jìn)程信息:</b></p><p><b>
40、 輸出相關(guān)運(yùn)行結(jié)果:</b></p><p> 4、先來先服務(wù)算法模擬</p><p><b> 算法思想</b></p><p> 按照進(jìn)程的某種順序進(jìn)行排序,然后按照這個(gè)順序進(jìn)行調(diào)度。例如:可以按照作業(yè)提交時(shí)間或進(jìn)程變?yōu)榫途w狀態(tài)的先后次序來分派處理器,讓排在后面的進(jìn)程占用處理器,知道該進(jìn)程執(zhí)行完或者由于某種原因被阻塞才讓出
41、處理器。</p><p> 在該調(diào)度策略中還規(guī)定,當(dāng)有一個(gè)事件發(fā)生(如一個(gè)I/O操作完成)時(shí),會有一些進(jìn)程被喚醒,這些被喚醒的進(jìn)程并不能立即恢復(fù)執(zhí)行,而是要等到當(dāng)前運(yùn)行的進(jìn)程出讓處理器后才可以被調(diào)度執(zhí)行。采用此算法存在以下幾個(gè)特點(diǎn):</p><p> 周轉(zhuǎn)時(shí)間:對進(jìn)程i來說,假設(shè)Tei是進(jìn)程的完成時(shí)間,Tsi是進(jìn)程的提交時(shí)間,那么進(jìn)程i的周轉(zhuǎn)時(shí)間Ti=進(jìn)程完成時(shí)間-進(jìn)程提交時(shí)間;<
42、;/p><p> 進(jìn)程平均周轉(zhuǎn)時(shí)間:T=1/nETi;</p><p> 進(jìn)程帶權(quán)周轉(zhuǎn)時(shí)間=進(jìn)程等待時(shí)間+進(jìn)程運(yùn)行時(shí)間。</p><p><b> ?。?)流程圖</b></p><p><b> ?。?)程序代碼</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 { /* 定義進(jìn)程控制塊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() /* 建立對進(jìn)程進(jìn)行優(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)先級最大者,插入隊(duì)首*/ </p><p><b>
47、; { </b></p><p> p->link=ready; </p><p><b> ready=p; </b></p><p><b> } </b></p><p> else /* 進(jìn)程比較優(yōu)先級,插入適當(dāng)?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)) /*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù)大,*/ </p><p> { /*插入到當(dāng)前進(jìn)程前面*/ </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 /* 插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊(duì)尾*/ </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() /* 建立進(jìn)程控制塊函數(shù)*/ </p><p><b> { </b></p><p> int i,num; </p><p> printf("\n 請輸入
53、進(jìn)程數(shù):"); </p><p> scanf("%d",&num); </p><p> for(i=0;i<num;i++) </p><p><b> { </b></p><p> printf("\n 進(jìn)程號No.%d:\n",i+1);
54、</p><p> p=getpch(PCB); </p><p> printf("\n 輸入進(jìn)程名:"); </p><p> scanf("%s",p->name); </p><p> printf("\n 輸入進(jìn)程優(yōu)先數(shù):"); </p><
55、;p> scanf("%d",&p->super); </p><p> printf("\n 輸入進(jìn)程運(yùn)行時(shí)間:"); </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) /*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/ </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() /* 建立進(jìn)程查看函數(shù) */ </p>&
62、lt;p><b> { </b></p><p><b> PCB* pr; </b></p><p> printf("\n **** 當(dāng)前正在運(yùn)行的進(jìn)程是:%s",p->name); /*顯示當(dāng)前運(yùn)行進(jìn)程*/ </p><p><b> disp(p); </b&
63、gt;</p><p> pr=ready; </p><p> printf("\n ****當(dāng)前就緒隊(duì)列狀態(tài)為:\n"); /*顯示就緒隊(duì)列狀態(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() /*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/ </p><p>
65、;<b> { </b></p><p> printf("\n 進(jìn)程 [%s] 已完成.\n",p->name); </p><p><b> free(p); </b></p><p><b> } </b></p><p> void
66、running() /* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(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ìn)程已經(jīng)完成.\n"); </p><p> ch=getchar(); </p><p><b> }</b></p><p><b> ?。?)運(yùn)行結(jié)果</b></p><p><b> 輸入相關(guān)進(jìn)程信息:</b></p>&
74、lt;p><b> 輸出相關(guān)運(yùn)行結(jié)果:</b></p><p> 三、主存空間的回收與分配</p><p><b> 1、設(shè)計(jì)目的</b></p><p> 主存是中央處理器能直接存取指令和數(shù)據(jù)的存儲器,能否合理地利用主存,在很大程度上將影響到整個(gè)計(jì)算機(jī)系統(tǒng)的性能。主存分配是指在多道作業(yè)和多進(jìn)程環(huán)境下,如何共
75、享主存空間。主存回收是指當(dāng)作業(yè)執(zhí)行完畢或進(jìn)程運(yùn)行結(jié)束后將主存空間歸還給系統(tǒng)。主存分配與回收的實(shí)現(xiàn)是與主存儲器的管理方式有關(guān)。本次設(shè)計(jì)主要是為了幫助學(xué)生深入理解主存空間的分配與回收的幾種算法。</p><p> (1)掌握最先適應(yīng)分配算法</p><p> ?。?)掌握最優(yōu)適應(yīng)分配算法</p><p> ?。?)掌握最壞適應(yīng)分配算法</p><p
76、><b> 2、設(shè)計(jì)要求</b></p><p> 用戶提出內(nèi)存空間請求,系統(tǒng)根據(jù)申請者要求,按照最先適應(yīng)分配算法的分配策略分析內(nèi)存空間的使用情況,找出能滿足請求的空閑區(qū),分給申請者,當(dāng)程序執(zhí)行完畢時(shí),系統(tǒng)要收回它所占用的內(nèi)存空間。建立空閑數(shù)據(jù)文件,空閑區(qū)數(shù)據(jù)文件包括若干行,每行有兩個(gè)字段:起始地址、內(nèi)存塊大?。ň鶠檎麛?shù)),各字段以逗號隔開。下面是一個(gè)空閑區(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)存的起始地址和大小,用標(biāo)志位指出該分區(qū)是否是未分配的空閑區(qū)。</p><p> 接收用戶的內(nèi)存申請,格式為:作業(yè)名、申請空間的大小。<
79、/p><p> 按照內(nèi)存分配算法中的一種方法選擇一個(gè)空閑區(qū),分割并分配,修改空閑區(qū)表,填寫內(nèi)存已分配區(qū)表(起始地址、長度、標(biāo)志位),其中標(biāo)志位的一個(gè)作用是指出該區(qū)域分配給哪個(gè)作業(yè)。</p><p> 進(jìn)程結(jié)束后回收內(nèi)存。</p><p> 空閑區(qū)表的結(jié)構(gòu)如下:</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> 本次設(shè)計(jì)要求完成如下算法:</p><p> ?。?)設(shè)計(jì)一個(gè)內(nèi)存分配回收的程序
81、使用最先適應(yīng)分配算法</p><p> (2)設(shè)計(jì)一個(gè)內(nèi)存分配回收的程序使用最優(yōu)適應(yīng)分配算法</p><p> ?。?)設(shè)計(jì)一個(gè)內(nèi)存分配回收的程序使用最壞適應(yīng)分配算法</p><p> 用戶提出內(nèi)存空間請求,系統(tǒng)根據(jù)申請者要求,選擇上述算法的一種分配策略分析內(nèi)存空間的使用情況,找出合適的空閑區(qū),分給申請者,當(dāng)進(jìn)程執(zhí)行完畢時(shí),系統(tǒng)收回它所占用的內(nèi)存空間。</
82、p><p><b> 3、模擬算法的實(shí)現(xiàn)</b></p><p><b> ?。?)流程圖</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> //當(dāng)把空閑分區(qū)鏈表和占用分區(qū)鏈表按照地址先后順序合并</p><p> //以顯示整個(gè)內(nèi)存情況的時(shí)候使用</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 在鏈表中或鏈表尾插入,返回當(dāng)前
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> //進(jìn)行分區(qū)鏈表的實(shí)際插入工作</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> //進(jìn)行查詢空閑分區(qū)鏈表動態(tài)分配分區(qū)的實(shí)際工作,算法步驟:</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)//鏈表中的第一個(gè)分區(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> //進(jìn)行查詢占用分區(qū)鏈表動態(tài)釋放分區(qū)的實(shí)際工作,算法步驟:</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)//鏈表中的第一個(gè)分區(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ū)的相關(guān)數(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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)
- 計(jì)算機(jī)操作系統(tǒng)實(shí)踐教學(xué)課程報(bào)告
- 計(jì)算機(jī)操作系統(tǒng)實(shí)踐教學(xué)課程報(bào)告
- 計(jì)算機(jī)操作系統(tǒng)實(shí)踐教學(xué)課程報(bào)告
- 計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- “計(jì)算機(jī)操作系統(tǒng)”課程輔導(dǎo)
- 《計(jì)算機(jī)操作系統(tǒng)》課程實(shí)驗(yàn)大綱
- 計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)報(bào)告---win32sdk下聊天程序
- 計(jì)算機(jī)操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)任務(wù)書(計(jì)算機(jī)、軟件、網(wǎng)絡(luò))
- 計(jì)算機(jī)08級操作系統(tǒng)課程設(shè)計(jì)任務(wù)書
- 計(jì)算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計(jì) 存儲管理地址換算演示
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 計(jì)算機(jī)操作系統(tǒng)課程教學(xué)大綱
- 計(jì)算機(jī)操作系統(tǒng)教案
- 計(jì)算機(jī)操作系統(tǒng)試題
- 計(jì)算機(jī)操作系統(tǒng)題庫
- 計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)---銀行家算法的設(shè)計(jì)與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論