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

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

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

[размер файла подкачки] + [размер физической памяти] * overcommit_ratio / 100

Значение overcommit_ratio представляет собой целое процентное значение и хранится в файле /proc/sys/vm/overcommit_ratio (доступном только в Linux). По умолчанию оно равно 50; это значит, что при выделении адресного пространства ядро может успешно превысить размер доступной в системе памяти на 50 % (если только все процессы не попытаются одновременно использовать всю выделенную им память).

Стоит отметить, что мониторинг перерасхода памяти касается только следующих типов отображения:

• приватные отображения, доступные для записи (как файловые, так и анонимные), выделяемые отдельно для каждого процесса, который их задействует;

• разделяемые анонимные отображения, существующие в единственном экземпляре (поскольку они разделяются всеми процессами).

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

При вызове fork() дочерний процесс наследует не только отображение, но и его параметр MAP_NORESERVE. Этот флаг не предусмотрен стандартом SUSv3, но поддерживается в нескольких реализациях UNIX, включая Linux.

В данном разделе мы рассмотрели ситуации, в которых вызов mmap() может не суметь увеличить адресное пространство процесса ввиду системных ограничений, касающихся физической памяти и пространства подкачки. Причиной также может оказаться ограничение на ресурсы RLIMIT_AS (описанное в разделе 36.3), ограничивающее максимальный размер адресного пространства, выделяемый для вызывающего процесса.


OOM killer

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

Подсистема ядра, предназначенная для выбора процессов, которые следует завершить при нехватке памяти, известна под названием OOM killer (OOM от англ. out-of-memory — «нехватка памяти»). Данный механизм пытается выбрать наиболее подходящие для завершения процессы; критерии, учитываемые им при этом, зависят от целого ряда факторов. Например, чем больше памяти потребляет процесс, тем выше вероятность того, что OOM killer выберет именно его. Среди других факторов, принимаемых во внимание, можно отметить низкое значение nice (то есть больше 0) и попытки создания множества дочерних процессов. Ядро предпочитает не трогать следующие процессы:

• привилегированные процессы, поскольку они, вероятно, выполняют важные задачи;

• процессы, напрямую работающие с устройствами, так как их принудительное завершение может оставить устройство в нерабочем состоянии;

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

Для принудительного завершения процесса OOM killer отправляет ему сигнал SIGKILL.

В Linux с версии 2.6.11 существует файл /proc/PID/oom_score; в нем хранится «вес», который ядро назначает процессу, когда возникает необходимость в вызове OOM killer. Чем больше данное значение, тем выше вероятность того, что процесс при необходимости будет выбран для принудительного завершения. В версии ядра 2.6.11 также появился файл /proc/PID/oom_adj, с помощью которого можно повлиять на значение oom_score процесса. Этому файлу можно назначить любое число в диапазоне от –16 до +15; отрицательные значения снижают oom_score, а положительные — повышают. Если указать специальное значение -17, процесс перестанет рассматриваться системой OOM killer как кандидат на завершение. Дальнейшие подробности можно найти на странице proc(5) руководства.


45.10. Флаг MAP_FIXED


Если указать в аргументе flags вызова mmap() флаг MAP_FIXED, ядро будет интерпретировать адрес, заданный в аргументе addr, буквально, а не как точку отсчета. В таком случае адрес должен быть изначально выровнен по странице.

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

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

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

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

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