я пишу программу переменного тока, чтобы выделить определенный объем памяти и освободить их.
По умолчанию он создает полностью 100 МБ памяти с помощью malloc 1 МБ для каждой записи массив размером 100.
Когда я просматриваю системный монитор и нахожу программу (добавляю системную паузу для поиска), в поле памяти отображается только 292 КБ . Это правда? 292 КБ и 100 МБ очень разные ...
Код, как показано ниже, вы можете просто скомпилировать и запустить.
#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; перед фактическим отображением памяти в адресное пространство вашей программы.
После того, как я назначил значения массива, использование памяти из поиска в системном мониторе будет правильным!