个人网站建设 实验报告,泉州网站建设技术支持,网页制作三剑客是哪三个,网站建设 趋势内存池技术
操作系统在运行进程的过程中#xff0c;会产生内存碎片#xff0c;降低了内存的使用率。内存池技术就是为了解决/减少内存碎片的一种方法#xff0c;内部底层的具体实现根据不同业务场景使用不要的方式#xff0c;以下是一种好理解的方式#xff0c;供大家一起…内存池技术
操作系统在运行进程的过程中会产生内存碎片降低了内存的使用率。内存池技术就是为了解决/减少内存碎片的一种方法内部底层的具体实现根据不同业务场景使用不要的方式以下是一种好理解的方式供大家一起学习。
内存碎片
产生的原因过程
内存碎片分为内部内存碎片和外部内存碎片。我们一般说的内存碎片指的是外部内存碎片。外部内存碎片指的是操作系统连续malloc出来的内存中间有free部分而这些free出来的部分暂时无法重新被使用。
Linux下运行一个进程的内存分配的过程 进程运行时操作系统先将代码和全局数据、静态数据加载到代码段和数据段中然后开始读取代码一步步执行遇到局部变量操作系统会在栈中开辟对应的内存空间遇到malloc申请的内存会在堆中开辟相应大小的空间。
解决方法——内存池技术
链表化
将堆的内存空间分成多段大小相同的内存块存放在链表结构中:
struct MemNode{void *m_ptr;bool flag;MemNode *next;
}//内存分配的时候
MemNode node new MemNode;
node.m_ptr malloc(1024);
node.flag true; // 表示该结点被占用
add_node(head, node); //内存释放的时候
node search(head, ptr); // 找到释放的node将标志位置成false
node.flag false; // 标志位为false的空间可以被使用1、实现原理将malloc出来的Node放在链表中并将标志位置成true释放的时候只需要将标志位置成false。下次再有malloc的时候会遍历链表找到第一块内存大于需要分配的内存块且标志位为false的node直接使用。 2、解决的问题 1一定程度上减少了操作系统反复malloc/free开辟释放空间 2避免了内存碎片的产生 3、缺点 1内存没有高效利用 2每次查找需要O(n)的时间复杂度
2^n分配法 红黑树
struct MemNode{void *m_ptr;bool flag;rbTree_nodeMemNode treeNode;MemNode *next;
}struct HeadTable{MemNode *list;int size;
}struct MemTable{HeadTable[6];rbTreeMemNode tree;
}1、实现原理将malloc出来的Node放在链表中并将标志位置成true释放的时候只需要将标志位置成false。下次再有malloc的时候会遍历链表找到第一块内存大于需要分配的内存块且标志位为false的node直接使用。 2、解决的问题 1一定程度上提高了内存利用率 2红黑树的查找效率为O(logn)也可以使用hash、b树、b树、skip-table 3、缺点 1极端场景分配的内存集中在某一个范围假设一直分配512的大小那么小的内存都将没有利用到。所有这种场景许哟啊根据实际情况进行2^n的分配和制定。
大内存块向小内存块分离小内存块向大内存块整合的问题
1、大内存块向小内存块分离 这种场景可以将大内存进行折半分解比较容易 2、小内存块向大内存块整合 这种场景不好整合因为内存的地址可能不连续。所以需要尽量去避免根据具体的内存使用场景及生命周期采用合理的技术。