开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

解决内存碎片问题

简介:
+关注继续查看

经常的new delete 导致可用内存越来越小, 这就是内存碎块
就是内存有各种各样大小不一样的节点 ,
长时间在 new delete 这时候操作系统 在内存,
上分一块内存给你, 分出去了 好几块,内存紧张了, 释放这中间 就有一些内存用不了
就是有一些很小的空闲内存, 但是你申请的空间 可能就比他们要大,
什么东西需要防止内存碎片呢?一般需要大量数据节点的,都需要自己的缓冲池
也就是根据系统的负载开一块很大的内存出来,比如一个在线用户的信息 节点
因为你一天的活跃用户可能上万,但是当前可能在线的可能只有三千,五千
也就是你一天 会有成千上万的用户 上线, 如果去冲击系统的new malloc
,那么就会造成内存碎片为了 解决这个文件,就要对这些节点做缓冲池**

解决内存碎片问题

代码设计

#define MAX_SESSION_NUM 6000  //缓冲池大小
#define my_malloc malloc 
#define my_free free

//用户节点结构体
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 ;

//清空内存
    memset(&session_manager, 0, sizoef(session_manager));
    //将6000节点  一次缓冲池分配出来 
    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));
        //把没有使用的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;
    //可用的 缓冲池 必须是有节点 才能分配
    if (session_manager.free_list != NULL){
        s = session_manager.free_list;
        //因为free_list 指向缓冲池里最后一个节点
        //分配一个后 这个可用缓冲池 就指向上一个缓冲节点  
        session_manager.free_list = s->_next;
    }
    else{
    //当可用缓冲池用完,防止程序奔溃 在极少数的情况下
    //这时候就要调用系统的分配内存   
    //少次数的调用malloc  不会引发内存碎片
        s = my_malloc(sizeof(struct  session));

    }
    //情况当前内存信息  应为可能存在使用情况
    memset(s,0, sizeof(struct session));
    return s;
}

static void cache_free(struct session* s)
{
    //判断是从 cache 分配的 还是从系统 malloc分配的
    //只需要判断 他的内存范围 是不是在这个分配的内存里面
    if (s >= session_manager.cache_mem && s < session_manager.cache_mem + MAX_SESSION_NUM)
    {
        //内存不释放  
        //当前使用的 上一个就是申请时 赋值给free_list的
        s->_next = session_manager.free_list;
        //记录当前这个节点
        session_manager.free_list = s;

    }
    else{//系统分配的
        my_free(s);
    }
}

这是上面的调试信息
解决内存碎片问题

 本文转自超级极客51CTO博客,原文链接:http://blog.51cto.com/12158490/2057439,如需转载请自行联系原作者





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JSB内存管理
<p style="margin-top:0px; margin-bottom:22px; line-height:24px; font-size:15px; color:rgb(51,51,51); font-family:'Microsoft Yahei','冬青黑体简体中文 w3',宋体"> 原文地址:<a target="_blank" href="http://www.coco
1338 0
VB6中从内存中(Byte 字节数组)加载图片
从内存(字节数组)加载图片<br><br>Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long<br>Private Declare Function OleLoadPictu
2206 0
内存管理
内存管理 内存提供了一种存储信息的方式。 根据怎样使处理器能快速访问存储的数据,计算机存储设备可分为如下几类: 1)处理器寄存器 2)处理器缓存 3)RAM 4)本地磁盘存储 5)经网络连接的数据存储 有三种级别的内存管理: 1)机器级 内存由一系列的读写单元所组成。
665 0
【5. 虚拟内存管理】
题目描述 : 页面大小为4k, 分配给每个进程的物理页面是1. 在一个进程中, 定义了如下的二维数组 int A[1024][1024]. 该数组按行存放在内存, 每一行放在一个页面中. 考虑一下程序的编写方法对缺页率的影响?
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载