2011-06-19 6 views
3

Existe-t-il une fonction noyau qui renvoie la quantité de mémoire du noyau disponible (pas liée à vmalloc).mémoire disponible dans le noyau

+4

Vous avez déjà une très bonne indication de manque de mémoire (l'allocation retourne 'NULL'), pourquoi en cherchez-vous une autre? – delnan

+3

La vérification de la quantité de mémoire disponible, en particulier dans les situations de mémoire insuffisante, ne fonctionnerait pas. Un autre thread pourrait avoir alloué ce qui restait entre le moment où vous vérifiez et le temps que vous allouez. – Mat

+0

Peut-être que vous essayez d'allouer zéro octets? Vérifiez pour cela aussi. –

Répondre

12

D'abord, permettez-moi de dire que si vous allez prendre des décisions politiques (dois-je procéder à cette opération?) Sur la base de ces informations, ARRÊT. Comme WGW l'a souligné, il y a des races inévitables ici; la mémoire peut être utilisée entre quand vous vérifiez et quand vous l'utilisez. Testez simplement les erreurs sur vos allocations de mémoire et disposez d'un chemin d'échec approprié. De plus, si vous demandez de la mémoire quand il n'y a pas assez de mémoire libre, le noyau peut obtenir plus de mémoire libre en nettoyant la mémoire cache, en échangeant sur le disque, en libérant des galettes, etc. allocations lorsqu'il n'est pas fait par vmalloc même avec beaucoup de mémoire libre. Cela dit, il existe des API pour interroger la disponibilité de la mémoire du noyau. Vous devriez noter que le noyau a plusieurs pools de mémoire, donc même si l'une de ces API indique que vous n'avez pas de RAM libre, elle pourrait être disponible dans le pool de mémoire qui vous intéresse.

D'abord, nous avons si_meminfo. C'est l'appel qui fournit les données de disponibilité pour /proc/meminfo, entre autres choses, et des rapports sur l'état actuel de l'allocateur de page de contact. Notez que la RAM mise en cache et la mémoire tampon peuvent être converties en RAM libre très rapidement.

global_page_state(NR_SLAB_RECLAIMABLE) peut également être utilisé pour obtenir des comptes de combien de mémoire de dalle peut être rapidement récupéré. Si vous demandez une allocation, cette mémoire peut et sera libérée à la demande. L'allocateur SLUB (utilisé pour kalloc() et similaires, entre autres) fournit également des statistiques pour ses pools de mémoire interne qui peuvent également refléter la mémoire disponible dans chaque pool de mémoire. Cela peut ne pas être disponible avec la même API en fonction de l'allocateur sélectionné dans votre configuration - veuillez n'utilisez pas ces données sauf pour le débogage. Le code correspondant (implémentant /proc/slabinfo) peut être trouvé dans mm/slub.c

+0

S'il vous plaît corrigez-moi si je me trompe, mais ne serait même pas très difficile et race informations vulnérables sur la mémoire du noyau disponible être utile lorsqu'il s'agit de fuites de mémoire dans l'espace noyau? Je veux dire vérifier la mémoire disponible, puis exécuter X fois un pilote ou quoi que ce soit qui alloue de la mémoire et enfin vérifier quelle sera la différence. – user1723095

3

Quelle est l'utilisation de la mémoire disponible pour vous? Dans le pire des cas, vous exécutez une condition de concurrence en vérifiant la mémoire disponible:

  1. Vous obtenez la mémoire disponible. C'est assez.
  2. Multitâche, c'est-à-dire le planificateur du noyau, arrête votre processus et continue avec un autre qui alloue un bouquet de la mémoire disponible.
  3. Le planificateur poursuit votre processus.
  4. Vos allocations échouent bien que l'étape 1 ait montré assez de mémoire disponible.
+0

S'il vous plaît corrigez-moi si je me trompe, mais AFAIK simplement que kmalloc() peut toujours montrer le succès.Mais ils ne signifient pas que cette mémoire est actuellement allouée. Les pages de la mémoire sont créées lorsque la tâche accède réellement à la mémoire que vous avez créée. –

Questions connexes