動態分割槽分配

2021-07-13 03:05:09 字數 3745 閱讀 3200

一.實驗目的

1.通過這次實驗,加深對動態分割槽分配的理解,進一步掌握首次適應演算法和最佳適應演算法的理解。了   解動態分割槽分配方式中使用的資料結構和分配演算法,進一步加深對動態分割槽儲存管理方式及其實現   過程的理解。提高學生設計實驗、發現問題、分析問題和解決問題的能力。

2.學會可變式分割槽管理的原理是在處理作業過程中建立分割槽,使分割槽大小正好適合作業的需求。

3.當乙個作業執行完成後,作業所佔的分割槽應歸還給系統。

二.實驗原理

首次適應演算法

以空閒分割槽鏈為例來說明採用ff

演算法時的分配情況。

ff演算法要求空閒分割槽鏈以位址遞增的次序鏈結。在分配記憶體時,從鏈首開始順序查詢,直至找到乙個大小能滿足要求的分割槽為止;然後再按照作業的大小,從該分取中劃出一塊記憶體空間分配給請求者,餘下的空閒分割槽仍留在空閒鏈中。若從鏈首直到鏈尾都不能找到乙個能滿足要求的分割槽,則此次記憶體分配失敗,返回。該演算法傾向於優先利用記憶體中低位址部分的空閒分割槽,從而保留了高址部分的大空閒區。這給為以後到達的大作業分配大的記憶體空間創造了條件,其缺點是低址部分不斷被劃分,會留下許多難以利用的、很小的空閒分割槽,而每次查詢又都是從低址部分開始,這無疑會增加查詢可用空閒分割槽時的開銷。

最佳適應演算法

所謂「最佳」是指每次為作業分配記憶體時,總是把能滿足要求、又是最小的空閒分割槽分配給作業,避免「大材小用」。為了加速尋找,該演算法要求將所有的空閒分割槽按其容量以從小到大的順序形成以空閒分割槽鏈。這樣,第一次找到的能滿足要求的空閒區,必然是最佳的。孤立地看,最佳適應演算法似乎是最佳的,然而在巨集觀上卻不一定。因為每次分配後所割下來的剩餘部分總是最小的,這樣,在儲存器中會留下許多難以利用的開銷。

三.實驗流程圖

首次適用演算法

最佳適用演算法

四.程式清單(vs 2013)

#define _crt_secure_no_warnings 1

#include#includeenum state ; 

struct subareanode 

subhead;

// 初始化空閒分割槽鏈

void intsubarea()

// 首次適應演算法

int firstfit(int taskid, int size)

else 

p->nxt = node;

// 分配空閒區間

p->size = size;

p->state = busy;

p->taskid = taskid;

}printf("記憶體分配成功!\n");

return 1;

}p = p->nxt;

}printf("找不到合適的記憶體分割槽,分配失敗...\n");

return 0;} 

// 最佳適應演算法

int bestfit(int taskid, int size)

p = p->nxt;

}if (tar != null) 

else

tar->nxt = node;

// 分配空閒區間

tar->size = size;

tar->state = busy;

tar->taskid = taskid;

}printf("記憶體分配成功!\n");

return 1;

}else} 

int freesubarea(int taskid)     // **記憶體

free(pp);

}else if ((p->pre == &subhead || p->pre->state == busy)

&& (p->nxt != null && p->nxt->state == free)) 

free(pp);

}else if ((p->pre != &subhead && p->pre->state == free)

&& (p->nxt == null || p->nxt->state == busy)) 

free(pp);

}else

}p = p->nxt;

}if (flag == 1)

else } 

// 顯示空閒分割槽鏈情況

void showsubarea()

else

printf("**\n");

p = p->nxt;

}printf("*********************************************\n");} 

int main()

else if (option == 1)

else

}// 模擬動態分割槽分配演算法

while (1)

// 呼叫分配演算法

if (option == 0) 

else 

// 顯示空閒分割槽鏈情況

showsubarea();

}else if (ope == 2)

else 

}printf("分配演算法模擬結束\n");

system("pause");

return 0;

}

五.實驗結果截圖

經過多次記憶體後:

**作業1和作業4後

此時分兩種情況分別模擬首次使用演算法和最佳使用演算法為作業6分配40kb記憶體:

模擬首次適應演算法:

最佳適用演算法:

六.結果分析

通過多個分割槽分配,當**作業1釋放100k空間,**作業4釋放80k空間後,再為作業6分配40k空間。首次適用演算法會優先拿作業1釋放的100k空間為作業6分配記憶體。最佳適用演算法則會優先拿作業4釋放的80k空間為作業6分配記憶體。

根據實驗得出結論,首次適用演算法是從空閒分割槽表

的頭指標開始查詢,把最先能夠滿足要求的空閒區分配給作業。該演算法優先使用低址部分空閒區,在低址空間造成許多小的空閒區,在高位址空間

保留大的空閒區,此演算法比較節省時間。

最佳適用演算法將可利用空閒表中乙個不小於「請求」且最接近"請求"的空閒區的一部分分配給使用者。分配與**都需要對可利用空閒表從頭至尾查詢一遍。在分配時容易產生太小而無法利用的記憶體碎片,同時這種做法也保留了那些很大的記憶體塊以備響應將來發生的記憶體量較大的使用者的請求。這種分配演算法適合請求分配記憶體大小範圍較廣的系統,此演算法最費時間。

動態分割槽分配

動態分割槽分配是根據程序的實際需要,動態的為之分配記憶體的空間。總體是按照演算法規則找到分配的空閒分割槽,然後從該分割槽中再按照作業的大小劃出一塊記憶體空間分給作業,該分割槽餘下的空閒分割槽當做乙個新的空閒分割槽留在空閒鏈中。當作業按照演算法規則分配好了後,等作業執行完畢釋放記憶體,系統根據 區的首...

動態分割槽分配演算法

動態分割槽分配演算法 一.順序搜尋的動態分割槽分配演算法 1.首次適應演算法 first fit 演算法思想 將空閒分割槽鏈以位址遞增的順序連線 在進行記憶體分配時,從鏈首開始順序查詢,直到找到一塊分割槽的大小可以滿足需求時,按照該作業的大小,從該分割槽中分配出記憶體,將剩下的空閒分割槽仍然鏈在空閒...

動態分割槽分配演算法

1.首次適應演算法 ff 2.迴圈首次適應演算法 nf 和首次適應演算法的區別就是,在為程序分配記憶體空間的時候,不再是都從鏈首開始查詢,而是從上次找到的空閒的分割槽的下乙個空閒分割槽開始查詢,直到找到乙個能滿足要求的空閒分割槽。3.最佳適應演算法 bf 將所有的空閒空間按其容量從小到大的順序形成一...