2009-11-23 7 views
3

Sur la ligne de commande, ceci peut être trouvé en utilisant l'utilitaire 'free' et 'cat/proc/meminfo'. Quelles seraient les différentes façons de trouver la taille de la RAM physique sous Linux programatically d'un:Comment la taille de la RAM physique peut-elle être déterminée sous Linux?

  1. Userspace application
  2. noyau Module

Qu'est-ce que les appels d'API sont disponibles?

+1

S'il s'agit d'un doublon, veuillez indiquer une question similaire, puis celle-ci peut être fermée. – vivekian2

Répondre

4
#include <unistd.h> 

long long physical_mem_bytes = (long long) sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE); 

Autre que la ligne de commande ulimit, je ne sais pas d'une façon de trouver la mémoire maximale pour un processus individuel.

+0

Je ne cherche pas la taille de la mémoire d'un processus particulier, plutôt la totalité de la RAM physique. – vivekian2

+0

Ok, alors l'exemple de code est la réponse. – wallyk

+2

Notez que ceci peut déborder s'il est compilé sur un arc de 32 et exécuté sur une machine 64 bits, qui peut avoir plus de 2^32 octets. Qui m'est arrivé. Mieux vaut convertir les deux valeurs en uint64_t ou en long. – hirschhornsalz

-1

cat /proc/meminfo

+3

vous venez de prendre cela de la question :-p – Fredou

+1

Yeh, trop peu de café le matin. Mais qu'est-ce qui ne va pas avec la lecture et l'analyse de/proc/meminfo à partir d'une application? –

+2

Absolument rien. La lecture et l'analyse du système de fichiers/proc est une interface programmatique bien établie pour le noyau Linux. –

1

Par programme, Linux ne vous indiquera pas la taille physique réelle. Au lieu de cela, vous devriez lire cette information de SMBIOS avec, par exemple,

sudo dmidecode -t memory | fgrep -ie 'size:' 

Cela vous donnera des résultats comme ce qui suit (à partir d'une boîte avec 4 banques de mémoire vive, seulement 2 installé):

Maximum Memory Module Size: 16384 MB 
Maximum Total Memory Size: 65536 MB 
Installed Size: 2048 MB (Single-bank Connection) 
Enabled Size: 2048 MB (Single-bank Connection) 
Installed Size: Not Installed 
Enabled Size: Not Installed 
Installed Size: 2048 MB (Single-bank Connection) 
Enabled Size: 2048 MB (Single-bank Connection) 
Installed Size: Not Installed 
Enabled Size: Not Installed 
Size: 2048 MB 
Size: No Module Installed 
Size: 2048 MB 
Size: No Module Installed 

Ajouter la tailles rapportées (ou Enabled Size s, mais certains BIOS empiriquement ne rapportent pas cela) pour obtenir (dans ce cas) 4096 Mo. (points supplémentaires pour le code qui permet d'automatiser l'analyse et l'arithmétique, mais vous pouvez probablement le faire dans votre tête presque aussi fiable.)

Pour vérifier votre calcul, exécutez

fgrep -e 'MemTotal:' /proc/meminfo 

La valeur déclarée par /proc/meminfo ne devrait pas être plus que la valeur que vous calculez à partir de dmidecode. Dans ce cas, de façon empirique, je reçois

MemTotal:  3988616 kB 
+0

C'est une interprétation plus littérale de la question que je ne le pensais. Il est vrai que la mémoire visible/utilisable du noyau et la quantité de DRAM physique sur le châssis de la machine ne doivent pas être identiques. Mais dans presque tous les cas, c'est l'ancien numéro qui intéresse un programmeur. –

+1

De la preuve de l'empereur, les appels à sysconf vous donneront des valeurs telles que 2037mb.En utilisant SMBIOS vous obtiendrez la bonne réponse, telle que 2048mb, garantie. En outre, vous pouvez partager le code entre l'espace utilisateur et le code noyau, l'analyse est la même. –

+1

Mais comme je l'ai souligné, le noyau peut ou non utiliser cette mémoire physique, même si elle est sur la carte et exposée par le firmware. La bonne réponse à la question "combien DRAM est disponible" pour vérifier/proc/meminfo. Votre réponse est correcte uniquement si vous posez une question sur la configuration du matériel et non sur le réglage du logiciel. Ma compréhension du contexte de la question est que ce n'est pas le cas. –

-1

spécifiquement de la mémoire, je suis arrivé à ce résultat de ce que Jared a dit sudo dmidecode -t memory là, vous pouvez lire les spécifications pour chaque emplacement de la mémoire individuelle, donc vous lire quelque chose comme 2048 Mo, en mon cas, j'ai 2 de ces derniers étant 4gb, malgré mon noyau non PAE montre seulement 3.3gb et toutes les autres applications ne disent pas la mémoire physique réelle, seulement dmidecode, thx!

+0

C'est une longue phrase! Pouvez-vous prendre le temps de formater la prochaine fois que vous écrivez une réponse? Merci –