版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、學(xué)校代碼:學(xué) 號: 3課程設(shè)計題 目:主存空間的分配與回收學(xué)生姓名: 學(xué) 院: 系 別: 專 業(yè): 班 級: 指導(dǎo)教師: 2011年12月30日內(nèi)蒙古工業(yè)大學(xué)課程設(shè)計任務(wù)書(三)學(xué)院(系):信息學(xué)院計算機(jī)系 課程名稱:操作系統(tǒng)課程設(shè)計 指導(dǎo)教師(簽名): 專業(yè)班級: 軟件工程 0902班 學(xué)生姓名: 學(xué)號: 一、課程設(shè)計題目主存空間的分配與回收二、課程設(shè)計的目的通過該課程設(shè)計使學(xué)生理解在不同的存儲管理方式下,如何實(shí)現(xiàn)主存空間的分配與回收。使學(xué)生初步具有研究、設(shè)計、編制和調(diào)試操作系統(tǒng)模塊的能力。 三、課程設(shè)計的主要內(nèi)容和要求(包括原始數(shù)據(jù)、技術(shù)參數(shù)、設(shè)計要求、工作量要求等) 原始數(shù)據(jù):空閑區(qū)說明
2、表結(jié)構(gòu)體。 技術(shù)參數(shù):Windows XP系統(tǒng),VC+6.0開發(fā)工具。設(shè)計要求: 1 設(shè)計基于空閑區(qū)說明表的可變分區(qū)分配與回收算法;2 或設(shè)計基于空閑區(qū)鏈表的可變分區(qū)分配與回收算法;3 畫出以上算法流程圖;4 編程實(shí)現(xiàn)算法功能;5編寫課程設(shè)計說明書。 工作量要求:完成以上設(shè)計要求中的所有算法功能。四、工作進(jìn)度安排 周一:布置、講解題目,收集資料;周二:系統(tǒng)分析,算法設(shè)計;周三:編制、調(diào)試程序;周四:測試系統(tǒng),形成設(shè)計結(jié)論,編寫課設(shè)報告;周五:系統(tǒng)及材料驗(yàn)收,課設(shè)答辯。五、主要參考文獻(xiàn)1 張堯?qū)W編計算機(jī)操作系統(tǒng)教程(第三版)習(xí)題解答與實(shí)驗(yàn)指導(dǎo)北京:清華大學(xué)出版社,20062 湯子瀛主編計算機(jī)操作
3、系統(tǒng)(第三版)西安:西安電子科技大學(xué)出版社,2001 3 張坤等編操作系統(tǒng)實(shí)驗(yàn)教程北京:清華大學(xué)出版社,2008審核批準(zhǔn)意見系(教研室)主任(簽字) 摘要在內(nèi)存初始化完成以后,內(nèi)存中就常駐有內(nèi)核映象(內(nèi)核代碼和數(shù)據(jù))。以后,隨著用戶程序的執(zhí)行和結(jié)束,就需要不斷地分配和釋放物理頁面。內(nèi)核應(yīng)該為分配一組連續(xù)的頁面而建立一種穩(wěn)定、高效的分配策略。為此,必須解決一個比較重要的內(nèi)存管理問題,即外碎片問題。頻繁地請求和釋放不同大小的一組連續(xù)頁面,必然導(dǎo)致在已分配的內(nèi)存塊中分散許多小塊的空閑頁面。由此帶來的問題是,即使這些小塊的空閑頁面加起來足以滿足所請求的頁面,但是要分配一個大塊的連續(xù)頁面可能就根本無法滿
4、足。Linux采用著名的伙伴(Buddy)系統(tǒng)算法來解決外碎片問題。但是請注意,在Linux中,CPU不能按物理地址來訪問存儲空間,而必須使用虛擬地址;因此,對于內(nèi)存頁面的管理,通常是先在虛存空間中分配一個虛存區(qū)間,然后才根據(jù)需要為此區(qū)間分配相應(yīng)的物理頁面并建立起映射,也就是說,虛存區(qū)間的分配在前,而物理頁面的分配在后,但是為了承接上一節(jié)的內(nèi)容,我們先介紹內(nèi)存的分配和回收,然后再介紹用戶進(jìn)程虛存區(qū)間的建立。分配效率、碎片問題是操作系統(tǒng)中內(nèi)存分配的兩大問題。一個好的分配器應(yīng)該能夠快速地滿足各種大小的分配要求,同時不能產(chǎn)生大量的碎片浪費(fèi)空間?;跀?shù)據(jù)結(jié)構(gòu)中的伙伴系統(tǒng)的分配與回收思想給出了一個有效的
5、算法。關(guān)鍵字:操作系統(tǒng) 內(nèi)存分配 首次適應(yīng)算法 磁盤存儲管理目錄第一章 課程設(shè)計簡介11.1 課程設(shè)計的目的11.2 課程設(shè)計內(nèi)容2第二章 需求分析32.1 硬件需求32.2 軟件需求32.3 設(shè)計需求3第三章 概要設(shè)計43.1算法設(shè)計思想43.2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計5第四章 詳細(xì)設(shè)計64.1 菜單模塊64.2 分配方法模塊84.2.1首次適應(yīng)算法分配概念84.2.2 數(shù)據(jù)流程圖84.2.3 核心代碼84.3 內(nèi)存釋放模塊94.3.1概念94.3.2 釋放區(qū)與上下臨界區(qū)的關(guān)系94.3.3 數(shù)據(jù)流程圖104.3.4 核心代碼11第五章 程序運(yùn)行問題及解決辦法結(jié)果135.1 程序運(yùn)行出現(xiàn)的問題及解決辦
6、法問題135.2運(yùn)行結(jié)果截圖13六課程總結(jié)與體會心得186.1課程設(shè)計心得186.2 總結(jié)186.3致謝18七參考文獻(xiàn)19源代碼20第一章 課程設(shè)計簡介1.1 課程設(shè)計的目的通過該課程設(shè)計使學(xué)生理解在不同的存儲管理方式下,以及使學(xué)生加深對如何實(shí)現(xiàn)主存空間的分配與回收原理的理解。也使學(xué)生初步具有研究、設(shè)計、編制和調(diào)試操作系統(tǒng)模塊的能力。1.2 課程設(shè)計內(nèi)容編程序?qū)崿F(xiàn)下述在不同的存儲管理方式下的主存空間的分配與回收,其中原始數(shù)據(jù)設(shè)為空閑區(qū)說明表結(jié)構(gòu)體(1).設(shè)計基于空閑區(qū)說明表的可變分區(qū)分配與回收算法;(2).或設(shè)計基于空閑區(qū)鏈表的可變分區(qū)的分配與回收;第二章 需求分析2.1 硬件需求本系統(tǒng)適用于
7、現(xiàn)用的各種類型的計算機(jī),內(nèi)存容量建議為128MB以上,不必配備外部附加設(shè)備2.2 軟件需求VC+6.0開發(fā)工具2.3 設(shè)計需求 內(nèi)存的分配與回收是內(nèi)存管理的主要功能之一。無論采取哪一種管理和控制方式,能否把外存中的數(shù)據(jù)和程序調(diào)入內(nèi)存,取決于內(nèi)否在內(nèi)存中為他們安排合適的位置。因此,存儲管理模塊要為每一個并發(fā)執(zhí)行的進(jìn)程分配內(nèi)存空間。另外,當(dāng)進(jìn)程執(zhí)行結(jié)束之后,存儲管理模塊又要及時回收該進(jìn)程所占用的內(nèi)存資源,以便給其他進(jìn)程分配空間。但由于作業(yè)大大小不一,所以系統(tǒng)為作業(yè)分配內(nèi)存大小不一,在釋放時造成系統(tǒng)資源的浪費(fèi)。因此,采取首次適應(yīng)算法,以及那少內(nèi)存的浪費(fèi)。第三章 概要設(shè)計3.1算法設(shè)計思想初始化系統(tǒng)的
8、內(nèi)存分區(qū)說明表;輸入當(dāng)前作業(yè)或進(jìn)程的使用內(nèi)存情況,檢索系統(tǒng)內(nèi)的內(nèi)存分區(qū)說明表,判斷是否可分配,也就是查看是否有足夠的空閑空間,若有,則按需求量分割一部分給作業(yè);若無;則作業(yè)等待。隨著作業(yè)的裝入、完成,主存空間被分割成許多大大小小的分區(qū)。有的分區(qū)被作業(yè)占用,有的分區(qū)空閑。使用內(nèi)存的分配和回收算法進(jìn)行,完成所有作業(yè)或進(jìn)程的內(nèi)存使用請求,作業(yè)完成后回收其所占用的內(nèi)存給系統(tǒng);并可輸出查看內(nèi)存的當(dāng)前使用狀況。例如,某時刻主存空間占用情況如圖3-1所示。(1) 為了說明哪些分區(qū)是空閑的,可以用來裝入新作業(yè),必須要有一張空閑區(qū)說明表,如表3-1所示。操作系統(tǒng)(10KB)作業(yè)1(10KB)作業(yè)4(25KB)空
9、閑區(qū)1(20KB)作業(yè)2(45KB)空閑區(qū)2(146KB)起始地址長度狀態(tài)45K20KB未分配110K146KB未分配空表目空表目空表目010K20K45K65K110K256K3-1主存空間占用情況 表3-1 空閑區(qū)說明表其中,起始地址指出各空閑區(qū)的主存起始地址,長度指出空閑區(qū)大小。狀態(tài)有: 未分配:該欄目是記錄的有效空閑區(qū)。 空表目:沒有登記信息。由于分區(qū)個數(shù)不定,所以空閑區(qū)說明表中應(yīng)有足夠的空表目項(xiàng)。否則造成溢出,無法登記。同樣,再設(shè)一個已分配區(qū)表,記錄作業(yè)或進(jìn)程的主存占用情況。(2) 當(dāng)有一個新作業(yè)要求裝入主存時,必須查空閑區(qū)說明表,從中找出一個足夠大的空閑區(qū)。有時找到的空閑區(qū)可能大于
10、作業(yè)需求量,這時應(yīng)將空閑區(qū)一分為二。一個分給作業(yè);另一個仍作為空閑區(qū)留在空閑區(qū)表中。為了盡量減少由于分割造成的碎片,盡可能分配低地址部分的空閑區(qū),將較大空閑區(qū)留在高地址端,以利于大作業(yè)的裝入。為此在空閑區(qū)表中,按空閑區(qū)首地址從低到高進(jìn)行登記。為了便于快速查找,要不斷地對表格進(jìn)行緊縮,即讓“空表目”項(xiàng)留在表的后部。(3) 當(dāng)一個作業(yè)執(zhí)行完成時,作業(yè)所占用的分區(qū)應(yīng)歸還給系統(tǒng)。在歸還時要考慮相鄰空閑區(qū)合并的問題。作業(yè)的釋放區(qū)與空閑區(qū)的鄰接分以下4種情況考慮:A釋放區(qū)下鄰(低地址鄰接)空閑區(qū);B釋放區(qū)上鄰(高地址鄰接)空閑區(qū);C釋放區(qū)上下都與空閑區(qū)鄰接;D釋放區(qū)與空閑區(qū)不鄰接。3.2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計3
11、.2.1 區(qū)說明表的設(shè)計 struct freearea int startaddress; /*空閑區(qū)的起始地址號*/int size; /*空閑區(qū)的大小*/int state; /*空閑區(qū)狀態(tài):0為空表目,1為可用空閑塊*/freeblockN=100,100,1,10,10,1,300,50,0,20,35,1,250 ,30,1,600,200,0; 說明:設(shè)置空閑區(qū)為結(jié)構(gòu)體類型,并且為其初始化,構(gòu)成空閑區(qū)表的分區(qū)3.2.2 已分配區(qū)說明表設(shè)計 struct fullareaint address; /*分配作業(yè)的首地址*/int sizes; /*分配作業(yè)的大小*/fullblock
12、N;說明:設(shè)置已分配區(qū)說明表為結(jié)構(gòu)體類型,構(gòu)成已分配區(qū)表的分區(qū) 第四章 詳細(xì)設(shè)計4.1 菜單模塊 為了操作界面的人性化和美觀,為模擬系統(tǒng)開辟一個操作菜單,通過switch() case的方法來實(shí)現(xiàn),其核心代碼為int start;char t;while(c)system(cls);muen();printf(請選擇操作編號:);scanf(%d,&b);switch(b)case 1:system(cls);printf(n系統(tǒng)原有內(nèi)存空閑區(qū)分表和已分配表區(qū)如下:nn);order();order1();show();printf(n請輸入作業(yè)申請量:);scanf(%d,&a);order
13、();start=alloc(a,d);d+;if(start=-1)system(cls);printf(n1 內(nèi)存中沒有符合的空閑區(qū)可供分配!等待釋放內(nèi)存中n);Sleep(1*1000);system(cls);show();setfree();break;system(cls);printf(n1 系統(tǒng)采用最佳適應(yīng)算法正在為作業(yè)分配內(nèi)存中nn);Sleep(1*1000);system(cls);printf(n1 系統(tǒng)為作業(yè)分配內(nèi)存成功!:nn);order();order1();Sleep(1*1000);system(cls);break;case 2:system(cls);o
14、rder();show();setfree();system(cls);order1();for(i=0;i=XK?大于Y置狀態(tài)為“空表目”作業(yè)等待長度=長度XK始址=始址XK將空表目向后移返回登記已分配區(qū)表和空閑區(qū)表,輸出系統(tǒng)中各數(shù)據(jù)結(jié)構(gòu)的值。返回分配給作業(yè)的主存始址。 4.2.3 核心代碼 int alloc(int a,int b) int i,j,tag=0;j=b;for(i=0;ia) freeblocki.startaddress=freeblocki.startaddress+a;freeblocki.size=freeblocki.size-a;fullblockj.addr
15、ess=freeblocki.startaddress-a;fullblockj.sizes=a;tag=1;return freeblocki.startaddress-a;break;elseif (freeblocki.state=1&freeblocki.size=a) freeblocki.state=0;fullblockj.address=freeblocki.startaddress;fullblockj.sizes=a;tag=1;return freeblocki.startaddress;break;if(tag=0)return -1;4.3 內(nèi)存釋放模塊4.3.1概念
16、當(dāng)一個作業(yè)執(zhí)行完成時,作業(yè)所占用的分區(qū)應(yīng)歸還給系統(tǒng)。由于每個作業(yè)或進(jìn)程所用的內(nèi)存長度不一樣而出現(xiàn)大量分散,較小的空閑區(qū)。這樣造成內(nèi)存大量的浪費(fèi)。解決這個辦法之一就是在空閑區(qū)回收時,把不連續(xù)的空閑區(qū)集中起來。4.3.2 釋放區(qū)與上下臨界區(qū)的關(guān)系A(chǔ)釋放區(qū)下鄰(低地址鄰接)空閑區(qū):將釋放區(qū)與下空閑區(qū)合并,將其釋放區(qū)的首地址作為合并區(qū)的首地址,合并區(qū)的長度為釋放區(qū)與下空閑區(qū)長度之和。B釋放區(qū)上鄰(高地址鄰接)空閑區(qū):將釋放區(qū)與下空閑區(qū)合并,將其上臨區(qū)的首地址作為合并區(qū)的首地址,合并區(qū)的長度為釋放區(qū)與下空閑區(qū)長度之和。C釋放區(qū)上下都與空閑區(qū)鄰接:釋放區(qū)作為一個新的可用區(qū)插入可用表。D釋放區(qū)與空閑區(qū)不鄰接
17、:將三個空閑區(qū)合并為一個空閑區(qū),新空閑區(qū)的首地址為上空閑區(qū)的首地址,大小為三個空閑區(qū)之和。合并后,取消可用表下空閑區(qū),修改上空閑區(qū)的對應(yīng)項(xiàng)。4.3.3 數(shù)據(jù)流程圖開始S=釋放區(qū)始址L=釋放區(qū)長度查空閑區(qū)說明表有與釋放區(qū)的高地址鄰接(上鄰)的空閑區(qū)嗎?YN有與釋放區(qū)下鄰的空閑區(qū)嗎?L=L上鄰空閑區(qū)長度Y有與釋放區(qū)下鄰的空閑區(qū)嗎?在空閑區(qū)說明表中找一空表目登記:始址=S長度=L狀態(tài)=未分配YN把上鄰空閑區(qū)登記欄中的狀態(tài)置為“空表目”,且將空表目向后調(diào)整。把上鄰空閑區(qū)登記欄中的始址改為S,長度改為LN按地址順序調(diào)整和緊縮空閑區(qū)說明表上空閑區(qū)首地址為總地址,大小為兩個大小之和上空閑區(qū)首地址為總地址,大
18、小為兩個大小之和把下鄰空閑區(qū)登記欄中的長度改為:長度=長度L有等待裝入的作業(yè)嗎?Y喚醒等待的作業(yè)并返回N返回圖3-3 首次適應(yīng)算法回收框圖4.3.4 核心代碼voidsetfree() int s,l,i,j,k; /*tagl代表釋放區(qū)的高地址是否鄰接一個空閑區(qū),tag2代表釋放區(qū)的高低地址是否都鄰接一個空閑區(qū),tag3代表釋放區(qū)的低地址是否鄰接一個空閑區(qū)*/ printf(nn請輸入需要釋作業(yè)的首地址:); scanf(%d,&s); /*輸入釋放區(qū)的開始地址*/ printf(n輸入作業(yè)的大小:); scanf( %d,&l);/*輸入釋放區(qū)的大小*/for(k=0;kN;k+)if(f
19、ullblockk.address=s)if(fullblockk.sizes=l)fullblockk.address=0;fullblockk.sizes=0;break;elsefullblockk.sizes=fullblockk.sizes-l;break;if(k=N-1)printf(n輸入釋放作業(yè)開始地址不存在,請重新輸入!);setfree();return; for(i=0;iN;i+) if(freeblocki.startaddress+freeblocki.size=s&freeblocki.state=1)for(j=i+1;jN;j+)if(freeblockj.
20、startaddress=s+l& freeblockj.state=1)freeblocki.size=freeblocki.size+l+freeblockj.size;freeblockj.state=0;return;freeblocki.size=freeblocki.size+l;freeblocki.state=1;return;elsefor(j=0;jN;j+)if(freeblockj.startaddress=s+l& freeblockj.state=1)freeblockj.startaddress=s;freeblockj.size=freeblockj.size+
21、l;return;elseif(freeblockj.state=0)freeblockj.size=l;freeblockj.startaddress=s;freeblockj.state=1;return;第五章 程序運(yùn)行問題及解決辦法結(jié)果5.1 程序運(yùn)行出現(xiàn)的問題及解決辦法問題(1)程序運(yùn)行沒有按預(yù)期完成任務(wù),解決辦法是每次在對內(nèi)存的分配和會和回收之前和之后都要對空閑區(qū)按地址進(jìn)行排序(2)程序不能顯示作業(yè)狀況,解決辦法是為作業(yè)作一個已分配表用來存儲作業(yè)記錄(3)在進(jìn)行排序時,采用冒泡法進(jìn)行排序5.2運(yùn)行結(jié)果截圖 (1)主菜單(2)載入作業(yè)結(jié)結(jié)果 (1)(2)(3) 分配結(jié)果圖(4) 模擬
22、系統(tǒng)回收內(nèi)存(5) 回收結(jié)果顯示(1)(2)(6) 多分配結(jié)果(7) 多回收結(jié)果5.8 退出系統(tǒng)六課程總結(jié)與體會心得6.1課程設(shè)計心得在這次課程設(shè)計中,我們的收獲應(yīng)該說是非常大的。開始的時候我們在網(wǎng)上搜索了一些代碼。但是這個代碼語法本身有問題。但是由于對JAVA的使用不夠熟練,所以我們就用了比較熟悉的c語言。整個過程的代碼都是我們自己動腦筋寫的,最終代碼調(diào)試運(yùn)行成功,但是我們還是面臨一個很大的問題就是,源程序使用C編寫的,我們?nèi)绾斡脠D形化界面表示出來呢?我們查閱了相關(guān)資料并且動手實(shí)踐,但仍未解決,最后決定不使用圖形用戶界面。在這次實(shí)踐中,我們充分的意識到,編程功底的薄弱,只是粗淺的了解了語言,
23、只是會一些語法,在編程思想上,我們顯的很弱。在今后的學(xué)習(xí)中,一定要擴(kuò)大自己的知識面,如:多從網(wǎng)上尋找可實(shí)現(xiàn)的項(xiàng)目,同學(xué)之間組成團(tuán)隊(duì),多學(xué)習(xí),自己用代碼實(shí)現(xiàn);還有就是要精通一們語言,熟練掌握其數(shù)據(jù)結(jié)構(gòu),算法思想,以至于能夠熟練運(yùn)用。應(yīng)該說這是通過我們小組成員的共同努力和動腦完成的,雖然內(nèi)容并不是很復(fù)雜,但是我們覺得設(shè)計的過程相當(dāng)重要,學(xué)到了很多。我覺得課程設(shè)計反映的是一個從理論到實(shí)際應(yīng)用的過程,但是更遠(yuǎn)一點(diǎn)可以聯(lián)系到以后畢業(yè)之后從學(xué)校轉(zhuǎn)到踏上社會的一個過程。小組人員的配合相處,以及自身的動腦和努力,都是以后工作中需要的。6.2 總結(jié)在這次設(shè)計中遇到了很多實(shí)際性的問題,在實(shí)際設(shè)計中才發(fā)現(xiàn),書本上理
24、論性的東西與在實(shí)際運(yùn)用中的還是有一定距離的。一切問題必須要靠自己一點(diǎn)一滴的解決,而在解決的過程當(dāng)中你會發(fā)現(xiàn)自己在飛速的提升。程序設(shè)計是一個很靈活的東西,它反映了你解決問題的邏輯思維和創(chuàng)新能力,是一個設(shè)計的靈魂所在。通過這次課程設(shè)計我也發(fā)現(xiàn)了自身存在的不足之處,雖然感覺理論上已經(jīng)掌握,但在運(yùn)用到實(shí)踐的過程中仍有意想不到的困惑,經(jīng)過一番努力才得以解決??傊ㄟ^這次課程設(shè)計,我真的在實(shí)踐中學(xué)到的不僅是課本知識的鞏固和提高,而且還有在實(shí)踐中使我著手解決不少程序設(shè)計的細(xì)節(jié)問題。而這些問題是我在從低級的程序員向高級程序設(shè)計師過度的過程必須要解決的。而我個人認(rèn)為,我越早接觸,越多接觸,越快解決對我本人縮短
25、此過程有重要的意義。6.3致謝首先感謝兩位馬老師在這次課程設(shè)計中給予我們的指導(dǎo)和建議,在他的指導(dǎo)下我們順利的完成了本次課程設(shè)計!其次,要感謝我們同學(xué),在我們互相幫助之下,攻克了在課程設(shè)計中遇到的一個個難關(guān)!七參考文獻(xiàn)1. 教材1 張堯?qū)W主編計算機(jī)操作系統(tǒng)教程(第三版)北京:清華大學(xué)出版社,20062. 主要參考書 1 張堯?qū)W編計算機(jī)操作系統(tǒng)教程(第三版)習(xí)題解答與實(shí)驗(yàn)指導(dǎo)北京:清華大學(xué)出版社,20062 湯子瀛主編計算機(jī)操作系統(tǒng)(第三版)西安:西安電子科技大學(xué)出版社,2001 3 張坤等編操作系統(tǒng)實(shí)驗(yàn)教程北京:清華大學(xué)出版社,20084 張麗芬等編操作系統(tǒng)實(shí)驗(yàn)教程北京:清華大學(xué)出版社,2006
26、5 Andrew S.Tanenbaum. Modern Operating Systems, Second Edition.Englewood Cliffs,N.J,Prentice Hall, 20016 屠祁等編.操作系統(tǒng)基礎(chǔ)(第三版)北京:清華大學(xué)出版社,20007 馮耀霖等編.操作系統(tǒng).西安:西安電子科技大學(xué)出版社,20018 左萬歷計算機(jī)操作系統(tǒng)教程(第二版)北京:高等教育出版社,2004源代碼#include#include #define N 6struct freearea/*定義一個空閑區(qū)說明表結(jié)構(gòu),并初始化變量*/ int startaddress;/*空閑區(qū)始址*/in
27、t size;/*空閑區(qū)大小*/int state;/*空閑區(qū)狀態(tài):0為空表目,1為可用空閑塊*/freeblockN=100,100,1,10,10,1,300,50,0,20,35,1,250,30,1,600,200,0;struct fullareaint address;int sizes;fullblockN;void muen()printf(n*n);printf(* *n);printf(* 1模擬的主存空間的分配與回收1 *n);printf(* *n);printf(* *n);printf(* 1.載入作業(yè) 2.回收內(nèi)存 *n);printf(* *n);printf(
28、* 3.顯示分配回收結(jié)果 0.退出 *n);printf(* *n);printf(* *n);printf(* *n);printf(*n);void order()int j,i; struct freearea m; for(i=0;iN;i+)for(j=i; jfreeblockj.startaddress)m.startaddress=freeblockj.startaddress;m.size=freeblockj.size;m.state=freeblockj.state;freeblockj.startaddress=freeblocki.startaddress;freeb
29、lockj.size=freeblocki.size;freeblockj.state=freeblocki.state;freeblocki.startaddress=m.startaddress;freeblocki.size=m.size;freeblocki.state=m.state;for(i=0;iN;i+) for(j=0;jN;j+)if(freeblockj.state=0 & freeblockj+1.state=1)m.startaddress=freeblockj.startaddress;m.size=freeblockj.size;m.state=freebloc
30、kj.state;freeblockj.startaddress=freeblockj+1.startaddress;freeblockj.size=freeblockj+1.size;freeblockj.state=freeblockj+1.state;freeblockj+1.startaddress=m.startaddress;freeblockj+1.size=m.size;freeblockj+1.state=m.state;void order1()int j,i; struct fullarea m; for(i=0;iN;i+)for(j=i; jN; j+)if(full
31、blocki.addressfullblockj.address)m.address=fullblockj.address;m.sizes=fullblockj.sizes;fullblockj.address=fullblocki.address;fullblockj.sizes=fullblocki.sizes;fullblocki.address=m.address;fullblocki.sizes=m.sizes;void show()int i; printf( |n);printf( | 空閑區(qū)說明表 | 已分配區(qū)表 |n);printf( | | |n); printf( |st
32、artsizestate |start size |n); printf( |n);for(i=0;iN;i+) printf( |%3d%3d%3d |%3d %3d |n,freeblocki.startaddress, freeblocki.size, freeblocki.state,fullblocki.address, fullblocki.sizes);printf( | | |n); printf( |n);int alloc(int a,int b) /*定義為作業(yè)分配主存空間的函數(shù)alloc(),a為作業(yè)申請量*/int i,j,tag=0;/* tag為檢查是否有滿足作業(yè)
33、需要的空閑區(qū)的標(biāo)志,0表示滿,1表示未滿*/j=b;for(i=0;ia) /*檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū)*/freeblocki.startaddress=freeblocki.startaddress+a;freeblocki.size=freeblocki.size-a;fullblockj.address=freeblocki.startaddress-a;fullblockj.sizes=a;tag=1;/*有滿足條件的空閑區(qū)時,tag置1*/return freeblocki.startaddress-a;break;elseif (freeblocki.state
34、=1&freeblocki.size=a) freeblocki.state=0;fullblockj.address=freeblocki.startaddress;fullblockj.sizes=a;tag=1;/*有滿足條件的空閑區(qū)時,tag置1*/return freeblocki.startaddress;/*返回為作業(yè)分配的主存地址*/break;if(tag=0)return -1;voidsetfree() int s,l,i,j,k; /*tagl代表釋放區(qū)的高地址是否鄰接一個空閑區(qū),tag2代表釋放區(qū)的高低地址是否都鄰接一個空閑區(qū),tag3代表釋放區(qū)的低地址是否鄰接一個空
35、閑區(qū)*/ printf(nn請輸入需要釋作業(yè)的首地址:); scanf(%d,&s); /*輸入釋放區(qū)的開始地址*/ printf(n輸入作業(yè)的大小:); scanf( %d,&l);/*輸入釋放區(qū)的大小*/for(k=0;kN;k+)if(fullblockk.address=s)if(fullblockk.sizes=l)fullblockk.address=0;fullblockk.sizes=0;break;elsefullblockk.sizes=fullblockk.sizes-l;break;if(k=N-1)printf(n輸入釋放作業(yè)開始地址不存在,請重新輸入!);setfr
36、ee();return; for(i=0;iN;i+) if(freeblocki.startaddress+freeblocki.size=s&freeblocki.state=1)for(j=i+1;jN;j+)if(freeblockj.startaddress=s+l& freeblockj.state=1)freeblocki.size=freeblocki.size+l+freeblockj.size;freeblockj.state=0;return;freeblocki.size=freeblocki.size+l;freeblocki.state=1;return;elsef
37、or(j=0;jN;j+)if(freeblockj.startaddress=s+l& freeblockj.state=1)freeblockj.startaddress=s;freeblockj.size=freeblockj.size+l;return;elseif(freeblockj.state=0)freeblockj.size=l;freeblockj.startaddress=s;freeblockj.state=1;return;void main()int i,b,a,d=0,c=1;int start;char t;while(c)system(cls);muen();
38、printf(請選擇操作編號:);scanf(%d,&b);switch(b)case 1:system(cls);printf(n系統(tǒng)原有內(nèi)存空閑區(qū)分表和已分配表區(qū)如下:nn);order();order1();show();printf(n請輸入作業(yè)申請量:);scanf(%d,&a);order();start=alloc(a,d);d+;if(start=-1)system(cls);printf(n1 內(nèi)存中沒有符合的空閑區(qū)可供分配!等待釋放內(nèi)存中n);Sleep(1*1000);system(cls);show();setfree();break;system(cls);printf(n1 系統(tǒng)采用最佳適應(yīng)算法正在為作業(yè)分配內(nèi)存中nn);Sleep(1*1000);system(cls);printf(n1 系統(tǒng)為作業(yè)分配內(nèi)存成功!:nn);order();order1();Sleep(1*1
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 青海高等職業(yè)技術(shù)學(xué)院《高等化學(xué)反應(yīng)工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 青海柴達(dá)木職業(yè)技術(shù)學(xué)院《光電成像原理與技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 醫(yī)院物業(yè)管理及衛(wèi)生清潔要求
- 美工區(qū)活動中的多元文化教育實(shí)踐探索
- 多學(xué)科協(xié)作的延續(xù)性服務(wù)團(tuán)隊(duì)建設(shè)
- 青島農(nóng)業(yè)大學(xué)海都學(xué)院《法學(xué)導(dǎo)論I》2023-2024學(xué)年第一學(xué)期期末試卷
- 青島酒店管理職業(yè)技術(shù)學(xué)院《戲曲藝術(shù)概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 幼兒園美術(shù)葫蘆課程設(shè)計
- 環(huán)保型脈沖變壓器設(shè)計與生產(chǎn)技術(shù)
- 我愛郊游課程設(shè)計
- 圖文轉(zhuǎn)換-圖表(小題訓(xùn)練)(解析版)-2025年部編版中考語文一輪復(fù)習(xí)
- 七上語文期末考試復(fù)習(xí)計劃表
- 2024兒童青少年抑郁治療與康復(fù)痛點(diǎn)調(diào)研報告 -基于患者家長群體的調(diào)研
- 大數(shù)據(jù)+治理智慧樹知到期末考試答案章節(jié)答案2024年廣州大學(xué)
- 江蘇省建筑與裝飾工程計價定額(2014)電子表格版
- 山東省煙臺市2023-2024學(xué)年高二上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 壓力管道元件產(chǎn)品合格證
- 1000以內(nèi)自然數(shù)數(shù)數(shù)表
- 10KV變電站供電系統(tǒng)設(shè)計
- 起重機(jī)傳動裝置的設(shè)計
- 15立方米的液氯儲罐課程設(shè)計說明書
評論
0/150
提交評論