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

void *mremap(void *old_address, size_t old_size, size_t new_size,

int flags…);

Возвращает начальный адрес измененного отображения при успешном завершении или MAP_FAILED, если произошла ошибка

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

• MREMAP_MAYMOVE — если указать данный флаг, ядро, исходя из требований к свободной памяти, может переместить отображение внутри виртуального адресного пространства процесса. В противном случае, если на текущем участке не хватает свободного места для расширения отображения, генерируется ошибка ENOMEM.

• MREMAP_FIXED (начиная с Linux 2.4) — этот флаг можно использовать только в сочетании с MREMAP_MAYMOVE. Его действие аналогично применению флага MAP_FIXED в вызове mmap() (см. раздел 45.10). Если его указать, то вызов mremap() сможет принять дополнительный аргумент void *new_address — адрес, выровненный по странице, куда следует переместить отображение. Любые другие отображения, находящиеся в диапазоне, заданном с помощью new_address и new_size, уничтожаются.

В случае успеха mremap() возвращает начальный адрес отображения. Поскольку данное значение может отличаться от предыдущего начального адреса (если был указан флаг MREMAP_MAYMOVE), указатели, ссылающиеся на этот участок, могут утратить свою актуальность. Следовательно, приложения, выполняющие вызов mremap(), должны ссылаться на адреса в отображенном участке с помощью отступов, избегая абсолютных значений.

В Linux существует функция realloc(), которая использует вызов mremap() для эффективного перемещения больших блоков памяти, выделенных ранее путем операции mmap() MAP_ANONYMOUS (я уже упоминал о данной возможности вызова malloc() из библиотеки glibc в разделе 45.7). Применение для этих целей вызова mremap() позволяет избежать копирования данных во время перемещения.


45.9. Флаг MAP_NORESERVE и перерасход пространства подкачки


Некоторые приложения создают большие (обычно приватные и анонимные) отображения, но используют только небольшую часть выделенной памяти. Например, ряд научных программ выделяют огромные массивы, но помещают в разные его участки всего несколько элементов (такие массивы называют разреженными).

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

Иными словами, отложенное резервирование позволяет перерасходовать пространство подкачки. Это работает до тех пор, пока все процессы не попытаются получить доступ ко всему диапазону адресов своих отображений. В таком случае физическая память и пространство подкачки будут исчерпаны и ядро будет вынуждено снизить давление на память, принудительно завершив один или несколько процессов. В идеале оно попытается выбрать процесс, вызывающий проблемы с памятью (см. описание OOM killer чуть ниже), но так происходит не всегда. Поэтому в некоторых случаях от отложенного резервирования лучше отказаться и заставить систему выделять все пространство подкачки, необходимое для размещения отображения.

Способ резервирования пространства подкачки ядром зависит от использования флага MAP_NORESERVE при вызове mmap(), а также от интерфейсов /proc, которые влияют на перерасход пространства подкачки на уровне системы. Эти факторы сгруппированы в табл. 45.4.


Таблица 45.4. Управление резервированием пространства подкачки при вызове mmap()

Значение overcommit_memory

Указан ли флаг MAP_NORESERVE при вызове mmap()?

Нет

Да

0

Очевидный перерасход запрещается

Перерасход разрешен

1

Перерасход разрешен

Перерасход разрешен

2 (начиная с Linux 2.6)

Разрешается фиксированный перерасход


Файл /proc/sys/vm/overcommit_memory (доступный только в Linux) содержит целое число, определяющее поведение ядра касательно перерасхода пространства подкачки. Версии ядра ниже 2.6 поддерживали только два значения: 0 и больше нуля. Первое означает, что очевидный перерасход запрещается (при условии использования флага MAP_NORESERVE), а второе разрешает перерасход при любых условиях.

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

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

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#.Введите сюда краткую аннотацию

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

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