內存管理實驗總結

1、首次適應算法:

空閒分區鏈以地址遞增的次序鏈接,在分配內存時,從鏈首開始查找,直至找到一個大小能滿足要求的空閒分區鏈爲止;然後再按照作業的大小,從該分區中劃出一塊內存空間分配給請求者,餘下的空閒分區仍留在空閒鏈中。若從鏈首直至鏈尾都不能找到一個能滿足要求的空閒分區,則此次內存分配失敗,返回。

2、循環首次適應算法:

在爲進程分配內存空間時,不是每次都從鏈首開始查找,而是從上次找到的空閒分區的下一個空閒分區開始查找,直至找到一個能滿足要求的空閒分區,從中劃出一塊玉請求大小相等的內存空間分配給作業。

3、最佳適應算法:

把能滿足要求又是最小的空閒分區分配給作業使用,要求所有的空閒分區按其容量以小到大的順序形成一個空閒分區鏈。

4、最壞適應算法:

每次挑選一個最大的空閒分區分割給作業使用,要求將所有的空閒分區按其容量以從大到小的順序形成一空閒分區鏈。

5、回收內存方式

(1)回收區與插入點的前一個空閒分區F1相鄰接,將回收區與插入點的前一分區合併,不必爲回收區分配新表項,而只需修改其前一分區F1的大小。

(2)回收區與插入點的後一空閒分區F2相鄰接,將兩分區合併,形成新的空閒分區,但用回收區的首址作爲新空閒分區的首址,大小爲兩者之和。

(3)回收區同時與插入點的前、後兩個分區鄰接,此時將三個分區合併,使用F1的表項和F1的首址,取消F2的表項,大小爲三者之和。

(4)回收區既不與F1鄰接,又不與F2鄰接。這時應爲回收區單獨建立一新表項,填寫回收區的首址和大小,並根據其首址插入到空閒鏈中的適當位置。

雙鏈表初始化函數Initblock():初始化雙鏈表,並將系統區0到56MB-1的內存地址空間分配給頭結點,將56MB到256MB的地址空間分配給尾節點。

清空內存變量,數據初始化函數clearNC():清空帶頭結點的雙鏈表,以便再次使用。

初始化內存函數ChuShiHuaNC(DIZHI,DIZHI):將申請單的空閒塊插入雙鏈表中,修改尾指針的地址和大小。

輸出當前內存塊數據的函數show():將當前內存塊數據輸出。

隨機數產生函數RandTest():產生服從正太分佈的內存塊隨機數大小,和回收地址,等待利用。再此將申請內存的大小存入文件中。

首次適應算法函數int First_fit(unsigned long zDX):利用首次適應算法的思想,實現內存分配;

循環首次適應算法函數int Next_fit(unsigned long zDX):利用循環首次適應算法思想,實現內存分配;

排序函數void Sort_Array(int ud):實現按內存大小升序和降序排序以及按ID升序排序;

最佳適應算法int Best_fit(unsigned long zDX):按最佳適應算法的思想,實現內存分配;

最壞適應算法int Worst_fit(unsigned long zDX):按最壞適應算法的思想,實現內存分配;

申請內存int ShenQingNC(unsigned long zDX,int m):根據所選擇的算法和申請內存塊的大小來申請內存;

回收內存int HuiShouNC(DIZHI zKSDZ):按照四種內存回收策略來進行內存的回收,修改地址,狀態位和大小;

記錄每一個ID被申請的次數void PrintID(int m):按ID被申請次數記錄;

產生區間[min,max]內的隨機數double Rand(int min,int max);

正太分佈函數double normal(double x, double miu,double sigma);

產生服從正太分佈隨機數的函數double randn(double miu,double sigma, int min ,int max);

將最後分區內存表輸出到文件void Print1();

空閒分區表的建立void InitNC(int m):根據隨機數,決定回收或者申請內存,若是申請內存,則根據選擇的算法來實現內存申請,如實回收內存,則根據回收地址來進行內存的回收。再次記錄內存利用率,存入文件中。

每次條用內存分配算法的適合記錄查詢次數,最終存入文件中。

最後將存入文件的結果利用MATLAB處理之後,以圖形化的方式展示。



1、首次適應算法傾向於優先利用內存中地址部分的空閒分區,從而保留了高址部分的大空閒區,這給爲以後到達的大作業分配大的空閒空間創造了條件。其缺點是低址部分不斷被劃分,會留下許多難以利用的、很小的空閒分區,而每次查找又都是從地址部分開始,會增加查找可用空閒分區的開銷。

2、循環首次適應算法使內存分區分佈得更均勻,從而減少了查找空閒分區時的開銷,但這會缺乏大的空閒分區。

3、最佳適應算法每次分配後所切割下來的剩餘部分總是最小的,但是,在存儲器中會留下許多難以利用的小空閒區。

4、最壞適應算法查找時只需看第一個空閒分區能否被利用,查找優越,但是,會使存儲器中缺乏大的空閒分區。

由結果分析可知:隨着平均申請內存空間的增加,每個算法的平均查找次數都會趨近於某個值,但是循環首次適應算法查找次數是最少的,最壞適應算法其次,然後是首次適應算法,查找次數最多的是最佳適應算法。

隨着平均申請內存空間的增加,每個算法的內存平均利用率都會區域某個值,但是,當申請的內存空間較大,申請次數較多的時候,內存平均利用率最高的是最佳適應算法,其次是首次適應算法,然後是最壞適應算法,最差的是循環首次適應算法。

隨着申請次數的增加,內存平均利用率也會增加,每個算法在不同的情況下都會體現出自己的優勢,每個算法都會有內存平均利用率最高的時候。

當申請的內存塊比較小,申請次數比較少的時候,利用首次適應算法內存利用率較高,當申請的平均內存塊大小較大,申請次數較多的時候,使用循環首次適應算法內存利用率較高,當申請的平均內存塊大小較大,申請次數較少的時候,使用最壞適應算法內存利用率較高,最佳適應算法適合於申請內存空間較大,申請次數也非常多的時候,其內存利用率較高,但此時選用其他算法內利用率也高。

總之,各種算法都有其有點,也有其缺點,沒有一種算法在任何情況下都是最有的,這四個算法也不是在任何情況下平均內存利用率大小都是固定不變的,在不同的情況下體現出不同的優先,也存在不同的缺點。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章