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