Распечатка 7.3 Операции блокировки памяти

Предыдущая  Содержание  Следующая V*D*V

Распечатка 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;

}

 

Предыдущая  Содержание  Следующая