关于内存池感觉网上资料好乱,内存分配和释放的有关问题,求大神指教(分不多了)
关于内存池感觉网上资料好乱,内存分配和释放的问题,求大神指教(分不多了)
我是按照这个图来学的,不知道对不对。
1、最开始节点是需要的时候malloc创建,并没比直接使用malloc有优势。
2、如果多线程对内存进行申请需要同步吗?如果同时在一条链表中申请多块内存,不互斥的话不容易把节点添加进去
3、如果节点的时候free掉内存吗?
(1)free掉了,感觉没意义了,不free的话又占内存
(2)不free掉的话,是不是修改节点指针,把节点放到最后
回答一个也行,拜托了。。。
------解决方案--------------------
预分配大内存给程序使用 降低在运行的时候频繁跟系统申请内存造成的碎片 影响效能
------解决方案--------------------
个人认为,内存池不存在通用解决方案,他只适用于特定的应用环境。这些环境都有对内存频繁申请和释放的情况。
而且用malloc处理做内存池也不一定靠谱,因为malloc分配的是虚拟内存,操作系统啥时候把他交换到磁盘你不能控制。
而应该用操作系统本身提供的api函数,来管理内存池,以便你可以控制内存不被交换出去。
各方实现c运行库的malloc和free函数本身就支持了一定的内存池功能。我个人倾向于直接增加内存条简单有效低成本来解决问题。这类情况一般多是64位的服务器系统。
不合理的内存池方案,导致物理内存块长期锁定,反而可能造成更大的内存碎片。操作系统一定比ring3层的应用程序更懂硬件,更懂内存管理。
------解决方案--------------------
这是一个内存池,仅供参考
我是按照这个图来学的,不知道对不对。
1、最开始节点是需要的时候malloc创建,并没比直接使用malloc有优势。
2、如果多线程对内存进行申请需要同步吗?如果同时在一条链表中申请多块内存,不互斥的话不容易把节点添加进去
3、如果节点的时候free掉内存吗?
(1)free掉了,感觉没意义了,不free的话又占内存
(2)不free掉的话,是不是修改节点指针,把节点放到最后
回答一个也行,拜托了。。。
------解决方案--------------------
预分配大内存给程序使用 降低在运行的时候频繁跟系统申请内存造成的碎片 影响效能
------解决方案--------------------
个人认为,内存池不存在通用解决方案,他只适用于特定的应用环境。这些环境都有对内存频繁申请和释放的情况。
而且用malloc处理做内存池也不一定靠谱,因为malloc分配的是虚拟内存,操作系统啥时候把他交换到磁盘你不能控制。
而应该用操作系统本身提供的api函数,来管理内存池,以便你可以控制内存不被交换出去。
各方实现c运行库的malloc和free函数本身就支持了一定的内存池功能。我个人倾向于直接增加内存条简单有效低成本来解决问题。这类情况一般多是64位的服务器系统。
不合理的内存池方案,导致物理内存块长期锁定,反而可能造成更大的内存碎片。操作系统一定比ring3层的应用程序更懂硬件,更懂内存管理。
------解决方案--------------------
这是一个内存池,仅供参考