Распечатка 7.3 Операции блокировки памяти |
Предыдущая Содержание Следующая |
Распечатка 7.3.
/* mlock.c */
#include <sys/mman.h> #include <unistd.h>
#define RT_BUFSIZE 1024 int main(){
/* rt_buffer должен быть заблокирован в памяти */ char *rt_buffer = (char *)malloc(RT_BUFSIZE); unsigned long pagesize, offset;
/* * В Linux нет необходимости выравнивать адрес страницы перед * mlocking, это делает ядро. Но POSIX требует выровнять * адрес памяти по границе страницы перед вызовом mlock для * улучшения переносимости. Так что выравниваем rt_buffer * по границы страницы. */ pagesize = sysconf(_SC_PAGESIZE); offset = (unsigned long) rt_buffer % pagesize; /* Блокируем rt_buffer в памяти */ if (mlock(rt_buffer - offset, RT_BUFSIZE + offset) != 0){ perror("cannot mlock"); return 0; }
/* * После успешного выполнения mlock страница, которая содержит * rt_buffer, находится в памяти и заблокирована. Она никогд * не будет замещена. Так что rt_buffer может использоваться * без беспокойства о задержке вследствие замещения страниц. */
/* Разблокируем rt_buffer после использования */ if (munlock(rt_buffer - offset, RT_BUFSIZE + offset) != 0){ perror("cannot mulock"); return 0; }
/* * В зависимости от приложения мы можем решить заблокировать * в памяти всё адресное пространство процесса. */
/* Блокируем текущую память процесса, а также все будущие * выделения памяти. * MCL_CURRENT - Блокировать все страницы, которые в настоящее * время включены в адресное пространство процесса * MCL_FUTURE - Блокировать также все страницы, которые будут * включены в адресное пространство процесса в будущем. */ if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0){ perror("cannot mlockall"); return 0; }
/* * Если mlockall был успешным, все новые выделения памяти * будут блокироваться. Так что страницы, содержащие * rt_buffer, будут заблокированы в памяти. */ rt_buffer = (char *)realloc(rt_buffer , 2*RT_BUFSIZE);
/* * В конце разблокируем всю память, которая была заблокирована * либо mlock, либо mlockall, вызовом функции munlockall. */ if (munlockall() != 0){ perror("cannot munlock"); return 0; } return 0; }
|
Предыдущая Содержание Следующая |