第 12 章 在 RHEL for Real Time 中使用 mlock ()系统调用


RHEL for Real-Time 内存锁定(mlock())函数可让实时调用进程锁定或解锁指定的地址空间范围。这个范围可防止 Linux 在交换内存空间时分页锁定的内存。将物理页面分配给页表条目后,对该页面的引用就会变得快速。mlock () 系统调用包含两个函数: mlock ()mlockall ()。同样,munlock () 系统调用包含 munlock ()munlockall () 函数。

12.1. 使用 mlock ()系统调用锁定页面

实时 mlock () 系统调用使用 addr 参数指定地址范围的开头,len 则以字节为单位定义地址空间长度。alloc_workbuf () 函数动态分配内存缓冲区并锁定它。内存分配由 posix_memalig () 函数完成,以将内存区域与页面保持一致。函数 free_workbuf () 解锁内存区域。

先决条件

  • 您有 root 特权或 CAP_IPC_LOCK 功能在大型缓冲区上使用 mlockall ()mlock ()

流程

  • 以下代码使用 mlock () 系统调用锁定页面:

    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/mman.h>
    
    void *alloc_workbuf(size_t size)
    {
      void *ptr;
      int retval;
    
      // alloc memory aligned to a page, to prevent two mlock() in the same page.
      retval = posix_memalign(&ptr, (size_t) sysconf(_SC_PAGESIZE), size);
    
      // return NULL on failure
      if (retval)
        return NULL;
    
      // lock this buffer into RAM
      if (mlock(ptr, size)) {
        free(ptr);
        return NULL;
      }
    
      return ptr;
    }
    
    void free_workbuf(void *ptr, size_t size) {
      // unlock the address range
      munlock(ptr, size);
    
      // free the memory
      free(ptr);
    }

验证

成功时,实时 mlock ()munlock () 调用返回 0。如果出现错误,则返回 -1 并设置 errno 来指示错误。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部