В наши дни sbrk (2) (и brk
) - это почти устаревшие системные вызовы (и вы можете почти забыть о них и проигнорировать старое понятие прерывания ; фокуспри понимании mmap (2) ).Обратите внимание, что на странице sbrk (2) man
написано NOTES :
Избегайте использования brk()
и sbrk()
: пакет выделения памяти malloc (3) - это портативный и удобный способ выделения памяти.
(выделено мной)
Большинство реализаций malloc (3) (особенно в musl-libc ) скорее используют mmap (2) , чтобы требовать память -и увеличить их виртуальное адресное пространство - из ядра (посмотрите на это виртуальное адресное пространство вики-страничка, у него есть хорошая картинка).Некоторые malloc
-s используют sbrk
для небольших распределений, mmap
для больших.
Используйте strace (1) для поиска системных вызовов (перечисленных в syscalls (2) ), выполняемые каким-либо заданным процессом или командой.Кстати, вы обнаружите, что bash
и ls
(и, вероятно, многие другие программы) не делают ни одного вызова sbrk
.
Исследуйте виртуальное адресное пространство какого-либо процесса с помощью ** Proc одна тысяча пятьдесят-четыре (5) .Попробуйте cat /proc/$$/maps
и cat /proc/self/maps
и даже cat /proc/$$/smaps
и прочитайте немного, чтобы понять вывод.
Помните о ASLR & vdso (7) .
И sbrk
не очень подходит для потоков.
(мой ответ сосредоточен на Linux)