The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

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

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

}

 

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