Как работает sbrk()?
Я пытаюсь понять как sbrk
работает.
Вот мой маленький код:
int main()
{
printf("end of the break : %p\n", sbrk(0));
printf("end of the break : %p\n", sbrk(10));
printf("new end of the break : %p\n\n", sbrk(0));
}
Это выводит:
end of break : 0xaa6000 end of break : 0xac7000 new end of the break : 0xac700a
Почему разница между первыми двумя адресами 0xac7000 - 0xaa6000 = 21000, а не 10?
1 ответ
sbrk(n)
увеличивает разрыв на n
и возвращает старое значение разрыва.
Таким образом:
printf("end of the break : %p\n", sbrk(0));
Выход: end of the break : 0xaa6000
Первоначально, разрыв составляет 0xaa6000 и sbrk
звонок не меняет это.
printf("end of the break : %p\n", sbrk(10));
Выход: end of the break : 0xac7000
Это значение, о котором вы спрашиваете. Выше я сказал sbrk(0)
не изменил бы разрыв, так почему мы получаем другое значение здесь?
Единственное, что произошло между двумя sbrk
вызов - это вызов первому printf
, Предположительно внутренности вашей реализации stdio используют malloc
(например, для создания буферов), который в свою очередь вызывает sbrk
сам. Другими словами, printf
звонки malloc
внутренне, который резервирует память, используя sbrk
,
printf("new end of the break : %p\n\n", sbrk(0));
Выход: new end of the break : 0xac700a
На этот раз мы видим приращение 0xa, которое соответствует вашему предыдущему sbrk(10)
позвони точно. Видимо на этот раз printf
не нужно было выделять динамическую память (или, если это было сделано, malloc
был в состоянии сделать все в пространстве, которое он получил с первого раза sbrk
так что не нужно было запрашивать больше у ОС).