rt-linux中使用mlockall与free的差异

调用 mlockall(MCL_CURRENT|MCL_FUTURE) 后,动态申请的内存并非绝对得不到释放,但与常规内存释放相比,存在一些特殊情况和注意事项。

  1. mlockall 函数作用

    • mlockall 函数用于将当前进程的部分或全部虚拟内存锁定在物理内存中,防止它们被交换到磁盘的交换空间(swap)。这在一些对内存访问实时性要求极高的应用场景中很有用,比如实时控制系统、金融交易系统等,避免因内存交换导致的性能抖动。
    • MCL_CURRENT 标志表示锁定当前已映射的内存页面,MCL_FUTURE 标志表示锁定将来映射的内存页面。
  2. 动态内存释放情况

    • 正常释放操作 :从内存管理角度,动态分配内存(如使用 mallocnew 等函数)的释放机制本身并未改变。当你调用相应的内存释放函数(如 free 对应 mallocdelete 对应 new)时,从进程的虚拟地址空间角度,这些内存区域被标记为可重用,相关的内存控制块等数据结构会被清理。例如:
c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>

int main() {
    // 锁定当前和未来内存
    mlockall(MCL_CURRENT | MCL_FUTURE);

    char *ptr = (char *)malloc(1024);
    // 使用ptr
    free(ptr);

    // 解锁内存(如果需要)
    munlockall();
    return 0;
}
复制代码
- **物理内存锁定影响**:然而,由于 `mlockall` 的作用,这些被释放的内存对应的物理内存页面可能不会立即被系统回收以供其他进程使用。因为它们被锁定在物理内存中,直到调用 `munlockall` 函数解除锁定,或者进程终止。在这期间,这些物理内存虽然对于本进程来说已经释放(虚拟地址空间可重用),但在系统层面,它们仍被标记为被该进程占用。
  1. 注意事项
    • 内存泄漏风险 :如果在调用 mlockall 后,没有正确释放动态分配的内存(忘记调用释放函数),不仅会导致进程虚拟地址空间的内存泄漏,由于物理内存也被锁定,这部分内存将一直被占用,直到进程结束,可能会对系统整体内存资源造成浪费。
    • 系统资源管理 :过度使用 mlockall 锁定大量内存可能会导致系统物理内存紧张,影响其他进程的运行。特别是在多进程环境下,需要谨慎使用,并根据系统实际内存资源进行合理规划。

总之,调用 mlockall(MCL_CURRENT|MCL_FUTURE) 后,动态申请内存的释放逻辑与常规情况一致,但物理内存的释放会受到锁定状态的影响。在使用完毕后,应适时调用 munlockall 释放锁定的物理内存,以确保系统内存资源的合理利用。

相关推荐
呆呆的小鳄鱼6 分钟前
leetcode:冗余连接 II[并查集检查环][节点入度]
算法·leetcode·职场和发展
墨染点香6 分钟前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
沧澜sincerely7 分钟前
排序【各种题型+对应LeetCode习题练习】
算法·leetcode·排序算法
CQ_07127 分钟前
自学力扣:最长连续序列
数据结构·算法·leetcode
弥彦_23 分钟前
cf1925B&C
数据结构·算法
Y40900143 分钟前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记
YuTaoShao44 分钟前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
退役小学生呀1 小时前
十五、K8s可观测能力:日志收集
linux·云原生·容器·kubernetes·k8s
van叶~1 小时前
Linux探秘坊-------15.线程概念与控制
linux·运维·服务器
Andy杨3 小时前
20250718-1-Kubernetes 应用程序生命周期管理-应用部署、升级、弹性_笔记
linux·docker·容器