簡體   English   中英

sbrk 的最大增量

[英]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 調用成功,以下應該是正確的:

  • 該參數應在處理器/機器支持的地址空間內。 許多現代系統最多允許 2^48 個地址(與 2^64 的理論限制相反。
  • 請求的堆大小的總大小應在配置限制范圍內:特定於進程的硬/軟限制 (ulimit) 和系統配置限制。
  • 當增加堆大小時,應該有足夠的物理或交換空間來支持請求的內存。

回到用戶問題,運行32位程序(在32位或64位系統上)時,限制為2GB或更少。 並且 1e10 將不起作用。 運行 64 位程序時,請求可能會失敗或通過,具體取決於配置、資源和設置。

我做了更多的實驗來嘗試檢查哪些配置和資源可以解釋所描述的行為。

我發現我無法分配大於總物理內存 + 交換的連續內存塊。 這似乎回答了我的問題。

但是,這是配置嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM