Процесс может изменить свой размер в ходе выполнения, явным образом запросив дополнительное пространство данных с помощью системного вызова sbrk. Также сегмент стека будет автоматически расширен, если произойдет столкновение с ошибкой защиты из-за попытки увеличения стека ниже конца области стека. В любом случае размер адресного пространства процесса должен быть изменен. Размер запроса всегда округляется в большую сторону до ближайшего значения, кратного размеру страницы. Новые страницы помечаются для заполнения нулями, поскольку нет содержимого, первоначально связанного с новыми разделами адресного пространства.
Первым шагом в увеличении размера процесса является проверка того, не будет ли новый размер нарушать ограничение размера для этого сегмента процесса. Если новый размер в пределах нормы, для увеличения области данных предпринимаются следующие шаги.
Проверяется, что ресурсы виртуальной памяти доступны.
Проверяется, что адресное пространство запрошенного размера, следующее непосредственно за текущим концом области данных, еще не отображено.
Если существующий vm_map_entry является единственной ссылкой на объект подкачки, увеличить конечный адрес vm_map_entry на запрошенный размер и увеличить размер объекта подкачки на тот же размер. Если у объекта подкачки есть две или более ссылок (как было бы после разветвления процесса), должен быть создан новый vm_map_entry с начальным адресом, следующим сразу после конца предыдущего элемента фиксированного размера. Вычисляется его конечный адрес, чтобы дать ему запрашиваемый размер. Он будет зарезервирован новым объектом подкачки. Пока этот процесс не разветвится снова, новый элемент и его объект подкачки смогут продолжать расти.
Если изменение должно уменьшить размер сегмента данных, операция проста: любая память, выделенная страницам, которые больше не будут частью адресного пространства, освобождается. Конечный адрес vm_map_entry уменьшается на этот размер. Если запрошенное уменьшение размера превышает диапазон, определенный vm_map_entry, освобождается весь элемент, а оставшееся уменьшение применяется к vm_map_entry, который предшествует ему. Этот алгоритм применяется до тех пор, пока не будет выполнено все уменьшение. Будущие ссылки на эти адреса вызовут ошибки защиты, поскольку доступ запрещен, когда диапазон адресов был освобожден.
- 01/11/2010 22:58 - Подкачка процессов
- 31/10/2010 22:44 - Отображение файлов
- 29/10/2010 23:12 - Демон выгрузки страниц
- 29/10/2010 05:27 - Параметры страничной подкачки
- 29/10/2010 00:56 - Замещение страниц
- 28/10/2010 11:59 - Раскраска страниц (page coloring)
- 26/10/2010 13:51 - Исполнение файла
- 26/10/2010 11:57 - Дизайн аппаратного кеша
- 26/10/2010 07:21 - Дублирование адресного пространства пользователя
- 26/10/2010 06:04 - Зональный распределитель ядра