WikiDer > Сбрк

Sbrk

BRK и sbrk основные управление памятью системные вызовы используется в Unix и Unix-подобный операционные системы для управления объемом памяти, выделенной для сегмент данных из процесс.[1] Эти функции обычно вызываются из функции библиотеки управления памятью более высокого уровня, такой как маллок. В исходной системе Unix BRK и sbrk были единственными способами, которыми приложения могли получить дополнительное пространство данных; более поздние версии позволяли это также делать с помощью mmap вызов.[2][3]

Описание

Вызовы brk и sbrk динамически изменять объем пространства, выделенного для сегмента данных вызывающего процесса. Изменение осуществляется путем сброса прерывания программы процесса, которое определяет максимальное пространство, которое может быть выделено. Разрыв программы - это адрес первого места за текущим концом области данных. Объем доступного пространства увеличивается с увеличением значения разрыва. Доступное пространство инициализируется нулевым значением, если разрыв не будет уменьшен, а затем увеличен, поскольку он может повторно использовать те же страницы каким-либо неопределенным образом. Значение разрыва может быть автоматически округлено до размера, подходящего для управление памятью архитектура.[4]

sbrk и BRK считаются устаревшими даже по стандартам 1997 года (Единая спецификация UNIX v2 или POSIX.1-1998).[5] Они были удалены в POSIX.1-2001.[6]

Сигнатуры и поведение функций

#включают <unistd.h>int BRK(пустота* end_data_segment);пустота *sbrk(intptr_t приращение);

sbrk используется для настройки значения прерывания программы путем добавления возможно отрицательного размера, а BRK используется для установки значения разрыва на значение указателя. Набор приращение нулевое значение, чтобы получить текущее значение прерывания программы.

После успешного завершения BRK подпрограмма возвращает значение 0, а sbrk подпрограмма возвращает предыдущее значение прерывания программы (если доступное пространство увеличивается, это предыдущее значение также указывает на начало новой области). Если какая-либо подпрограмма завершилась неудачно, значение −1 возвращается и errno глобальная переменная установлен, чтобы указать на ошибку.[5]

Не каждая Unix-подобная система поддерживает идею о том, что пользователь может управлять сегментом данных. В Mac OS X реализация sbrk является эмуляцией и имеет максимальный размер 4 мегабайта. При первом вызове для моделирования сегмента выделяется именно такая большая область. Когда этот предел достигнут, возвращается -1 и errno установлен на ЭНОМЕМ. BRK всегда ошибки.[7]

Коды ошибок

Ошибка ЭНОМЕМ установлен, и выделенное пространство остается неизменным, если выполняется одно или несколько из следующих условий:

  • Запрошенное изменение выделяет больше места, чем разрешено установленным системой максимумом.
  • Запрошенное изменение устанавливает значение перерыва в значение больше или равно начальный адрес любого прикрепленного Общая память сегмент.

Смотрите также

Рекомендации

  1. ^ «Концепции памяти процесса». Фонд свободного программного обеспечения. Получено 9 октября 2015.
  2. ^ «Новый malloc (3) для OpenBSD» (PDF). Получено 13 июн 2018.
  3. ^ «Управление памятью POSIX». blog.pr4tt.com.
  4. ^ Спецификация X / Open CAE, системные интерфейсы и заголовки (PDF) (2-е изд.). X / Open Company Ltd., Великобритания, сентябрь 1994 г., стр. 64. Получено 9 октября 2015.
  5. ^ а б "brk, sbrk - изменить выделение пространства (НАСЛЕДИЕ)". Единая спецификация UNIX®, версия 2. 1997. Получено 30 ноября 2019.
  6. ^ brk (2) – Linux Программиста Руководство - Системные вызовы
  7. ^ https://opensource.apple.com/source/Libc/Libc-1272.250.1/emulated/brk.c.auto.html