[英]How does sbrk() work?
我試圖了解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?
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
獲得的空間內完成所有操作,因此它不需要從OS上請求更多)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.