12장. RHEL에서 실시간에 mlock() 시스템 호출 사용
RHEL for Real-Time 메모리 잠금(mlock()) 함수를 사용하면 실시간 호출 프로세스가 지정된 주소 공간 범위를 잠그거나 잠금 해제할 수 있습니다. 이 범위는 Linux가 메모리 공간을 스와핑할 때 잠긴 메모리를 페이징하지 못하도록 합니다. 페이지 테이블 항목에 실제 페이지를 할당하면 해당 페이지에 대한 참조가 빨라집니다. mlock() 시스템 호출에는 mlock() 및 mlockall() 의 두 함수가 포함됩니다. 마찬가지로 munlock() 시스템 호출에는 munlock() 및 munlockall() 함수가 포함됩니다.
12.1. mlock() 시스템 호출을 사용하여 페이지를 잠그기 링크 복사링크가 클립보드에 복사되었습니다!
실시간 mlock() 시스템 호출은 addr 매개변수를 사용하여 주소 범위의 시작을 지정하고 len 을 사용하여 주소 공간의 길이를 바이트 단위로 정의합니다. alloc_workbuf() 함수는 메모리 버퍼를 동적으로 할당하고 잠급니다. 메모리 할당은 posix_memalig() 함수에 의해 수행되어 메모리 영역을 페이지에 맞춥니다. function free_workbuf() 는 메모리 영역을 잠금 해제합니다.
사전 요구 사항
-
큰 버퍼에서
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 를 설정합니다.