2012-06-21 1 views
1

Это мой первый вопрос здесь; Я не уверен, что это не по теме.Почему файлы с отображением памяти всегда отображаются на границах страниц?

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

Операционные системы, которые позволяют отображаемые в память файлы всегда требуют файлы, которые будут отображаться на границах страниц. Например, с 4 КБ страницей, файл может быть отображен в начиная с виртуальным адресом 4096, но не начиная с виртуальным адресом 5000.

Это утверждение объясняется следующим образом:

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

Я хотел бы попросить помощи, чтобы понять этот ответ. В частности, что означает сказать, что «для отображения одной виртуальной страницы потребуется две частичные страницы на диске»? Из того, что я нашел о файлах с отображением памяти, виртуальные страницы сопоставляются с файлами на диске, а не с файлом подкачки. Это то, что подразумевается под «частичной страницей»?

Кроме того, что подразумевается под «царапиной страницей» здесь? Я попытался найти этот термин в книгах («Современные операционные системы Таненбаума» и «Структурированная компьютерная организация») и в Интернете, но не нашел его.

ответ

1

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

Теперь в связи с этим. Современные операционные системы всегда имеют место на диске для каждой выделенной страницы памяти. Это имеет смысл. Как только потребуется отбросить страницу в памяти - уже ясно, где разместить эту страницу, если она «грязная», или просто отбросить ее, если она не изменена. Эта стратегия широко принята. Хотя возможны и альтернативные политики.

Место на диске может представлять собой файл подкачки или файл с отображением памяти. Наиболее распространенное использование файлов с отображением памяти - исполняемые файлы и dll. Они (почти) никогда не изменялись. Если страница с кодом не используется в течение некоторого времени - отбросьте ее. Если элемент управления появится, перечитайте его из файла.

В тексте тезисы, которые вы упомянули, говорят would need two partial pages on disk to map it. The first page, in particular, would be mapped onto a scratch page. Они, как правило, представляют ситуацию, поскольку здесь есть только одно решение. Фактически, можно выделить страницу в файле подкачки для такой комбинированной страницы и обработать соответствующее копирование данных. Также возможно не иметь ничего в файле подкачки для такой страницы и собирать эту страницу из файлов с использованием временной страницы. В 99% случаев контроллер диска может читать/записывать только с/на границу страницы. Это означает, что вам нужно прочитать с первого файла на страницу памяти, со второго файла на переходную страницу. Скопируйте данные с временной страницы и немедленно отбросьте ее.

Как вы видите, вполне возможно объединить несколько файлов на одной странице. Здесь нет принципиальной проблемы.Хотя алгоритмы для обработки этого решения будут более сложными, и они будут потреблять больше процессорных часов. Реконструкция такой страницы (если она будет отброшена) потребует чтения из нескольких разных файлов. В наши дни 4kb - довольно небольшое количество. Экономия 2 КБ не является огромным выигрышем. На мой взгляд, глядя на преимущества и стоимость, я бы сказал, что выгоды недостаточно значительны.

0

Страницы виртуального адреса (на каждой машине, о которой я когда-либо слышал) выровнены на границах размера страницы. Это просто потому, что математика очень проста. На x86 размер страницы составляет 4096. Это ровно 12 бит. Чтобы определить, к какой виртуальной странице относится адрес, вы просто смещаете адрес вправо на 12. Если вы должны были сопоставить блок диска (предположим, 4096 байт) с адресом 5000, он запустится на странице # 1 (5000 >> 12 == 1) и конец на странице # 2 (9095 >> 12 == 2).

Файлы с отображением памяти работают путем сопоставления фрагмента виртуального адресного пространства с файлом, но данные загружаются по требованию (действительно, файл может быть намного больше физической памяти и может не соответствовать). Когда вы впервые получаете доступ к виртуальному адресу, если данных нет (т. Е. Он не находится в физической памяти). Процессор неисправен, и ОС должна извлекать данные. Когда вы извлекаете данные, вам нужно получить все данные для страницы, иначе вы не сможете отключить эту ошибку. Если вы не выровнены по адресам, вам нужно будет добавить несколько блоков диска, чтобы заполнить страницу. Вы можете это сделать, это просто грязно и неэффективно.