Первым ресурсом, который должен быть зарезервирован при дублировании адресного пространства, является необходимое виртуальное адресное пространство. Чтобы избежать выхода за пределы памяти, ядро должно убедиться, что оно не обещает предоставить больше виртуальной памяти, чем оно способно предоставить. Общий размер виртуальной памяти, которая может быть предоставлена системой, ограничен количеством доступной для страничной подкачки физической памяти плюс объем предусмотренного пространства подкачки. Несколько страниц сохраняются в резерве для организации ввода/вывода между областью подкачки и основной памятью.
Причина этого ограничения в том, что процессы получают синхронные уведомления об ограничениях памяти. В частности, процесс должен получить сообщение об ошибке из системного вызова (такого, как sbrk, fork или mmap), если недостаточно ресурсов для выделения необходимой виртуальной памяти. Если ядро обещает больше виртуальной памяти, чем оно может обеспечить, оно может попасть в тупик, пытаясь обслужить отказ страницы. Проблема возникает, когда нет свободных страниц для обслуживания отказа и нет доступного пространства подкачки для сохранения активной страницы. Здесь у ядра нет выбора, кроме посылки сигнала завершения (kill) процессам, неудачно вызвавшим отказ страницы. Такое асинхронное уведомление о недостаточности ресурсов памяти является неприемлемым.
Из этого ограничения исключаются лишь те части адресного пространства, которые отображаются с правом только для чтения (такие, как код программ). Любые страницы, которые используются для части адресного пространства с правом доступа только для чтения, можно вернуть без сохранения, поскольку их содержимое можно восстановить из первоначального источника. Из этого ограничения исключаются также части адресного пространства, которые отображают разделяемые файлы. Ядро может вернуть любые страницы, которые используются для разделяемого отображения, после записи их содержимого обратно в файловую систему, из которой они были отображены. Здесь файловая система используется как расширение области подкачки. Наконец, любой участок памяти, который используется более чем одним процессом (такой, как область анонимной памяти, разделяемой несколькими процессами), следует учитывать лишь один раз в подсчете предела виртуальной памяти.
Ограничение на размер виртуального адресного пространства, которое можно выделить, вызывает проблемы для приложений, которые хотят выделять большие участки адресного пространства, но использовать их лишь изредка. Например, процесс может захотеть сделать индивидуальное отображение большой базы данных, лишь к небольшой части которой будет осуществляться доступ. Поскольку у ядра нет способа гарантировать, что доступ будет редким, оно принимает пессимистическую точку зрения, что будет модифицироваться весь файл, и отвергнет запрос. Одним из расширений, которое сделали многие производные из BSD-системы к системному вызову mmap, является добавление флага, который сообщает ядру, что процесс готов к приему асинхронных отказов в отображении. Такому отображению было бы позволено использовать такой объем виртуальной памяти, который не был обещан другим процессам. Если затем процесс модифицирует большую часть файла, чем эта доступная память, или если возможности уменьшены другими процессами, выделяющими гарантированную память, ядро может послать процессу отказ сегментации или более специфичный сигнал. Получив сигнал, процесс должен выполнить munmap для ненужной части файла, чтобы вернуть ресурсы обратно в систему. Процесс должен гарантировать, что структуры кода, стека и данных, необходимые для обработки сигнала отказа сегмента, не находятся в той части адресного пространства, которая подвержена таким отказам.
Точное отслеживание невыделенной (outstanding) виртуальной памяти и определение того, когда следует ограничить дальнейшие распределения, является сложной задачей. Поскольку большинство процессов используют лишь около половины своего виртуального адресного пространства, ограничение невыделенной виртуальной памяти суммой адресных пространств процесса является чрезмерно консервативным. Однако допущение больших выделений создает риск выхода за пределы виртуальной памяти. Хотя FreeBSD вычисляет загрузку невыделенной памяти, она не проводит в жизнь какое-нибудь ограничение общей памяти, поэтому ее можно заставить пообещать больше, чем она может предоставить. Когда ресурсы памяти заканчиваются, она выбирает процесс для завершения, предпочитая процессы с большим использованием памяти. Важным будущим усовершенствованием будет разработка эвристики для определения того, когда ресурсы виртуальной памяти близки к завершению и нуждаются в ограничении.
- 28/10/2010 11:59 - Раскраска страниц (page coloring)
- 28/10/2010 08:07 - Манипулирование процесса своим адресным пространством
- 26/10/2010 13:51 - Исполнение файла
- 26/10/2010 11:57 - Дизайн аппаратного кеша
- 26/10/2010 07:21 - Дублирование адресного пространства пользователя
- 25/10/2010 16:31 - Создание нового процесса
- 24/10/2010 06:47 - Индивидуальные моментальные снимки
- 23/10/2010 02:20 - Страничная подкачка
- 22/10/2010 23:00 - Пейджер подкачки
- 22/10/2010 12:25 - Сворачивание теневых цепочек