linux elf .bss 部分内存开销
linux elf .bss section memory cost
#include <string.h>
#include <stdio.h>
typedef struct {
char a[1024];
} AA;
static AA a[102400];
int main(int argc, char **argv)
{
getchar();
memset(a, 0, sizeof(a)/2);
getchar();
}
我想了解 elf .bss 的内存开销。以上是我的测试程序。当程序启动时,它使用很少的内存所以我认为静态AA a[102400] 没有映射到all.When 我按"Enter" 让它memset 数组的一半,消耗了50M 内存。这是否意味着 linux 内核支持动态映射 .bss 部分,所以我不需要关心未使用的 global/static 变量的内存浪费?
.bss
部分被写入时复制映射到零页。
如果你不写入它,它实际上不是你程序的 RSS(驻留集大小)的一部分,因为它总是可以从零页映射回来。
当你写入它的那一刻,内核需要将它重新映射到可写内存,而现在你实际上正在消耗那块内存。
#include <string.h>
#include <stdio.h>
typedef struct {
char a[1024];
} AA;
static AA a[102400];
int main(int argc, char **argv)
{
getchar();
memset(a, 0, sizeof(a)/2);
getchar();
}
我想了解 elf .bss 的内存开销。以上是我的测试程序。当程序启动时,它使用很少的内存所以我认为静态AA a[102400] 没有映射到all.When 我按"Enter" 让它memset 数组的一半,消耗了50M 内存。这是否意味着 linux 内核支持动态映射 .bss 部分,所以我不需要关心未使用的 global/static 变量的内存浪费?
.bss
部分被写入时复制映射到零页。
如果你不写入它,它实际上不是你程序的 RSS(驻留集大小)的一部分,因为它总是可以从零页映射回来。
当你写入它的那一刻,内核需要将它重新映射到可写内存,而现在你实际上正在消耗那块内存。