您好,登錄后才能下訂單哦!
《UNIX環(huán)境高級編程》
在大部分操作系統(tǒng)中,內(nèi)存分配由以下兩個簡單的函數(shù)來處理:
void *malloc (long numbytes):該函數(shù)負(fù)責(zé)分配 numbytes 大小的內(nèi)存,并返回指向第一個字節(jié)的指針。
void free(void *firstbyte):如果給定一個由先前的 malloc 返回的指針,那么該函數(shù)會將分配的空間歸還給進(jìn)程的“空閑空間”。
malloc和free大量使用后回造成內(nèi)存碎片,那么這種碎片形成的原理是什么? ??
如果機理是申請的內(nèi)存空間大?。ㄌ。┧纬傻?,那么,申請多大的區(qū)域能夠最大限度的避免內(nèi)存碎片呢?(這里的避免不是絕對的避免,只是一種概率)
?
內(nèi)存碎片一般是由于空閑的連續(xù)空間比要申請的空間小,導(dǎo)致這些小內(nèi)存塊不能被利用。 ??
產(chǎn)生內(nèi)存碎片的方法很簡單,舉個例: ??
假設(shè)有一塊一共有100個單位的連續(xù)空閑內(nèi)存空間,范圍是0~99。如果你從中申請一塊內(nèi)存,如10個單位,那么申請出來的內(nèi)存塊就為0~9區(qū)間。這時候你繼續(xù)申請一塊內(nèi)存,比如說5個單位大,第二塊得到的內(nèi)存塊就應(yīng)該為10~14區(qū)間。 ??
如果你把第一塊內(nèi)存塊釋放,然后再申請一塊大于10個單位的內(nèi)存塊,比如說20個單位。因為剛被釋放的內(nèi)存塊不能滿足新的請求,所以只能從15開始分配出20個單位的內(nèi)存塊。 ??
現(xiàn)在整個內(nèi)存空間的狀態(tài)是0~9空閑,10~14被占用,15~24被占用,25~99空閑。其中0~9就是一個內(nèi)存碎片了。如果10~14一直被占用,而以后申請的空間都大于10個單位,那么0~9就永遠(yuǎn)用不上了,造成內(nèi)存浪費。 ??
??
如果你每次申請內(nèi)存的大小,都比前一次釋放的內(nèi)村大小要小,那么就申請就總能成功。 ??
有的人喜歡自己編寫內(nèi)存管理模塊,程序一開始就申請一大塊內(nèi)存,然后以后申請內(nèi)存都在這個大內(nèi)存中取,配合一定的技巧來減少內(nèi)存碎片問題。
一般按頁為單位,4k ??
malloc ? ,operator ? new ? 這些都有自己的分配策略,只要不是使用系統(tǒng)API,而是用庫,則一般來說不用自己考慮
?
一般情況如果你申請的內(nèi)存都是比較大,而且比較有規(guī)律的話(比如你只申請16k和4k兩種大小的內(nèi)存)就沒問題。不過這樣的話就要你自己加一個層次來處理這些大內(nèi)存了。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。