[英]Maximum increment to sbrk
sbrk
調用中可以使用的增量的上限是多少?
我無法以2e10
增量成功調用sbrk
,但我可以連續三次以1e10
增量調用sbrk
。
我對mmap
有類似的問題。
在帶有 glibc 2.30 的 Arch Linux 5.4.3-arch1-1 x86-64 中測試。
使用 gcc 9.2.0 編譯的代碼示例。
代碼示例:
#define _DEFAULT_SOURCE
#include <stdio.h>
#include <unistd.h>
int main() {
printf("sizeof(intptr_t)=%ld\n", sizeof(intptr_t));
intptr_t increment = 1e10;
if (sbrk(increment * 2) == (void *) -1) {
printf("error sbrk 1\n");
}
if (sbrk(increment) == (void *) -1) {
printf("error sbrk 2\n");
}
if (sbrk(increment) == (void *) -1) {
printf("error sbrk 3\n");
}
if (sbrk(increment) == (void *) -1) {
printf("error sbrk 4\n");
}
return 0;
}
上面的代碼導致以下輸出:
sizeof(intptr_t)=8
error sbrk 1
從技術上講,sbrk 將在大多數現代系統上采用intptr_t
。 使用 32 位指針編譯時,這將是 32 位有符號整數(-2^31 到 2^31-1),使用 64 位指針編譯時,這將是 64 位有符號整數(-2^63 到 2^63-1)。
當然,實際的范圍要小得多。 為了使 sbrk 調用成功,以下應該是正確的:
回到用戶問題,運行32位程序(在32位或64位系統上)時,限制為2GB或更少。 並且 1e10 將不起作用。 運行 64 位程序時,請求可能會失敗或通過,具體取決於配置、資源和設置。
我做了更多的實驗來嘗試檢查哪些配置和資源可以解釋所描述的行為。
我發現我無法分配大於總物理內存 + 交換的連續內存塊。 這似乎回答了我的問題。
但是,這是配置嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.