最終OS實(shí)驗(yàn)報(bào)告_第1頁
最終OS實(shí)驗(yàn)報(bào)告_第2頁
最終OS實(shí)驗(yàn)報(bào)告_第3頁
最終OS實(shí)驗(yàn)報(bào)告_第4頁
最終OS實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、操作系統(tǒng)實(shí)驗(yàn)報(bào)告 學(xué)生學(xué)院_ 計(jì)算機(jī)學(xué)院_專業(yè)班級(jí)_ _網(wǎng)絡(luò)工程_學(xué) 號(hào) 3113006565 學(xué)生姓名_ 李康賢_ 指導(dǎo)教師_ 李敏 _ _2015年1 月 2 日 實(shí)驗(yàn)一 進(jìn)程調(diào)度1、 實(shí)驗(yàn)?zāi)康挠酶呒?jí)語言編寫和調(diào)試一個(gè)進(jìn)程調(diào)度程序,以加深對(duì)進(jìn)程的概念及進(jìn)程調(diào)度算法的理解。2:實(shí)驗(yàn)內(nèi)容及要求設(shè)計(jì)一個(gè)有 N個(gè)進(jìn)程共行的進(jìn)程調(diào)度程序。 要求采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程),時(shí)間片輪轉(zhuǎn)算法,多級(jí)反饋隊(duì)列調(diào)度算法這三種算法。 每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊( PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用CPU時(shí)間、進(jìn)程狀態(tài)等等。 進(jìn)

2、程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。 每個(gè)進(jìn)程的狀態(tài)可以是就緒 W(Wait)、運(yùn)行R(Run)、或完成F(Finish)三種狀態(tài)之一。 就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用已占用CPU時(shí)間加1來表示。 如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級(jí)),然后把它插入就緒隊(duì)列等待CPU。 每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)

3、程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。 重復(fù)以上過程,直到所要進(jìn)程都完成為止。3:實(shí)驗(yàn)設(shè)計(jì)方案及原理 簡(jiǎn)單輪轉(zhuǎn)法:所有就緒進(jìn)程按 FCFS排成一個(gè)隊(duì)列,總是把處理機(jī)分配給隊(duì)首的進(jìn)程,各進(jìn)程占用CPU的時(shí)間片相同。如果運(yùn)行進(jìn)程用完它的時(shí)間片后還為完成,就把它送回到就緒隊(duì)列的末尾,把處理機(jī)重新分配給隊(duì)首的進(jìn)程。直至所有的進(jìn)程運(yùn)行完畢。 多級(jí)反饋隊(duì)列調(diào)度算法:當(dāng)一個(gè)新進(jìn)程進(jìn)入內(nèi)存后,首先將它放入第一隊(duì)列的末尾,按FCFS原則排隊(duì)等待調(diào)度。當(dāng)輪到該進(jìn)程執(zhí)行時(shí),如能在該時(shí)間片內(nèi)完成,便可準(zhǔn)備撤離系統(tǒng);如果它在一個(gè)時(shí)間片結(jié)束時(shí)尚未完成,調(diào)度程序便將該進(jìn)程轉(zhuǎn)入第二隊(duì)列的末尾,再同樣地按FCFS

4、原則等待調(diào)度執(zhí)行,以此類推。4、程序流程圖(一個(gè)實(shí)驗(yàn)有多個(gè)算法的應(yīng)該分別給出) 簡(jiǎn)單論轉(zhuǎn)法 N Y N Y多級(jí)反饋: N Y N Y Y N5、各程序之間的調(diào)用關(guān)系 Main函數(shù)進(jìn)入,調(diào)用input方法建立進(jìn)程控制塊,再調(diào)用check方法進(jìn)程查看函數(shù),running方法中調(diào)用sort方法,sort方法實(shí)現(xiàn)了簡(jiǎn)單論轉(zhuǎn)法的算法,最后調(diào)用disp方法打印進(jìn)程,直到全部結(jié)束; 對(duì)于多級(jí)反饋隊(duì)列調(diào)度算法,調(diào)用input方法建立進(jìn)程控制塊,再調(diào)用insertProcess方法確定隊(duì)列,調(diào)用sort方法將進(jìn)程進(jìn)行排列,當(dāng)滿足在第一隊(duì)列時(shí)間片內(nèi)可以完成進(jìn)程時(shí),則在此隊(duì)列繼續(xù)執(zhí)行,否則建立一個(gè)新隊(duì)列,把該進(jìn)程未

5、完成的部分放到下一個(gè)隊(duì)列中,直到該隊(duì)列所有進(jìn)程完成時(shí),再去執(zhí)行下一個(gè)隊(duì)列中的進(jìn)程。調(diào)用check方法查看進(jìn)程的運(yùn)行狀態(tài)以及就緒的進(jìn)程,調(diào)用running方法運(yùn)行,當(dāng)需要添加新進(jìn)程時(shí),調(diào)用A方法,在A方法中再調(diào)用sort方法排列,這樣就可以保證后進(jìn)的作業(yè)不一定慢完成。從而體現(xiàn)多級(jí)反饋隊(duì)列調(diào)度算法的作用。6、重要數(shù)據(jù)結(jié)構(gòu)或源程序中疑難部分的說明,需附詳細(xì)注釋void running() int i;(ready->rtime)+;ready->etime -;if(ready->rtime = ready->ntime)/ 進(jìn)程在該隊(duì)列的時(shí)間時(shí)間片內(nèi)完成,然后銷毀進(jìn)程des

6、troy();return;else if(ready ->etime = 0)/當(dāng)時(shí)間片用完,剩余部分添加到下一個(gè)隊(duì)列int time = 2;/時(shí)間片翻倍,因?yàn)槌跏紩r(shí)間為1(ready->queue)+;/隊(duì)列數(shù)比原先加1for(i = 2; i != ready->queue; +i)time *= 2;/以后每增加一條隊(duì)列,時(shí)間片都為原先2倍ready->etime = time;ready->state='w'/狀態(tài)為等待,僅當(dāng)前一隊(duì)列的全部進(jìn)程運(yùn)行完畢在運(yùn)行sort();調(diào)用sort方法重新排列,再重新運(yùn)行接下來的等級(jí)高的進(jìn)程7、程序運(yùn)

7、行結(jié)果多級(jí)反饋:8、結(jié)果分析與實(shí)驗(yàn)小結(jié) 結(jié)果分析:對(duì)于簡(jiǎn)單論轉(zhuǎn)法,只需比較進(jìn)程到達(dá)時(shí)間以及每個(gè)進(jìn)程運(yùn)行所需的時(shí)間。對(duì)于多級(jí)反饋隊(duì)列算法,由原先的進(jìn)程1,2先到達(dá),進(jìn)程1先運(yùn)行1個(gè)時(shí)間片,剩余的進(jìn)程1下降到隊(duì)列2,輪到進(jìn)程2在原隊(duì)列運(yùn)行,剩余的進(jìn)程2下降到隊(duì)列2,當(dāng)進(jìn)程1完成后,此時(shí)新增加進(jìn)程3,但是進(jìn)程3的所需運(yùn)行時(shí)間比進(jìn)程2小,所以最終結(jié)果為進(jìn)程3先于進(jìn)程2早完成。這樣就可以保證后進(jìn)的作業(yè)不一定慢完成。從而體現(xiàn)多級(jí)反饋隊(duì)列調(diào)度算法的作用。小結(jié):簡(jiǎn)單輪轉(zhuǎn)法原理簡(jiǎn)單,但是可能產(chǎn)生進(jìn)程等待時(shí)間過長(zhǎng)的問題,多級(jí)反饋隊(duì)列算法則兼顧大小進(jìn)程,且對(duì)進(jìn)程到達(dá)時(shí)間也很好兼顧到,時(shí)比較好的一種算法。通過此實(shí)驗(yàn),

8、我感覺了編程的能力是極其重要的,對(duì)于實(shí)現(xiàn)某些功能,要先分析其邏輯,再慢慢結(jié)合編程技巧,一點(diǎn)點(diǎn)把所需要的功能以程序的方法體現(xiàn)出來。很有意義。 實(shí)驗(yàn)二 作業(yè)調(diào)度1、 實(shí)驗(yàn)?zāi)康谋緦?shí)驗(yàn)要求學(xué)生模擬作業(yè)調(diào)度的實(shí)現(xiàn),用高級(jí)語言編寫和調(diào)試一個(gè)或多個(gè)作業(yè)調(diào)度的模擬程序,了解作業(yè)調(diào)度在操作系統(tǒng)中的作用,以加深對(duì)作業(yè)調(diào)度算法的理解。2、 實(shí)驗(yàn)內(nèi)容及要求1、為單道批處理系統(tǒng)設(shè)計(jì)一個(gè)作業(yè)調(diào)度程序1) 編寫并調(diào)試一個(gè)單道處理系統(tǒng)的作業(yè)等待模擬程序。2) 作業(yè)調(diào)度算法:分別采用先來先服務(wù)(FCFS)、響應(yīng)比高者優(yōu)先(HRNN)的調(diào)度算法。 3) 由于在單道批處理系統(tǒng)中,作業(yè)一投入運(yùn)行,它就占有計(jì)算機(jī)的一切資源直到作業(yè)完成

9、為止,因此調(diào)度作業(yè)時(shí)不必考慮它所需要的資源是否得到滿足,它所占用的 CPU時(shí)限等因素。4) 每個(gè)作業(yè)由一個(gè)作業(yè)控制塊JCB表示,JCB可以包含如下信息:作業(yè)名、提交時(shí)間、所需的運(yùn)行時(shí)間、所需的資源、作業(yè)狀態(tài)、鏈指針等等。作業(yè)的狀態(tài)可以是等待W(Wait)、運(yùn)行R(Run)和完成F(Finish)三種狀態(tài)之一。每個(gè)作業(yè)的最初狀態(tài)總是等待W。5) 對(duì)每種調(diào)度算法都要求打印每個(gè)作業(yè)開始運(yùn)行時(shí)刻、完成時(shí)刻、周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間,以及這組作業(yè)的平均周轉(zhuǎn)時(shí)間及帶權(quán)平均周轉(zhuǎn)時(shí)間,并比較各種算法的優(yōu)缺點(diǎn)。3、 實(shí)驗(yàn)設(shè)計(jì)方案及原理首先本次實(shí)驗(yàn)將會(huì)選擇單道作業(yè)調(diào)度,所以不需要考慮內(nèi)存分配情況以及磁帶機(jī)分配情況,

10、因?yàn)樵趩蔚勒{(diào)度中,只要作業(yè)被調(diào)進(jìn)內(nèi)存之后,它就會(huì)一直到完成才可以調(diào)出內(nèi)存。在程序中采用先來先服務(wù)算法和高響應(yīng)比優(yōu)先算法,利用switch語句選擇將要采取的方法。對(duì)于先來先服務(wù)算法,首先按照每個(gè)作業(yè)的到達(dá)時(shí)間,采取先到達(dá)先被調(diào)度的原則,知道其完成再輪到下一個(gè)最先到達(dá)的作業(yè),將其調(diào)入內(nèi)存。對(duì)于高響應(yīng)比優(yōu)先算法,首先將最先到達(dá)的作業(yè)先調(diào)入內(nèi)存,當(dāng)?shù)谝粋€(gè)作業(yè)完成時(shí)候,在這一刻利用算法計(jì)算出剩下的作業(yè)在此時(shí)的響應(yīng)比,只把響應(yīng)比最高的作業(yè)調(diào)入內(nèi)存。以此類推,每一次完成一個(gè)作業(yè)之后都計(jì)算剩下的作業(yè)在此刻的響應(yīng)比,以此調(diào)入,知道結(jié)束。最后得出平均周轉(zhuǎn)時(shí)間及帶權(quán)平均周轉(zhuǎn)時(shí)間。4、 程序流程圖 FCFS算法: N

11、Y5、 HRNN算法: Y N Y N6、 各程序之間的調(diào)用關(guān)系Main函數(shù)開始,當(dāng)選擇1采用先來先服務(wù)算法時(shí),調(diào)用FCFS方法,再調(diào)用initial方法,建立作業(yè)控制塊隊(duì)列,先將其排成先來先服務(wù)的模式隊(duì)列,根據(jù)該方法選擇出最先到達(dá)的作業(yè),調(diào)用running方法進(jìn)行運(yùn)行,計(jì)算作業(yè)運(yùn)行后的完成時(shí)間,周轉(zhuǎn)時(shí)間等等,再調(diào)用調(diào)用disp()方法,顯示作業(yè)運(yùn)行情況,當(dāng)作業(yè)運(yùn)行結(jié)束時(shí)調(diào)用free方法釋放內(nèi)存。當(dāng)采用高響應(yīng)比算法時(shí),調(diào)用HRRN方法,再調(diào)用initial方法,建立作業(yè)控制塊隊(duì)列,先將其排成先來先服務(wù)的模式隊(duì)列,在調(diào)用super方法計(jì)算出每個(gè)時(shí)刻的各作業(yè)響應(yīng)比,選擇響應(yīng)比最大的作業(yè)調(diào)用runn

12、ing方法,計(jì)算作業(yè)運(yùn)行后的完成時(shí)間,周轉(zhuǎn)時(shí)間等等,再調(diào)用調(diào)用disp()方法,顯示作業(yè)運(yùn)行情況,當(dāng)作業(yè)運(yùn)行結(jié)束時(shí)調(diào)用free方法釋放內(nèi)存。最后當(dāng)全部作業(yè)都運(yùn)行結(jié)束,調(diào)用final方法,最后打印作業(yè)的平均周轉(zhuǎn)時(shí)間,平均帶權(quán)周轉(zhuǎn)時(shí)間,程序結(jié)束,退出程序。6、重要數(shù)據(jù)結(jié)構(gòu)或源程序中疑難部分的說明,需附詳細(xì)注釋void super() /計(jì)算隊(duì)列中各個(gè)作業(yè)的響應(yīng)比 JCB *padv; padv=ready; do if(padv->state='W'&&(padv->rtime)<=times) /*當(dāng)作業(yè)狀態(tài)為W(等待)時(shí)且其到達(dá)時(shí)間小于上一作業(yè)

13、完成時(shí)間,也就是現(xiàn)在這個(gè)時(shí)刻 padv->super=(float)(times-padv->rtime+padv->ntime)/padv->ntime; /*計(jì)算方法為(等待時(shí)間+需要運(yùn)行的時(shí)間)/需要運(yùn)行的時(shí)間,從而得出響應(yīng)比; padv=padv->next; /指針指向下一個(gè)作業(yè),計(jì)算每一個(gè)作業(yè)的響應(yīng)比 while(padv!=NULL); 7、 程序運(yùn)行結(jié)果先來先服務(wù)算法: 高響應(yīng)比算法 8、 結(jié)果分析與實(shí)驗(yàn)小結(jié)結(jié)果分析:對(duì)于FCFS算法,由于各個(gè)作業(yè)的到達(dá)時(shí)間為依此遞增,根據(jù)先到先服務(wù),所以他們的運(yùn)行次序?yàn)?,2,3,4,5。對(duì)于HRRN算法,先將第

14、一個(gè)到達(dá)的作業(yè)運(yùn)行,待結(jié)束后計(jì)算出個(gè)作業(yè)的響應(yīng)比,所以他們的運(yùn)行次序?yàn)?,2,3,5,4. 實(shí)驗(yàn)小結(jié):此次試驗(yàn)的兩種算法原理比較簡(jiǎn)單,說以實(shí)現(xiàn)起來不算太難。通過實(shí)驗(yàn),我可以從程序上更好地深刻了解兩種方法的原理。兩種方法比較,我更加傾向于先來先服務(wù)算法,由于其簡(jiǎn)單,在一般的練習(xí)中他的計(jì)算也更加簡(jiǎn)單。但是,高響應(yīng)比算法則是既考慮了作業(yè)等待時(shí)間,又考慮作業(yè)運(yùn)行時(shí)間的調(diào)度算法,既照顧了短作業(yè),又不致使長(zhǎng)作業(yè)的等待時(shí)間過長(zhǎng),從而改善了處理機(jī)調(diào)度的性能,雖然在考試中它的計(jì)算比較復(fù)雜。所以,有利必有失,每種算法都有其優(yōu)點(diǎn),但也有令學(xué)生有種比較復(fù)雜的感覺。實(shí)驗(yàn)三 儲(chǔ)存管理(最佳適應(yīng)算法)1、 實(shí)驗(yàn)?zāi)康?、通過

15、編寫和調(diào)試存儲(chǔ)管理的模擬程序以加深對(duì)存儲(chǔ)管理方案的理解。熟悉虛存管理的各種頁面淘汰算法。2、通過編寫和調(diào)試地址轉(zhuǎn)換過程的模擬程序以加強(qiáng)對(duì)地址轉(zhuǎn)換過程的了解。2、 實(shí)驗(yàn)內(nèi)容及要求1:設(shè)計(jì)一個(gè)請(qǐng)求頁式存儲(chǔ)管理方案。并編寫模擬程序?qū)崿F(xiàn)之。產(chǎn)生一個(gè)需要訪問的指令地址流。它是一系列需要訪問的指令的地址。為不失一般性,你可以適當(dāng)?shù)兀ㄓ萌斯ぶ付ǖ胤椒ɑ蛴秒S機(jī)數(shù)產(chǎn)生器)生成這個(gè)序列,使得 50的指令是順序執(zhí)行的。25的指令均勻地散布在前地址部分,25的地址是均勻地散布在后地址部分。 2:為簡(jiǎn)單起見。頁面淘汰算法采用 FIFO頁面淘汰算法,并且在淘汰一頁時(shí),只將該頁在頁表中抹去。而不再判斷它是否被改寫過,也不將

16、它寫回到輔存。 3:具體的做法可以是: 產(chǎn)生一個(gè)需要訪問的指令地址流; 指令合適的頁面尺寸(例如以 1K或2K為1頁); 指定內(nèi)存頁表的最大長(zhǎng)度,并對(duì)頁表進(jìn)行初始化; 每訪問一個(gè)地址時(shí),首先要計(jì)算該地址所在的頁的頁號(hào),然后查頁表,判斷該頁是否在主存如果該頁已在主存,則打印頁表情況;如果該頁不在主存且頁表未滿,則調(diào)入一頁并打印頁表情況;如果該頁不在主存且頁表已滿,則按 FIFO頁面淘汰算法淘汰一頁后調(diào)入所需的頁,打印頁表情況; 逐個(gè)地址訪問,直到所有地址訪問完畢。3、 實(shí)驗(yàn)設(shè)計(jì)方案及原理最佳適應(yīng)算法循環(huán)首次適應(yīng)算法每次為作業(yè)分配內(nèi)存時(shí),總是先把能滿足要求又是最小的空閑分區(qū)分配給作業(yè),避免大材小用

17、。為了加上尋找,該算法要求將所有的空閑分區(qū)按容量從小到大的順序形成一空閑分區(qū)連。這樣,第一次找到的能滿足要求的空閑分區(qū)必然是最佳的。雖然如此,但是最佳算法并非是最佳的。因?yàn)槊看畏峙浜笏懈钕聛淼氖S嗖糠挚偸亲钚〉模@樣在儲(chǔ)存器中會(huì)留下許多難以利用的碎片。設(shè)計(jì)結(jié)構(gòu)體分別顯示已分配分區(qū)以及空閑分區(qū),將空閑分區(qū)按照大小排序起來,其次可以根據(jù)要求事先確定最大作業(yè)數(shù)以及空閑區(qū)表,每個(gè)分區(qū)都根據(jù)接下來的算法執(zhí)行相應(yīng)程序,打印出來,當(dāng)回收內(nèi)存時(shí)重新比較空閑分區(qū)大小,在下一次作業(yè)需要分配內(nèi)存時(shí)即可將最佳的分區(qū)分配給它。 循環(huán)首次適應(yīng)算法是首次適應(yīng)算法的變種。在分配內(nèi)存空間時(shí),不需要再每次從表頭(鏈?zhǔn)祝╅_始查找

18、,而是從上次找到空閑區(qū)的下一個(gè)空閑開始查找,直到找到第一個(gè)能滿足要求的的空閑區(qū)為止,并從中劃出一塊與請(qǐng)求大小相等的內(nèi)存空間分配給作業(yè)。此算法旨在分配平均內(nèi)存,能使內(nèi)存中的空閑區(qū)分布得較均勻。在該算法中,首先確定內(nèi)存總大小,再把主存中所有空閑區(qū)按其物理地址遞增的次序排列。在為作業(yè)分配存儲(chǔ)空間時(shí),從上次找到的空閑分區(qū)的下一個(gè)空閑分區(qū)開始查找,直到找到第一個(gè)能滿足要求的空閑區(qū),從中劃出與請(qǐng)求的大小相等的存儲(chǔ)空間分配給相應(yīng)的作業(yè),余下的空閑區(qū)仍留在空閑區(qū)表或鏈中。根據(jù)提示需要進(jìn)行釋放內(nèi)存或者分配內(nèi)存。4、 程序流程圖最佳適應(yīng)算法: 否 是5、 程序流程圖循環(huán)首次適應(yīng)算法: 否 是 是 是 否6、 各程

19、序之間的調(diào)用關(guān)系最佳適應(yīng)算法:首先從main函數(shù)開始,輸入總內(nèi)存大小。根據(jù)選擇輸入數(shù)字獲取相應(yīng)操作。在分配內(nèi)存中,調(diào)用F方法,在該方法中先尋找是否還有剩余足夠多的內(nèi)存,當(dāng)有時(shí)在尋找尋找空間大于該作業(yè)的最小空閑區(qū),進(jìn)行分配。當(dāng)回收內(nèi)存時(shí),調(diào)用H方法進(jìn)行回收。首先確定回收作業(yè)名字,查找該作業(yè)的已分配分區(qū),然后回收內(nèi)存,將作業(yè)名改為0。循環(huán)首次適應(yīng)算法:首先從main函數(shù)開始,調(diào)用init方法初始化內(nèi)存大小和空閑分區(qū)鏈的頭結(jié)點(diǎn),其中在init方法中調(diào)用genti方法一起進(jìn)行。因?yàn)殚_始分配空間內(nèi)存時(shí)需要調(diào)用genti方法。黨作業(yè)需要分配內(nèi)存時(shí),調(diào)用allocmem方法進(jìn)行分配,并且調(diào)用check函數(shù)進(jìn)

20、行監(jiān)督檢查,當(dāng)輸入數(shù)據(jù)有誤時(shí)及時(shí)制止;同理當(dāng)需要進(jìn)行釋放內(nèi)存時(shí)調(diào)用realse函數(shù),同時(shí)調(diào)用check函數(shù)一起運(yùn)行。根據(jù)每次輸入輸出都需要打印出當(dāng)前界面,空閑分區(qū)表,空閑分區(qū)鏈等信息。7、 重要數(shù)據(jù)結(jié)構(gòu)或源程序中疑難部分的說明,需附詳細(xì)注釋最佳適應(yīng)算法void F(char J,float xk) /*采用最佳分配算法分配該作業(yè)大小的空間*/ int i,k; float ad; k=-1; for(i=0; i<m; i+) /*尋找空間大于該作業(yè)的最小空閑區(qū)*/ if(free_tablei.length>=xk&&free_tablei.flag=1)/僅當(dāng)空

21、閑分區(qū)內(nèi)存大于所需分配的內(nèi)存時(shí) if(k=-1|free_tablei.length<free_tablek.length) k=i; if(k=-1) /*未找到可用空閑區(qū),返回*/ printf("內(nèi)存不足n"); return; /*開始分配:若空閑區(qū)大小與要求分配的空間差小于msize大小,則空閑區(qū)全部分配; 若空閑區(qū)大小與要求分配的空間差大于msize大小,則從空閑區(qū)劃出一部分分配*/ if(free_tablek.length-xk<=minisize) free_tablek.flag=0; ad=free_tablek.address;/將可以分

22、配的內(nèi)存分配給作業(yè),并將該分區(qū)地址表示為作業(yè)地址 xk=free_tablek.length; else free_tablek.length=free_tablek.length-xk; ad=free_tablek.address+free_tablek.length; /*修改已分配區(qū)表*/ i=0; while(used_tablei.flag!=0&&i<n) /*空表目*/ i+; if(i>=n) /*已經(jīng)沒有表目可填寫已分配分區(qū)*/ printf("錯(cuò)誤n"); /*修正空閑區(qū)表*/ if(free_tablek.flag=0)

23、/*前面找到的是整個(gè)空閑分區(qū)*/ free_tablek.flag=1; else /*前面找到的是某個(gè)空閑分區(qū)的一部分*/ free_tablek.length=free_tablek.length+xk; return; else /*修改已分配表*/ used_tablei.address=ad; used_tablei.length=xk; used_tablei.flag=J; return;循環(huán)首次適應(yīng)算法bool release(MEM *pm, int base, int size)/釋放內(nèi)存空間8、 MEM 

24、;*p = pm;  /指針p指向結(jié)構(gòu)體分區(qū)鏈表節(jié)點(diǎn)9、  if(!check(pm, base ,size)   return false; 10、    while(p->next)  /鏈表連接,逐漸拓展分配內(nèi)存11、  if(base + size <= p->next->base)   /上一個(gè)空閑分區(qū)的下一個(gè)空閑分區(qū)12、

25、  break;  13、  p = p->next;/滿足時(shí)分配,指針指向下一個(gè)分區(qū)14、    15、  if(base = p->base + p->size)/低地址相鄰,高地址分開 16、   if(p ->next && p->next->base = base + size)17、 /釋放區(qū)上

26、下都相鄰,將鏈表中地址按相連順序一一釋放  18、   p->size += size + p->next->size;  19、   temp = p->next; 20、    p->next = p->next->next;  21、   free(temp); 22、   els

27、e/僅與低地址相鄰    23、 p->size += size;  24、   25、 else if (p->next && p->next->base = base +size)/僅高地址相鄰  26、  p->next->base = base;   p->next->size

28、 += size;  27、 else28、 /*釋放區(qū)上下與空閑區(qū)都不相鄰 ,釋放后指針向前,這樣才可以滿足下一次分配時(shí)在前一個(gè)分區(qū)的下一個(gè)空閑分區(qū)開始查找空閑分區(qū)。*/29、   temp = getMEM(); 30、   temp->size = size; 31、   temp->base = base; 32、   temp->next = p->next;  33、  p->next = temp;  34、     35、  

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論