Как и где используется sbrk в malloc.c?

Я читал в Advanced Unix Programming (а также в нескольких других книгах), что Linux malloc() использует системный вызов Linux sbrk() для запроса памяти из операционной системы.

Я смотрю на код glibc malloc.c и вижу много упоминаний sbrk() в комментариях, но не упоминаемых непосредственно в коде.

Как/где sbrk() упоминается/используется, когда malloc() запрашивает память у ОС?

(Это может быть общее непонимание с моей стороны того, как выполняются системные вызовы из библиотеки времени выполнения C. Если это так, мне было бы интересно узнать, как они выполняются??)


person user997112    schedule 31.12.2013    source источник
comment
Хотя я не уверен в фактическом расположении sbrk, между системным вызовом в C и функцией нет никакой разницы, за исключением того, что управление полностью осуществляется операционной системой до тех пор, пока системный вызов не завершится.   -  person millinon    schedule 01.01.2014
comment
sbrk(2) становятся устаревшими. Есть веские причины (многопоточность) использовать mmap(2)< /а> только.   -  person Basile Starynkevitch    schedule 01.01.2014
comment
@BasileStarynkevitch, не могли бы вы вкратце рассказать о таких причинах?   -  person user997112    schedule 01.01.2014
comment
Прочтите справочную страницу. sbrk удален из последнего стандарта Posix.   -  person Basile Starynkevitch    schedule 01.01.2014


Ответы (1)


Glibc malloc.c запрашивает больше памяти, вызов функции, хранящейся в глобальном указателе функции __morecore (вызов фактически использует макрос MORECORE, который расширяется до __morecore). По умолчанию он содержит адрес функции __default_morecore, которая определена в morecore.c. Эта функция вызывает sbrk.

Обратите внимание, что некоторые реализации malloc могут использовать mmap для получения большего объема памяти вместо sbrk.

person interjay    schedule 31.12.2013
comment
Круто - нашел. Комментарий в файле morecore.c гласит: Выделите НА ИНКРЕМЕНТ больше байтов пространства данных и верните начало пространства данных. Итак, если мне нужны 100 байт данных, я вызываю malloc(), что в конечном итоге вызывает функцию из morecore.c, которая вызывает sbrk(), и эта функция возвращает указатель на начало 100 байт? Или sbrk() используется до того, как вызывается main(), чтобы выделить всю кучу для процесса? - person user997112; 01.01.2014
comment
@ user997112 Размер кучи заранее неизвестен, поэтому sbrk будет вызываться malloc. Но он не будет преобразовывать 1 в 1, потому что malloc, вероятно, запросит большие блоки памяти у sbrk, а затем разделит их, а также может вернуть ранее освобожденную память вызывающему, не нуждаясь в sbrk. - person interjay; 01.01.2014
comment
Таким образом, все, что делает sbrk, — это принимает запрос на память с заданным размером и предоставляет указатель на нее. Разве это не ОЧЕНЬ похоже на то, что делает malloc()? Другими словами, какова цель malloc(), если sbrk делает это? Просто для того, чтобы загрузить обработку ошибок? - person user997112; 01.01.2014
comment
sbrk() не знает, какие части памяти все еще используются, так как нет эквивалента свободной памяти; malloc обрабатывает переработку блоков памяти, которые были malloc()ed и free()d. - person Guntram Blohm; 01.01.2014