У меня вопрос, когда происходит сбой страницы, а требуемая страница отсутствует в ОЗУ, после чего откуда ОС узнает, где искать данную страницу во всей вторичной памяти, чтобы перенести ее в ОЗУ?
Если бы существовало 50 различных операционных систем, поддерживающих в среднем по 10 различных архитектур, то было бы до 500 различных ответов;где один из ответов будет « все программное обеспечение использует физические адреса и нет виртуальной памяти, и нет вторичной памяти », а другой ответ будет « виртуальный адрес - это место на дискеОЗУ просто используется как дисковый кэш для ускорения"(см. https://en.wikipedia.org/wiki/Single-level_store).
Для большинства типичных современных операционных систем, работающих на большинстве типичных архитектур;если вы проработали всю информацию, которую ядро должно знать о каждой виртуальной странице (например, какой она притворяется, какая она на самом деле, расположение на диске, если есть, расположение в ОЗУ, если есть, что-то, что нужно отслеживать«наименее недавно использованный», что-то для отслеживания «количества копий при записи» и т. д.);тогда вы можете разбросать всю информацию по нескольким различным структурам данных так, чтобы:
- некоторые структуры данных использовались / требовались самим ЦП, а некоторые не
- информация может быть или не быть в 2 или более структурах данных одновременно
- некоторые структуры данных имеют запись для каждой виртуальной страницы, а некоторые просто имеют запись для каждого диапазона нескольких страниц
- некоторые структуры данных - это массивы / таблицы, некоторые - деревья, некоторые - деревья таблиц, а некоторые - что-то еще.
- некоторые используют «виртуальный адрес» или «номер виртуальной страницы» в качестве ключа для поиска информации;а некоторые используют что-то другое (например, таблицы перевернутых страниц в PowerPC и Itanium используют «физический адрес» в качестве индекса, потому что использование того, что вы пытаетесь найти в качестве индекса, является наименее разумной вещью, которую вы могли бы сделать, так почему бы и нет?).
- некоторые структуры данных могут находиться в ядре, а некоторые - нет (например, микроядро L4 управляет отображением виртуальной памяти исключительно в пространстве пользователя с помощью модели «абстрактного иерархического адресного пространства»).
В целом;информация о том, где находятся данные страницы (каждая отдельная часть?) вторичной памяти (если есть вторичная память), будет храниться в одном или нескольких местах в одной или нескольких вещах.
Обратите внимание, что когда страницапроисходит сбой, обработчик ошибок страницы обычно должен принимать несколько решений;возможно, начиная с выяснения того, что сделало доступ (процесс, само ядро?) и следует ли разрешить или запретить доступ, затем выяснив, что с этим делать (отправив SIGSEGV
- сделать панику ядра - извлечь данные вTLB ЦПУ - сделать недействительными устаревшие данные из TLB ЦП (выполнить клонирование «копировать при записи», «извлечь данные из пространства подкачки,« извлечь данные из файла »);таким образом, обработчик сбоев страниц заканчивает тем, что находил несколько разных частей данных из (потенциально) нескольких разных мест.
Конкретный пример
Для моих конструкций ОС (которые основаны нана асинхронную передачу сообщений и использование микроядер);микроядро достаточно маленькое, чтобы его можно было спроектировать и оптимизировать под конкретную архитектуру (без учета переносимости).Конструкция операционной системы предназначена для распределенных систем, и по этой причине разделяемая память (и fork()
) не поддерживаются (вы не хотите, чтобы обработчик сбоев страниц должен был получать данные с удаленного компьютера по перегруженному сетевому соединению, чтобы сделать«копия при записи»);и единственный случай «копирования при записи» - это файлы с отображением в памяти, где страница совместно используется одним или несколькими процессами и (локальным) кешем VFS.
Для 64-разрядных 80x86 ЦП требуется дерево из 4-х уровней таблиц (таблиц страниц, каталогов страниц, таблиц указателей каталогов страниц и уровня 4 карты страниц), а также для повышения эффективности (снижения потребления памяти и уменьшения количества кешей,и т. д.) Я использую эти таблицы в максимально возможной степени.
Для записей таблицы страниц (или записей каталога страниц, если используются страницы размером 2 МБ);если страница отсутствует, то процессор игнорирует 63 бита, которые ОС может использовать для своих собственных целей;и если страница присутствует, то (в зависимости от того, какие функции поддерживает ЦП) существует как минимум 9 битов, которые ОС может использовать для своих собственных целей, и флаги, которые использует ЦП (например, флаги «чтение, запись, отсутствие выполнения»)может использоваться для дополнения собственной информации ОС.
Когда страница отсутствует, 63-битные данные разбиваются на 2 поля - одно 8-битное поле для отслеживания виртуального типа страницы (если онадолжен действовать как ОЗУ, если он должен быть исполняемым, если предполагается использовать кэширование с «обратной записью» и т. д.) и одно 55-битное поле «где».Если старший бит в поле «где» установлен, то страница была отправлена в пространство подкачки, а остальные 54 бита - это «дескриптор пространства подкачки» (допускающий максимум «2 ** 54 * 4 КиБ» пространства подкачки);и если старший бит в поле «где» очищен, то остальные 54 бита являются «дескриптором файла отображения памяти».Если сбой страницы происходит из-за отсутствия страницы, обработчик сбоя страницы использует 8-битное поле, чтобы определить, следует ли разрешить или запретить доступ (или он уже обрабатывается из-за того, что другой поток уже обращается к нему)затем (если доступ должен быть разрешен) обработчик сбоев страницы указывает планировщику перевести поток в состояние «WAITING FOR PAGE» и помечает страницу как «извлекаемую» (чтобы другие потоки, принадлежащие тому же процессу, зналичто он уже извлекается), затем использует поле «где» для отправки сообщения запроса с запросом данных страницы в Swap Manager (который является процессом в пользовательском пространстве) или для поиска «дескриптора файла с отображенной памятью»структура в пространстве ядра, которая содержит больше информации (которая не помещается в элементе таблицы страниц), чтобы определить смещение страницы в файле и дескриптор файла, и отправить запрос в VFS для данных страницы (VFS илиВиртуальная файловая система - это еще один процесс в пространстве пользователя).Потом;когда Swap Manager или VFS отправляют ответное сообщение, содержащее данные страницы, обратно в ядро, ядро исправляет запись таблицы страниц (помещая страницу данных из сообщения в виртуальное адресное пространство) и говорит планировщику разблокировать поток / с(переведите их из состояния «WAITING FOR PAGE» в состояние «READY TO RUN»).
Для обоих этих случаев (файл с отображением в памяти и пространство подкачки), если доступ был «разрешенным чтением», тогдастраница отображается только для чтения (независимо от того, должна ли страница быть доступной для записи).Если доступ был «разрешенной записью» или более поздняя «разрешенная запись» выполняется для страницы, которая была ранее извлечена и отображена только для чтения;затем, если данные страницы поступили из пространства подкачки, обработчик ошибок страницы информирует Диспетчер подкачки о том, что копия страницы в пространстве подкачки может быть отброшена (не может использоваться повторно, если та же страница отправляется в пространство подкачки позже), иесли данные страницы поступили из отображенного в память файла, обработчик ошибок страницы информирует VFS о том, что при копировании этой страницы на один процесс меньше, и копирует данные страницы «копировать при записи» на вновь выделенную страницу.
Когда страница «присутствует», она все равно может быть частью файла с отображенной памятью, и в пространстве подкачки все еще может быть копия;но в записи таблицы страниц недостаточно места для хранения поля "где".В этом случае, если страница находится в пространстве подкачки и в ОЗУ, диспетчер подкачки должен принять «Идентификатор процесса + виртуальный адрес» вместо «дескриптора пространства подкачки» (что приводит к небольшим дополнительным издержкам в диспетчере подкачки, потому что он долженпреобразовать «ID процесса + виртуальный адрес» в сам «дескриптор пространства подкачки»).Если страница представляет собой файл с отображением в памяти «копировать при записи», то обработчик ошибок страницы выполняет поиск в списке «дескрипторов файлов, отображаемых в память» (что приводит к небольшим дополнительным затратам).
Обратите внимание, что (втеория), когда операционная система испытывает недостаток свободной оперативной памяти, она хочет выбрать страницу «с наименьшей вероятностью, которая потребуется в ближайшее время» для отправки в пространство подкачки, но это непросто / практично, поэтому большинство операционных систем вместо этого используют «наименее использованные»,Мои ядра не делают этого вообще.Вместо этого они просто отправляют «случайные» страницы в Swap Manager, и (первоначально) Swap Manager хранит данные в оперативной памяти и не отправляет их ни одному из провайдеров swap для хранения;и Менеджер обмена использует «наименее недавно отправленный в менеджер обмена», чтобы выяснить, какие страницы следует отправить провайдеру обмена для хранения.Страница, которая часто используется, может отправляться в менеджер подкачки много раз, даже не отправляя ее провайдеру подкачки (и не вызывая медленного дискового ввода-вывода для часто используемых страниц).Также обратите внимание, что, поскольку «копирование при записи в файл памяти» является единственным случаем, когда используется «копирование при записи», и поскольку другой формы разделяемой памяти не существует, VFS может отслеживать, сколько процессов совместно использует копиюсамим страницам и ядру никогда не нужно отслеживать, сколько процессов совместно используют копию какой-либо страницы (как это делают большинство ядер для большинства операционных систем).