Пространство логических адресов больше, чем объединение физических и резервных копий - PullRequest
0 голосов
/ 30 апреля 2019

Когда виртуальное адресное пространство больше, чем физическая память, ОС может использовать подкачку для удаления кадров страницы (например, вытеснение LRU). CPU генерирует Page Fault, где страница, находящаяся на диске, выгружается в основную память. Что происходит, когда виртуальный адрес достаточно велик, чтобы ни в основной памяти, ни на диске не было достаточно места для его хранения? Что происходит, когда фрейма страницы нет на диске? Вызывается ли ошибка другой страницы?

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Когда виртуальное адресное пространство больше, чем физическая память, ОС может использовать подкачку для удаления кадров страницы (например, вытеснение LRU)

Предположим, что виртуальный адрес является 48-разрядным(поэтому размер одного виртуального адресного пространства составляет 256 ТиБ), и вы запускаете 123 процесса, каждый из которых имеет свое собственное виртуальное адресное пространство.Это в сумме составляет 31488 ТБ виртуального адресного пространства. Примечание: это "очень нормально" для современного ПК 80x86, работающего под управлением современной ОС (Windows, Linux, ...).

Из этого 31488 TiB:

  • почти все из них будут неиспользованы и помечены как "не присутствующие".Если программное обеспечение пытается получить к нему доступ, вы получаете ошибку страницы, обработчик ошибок страницы понимает, что это ошибка, и вы, вероятно, в конечном итоге получаете SIGSEGV (или «синий экран смерти» или ...).Поскольку она не используется, ОС не требуется ОЗУ или дисковое пространство для нее.

  • некоторые из них будут одинаковыми, загруженными в ОЗУ один раз, а затем отображенными вмного виртуальных адресных пространств.Это чрезвычайно распространено как для самого ядра, так и для общих библиотек / DLL.Сюда также входят случаи, когда одно и то же ОЗУ используется для кэша виртуальной файловой системы и для файлов, отображаемых в память, или одно и то же ОЗУ отображается в 2 или более процессов как «общая память», или когда одно и то же ОЗУ отображается в 2 или болеевиртуальные адресные пространства как «копирование при записи» (например, после fork()).

  • некоторые будут «выделяться при записи» - буквально та же страница, полная нулей, отображенных вмного виртуальных адресов во многих виртуальных адресных пространствах, где, если вы пишете в него, вы получаете ошибку страницы, а обработчик ошибок страницы выделяет новую страницу ОЗУ для страницы, на которую вы пытались записать.Это позволяет ОС делать вид, что огромное количество виртуального пространства выделено и заполнено нулями без использования ОЗУ или дискового пространства (до тех пор, пока оно фактически не будет изменено).

  • некоторые будут(измененные) данные, которые являются уникальными для конкретного процесса.

Конечный результат заключается в том, что 31488 ТиБ общего виртуального пространства может потребовать всего несколько ГиБ ОЗУ (и, вероятно, не будетиспользовать пространство подкачки вообще).

Чрезмерная фиксация

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

a) Отказаться от предоставления процессам возможности выделять больше, если вы не можете охватить наихудший случай (например, возвращать ошибку «недостаточно памяти», когда процесс пытается выделить больше, чемОС может поставить).Это плохо, потому что наихудший случай крайне маловероятен, и вы в конечном итоге приводите к сбоям программного обеспечения без причины («недостаточно памяти», когда на самом деле достаточно памяти для покрытия текущих требований).

b) Разрешить процессам выделять больше(в пределах разумного), даже если вы не можете охватить худший случай.В большинстве случаев это работает нормально, но если на самом деле случается худший случай, что-то должно сломаться (например, ОС завершает процесс, чтобы освободить часть оперативной памяти).

Лучший вариант (на мой взгляд) - первыйопция (не разрешать чрезмерную фиксацию), но иметь большой объем пространства подкачки.По существу;это похоже на «разрешить чрезмерную фиксацию оперативной памяти, но не разрешать избыточную фиксацию пространства подкачки + оперативная память»;где ОС, вероятно, будет работать медленно (из-за чрезмерного использования пространства подкачки), прежде чем она начнет говорить процессам «больше нет памяти»;и где большую часть времени все будет в ОЗУ (и в идеале пространство подкачки используется только для покрытия маловероятного наихудшего случая).

0 голосов
/ 01 мая 2019

Что происходит, когда виртуальный адрес достаточно велик, чтобы ни в основной памяти, ни на диске не было достаточно места для его хранения?

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

Что происходит, когда фрейма страницы нет на диске?

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

Вызывается ли ошибка на другой странице?

номер

В системе логической памяти (поддерживаемой большинством процессоров) страница имеет два состояния:

1. Mapped
2. Unmapped

В системе виртуальной памяти существует три состояния:

1. Mapped
2. Unmapped and valid
3. Unmapped and invalid

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

...