可變分割槽是指在程序裝入記憶體時,把可用的記憶體空間「切出」乙個連續的區域分配給程序,以適應程序大小的需要。整個記憶體分割槽的大小和分割槽的個數不是固定不變的,而是根據裝入程序的大小動態劃分。
空閒分割槽表為每個尚未分配出去的分割槽設定乙個表項,每個表項包括分割槽的序號,分割槽大小,分割槽起始位址。
空閒分割槽鏈在每個分割槽中設定用於控制分割槽分配的資訊以及用於鏈結各個分割槽的指標,將記憶體中的空閒分割槽鏈成乙個鍊錶。
1)首次適應演算法(first fit)
該演算法要求空閒分割槽以位址遞增的次序排序,分配時從表頭開始順序查詢,直到找到乙個能夠滿足程序大小的空閒分割槽為止,然後從程序中切出一塊記憶體空間分配給程序,餘下的空間仍然留在記憶體中。
優點:優先使用低位址的空閒空間,高位址部分很少利用,保證了高位址的留有較大的空閒分割槽
缺點:低位址部分不斷「切割」,使留下許多難以利用的空閒分割槽,而每次又都從低位址開始,這就會影響查詢的速度。
2)下次適應演算法(next fit)
該演算法從首次適應演算法演變過來,為了避免低位址小空閒部分分割槽的不斷增加,在給程序分配空間時,不再每次從表頭開始,而是從上次找到的空閒分割槽的下乙個空閒分割槽開始,直到找到乙個滿足要求的空閒分割槽,並從中「切出」一塊分配給程序。為了實現,要設定起始查詢指標,鍊錶的鏈結採用迴圈鍊錶。
優點:使記憶體得到比較均衡的使用,減少了查詢的開銷
缺點:會使記憶體缺少大的記憶體分割槽,導致大的程序執行不了
3)最佳適應演算法(best fit)
最佳適應演算法就是在剩下的空閒空間中按空閒的大小遞增的順序查詢滿足條件的最小的空閒分割槽分配給程序。
優點:第一次找到的空閒分割槽一定是最優的,系統中也可能保留較大的空閒空間
缺點:鍊錶的表頭會留下許多難以利用的小空閒區,而影響分配速度。
4)最壞適應演算法(worst fit)
最壞適應演算法和最佳適應演算法正好相反,按大小遞減的順序查詢
優點:基本上不會留下小空閒區,不會形成碎片
缺點:大的空閒區被切割,導致較大的程序不能滿足,無法執行
設定空閒分割槽的資料結構為空閒分割槽表:
struct block
block[
100]
;
初始化表頭的起始位址以及所有空閒分割槽大小的總和
設定首次適應演算法:
void
shoucishiyin()
//新的第i+1塊
block[i+1]
.flag=0;
block[i+1]
.addr=block[i]
.addr+size;
block[i+1]
.size=block[i]
.size-size;
//新的第i塊
block[i]
.flag=1;
block[i]
.size=size;
}break;}
display()
;}
此演算法執行的效果如下:
設定最佳適應演算法:
void
zuijiashiyin()
}if(block[index]
.size==size)
else
}break;}
display()
;}
在以上設計演算法的過程中,討論塊調出後記憶體的變化情況是最重要的,只有把全部情況考慮進去之後,才能將最佳適應演算法正確的設計出來
下面是我執行的一些結果:
重在理解,**實現方法有很多種。由於過了一段時間再做改動,就潦草結尾了,對不住各位了。一起加油!!!
記憶體動態分配
陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時,它所需要的內存在編譯時就被分配。但是,你也可以使用動態記憶體分配在執行時為它分配記憶體。malloc所分配的是一塊連續的記憶體。例如,如果請求它分配100個位元組的記憶體,那麼它實際分配的記憶體就是100個連續的位元組,並不會分開位於兩塊或多...
動態分配記憶體
動態記憶體分配即分配記憶體大小在執行時才確定,一般在堆中分配。c語言動態記憶體分配相關的函式。include void malloc size t size malloc的使用比較直接,乙個成功的malloc呼叫返回分配的size大小的記憶體的指標。失敗時返回null並將錯誤 置為enomem。教材...
動態分配記憶體
動態分配記憶體 動態分配記憶體也可以分配儲存區,這種方式可以在程式執行的時候臨時決定分配的儲存區大小 為了管理動態分配的記憶體,就需要使用一組標準函式 為了使用這些標準函式,需要包含stdlib.h標頭檔案 malloc 函式可以動態分配一組連續的位元組 這個函式需要乙個整數型別引數表示分配的位元組...