我编写 ac 程序来分配特定大小的内存并释放它们。
默认情况下,它通过 malloc 1MB 为 100 大小数组的每个条目创建总共 100MB 内存。
当我查找系统监视器并找到程序(添加系统暂停以查找)时,它仅在内存字段中显示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
自己回答吧。
https://duckduckgo.com/?q=linux+overcommit+memory&atb=v203-1&ia=web
Linux 一直等到真正开始做 ptr[i][0] = 1; 之类的事情。在实际将内存映射到程序地址空间之前。
在我分配数组的值后,系统监视器中查找的内存使用情况是正确的!