我编写了一个程序来分配特定大小的内存并释放它们。
默认情况下,它会创建总共100MB内存为大小为 100 的数组的每个条目分配 1MB。
当我查找系统监视器并找到该程序(添加系统暂停以查找),它只显示292KiB在内存领域。是这样的吗?292KiB 和 100MB 差别很大……
代码如下,您可以直接编译并运行。
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdint.h>
#include <getopt.h>
static const char *progname;
struct optargs {
int size;
};
static struct option long_options[] = {
{"size", 1, 0, 's'},
{"help", 0, 0, 'h'},
{ NULL, 0, 0, 0 }
};
void Usage() {
printf("Allocate 150MB memory\n./program --size|-s 150\n");
exit(0);
}
int run(struct optargs opts) {
char *ptr[opts.size];
int steps = 4;
int sz_unit = 1048576; // 1MB
for (int i=0;i<opts.size;i++) {
ptr[i] = calloc(sz_unit, sizeof(char));
}
system("read -p 'Press Enter to continue...' var");
for (int i=0;i<opts.size;i++) {
free(ptr[i]);
}
return 0;
}
int main(int argc, char **argv) {
int opt_size = 0;
int c;
struct optargs opts;
progname = argv[0];
while ((c = getopt_long(argc, argv, "s:h", long_options, NULL)) != -1) {
switch(c) {
case 's':
opt_size = 1;
opts.size = atoi(optarg);
break;
default:
Usage();
break;
}
}
if (!opt_size)
opts.size = 100;
printf("Will allocate %dMB memory\n", opts.size);
run(opts);
return 0;
}
编译并运行:
gcc FILE -o run
./run
答案1
我自己回答一下。
https://duckduckgo.com/?q=linux+overcommit+memory&atb=v203-1&ia=web
Linux 一直等到真正开始执行诸如 ptr[i][0] = 1; 之类的操作后才真正将内存映射到程序地址空间中。
我分配数组值之后,系统监视器中查找的内存使用情况是正确的!