Linux Kernel (Ядро линукса) (часть 3)


Обратное отображение для анонимных страниц

Анонимные страницы нередко используются несколькими процессами. Самый распространенный случай— создание нового процесса с помощью fork . Как было сказано в главе 9, все страничные кадры, принадлежащие процессу-родителю (включая анонимные страницы), назначаются и потомку. Другой (довольно редкий) случай имеет место, когда процесс создает область памяти, устанавливая как флаг map anonymous, так и флаг map shared. Страницы такой области будут использоваться совместно потомками этого процесса.

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

Когда ядро присваивает первый страничный кадр анонимной области, оно создает новую структуру anon vma, состоящую всего из двух полей: lock, спин-бллокировки для защиты списка от параллельного обращения, и head, головы двунаправленного циклического списка дескрипторов областей памяти. Затем ядро заносит дескриптор vm area struct анонимной области памяти в список структуры anon vma. Для этой цели структура vm area struct имеет два поля: anon vma node содержит указатели на следующий и предыдущий элементы списка, a anon vma указывает на структуру anon vma. Наконец, ядро
сохраняет адрес структуры anon vma в поле mapping дескриптора анонимной страницы, как было описано ранее.

Когда страничный кадр, на который уже ссылается один процесс, заносится в запись Таблицы Страниц, соответствующую другому процессу (например, вследствие системного вызова fork), ядро просто вставляет анонимную область памяти второго процесса в двунаправленный циклический список структуры anon vma, на которую указывает поле anon vma области памяти, принадлежащей первому процессу. Таким образом, список структуры anon vma, как правило, содержит области памяти, которыми владеют разные процессы.

список структуры anon vma позволяет ядру быстро находить все записи Таблицы Страниц, ссылающиеся на один и тот же анонимный страничный кадр. Любой дескриптор области памяти хранит в поле
vm rnm адрес дескриптора памяти, который, в свою очередь, имеет поле pgd, содержащее адрес Глобального каталога страниц данного процесса.
Тогда запись в Таблице Страниц может быть определена по начальному линейному адресу анонимной страницы, который легко находится по дескриптору области памяти и полю index дескриптора страницы.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...