Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОС / 6. ОС - Управление памятью

.pdf
Скачиваний:
54
Добавлен:
01.06.2015
Размер:
189.31 Кб
Скачать

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 установлен, он сбрасывается, иначе страница вытесняется;

стрелка перемещается на следующую страницу.

Еще один демон периодически проверяет «грязные» страницы и очищает (т.е. записывает на диск) те, которые долго остаются грязными.

Операционные системы. Управление памятью