11
votes

Réserver RAM en C

J'ai besoin d'idées sur la façon d'écrire un programme C qui réserve une quantité spécifiée de MB RAM jusqu'à une clé [ex. La touche TOUT] est enfoncée sur un système Linux 2.6 32 32 32 32 32 32.

*
/.eat_ram.out 200

# If free -m is execute at this time, it should report 200 MB more in the used section, than before running the program.

[Any key is pressed]

# Now all the reserved RAM should be released and the program exits.
*


3 commentaires

"Toute clé"? Cette blague n'a pas encore été morte? Vous sont plaisanter, n'est-ce pas?


J'ai récemment vu l'épisode Simpsons no. 135 [Homère King-Taille]: Pour commencer, appuyez sur n'importe quelle touche ". Où est la clé de n'importe quelle clé? Je vois esk [" ESC "], catarl [" Ctrl "] et porc-up [" PGUP "]. Il n'y a pas semblent être n'importe quelle clé. Woo! Tout ce ordinateur piratage me rend assoiffé. Je pense que je vais commander un onglet. [appuie sur la touche TAB] AWP ... Pas de temps pour cela maintenant, l'ordinateur commence que la blague ne mourra jamais =)


Ce n'est pas des devoirs, il est de vérifier un gestionnaire de ressources dans un cluster, mais également apprendre en même temps


5 Réponses :


3
votes

Vous ne pouvez pas simplement utiliser masloc () pour allouer cette RAM à votre processus? Cela réservera cette RAM pour vous, puis vous êtes libre de faire ce que vous souhaitez avec elle.

Voici un exemple pour vous: xxx

si vous voulez plus d'informations , Jetez un coup d'œil à la page de l'homme ( homme masloc dans une coque Linux). Si vous n'êtes pas sur Linux, consultez La page Man . < / p>


4 commentaires

Il se peut que cette allocation dynamique soit nouvelle pour ce type ... Vous devriez vraiment l'expliquer, ou du moins fournir un lien vers un didacticiel décent.


Cela semble être un excellent cadre pour la demande finale.


De plus, comme le souligne Tim Post, Malloc n'est pas toujours suffisant. La mémoire peut ne pas être réellement réservée avant de l'écrire, par exemple.


@ Steve314 - Apparemment, MALLOC n'alloudra pas la mémoire physique, mais cela garantira suffisamment de mémoire virtuelle allouée. Cela devrait toujours apparaître dans une ressource gérer, Afaik.



19
votes

Vous voulez utiliser MALLOC () pour le faire. Selon votre besoin, vous voudrez également:

  1. Écrivez des données à la mémoire afin que le noyau la garantit réellement. Vous pouvez utiliser Memset () pour cela.
  2. empêche la mémoire de sortir de la mémoire (échangée), les fonctions MLOC () / MLOCALL () peuvent vous aider avec ceci.
  3. Dites au noyau comment vous avez l'intention de utiliser la mémoire, qui est accompli via POSIX_MADVISE () (ceci est préférable à un MLOCALL () explicite ()).

    Dans la plupart des réalités, MALLOC () et MEMSET () (ou, CalloC () qui fait efficacement les mêmes) conviendra à vos besoins.

    Enfin, bien sûr, vous voulez libérer () la mémoire quand elle n'est plus nécessaire.


6 commentaires

J'ai trouvé le manuel du programmeur POSIX lors de la recherche sur les fonctions que vous mentionez, je pense que cela me sera utile également.


Pour ceux qui se demandent; À moins que vous n'utilisiez la mémoire que vous avez demandée, le noyau peut tuer votre processus et donner la mémoire à un autre processus qui a demandé la mémoire. Ceci s'appelle Overgommit .


DreamLax - Merci pour l'information, je viens d'apprendre le pourcentage surmonter sur mon système et j'ai trouvé des informations sur vm.overcommit_memory, je ne le sais pas avant


Vous pouvez désactiver le surcommande en tapant (en tant que root) dans une coquille: ECHO 2> / PROC / SYS / VM / OverCommit_Memory


+1 pour Mlock () / Mockall (). Assurez-vous d'écrire en mémoire afin que la mémoire soit réellement revendiquée.


@Jack - Beaucoup de gens négligent POSIX_MADVISE () (surtout avec des segments partagés) car ils craignent le noyau, ce qui en fait l'une des interfaces les moins testées que Linux a. Je suppose que c'est ce qui se passe lorsque le noyau que vous utilisez a une réputation d'être un tueur en série :)



0
votes

Vous aurez besoin de:

  • malloc () Pour allouer toutefois de nombreux octets dont vous avez besoin ( MALLOC (200000000) ou MALLOC (20 * (1 << 20)) ).
  • getc () attendre une touche de frappe.
  • gratuit () pour annouez la mémoire.

    Les informations sur ces pages devrait être utile.


3 commentaires

Il est en fait de vérifier le gestionnaire de ressources dans un cluster afin qu'un travail soit exécuté lorsque X MB de RAM est gratuit sur un nœud. Mais j'essaie d'apprendre C quand je ne travaille pas avec des clusters, donc j'ai posté la question ici afin que je puisse essayer les différentes idées et solutions et apprendre de nouvelles parties de C en même temps.


Si vous voulez savoir combien de mémoire est gratuite, vous devez absolument utiliser / proc / vmstat et non seulement tester pour l'échec MALLOC.


@ petersmith221: rock on, bonne philosophie. @Matt j: excuses de détournement d'un commentaire juste pour cette adresse au commentaire de l'affiche original. :-)



1
votes

calloc () est ce que vous voulez. Il réservera la mémoire pour votre processus et écrira de zéro. Cela garantit que la mémoire est réellement allouée à votre processus. Si vous MALLOC () Une grande partie de la mémoire, le système d'exploitation peut être paresseux d'allouer la mémoire pour vous, ce qui ne l'attribue réellement que lorsqu'il est écrit (qui n'arrivera jamais dans ce cas). < / p>


0 commentaires

0
votes

Est-ce que cela devrait fonctionner. Bien que j'ai pu réserver plus de RAM que je n'ai installé, cela devrait fonctionner pour des valeurs valides, tho. xxx


0 commentaires