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

相关推荐
sheepwjl2 小时前
《嵌入式硬件(七):使用IMX6ULL所需环境以及编译方法》
单片机·嵌入式硬件·环境·.s编译
奔跑吧 android3 小时前
【linux kernel 常用数据结构和设计模式】【数据结构 2】【通过一个案例属性list、hlist、rbtree、xarray数据结构使用】
linux·数据结构·list·kernel·rbtree·hlist·xarray
汉克老师3 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
c++·算法·蓝桥杯·01背包·蓝桥杯c++·c++蓝桥杯
Mr_Xuhhh4 小时前
项目需求分析(2)
c++·算法·leetcode·log4j
NiKo_W4 小时前
Linux 文件系统与基础指令
linux·开发语言·指令
c++bug4 小时前
六级第一关——下楼梯
算法
PAK向日葵4 小时前
【C/C++】面试官:手写一个memmove,要求性能尽可能高
c语言·c++·面试
Morri34 小时前
[Java恶补day53] 45. 跳跃游戏Ⅱ
java·算法·leetcode
林木辛5 小时前
LeetCode热题 15.三数之和(双指针)
算法·leetcode·双指针
AndrewHZ5 小时前
【3D算法技术】blender中,在曲面上如何进行贴图?
算法·3d·blender·贴图·三维建模·三维重建·pcg