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发布于 2020-01-03 22:03:11
从技术上讲,sbrk将在大多数现代系统上采用intptr_t。当使用32位指针进行编译时,这将是32位有符号整数数量(-2^31到2^31-1),当使用64位指针进行编译时,这将是64位有符号整数(-2^63到2^63-1)。
当然,实际范围要小得多。要使sbrk调用成功,应满足以下条件:
回到用户的问题,当运行32位程序(在32或64系统上)时,限制是2 2GB或更小。和1e10将不起作用。运行64位程序时,请求可能会失败或通过,具体取决于配置、资源和设置。
发布于 2020-01-04 06:37:16
我做了更多的实验,试图检查哪些配置和资源可以解释所描述的行为。
我发现我无法分配一个大于总物理内存+交换空间的连续内存块。这似乎回答了我的问题。
然而,这是一种配置吗?
https://stackoverflow.com/questions/59572930
复制相似问题