新聞中心
《UNIX環(huán)境高級(jí)編程》

在大部分操作系統(tǒng)中,內(nèi)存分配由以下兩個(gè)簡(jiǎn)單的函數(shù)來處理:
void *malloc (long numbytes):該函數(shù)負(fù)責(zé)分配 numbytes 大小的內(nèi)存,并返回指向第一個(gè)字節(jié)的指針。
void free(void *firstbyte):如果給定一個(gè)由先前的 malloc 返回的指針,那么該函數(shù)會(huì)將分配的空間歸還給進(jìn)程的“空閑空間”。
malloc和free大量使用后回造成內(nèi)存碎片,那么這種碎片形成的原理是什么? ??
如果機(jī)理是申請(qǐng)的內(nèi)存空間大?。ㄌ。┧纬傻模敲?,申請(qǐng)多大的區(qū)域能夠大限度的避免內(nèi)存碎片呢?(這里的避免不是絕對(duì)的避免,只是一種概率)
內(nèi)存碎片一般是由于空閑的連續(xù)空間比要申請(qǐng)的空間小,導(dǎo)致這些小內(nèi)存塊不能被利用。 ??
產(chǎn)生內(nèi)存碎片的方法很簡(jiǎn)單,舉個(gè)例: ??
假設(shè)有一塊一共有100個(gè)單位的連續(xù)空閑內(nèi)存空間,范圍是0~99。如果你從中申請(qǐng)一塊內(nèi)存,如10個(gè)單位,那么申請(qǐng)出來的內(nèi)存塊就為0~9區(qū)間。這時(shí)候你繼續(xù)申請(qǐng)一塊內(nèi)存,比如說5個(gè)單位大,第二塊得到的內(nèi)存塊就應(yīng)該為10~14區(qū)間。 ??
如果你把第一塊內(nèi)存塊釋放,然后再申請(qǐng)一塊大于10個(gè)單位的內(nèi)存塊,比如說20個(gè)單位。因?yàn)閯偙会尫诺膬?nèi)存塊不能滿足新的請(qǐng)求,所以只能從15開始分配出20個(gè)單位的內(nèi)存塊。 ??
現(xiàn)在整個(gè)內(nèi)存空間的狀態(tài)是0~9空閑,10~14被占用,15~24被占用,25~99空閑。其中0~9就是一個(gè)內(nèi)存碎片了。如果10~14一直被占用,而以后申請(qǐng)的空間都大于10個(gè)單位,那么0~9就永遠(yuǎn)用不上了,造成內(nèi)存浪費(fèi)。 ??
??
如果你每次申請(qǐng)內(nèi)存的大小,都比前一次釋放的內(nèi)村大小要小,那么就申請(qǐng)就總能成功。 ??
有的人喜歡自己編寫內(nèi)存管理模塊,程序一開始就申請(qǐng)一大塊內(nèi)存,然后以后申請(qǐng)內(nèi)存都在這個(gè)大內(nèi)存中取,配合一定的技巧來減少內(nèi)存碎片問題。
一般按頁為單位,4k ??
malloc ? ,operator ? new ? 這些都有自己的分配策略,只要不是使用系統(tǒng)API,而是用庫,則一般來說不用自己考慮
一般情況如果你申請(qǐng)的內(nèi)存都是比較大,而且比較有規(guī)律的話(比如你只申請(qǐng)16k和4k兩種大小的內(nèi)存)就沒問題。不過這樣的話就要你自己加一個(gè)層次來處理這些大內(nèi)存了。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章題目:malloc與free-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://www.dlmjj.cn/article/eggjs.html


咨詢
建站咨詢
