Добавил:
Developerrnrn Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС Нижний.pdf
Скачиваний:
34
Добавлен:
25.03.2023
Размер:
2.75 Mб
Скачать

Лабораторный практикум по курсу "Операционные системы"

unsigned long, int);

399 };

writepage – записать страницу на диск; readpage – прочитать страницу с диска;

sync_page – синхронизировать измененную страницу с диском;

prepate_write – используется перед тем, как данные копируются из пользовательской части процесса в страницы, которые будут записаны на диск;

commit_write – записывает данные, скопированные после вызова prepate_write; flushpage – блокирует страницу до завершения операций ввода/вывода с ней;

releasepage – пытается записать все буферы, связанные со страницей, перед ее освобождением.

Страничные сбои

Linux, как и многие другие операционные системы, для страниц, не расположенных в оперативной памяти, использует стратегию выборки «по запросу». Это означает, что

страницы считываются в оперативную память в том случае, если возник страничный сбой. В Linux, при считывании страницы из области подкачки, вместе с ней считываются 2page_cluster

страниц и помещаются в кэш подкачки.

Различают два вида страничных сбоев – major, когда данные необходимо считывать с жесткого диска, и minor – когда считывать с диска не надо. Статистика о числе страничных сбоев ведется для каждого процесса в полях task_struct->maj_flt и task_struct- >min_flt.

Обработку страничного сбоя производит функция do_page_fault(). В данную функцию передается адрес страничного сбоя, просто не найдена страница или это ошибка защиты страницы, сбой ли это чтения или записи, сбой ли это в пользовательской части адресного пространства или в части ядра. Граф вызовов функции изображен на рисунке.

Учебно-исследовательская лаборатория «Информационные технологии» 123

Лабораторный практикум по курсу "Операционные системы"

Рис. 56 Граф вызовов функции do_page_fault

handle_mm_fault() – платформенно-независимая функция считывания страницы с жесткого диска, обработки страниц COW(Copy-On-Write) и т.д. Она возвращает 1 в случае minor-сбоя, 2 в случае major-сбоя, 0 инициирует посылку сигнала SIGBUS, любое другое значение означает, что память выделить невозможно (вызывается обработчик “out-of- memory”).

Функция handle_mm_fault() определяет регион, в котором произошел сбой, и соответствующую сбою таблицу страниц (если она не существовала, то создается). После этого вызывается функция handle_pte_fault().

На основании содержимого дескриптора страницы, производится выбор способа обработки сбоя.

Во-первых, определяется, отсутствует ли страница в оперативной памяти (pte_none() == false && pte_present() == true) или для данной страницы ВАП еще не была назначена физическая страница (pte_none() == true). В первом случае выполняется «подкачка по запросу» посредством вызова функции do_swap_page(), во втором – «выделение памяти по запросу» посредством вызова do_no_page().

Во-вторых, проверяются права доступа к странице. Если в таблице страниц указано, что страница защищена от записи, это означает, что данная страница используется несколькими процессами в режиме Copy-On-Write, и необходимо сделать «личную» копию данной страницы для текущего процесса. Это делает функция do_wp_page().

Выделение памяти по запросу

Когда процесс обращается к странице в первый раз, для данной страницы виртуального адресного пространстве еще не назначена физическая страница. Выделение выполняет функция do_no_page(). Исключение составляет случай, когда регион – владелец страницы, предоставляет функцию для выполнения данного действия (функция nopage() в

поле vm_area_struct->vm_ops).

124 Учебно-исследовательская лаборатория «Информационные технологии»

Лабораторный практикум по курсу "Операционные системы"

Если поле vm_area_struct->vm_ops не предоставляет функцию nopage(), вызывается функция do_anonymous_page(). Если обслуживается запрос на чтение, в дескриптор страницы помещается ссылка на специальную страницу, заполненную нулями, и для данной страницы запрещается запись (для всех процессов используется одна и та же такая страница). Когда процесс попытается выполнить запись на эту страницу, возникнет еще одн страничный сбой, который можно будет обработать.

Если произошла попытка первой записи в страницу, вызываются функции alloc_page() и clear_user_highpage(), выделяющие страницу физической памяти и обнуляющие ее. Если выделение прошло успешно, Resident State Size процесса (mm_struct->rss) увеличивается на 1, и вызывается функция flash_page_to_ram() для гарантированной синхронизации процессорного кэша. После этого страница вставляется в список lru, чтобы впоследствии ее можно было выгрузить на диск, и модифицируется таблица страниц.

Если страница была отображена на пространство на жестком диске (во внешней памяти), поле vm_area_struct->vm_ops предоставляет функцию nopage(), которая реализована в драйвере устройства внешней памяти. Данная функция выполняет выделение памяти для страницы и чтение ее из внешней памяти. После возврата из функции выполняется ряд проверок, модифицируется таблица страниц и синхронизируется процессорный кэш.

Подкачка по запросу

Если страница была выгружена на жесткий диск, ее чтение выполняет функция do_swap_page(). Информация о местонахождении страницы на диске, достаточная для ее чтения, содержится в дескрипторе страницы. Однако страница может все еще находиться в оперативной памяти.

Дело в том, что страницы, разделяемые несколькими процессами, не могут быть выгружены на диск немедленно. По содержимому структуры struct page невозможно определить все таблицы страниц, в которых существует ссылка на нее, а поиск посредством перебора таблиц страниц всех процессов занимает слишком много времени. Поэтому, когда страница выгружается в область подкачки, сначала она попадает в кэш подкачки.

Соответственно, если произошел страничный сбой, есть шанс, что требуемая страница находится в кэше подкачки. В этом случае счетчик ссылок на страницу увеличивается на 1 и исправляется таблица страниц процесса.

Если страница присутствует только на диске, вызывается функция swapin_readahead(), считывающая требуемую страницу и несколько следующих за ней (2page_cluster).

Демон выгрузки страниц (kswapd)

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

Методы, используемые в Linux для определения вытесняемых страниц, базируются на нескольких различных идеях и их параметры подобраны на основании анализа замеров производительности и отзывов пользователей.

За исключением страниц, управляемых менеджером памяти ядра (kernel allocator или slab allocator), все используемые страницы содержатся в кэше страниц и связаны в список через

Учебно-исследовательская лаборатория «Информационные технологии» 125

Соседние файлы в предмете Современные операционные системы