2 votes

allocation de mémoire différente lors de la recherche dans le moniteur système

J'écris un programme c pour allouer une taille spécifique de mémoire et les libérer.

Par défaut, il crée 100 Mo de mémoire au total par malloc 1MB pour chaque entrée d'un tableau de taille 100.

Quand je regarde moniteur système et trouver le programme (ajoutez la pause système à la recherche), il ne montre que 292KiB dans le champ de la mémoire. Est-ce que c'est vrai ? 292KiB et 100MB sont très différents...

Le code comme ci-dessous, vous pouvez juste compiler et exécuter.

#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;
}

Compilez et exécutez :

gcc FILE -o run
./run

1voto

code_worker Points 137

J'y répondrai moi-même.

https://duckduckgo.com/?q=linux+sur-engagement+mémoire&atb=v203-1&ia=web

Linux attend que l'on commence à faire des choses comme ptr[i][0] = 1 ; avant de mapper réellement la mémoire dans l'espace d'adressage de votre programme.

Après avoir assigné les valeurs du tableau, l'utilisation de la mémoire de la recherche dans le moniteur système est correcte !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X