The design of the UNIX Operating System 63 страница



 

Сегменты представляют собой непрерывные области (в Linux они так и называются - области ) в вирту - альном адресном пространстве процесса, выровненные по границам страниц. Каждая область состоит из набора страниц с одним и тем же режимом защиты. Между областями в виртуальном пространстве могут быть свободные участки. Естественно, что подобные объекты описаны соответствующими структурами

 

(см., например, структуры mm_struct и vm_area_struct в Linux).

 

Часть работы по организации сегментов может происходить с участием программиста. Особенно это за-метно при низкоуровневом программировании. В частности, отдельные области памяти могут быть по-именованы и использоваться для обмена данными между процессами. Два процесса могут общаться че-рез разделяемую область памяти при условии, что им известно ее имя (пароль). Обычно это делается при помощи специальных вызовов (например, map и unmap), входящих в состав интерфейса виртуальной па-мяти.

 

Загрузка исполняемого файла (системный вызов exec) осуществляется обычно через отображение (mapping) его частей ( кода, данных) в соответствующие сегменты адресного пространства процесса. На-пример, сегмент кода является сегментом отображаемого в память файла, содержащего исполняемую программу. При попытке выполнить первую же инструкцию система обнаруживает, что нужной части кода в памяти нет, генерирует page fault и подкачивает эту часть кода с диска. Далее процедура повторя-ется до тех пор, пока вся программа не окажется в оперативной памяти.

 

Как уже говорилось, размер сегмента данных динамически меняется. Рассмотрим, как организована под-держка сегментов данных в Unix. Пользователь, запрашивая (библиотечные вызовы malloc, new) или ос-вобождая (free, delete) память для динамических данных, фактически изменяет границу выделенной про-цессу памяти через системный вызов brk (от слова break), который модифицирует значение переменной brk из структуры данных процесса. В результате происходит выделение физической памяти, граница brk смещается в сторону увеличения виртуальных адресов, а соответствующие строки таблиц страниц полу-чают осмысленные значения. При помощи того же вызова brk пользователь может уменьшить размер сегмента данных. На практике освобожденная пользователем виртуальная память (библиотечные вызовы free, delete) системе не возвращается. На это есть две причины. Во-первых, для уменьшения размеров сегмента данных необходимо организовать его уплотнение или "сборку мусора". А во-вторых, незанятые внутри сегмента данных области естественным образом будут вытолкнуты из оперативной памяти вслед-ствие того, что к ним не будет обращений. Ведение списков занятых и свободных областей памяти в сег-менте данных пользователя осуществляется на уровне системных библиотек.

 

Более подробно информация об адресных пространствах процессов в Unix изложена в [Кузнецов], [Bach,1986].

 

Отдельные аспекты функционирования менеджера памяти

 

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


Дата добавления: 2021-01-21; просмотров: 114; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!