Friday, May 18th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Управление памятью Изменение размера процесса

Изменение размера процесса

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

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

Проверяется, что ресурсы виртуальной памяти доступны.

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

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

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


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 52 гостей онлайн