首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >到sbrk的最大增量

到sbrk的最大增量
EN

Stack Overflow用户
提问于 2020-01-03 11:43:02
回答 2查看 204关注 0票数 1

sbrk调用中可以使用的增量上限是多少?

我无法成功地调用具有2e10增量的sbrk,但是我能够连续三次调用具有1e10增量的sbrk

我的mmap也有类似的问题。

在装有glibc 2.30的Arch Linux 5.4.3-arch1-1 x86-64上测试。

使用gcc 9.2.0编译的代码示例。

代码示例:

代码语言:javascript
复制
#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;
}

上面的代码产生了以下输出:

代码语言:javascript
复制
sizeof(intptr_t)=8
error sbrk 1
EN

回答 2

Stack Overflow用户

发布于 2020-01-03 22:03:11

从技术上讲,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系统上)时,限制是2 2GB或更小。和1e10将不起作用。运行64位程序时,请求可能会失败或通过,具体取决于配置、资源和设置。

票数 1
EN

Stack Overflow用户

发布于 2020-01-04 06:37:16

我做了更多的实验,试图检查哪些配置和资源可以解释所描述的行为。

我发现我无法分配一个大于总物理内存+交换空间的连续内存块。这似乎回答了我的问题。

然而,这是一种配置吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59572930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档