malloc與free

《UNIX環境高級編程》

在大部分操作系統中,內存分配由以下兩個簡單的函數來處理:
void *malloc (long numbytes):該函數負責分配 numbytes 大小的內存,並返回指向第一個字節的指針。
void free(void *firstbyte):如果給定一個由先前的 malloc 返回的指針,那麼該函數會將分配的空間歸還給進程的“空閒空間”。


malloc和free大量使用後回造成內存碎片,那麼這種碎片形成的原理是什麼?   
如果機理是申請的內存空間大小(太小)所形成的,那麼,申請多大的區域能夠最大限度的避免內存碎片呢?(這裏的避免不是絕對的避免,只是一種概率)

 

內存碎片一般是由於空閒的連續空間比要申請的空間小,導致這些小內存塊不能被利用。   

產生內存碎片的方法很簡單,舉個例:   
假設有一塊一共有100個單位的連續空閒內存空間,範圍是0~99。如果你從中申請一塊內存,如10個單位,那麼申請出來的內存塊就爲0~9區間。這時候你繼續申請一塊內存,比如說5個單位大,第二塊得到的內存塊就應該爲10~14區間。   
如果你把第一塊內存塊釋放,然後再申請一塊大於10個單位的內存塊,比如說20個單位。因爲剛被釋放的內存塊不能滿足新的請求,所以只能從15開始分配出20個單位的內存塊。   


現在整個內存空間的狀態是0~9空閒,10~14被佔用,15~24被佔用,25~99空閒。其中0~9就是一個內存碎片了。如果10~14一直被佔用,而以後申請的空間都大於10個單位,那麼0~9就永遠用不上了,造成內存浪費。   
  
如果你每次申請內存的大小,都比前一次釋放的內村大小要小,那麼就申請就總能成功。   


有的人喜歡自己編寫內存管理模塊,程序一開始就申請一大塊內存,然後以後申請內存都在這個大內存中取,配合一定的技巧來減少內存碎片問題。


一般按頁爲單位,4k   

malloc   ,operator   new   這些都有自己的分配策略,只要不是使用系統API,而是用庫,則一般來說不用自己考慮

 

一般情況如果你申請的內存都是比較大,而且比較有規律的話(比如你只申請16k和4k兩種大小的內存)就沒問題。不過這樣的話就要你自己加一個層次來處理這些大內存了。


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