10.2. mlock() システムコールを使用したページのロック

リアルタイム mlock() システムコールは、addr パラメーターを使用してアドレス範囲の開始を指定し、len を使用してアドレス空間の長さをバイト単位で定義します。この alloc_workbuf() 関数はメモリーバッファーを動的に割り当ててロックします。メモリー割り当ては、posix_memalig() 関数によって行われ、メモリー領域がページに整列されます。free_workbuf() 関数は、メモリー領域のロックを解除します。

前提条件:

  • root 権限、または大きなバッファーで mlockall() または mlock() を使用するための CAP_IPC_LOCK 機能を持っている。

手順

  • 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 を設定します。