
ОС / 6. ОС - Управление памятью
.pdf
31
Выделение памяти для стека
Память, зарезервированная для стека (1 Мб)
Память, переданная стеку
Страница- |
Страница |
Текущий |
Начальные |
барьер |
PageGuard |
указатель стека |
страницы |
|
|
|
стека |
Операционные системы. Управление памятью

32
Использование «кучи»
Куча (heap) – обычный механизм динамического выделения/освобождения небольших участков памяти (например, при создании/удалении объектов в C++ Delphi или Java).
Традиционно работа с кучей – обязанность исполняющей системы языка. Windows предоставляет системные средства для создания и использования куч.
Каждый процесс при создании получает от системы собственную кучу, хэндл которой можно получить вызовом функции GetProcessHeap.
После этого нити процесса могут получать и освобождать блоки памяти из кучи.
Операционные системы. Управление памятью

33
Использование «кучи»
Функция HeapAlloc – выделение блока памяти.
Параметры:
хэндл кучи;
некоторые флаги;
размер блока.
Функция возвращает адрес выделенного блока.
Функция HeapFree – освобождение ранее выделенного блока памяти.
Параметры:
хэндл кучи;
флаги;
адрес блока.
Система учитывает, что при одновременном обращении нитей процесса к куче возможно ситуация взаимного исключения. Поэтому операции выделения/освобождения блоков по умолчанию сериализуются (защищаются семафорами). Если программист уверен, что конкуренции нитей не возникнет (например, только одна нить работает с кучей), он может ускорить выполнение, указав флаг HEAP_NO_SERIALIZE.
Операционные системы. Управление памятью

34
Использование «кучи»
Процесс может создать для себя любое количество дополнительных куч. Есть несколько причин для этого, в частности:
если каждая нить работает со своей кучей, то не нужна сериализация;
если в каждой куче всегда выделяются блоки одинакового размера, то исключается фрагментация кучи, а это ускоряет работу.
Функция HeapCreate – создание новой кучи.
Параметры:
некоторые флаги;
начальный размер кучи (MEM_COMMIT);
максимальный размер кучи (MEM_RESERVE).
Функция возврашает хэндл кучи.
Функция HeapDestroy – уничтожение кучи, освобождение всей ее памяти. Параметр – хэндл дополнительной кучи.
Операционные системы. Управление памятью

35
Управление памятью в UNIX
Механизмы управления памятью весьма отличаются в разных версиях UNIX и Linux. Здесь приведен лишь краткий обзор общих принципов и наиболее типичных решений.
В ходе исторического развития, в зависимости от возможностей аппаратуры, подходы менялись от программной настройки адресов до современной страничной организации виртуальной памяти с загрузкой по требованию.
Операционные системы. Управление памятью

36
Управление памятью в UNIX
Виртуальное адресное пространство процесса делится на три основные области (обычно в пределах 3 ГБ):
область кода (text) – обычно доступна только для чтения;
область данных (data) – доступна для чтения/записи, делится на две подобласти:
инициализированные данные (хранятся в исполняемом файле);
неинициализированные данные (BSS) (в файле – только размер подобласти, при загрузке инициализируются нулями);
область стека – доступна для чтения/записи, автоматически увеличивается при необходимости.
Область кода может разделяться между процессами, выполняющими одну и ту же программу.
Размер области BSS может изменяться системным вызовом brk (например, для размещения регионов или кучи).
Ядро системы имеет собственное адресное пространство (1 ГБ). При работе в режиме ядра доступна также и память процесса.
Операционные системы. Управление памятью

37
Системные вызовы управления памятью
s=brk(addr) – изменение размера области данных;
addr – верхняя граница доступных адресов памяти;
возвращает 0 (удача) или -1 (ошибка);
a=mmap(addr, len, prot, flags, fd, offset) – отображение файла на память;
addr – виртуальный адрес отображения (если 0 – система выбирает сама);
len – длина отображаемой части файла;
prot – режим доступа;
flags – флаги;
fd – хэндл открытого файла;
offset – смещение от начала файла;
возвращает виртуальный адрес;
s=munmap(addr, len) – отмена отображения файла;
addr – начало области отмены;
len – длина области отмены;
возвращает 0 (удача) или -1 (ошибка).
Операционные системы. Управление памятью

38
Подкачка страниц и процессов
В современных UNIX/Linux системах обычно используется два уровня фоновой загрузки/выгрузки областей памяти:
демон подкачки страниц (процесс с pid=2) пытается поддерживать достаточное количество свободных страниц физической памяти;
если это не удается (частота подкачки велика, но свободных страниц мало), работает более «древний» демон своппинга процессов (pid=0), вытесняющий на диск или подкачивающий с диска целые процессы.
Для сохранения могут использоваться страничные файлы, но более эффективно использование целого раздела диска, не несущего файловой структуры и используемого только для подкачки.
Операционные системы. Управление памятью

39
Работа страничного демона
Демон просыпается по таймеру (например раз в секунду) и проверяет число свободных страниц. Если оно меньше ¼ от общего числа, демон освобождает несколько страниц.
При выборе вытесняемых страниц алгоритм LRU слишком трудоемок. Обычно используется «Алгоритм часов» или его модификации.
Идея алгоритма:
при обращении к странице для нее устанавливается флаг обращения («бит R);
занятые блоки выстраиваются в круговой список ,на один из них указывает «стрелка часов»;
демон проверяет эту страницу; если бит R установлен, он сбрасывается, иначе страница вытесняется;
стрелка перемещается на следующую страницу.
Еще один демон периодически проверяет «грязные» страницы и очищает (т.е. записывает на диск) те, которые долго остаются грязными.
Операционные системы. Управление памятью