溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何解決內(nèi)存碎片問(wèn)題

發(fā)布時(shí)間:2020-05-07 16:17:02 來(lái)源:億速云 閱讀:427 作者:Leah 欄目:編程語(yǔ)言

這篇文章主要為大家詳細(xì)介紹了解決內(nèi)存碎片問(wèn)題的方法,文中示例代碼介紹的非常詳細(xì),圖文詳解容易學(xué)習(xí),非常適合初學(xué)者入門。

經(jīng)常的new  delete 導(dǎo)致可用內(nèi)存越來(lái)越小, 這就是內(nèi)存碎塊
就是內(nèi)存有各種各樣大小不一樣的節(jié)點(diǎn) ,
長(zhǎng)時(shí)間在 new  delete 這時(shí)候操作系統(tǒng) 在內(nèi)存,
上分一塊內(nèi)存給你, 分出去了 好幾塊,內(nèi)存緊張了, 釋放這中間 就有一些內(nèi)存用不了
就是有一些很小的空閑內(nèi)存, 但是你申請(qǐng)的空間 可能就比他們要大,
什么東西需要防止內(nèi)存碎片呢?一般需要大量數(shù)據(jù)節(jié)點(diǎn)的,都需要自己的緩沖池
也就是根據(jù)系統(tǒng)的負(fù)載開一塊很大的內(nèi)存出來(lái),比如一個(gè)在線用戶的信息 節(jié)點(diǎn)
因?yàn)槟阋惶斓幕钴S用戶可能上萬(wàn),但是當(dāng)前可能在線的可能只有三千,五千
也就是你一天 會(huì)有成千上萬(wàn)的用戶 上線, 如果去沖擊系統(tǒng)的new malloc
,那么就會(huì)造成內(nèi)存碎片為了 解決這個(gè)文件,就要對(duì)這些節(jié)點(diǎn)做緩沖池**
如何解決內(nèi)存碎片問(wèn)題

代碼設(shè)計(jì)

#define MAX_SESSION_NUM 6000  //緩沖池大小
#define my_malloc malloc 
#define my_free free

//用戶節(jié)點(diǎn)結(jié)構(gòu)體
struct  session{
    char c_ip[32];
    int c_port;
    int c_sock;
    struct  session * _next;

};

struct {

    struct session* online_session;

    struct session* cache_mem; //緩存池

    struct session* free_list;  //鏈表頭指針

}session_manager ;

//清空內(nèi)存
    memset(&session_manager, 0, sizoef(session_manager));
    //將6000節(jié)點(diǎn)  一次緩沖池分配出來(lái) 
    session_manager.cache_mem = (struct session*)my_malloc(MAX_SESSION_NUM * sizeof(struct session));
    memset(session_manager.cache_mem, 0, MAX_SESSION_NUM * sizeof(struct session));
        //把沒(méi)有使用的list全部放在 free_list 鏈表
            for (int i = 0; i<MAX_SESSION_NUM;i++){
        session_manager.cache_mem[i]._next = session_manager.free_list;
        session_manager.free_list = &session_manager.cache_mem[i];

    }

    定義分配器
    static struct session* cache_alloc(){
    struct session*s = NULL;
    //可用的 緩沖池 必須是有節(jié)點(diǎn) 才能分配
    if (session_manager.free_list != NULL){
        s = session_manager.free_list;
        //因?yàn)閒ree_list 指向緩沖池里最后一個(gè)節(jié)點(diǎn)
        //分配一個(gè)后 這個(gè)可用緩沖池 就指向上一個(gè)緩沖節(jié)點(diǎn)  
        session_manager.free_list = s->_next;
    }
    else{
    //當(dāng)可用緩沖池用完,防止程序奔潰 在極少數(shù)的情況下
    //這時(shí)候就要調(diào)用系統(tǒng)的分配內(nèi)存   
    //少次數(shù)的調(diào)用malloc  不會(huì)引發(fā)內(nèi)存碎片
        s = my_malloc(sizeof(struct  session));

    }
    //情況當(dāng)前內(nèi)存信息  應(yīng)為可能存在使用情況
    memset(s,0, sizeof(struct session));
    return s;
}

static void cache_free(struct session* s)
{
    //判斷是從 cache 分配的 還是從系統(tǒng) malloc分配的
    //只需要判斷 他的內(nèi)存范圍 是不是在這個(gè)分配的內(nèi)存里面
    if (s >= session_manager.cache_mem && s < session_manager.cache_mem + MAX_SESSION_NUM)
    {
        //內(nèi)存不釋放  
        //當(dāng)前使用的 上一個(gè)就是申請(qǐng)時(shí) 賦值給free_list的
        s->_next = session_manager.free_list;
        //記錄當(dāng)前這個(gè)節(jié)點(diǎn)
        session_manager.free_list = s;

    }
    else{//系統(tǒng)分配的
        my_free(s);
    }
}

這是上面的調(diào)試信息
如何解決內(nèi)存碎片問(wèn)題

以上就是解決內(nèi)存碎片問(wèn)題的詳細(xì)介紹,內(nèi)容較為全面,而且我也相信有相當(dāng)?shù)囊恍┕ぞ呖赡苁俏覀內(nèi)粘9ぷ骺赡軙?huì)見(jiàn)到或用到的。通過(guò)這篇文章,希望你能收獲更多。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI