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 释放锁定的物理内存,以确保系统内存资源的合理利用。

相关推荐
老鱼说AI7 分钟前
算法基础教学第一步:数据结构
数据结构·python·算法
Jing_Rainbow23 分钟前
【LeetCode Hot100 刷题日记(19/100)】54. 螺旋矩阵 —— 数组、矩阵、模拟、双指针、层序遍历🌀
算法·面试·程序员
Yue丶越33 分钟前
【C语言】自定义类型:联合体与枚举
c语言·开发语言
橘子真甜~1 小时前
C/C++ Linux网络编程8 - epoll + ET Reactor TCP服务器
linux·服务器·网络
万变不离其宗_81 小时前
centos 手动安装redis
linux·redis·centos
Bona Sun1 小时前
单片机手搓掌上游戏机(十五)—pico运行fc模拟器之编译环境
c语言·c++·单片机·游戏机
_lst_1 小时前
linux进程状态
linux·运维·服务器
贝塔实验室1 小时前
红外编解码彻底解析
网络·嵌入式硬件·信息与通信·信号处理·代码规范·基带工程·精益工程
地平线开发者1 小时前
征程 6 | linear 高精度输出配置方式
算法·自动驾驶
小尧嵌入式2 小时前
C++基础语法总结
开发语言·c++·stm32·单片机·嵌入式硬件·算法