В операционной системе выделение пространства подкачки может выполняться в двух режимах. Режим выделения определяется значением переменной PSALLOC. По умолчанию применяется алгоритм динамического выделения пространства подкачки. Для применения алгоритма статического выделения пространства подкачки следует присвоить переменной среды PSALLOC значение early.
Необходимый объем пространства подкачки зависит от назначения системы. При нехватке пространства подкачки возможно аварийное завершение работы отдельных процессов, а заполнение пространства подкачки может привести к серьезным нарушениям в работе системы. При уменьшении свободного объема пространства подкачки можно определить дополнительное пространство подкачки.
Система отслеживает число свободных блоков пространства подкачки и предупреждает о нехватке пространства подкачки. Когда число свободных блоков становится меньше установленного порога, называемого уровнем предупреждения пространства подкачки, система информирует об этом все процессы (кроме kprocs), отправляя сигнал SIGDANGER. Если объем свободного пространства подкачки оказывается меньше второго установленного порога, называемого критическим уровнем пространства подкачки, система отправляет сигнал SIGKILL процессам, использующим большую часть пространства подкачки, и процессам, не обрабатывающим сигнал SIGDANGER (по умолчанию сигнал SIGDANGER игнорируется процессами). Система отправляет сигнал SIGKILL до тех пор, пока число свободных блоков в пространстве подкачки не выйдет из критического диапазона.
Процессы, захватывающие память динамически, могут проверять наличие достаточного объема пространства подкачки, отслеживая значения уровней пространства подкачки с помощью подпрограммы psdanger или специальных функций выделения памяти. Вы можете предотвратить завершение работы процесса по достижении критического уровня пространства подкачки, вызвав подпрограмму disclaim. Для этого определите обработчик сигнала для SIGDANGER, который должен освобождать память и ресурсы пространства подкачки, выделенные в областях данных и стека, а также в общих сегментах памяти.
Способ выделения памяти и пространства подкачки определяется значением переменной операционной системы PSALLOC. Если переменная PSALLOC не задана, ей присвоено значение null, или любое другое значение, отличное от early, то по умолчанию применяется алгоритм динамического выделения.
Применяемый по умолчанию алгоритм динамического выделения памяти и пространства подкачки повышает эффективность использования дисковой памяти и поддерживает приложения, применяющие алгоритмы с резервированием ресурсов памяти. В соответствии с алгоритмом динамического выделения памяти пространство подкачки резервируется не сразу после получения запроса, а при обращении к странице памяти. Некоторые программы запрашивают большой объем виртуальной памяти, а используют его лишь частично. К таким программам относятся технические приложения, применяющие в качестве структур данных разреженные векторы или матрицы. Алгоритм динамического выделения памяти наиболее эффективен в системах реального времени с ядром, осуществляющим подкачку по запросу, например, при работе с ядром операционной системы.
В AIX 4.3.2 и более поздних версий в алгоритме динамического выделения пространства подкачки предусмотрена еще большая задержка между получением запроса и выделением памяти. Как сказано выше, в версиях AIX, предшествующих 4.3.2, пространство подкачки выделялось при обращении к странице памяти. Иногда это пространство так и не используется, особенно в системах с большим объемом реальной памяти, в которых подкачка применяется редко. В связи с этим возникает возможность отложить выделение пространства подкачки до того момента, пока не возникнет необходимость переместить на диск неиспользуемую страницу памяти. Такой подход позволяет избежать неэффективного выделения пространства подкачки. Однако в этом случае происходит двойное резервирование пространства подкачки. Если обращение к виртуальной памяти в системе выполняется настолько часто, что необходима подкачка, то объем обязательного пространства подкачки может достигать объема, применявшегося в предыдущих выпусках.
В случае применения алгоритма динамического выделения пространства подкачки возможен перехват ресурсов. Если один процесс получит доступ к ресурсу раньше, чем другой процесс, то произойдет сбой. Операционная система пытается предотвратить нарушение работы системы, завершая процессы, на которые повлиял возникший конфликт. Сигнал SIGDANGER отправляется для уведомления процессов о нехватке свободного пространства подкачки. При достижении критического уровня тем процессам, которые не получили сигнал SIGDANGER, отправляется сигнал SIGKILL.
Для применения статического алгоритма выделения памяти и пространства подкачки следует изменить значение переменной среды PSALLOC. Этот алгоритм выделяет процессам пространство подкачки сразу после запроса. Если в этот момент объем свободного пространства окажется недостаточным, то запрос на выделение памяти выполнен не будет.
Если переменной среды PSALLOC будет присвоено значение early, то с этого момента все программы, запускаемые в данной среде (исключая уже запущенные процессы), будут выполняться в режиме статического выделения памяти. Если при работе в этом режиме в момент получения запроса зарезервировать требуемый объем памяти не удастся, то подпрограммы malloc и brk вернут код ошибки.
Процессам, выполняемым в режиме статического выделения памяти, сигнал SIGKILL в случае нехватки пространства подкачки не отправляется.
Переход в режим статического выделения памяти влияет на работу следующих подпрограмм:
В следующем примере описаны различные способы присвоения переменной среды PSALLOC значения early для перехода в режим статического выделения памяти. Кроме того, здесь описаны результаты применения каждого способа.
PSALLOC=early;export PSALLOC
В результате все последующие команды, вводимые в этом сеансе оболочки, будут запускаться в режиме статического выделения памяти.
PSALLOC=early;export PSALLOC
В этом случае все процессы пользовательского сеанса, за исключением процессов начальной оболочки, будут выполняться в режиме статического выделения памяти. Эта команда защищает процессы от завершения сигналом SIGKILL.
PSALLOC=early
В этом случае все процессы системы, кроме процесса init (с ИД - 1), будут запущены в режиме статического выделения памяти и будут защищены от механизма обработки сигнала SIGKILL.
Алгоритм статического выделения памяти гарантирует выделение запрошенного объема памяти. Таким образом, для наиболее эффективного выполнения операций необходимо обеспечить правильное расположение пространства подкачки на системном диске. Когда объем свободного пространства подкачки достигнет заданного порогового значения, то новые процессы запускаться не будут, а для уже запущенных процессов память может оказаться недоступной. Все процессы, запущенные по умолчанию в режиме динамического выделения памяти, зависят от механизма обработки сигнала SIGKILL. Кроме того, поскольку ядро операционной системы периодически запрашивает выделение памяти, то при отсутствии свободного пространства подкачки работа системы может быть нарушена.
Перед тем, как перевести систему в режим статического выделения памяти, необходимо определить оптимальный объем пространства подкачки. Для режима статического выделения памяти пространство подкачки всегда должно быть больше пространства подкачки, необходимого в режиме динамического выделения памяти, который применяется по умолчанию. Объем пространства подкачки зависит от назначения системы и запускаемых в ней программ. В первом приближении можно выбрать объем пространства подкачки, превышающий объем физической памяти в четыре раза.
Некоторые приложения, запускаемые в режиме статического выделения памяти могут использовать очень большой объем пространства подкачки. Современному серверу AIXwindows для выполнения приложений в режиме статического выделения памяти необходимо более 250 Мб пространства подкачки. Объем пространства подкачки, необходимый для каждого приложения, зависит от алгоритма и режима работы приложения.
Все команды и подпрограммы, выдающие информацию об использовании процессами пространства подкачки и памяти, указывают также объем пространства подкачки, выделенный в статическом режиме. Команда lsps с флагом -s показывает общий объем выделенного пространства подкачки, включая пространство, выделенное в статическом режиме.
Программный интерфейс, управляющий режимами выделения пространства подкачки, использует переменную среды PSALLOC. Для того чтобы проверить, в каком режиме работает приложение (со статическим или динамическим выделением пространства подкачки), выполните следующие действия: