【操作系統】內存分配的五種算法比較

最簡單的算法是首次適配(first fit)算法。存儲管理器沿着段鏈表進行搜索,直到找到一個足夠大的空閒區,除非空閒區大小和要分配的空間大小正好一樣,否則將該空閒區分爲兩部分,一部分供進程使用,另一部分形成新的空閒區。首次適配算法是一種速度很快的算法,因爲它儘可能少地搜索鏈表結點。

對首次適配算法進行很小的修改就可以得到下次適配(next fit)算法。它的工作方式和首次適配算法相同,不同點是每次找到合適的空閒區時都記錄當時的位置。以便在下次尋找空閒區時從上次結束的地方開始搜索,而不是像首次適配算法那樣每次都從頭開始。Bays(1977)的仿真程序證明下次適配算法的性能略低於首次適配算法。

另一個著名的並廣泛應用的算法是最佳適配(best fit)算法。最佳適配算法搜索整個鏈表(從開始到結束),找出能夠容納進程的最小的空閒區。最佳適配算法試圖找出最接近實際需要的空閒區,以最好地區配請求和可用空閒區,而不是先拆分一個以後可能會用到的大的空閒區。

因爲每次調用最佳適配算法時都要搜索整個鏈表,所以它要比首次適配算法慢。讓人感到有點意外的是它比首次適配算法或下次適配算法浪費更多的內存,因爲它會產生大量無用的小空閒區。一般情況下,首次適配算法生成的空閒區更大一些。

最佳適配的空閒區會分裂出很多非常小的空閒區,爲了避免這一問題,可以考慮最差適配(worst fit)算法,即總是分配最大的可用空閒區,使新的空閒區比較大從而可以繼續使用。仿真程序表明最差適配算法也不是一個好主意。

如果爲進程和空閒區維護各自獨立的鏈表,那麼這四個算法的速度都能得到提高。這樣就能集中精力只檢查空閒區而不是進程。但這種分配速度的提高的一個不可避免的代價就是增加複雜度和內存釋放速度變慢,因爲必須將一個回收的段從進程鏈表中刪除並插入空閒區鏈表。

如果進程和空閒區使用不同的鏈表,則可以按照大小對空閒區鏈表排序,以便提高最佳適配算法的速度。在使用最佳適配算法搜索由小到大排列的空閒區鏈表時,只要找到一個合適的空閒區,則這個空閒區就是能容納這個作業的最小的空閒區,因此是最佳適配。因爲空閒區鏈表以單鏈表形式組織,所以不需要進一步搜索。空閒區鏈表按大小排序時,首次適配算法與最佳適配算法一樣快,而下次適配算法在這裏則毫無意義。

在與進程段分離的單獨鏈表中保存空閒區時,可以做一個小小的優化。不必那樣用單獨的數據結構存放空閒區鏈表,而可以利用空閒區存儲這些信息。每個空閒區的第一個字可以是空閒區大小,第二個字指向下一個空閒區。於是就不再需要圖3-6c中所示的那些三個字加一位(P/H)的鏈表結點了。

另一種分配算法稱爲快速適配(quick fit)算法,它爲那些常用大小的空閒區維護單獨的鏈表。例如,有一個n項的表,該表的第一項是指向大小爲4KB的空閒區鏈表表頭的指針,第二項是指向大小爲8KB的空閒區鏈表表頭的指針,第三項是指向大小爲12KB的空閒區鏈表表頭的指針,以此類推。像21KB這樣的空閒區既可以放在20KB的鏈表中,也可以放在一個專門存放大小比較特別的空閒區的鏈表中。

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