сбрк
Эту статью , возможно, придется переписать, Википедии чтобы она соответствовала стандартам качества . ( февраль 2012 г. ) |
брк и sbrk — это базовые управления памятью системные вызовы , используемые в Unix и Unix-подобных операционных системах для управления объемом памяти, выделяемой сегменту кучи процесса . [ 1 ] Эти функции обычно вызываются из библиотечной функции управления памятью более высокого уровня, такой как маллок . В исходной системе Unix брк и sbrk был единственным способом, с помощью которого приложения могли получить дополнительное пространство в куче; более поздние версии позволяли это делать с помощью вызов ммап . [ 2 ] [ 3 ]
Описание
[ редактировать ]Вызовы brk и sbrk динамически изменяют объем пространства, выделенного для сегмента кучи вызывающего процесса. Изменение вносится путем сброса программного прерывания процесса, определяющего максимальное пространство, которое может быть выделено. Прерывание программы — это адрес первого места за текущим концом области данных. Объем доступного пространства увеличивается по мере увеличения значения разрыва. Доступное пространство инициализируется нулевым значением, если разрыв не будет уменьшен, а затем увеличен, поскольку он может повторно использовать одни и те же страницы каким-то неопределенным образом. Значение разрыва может быть автоматически округлено до размера, соответствующего архитектуре управления памятью . [ 4 ]
сбрк и brk считались устаревшими даже по стандартам 1997 года ( Единая спецификация UNIX v2 или POSIX.1-1998). [ 5 ] Они были удалены в POSIX.1-2001. [ 6 ]
Сигнатуры функций и поведение
[ редактировать ]#include <unistd.h>
int brk(void* end_data_segment);
void *sbrk(intptr_t increment);
sbrk используется для настройки значения остановки программы путем добавления, возможно, отрицательного размера, в то время как brk используется для установки значения разрыва, равного значению указателя. Установите параметр приращения равным нулю, чтобы получить текущее значение остановки программы.
В случае успешного завершения, Функция brk возвращает значение 0, а функция Функция sbrk возвращает предыдущее значение разрыва программы (если доступное пространство увеличивается, то это предшествующее значение также указывает на начало новой области). значение -1 и Если какая-либо из подпрограмм завершилась неудачно, возвращается errno Глобальная переменная установлена для указания ошибки. [ 5 ]
Не каждая Unix-подобная система поддерживает концепцию управления сегментом данных пользователем. Mac OS X Реализация sbrk является эмуляцией и имеет максимальное выделение 4 мегабайт. При первом вызове для хранения моделируемого сегмента выделяется именно такая большая область. Когда этот предел достигнут, возвращается -1 и ошибка установлена на ЭНОМЕМ . брк всегда ошибки. [ 7 ]
Коды ошибок
[ редактировать ]Ошибка ENOMEM установлен, и выделенное пространство остается неизменным, если выполняется одно или несколько из следующих условий:
- Запрошенное изменение выделяет больше места, чем разрешено установленным системой максимумом.
- Запрошенное изменение устанавливает значение разрыва, большее или равное начальному адресу любого подключенного сегмента общей памяти .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Концепции памяти процесса» . Фонд свободного программного обеспечения . Проверено 9 октября 2015 г.
- ^ «Новый malloc(3) для OpenBSD» (PDF) . Проверено 13 июня 2018 г.
- ^ «Управление памятью POSIX» . blog.pr4tt.com .
- ^ Спецификация X / Open CAE, системные интерфейсы и заголовки (PDF) (2-е изд.). X/Open Company Ltd., Великобритания, сентябрь 1994 г., с. 64 . Проверено 9 октября 2015 г.
- ^ Перейти обратно: а б "brk, sbrk - изменить распределение пространства (LEGACY)" . Единая спецификация UNIX®, версия 2 . 1997 год . Проверено 30 ноября 2019 г.
- ^ Linux программиста Руководство – Системные вызовы –
- ^ «БРК.с» .