2017-08-12 1 views
1

Je cherche un programme qui fait les choses suivantes:programme avec la plus petite empreinte mémoire possible (sous Linux)

  1. Waits indéfiniment, alias ne quittez pas par elle-même lorsqu'elle est appelée avec ./prog &
  2. A l'plus faible empreinte de mémoire possible en cours d'exécution, comme mesurée, par exemple, par l'outil pmap, le programme et les champs [stack].

Cette question n'est pas purement académique, je travaille sur un memory scanner et j'ai besoin d'un exemple minimal pour travailler avec.

Le plus petit que je pouvais venir avec (en pur C) est:

#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    pause(); 
    return 0; 
} 

mais je suis sûr que cela peut être éclipsée avec un certain montage/compilateur/C magie arcanique, comme celui-ci mange plus de 180 Ko de programme + pile.

+2

En fait, vous voulez de la magie de l'éditeur de liens, avec un script d'éditeur de liens personnalisé pour réduire autant que possible les espaces de mémoire. –

+0

'#include int principal (int argc, char ** argv) { return pause(); } 'sera * marginalement * plus petit ;-) – wildplasser

+0

@wildplasser: Je ne pense vraiment pas que la taille de la source affectera la taille d'exécution. – 12345ieee

Répondre

6

Essayez ce programme:

#include <sys/syscall.h> 

    .text 
    .globl _start 
    .type _start,@function 
_start: 
    mov $SYS_pause,%eax 
    syscall # pause(); 
    ud2  # crash if pause() returns (should not happen) 

Enregistrer dans un fichier nommé pause.S (S majuscule) et assembler et lien comme celui-ci:

cc -c pause.S 
ld -o pause pause.o 

Cela montre que la consommation d'une page de mémoire sur ma machine . Cette page est probablement une page d'espace de pile, car le segment de texte est mappé à partir du binaire et ne consomme donc pas de RAM.

+0

Cela répond définitivement à ma question comme indiqué, merci, mais maintenant c'est trop pour mon but réel, car je n'ai aucune région à numériser. Y a-t-il un moyen facile d'allouer juste un peu? Je peux poser une autre question si nécessaire. – 12345ieee

+1

@ 12345ieee Pourriez-vous vous décider? Chaque programme qui utilise la liaison dynamique et la libc aura au moins autant d'utilisation de la mémoire que celle que vous avez donnée en raison de la mémoire utilisée par le lieur dynamique et de l'initialisation de l'exécution C. Lier statiquement pourrait réduire cela d'un peu (mais pas beaucoup).Si vous écrivez un programme sans aucun, il va utiliser autant de mémoire que vous utilisez dans votre programme, ce qui est à peu près rien dans le cas du programme que j'ai fourni. C'est un peu difficile de faire un programme qui consomme beaucoup plus de mémoire que celui-ci mais moins qu'un programme en C. – fuz

+0

@ 12345ieee Un programme acceptable permet-il d'incrémenter un compteur (stocké en RAM) toutes les secondes? – fuz