Читаем Linux API. Исчерпывающее руководство полностью

}

printf("\n");

free(vec);

}


int

main(int argc, char *argv[])

{

char *addr;

size_t len, lockLen;

long pageSize, stepSize, j;


if (argc!= 4 || strcmp(argv[1], "-help") == 0)

usageErr("%s num-pages lock-page-step lock-page-len\n", argv[0]);


pageSize = sysconf(_SC_PAGESIZE);

if (pageSize == -1)

errExit("sysconf(_SC_PAGESIZE)");


len = getInt(argv[1], GN_GT_0, "num-pages") * pageSize;

stepSize = getInt(argv[2], GN_GT_0, "lock-page-step") * pageSize;

lockLen = getInt(argv[3], GN_GT_0, "lock-page-len") * pageSize;

addr = mmap(NULL, len, PROT_READ, MAP_SHARED | MAP_ANONYMOUS, — 1, 0);

if (addr == MAP_FAILED)

errExit("mmap");


printf("Allocated %ld (%#lx) bytes starting at %p\n",

(long) len, (unsigned long) len, addr);


printf("Before mlock: \n");

displayMincore(addr, len);


/* Запираем в памяти страницы, указанные с помощью аргументов командной строки */

for (j = 0; j + lockLen <= len; j += stepSize)

if (mlock(addr + j, lockLen) == -1)

errExit("mlock");


printf("After mlock: \n");

displayMincore(addr, len);

exit(EXIT_SUCCESS);

}

vmem/memlock.c

В следующей сессии командной строки показан пример выполнения программы из листинга 46.2. Мы выделяем семь групп по три смежные страницы в каждой (всего 32 страницы):

$ su Повышаем привилегии

Password:

# ./memlock 32 8 3

Allocated 131072 (0x20000) bytes starting at 0x4014a000

Before mlock:

0x4014a000:…………………………..

After mlock:

0x4014a000: ***…..***…..***…..***…..

В этом программном выводе для обозначения страниц, которые находятся в физической памяти и пространстве подкачки, используются соответственно звездочки и точки. Как можно видеть в последней строке вывода, в каждой группе из восьми страниц три находятся в физическом адресном пространстве.

В данном примере мы получили повышенные привилегии, чтобы программа могла задействовать вызов mlock(). Начиная с Linux 2.6.9, данный шаг стал необязательным (при условии, что объем блокируемой памяти не превышает мягкое ограничение LIMIT_MEMLOCK).


46.4. Предсказание модели использования памяти в будущем: madvise()


Системный вызов madvise() служит для улучшения производительности программы путем информирования ядра о том, как именно вызывающий процесс (скорее всего) будет применять страницы памяти в диапазоне длиной length байт, начиная с адреса addr. С помощью данной информации ядро может повысить эффективность операций ввода/вывода, выполняемых с файлом, который отображается на эти страницы (обсуждение файловых отображений см. в разделе 45.4). В ядре Linux вызов madvise() доступен с версии 2.4.

#define _BSD_SOURCE

#include


int madvise(void *addr, size_t length, int advice);

Возвращает 0 при успешном завершении или -1 при ошибке

Значение addr должно быть выровнено по странице, а аргумент length в итоге округляется к следующему значению, кратному размеру страницы памяти в системе. Аргумент advice может быть равен одной из следующих констант.

• MADV_NORMAL — поведение по умолчанию. Страницы передаются в виде небольших групп. Это приводит к упреждающему и отложенному чтению.

• MADV_RANDOM — обращение к страницам на данном участке будет произвольным, поэтому упреждающее чтение не повлечет никакой выгоды. Таким образом, в каждой операции чтения ядро должно извлекать как можно меньший объем данных.

• MADV_SEQUENTIAL — обращение к страницам на этом участке будет последовательным. Таким образом, ядро может прибегнуть к агрессивному упреждающему чтению; после доступа к страницам их можно быстро освобождать.

• MADV_WILLNEED — страницы на этом участке следует считывать наперед, готовясь к будущему доступу. Операция MADV_WILLNEED по своим результатам похожа на вызов readahead() (доступный только в Linux) и posix_fadvise() с флагом POSIX_FADV_WILLNEED.

• MADV_DONTNEED — вызывающий процесс больше не требует, чтобы страницы на данном участке находились в физической памяти. Результаты применения этого флага варьируются в зависимости от реализации UNIX. Для начала посмотрим, как он ведет себя в Linux. Отображенные страницы на участке MAP_PRIVATE всегда отклоняются; это значит, что будут потеряны все внесенные в них изменения. Диапазон адресов виртуальной памяти остается доступным, но при следующем доступе к каждой странице произойдет отказ, который приведет к ее повторной инициализации (с помощью либо содержимого отображенного на нее файла, либо (если это анонимное отображение) нулей). Данную особенность можно использовать как средство повторной инициализации содержимого участка MAP_PRIVATE. В случае с участком MAP_SHARED ядро может отклонить измененные страницы в зависимости от архитектуры (на платформе x86 этого не происходит). Такое же поведение встречается и в ряде других систем. Но существуют реализации UNIX, в которых MADV_DONTNEED просто информирует ядро о том, что заданные страницы при необходимости можно сбросить на диск. Портируемые приложения не должны полагаться на деструктивную семантику флага MADV_DONTNEED, действующую в Linux.

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных