La façon standard de créer de nouveaux processus sous Linux est que l'empreinte mémoire du processus parent soit copiée et que cela devienne l'environnement du processus enfant jusqu'à ce qu'il execv
soit appelé.
De quelle empreinte mémoire parlons-nous, virtuelle (ce que le processus a demandé) ou résidente (qu'est-ce qui est réellement utilisé)?
Motivation: J'ai un appareil avec un espace d'échange limité et une application avec une grande différence entre l'empreinte mémoire virtuelle et résidente. L'application ne peut pas bifurquer en raison d'un manque de mémoire et aimerait voir si essayer de réduire la taille de l'empreinte virtuelle serait utile.
la source
If enough is available the kernel will commit to the full virtual size of the parent for both processes after the fork.
Oui merci. Cela signifie que la réduction de l'empreinte virtuelle du processus dans un environnement avec une mémoire limitée (RAM et swap) pourrait résoudre le problème de ne pas pouvoir effectuer de fork.fork
échoue avec un message d'erreur indiquant une mémoire insuffisante. Réduire ensuite l'utilisation de la mémoire virtuelle du processus avant de bifurquer pourrait aider.Ne vous inquiétez pas, cela fait une copie paresseuse (copie sur écriture). Les adresses de mémoire virtuelle des deux processus pointent initialement vers les mêmes pages, mais lorsque le processus forké essaie de le modifier, il crée en fait une copie physique de la page (à partir de ce moment, cette page réside à deux endroits dans votre RAM).
Attention, aucune des empreintes de mémoire signalées ne vous indique réellement la quantité de RAM que le processus utilise. En raison de l'échange, du partage de mémoire et d'autres problèmes avec la mémoire virtuelle, il est impossible de le savoir avec certitude. Certaines parties de l'espace mémoire sont des bibliothèques partagées (où les compter?), Certaines se réfèrent à de la mémoire non RAM (autres périphériques matériels), certaines sont actuellement permutées, d'autres ne sont pas encore copiées (copie sur écriture) et bientôt. Lis ça:
https://lwn.net/Articles/642202/
la source
Il y a un réglage du noyau
/ proc / sys / vm / overcommit_memory
Citation d'un excellent article :
Cela s'applique aux fourches ainsi qu'aux malloc ordinaires. Autrement dit, si vous le définissez sur 0, fork sera copié lors de l'écriture. La copie lors de l'écriture signifie qu'une fois l'application terminée, les deux copies partageront les pages de mémoire en utilisant l'enfant ou l'original commence à changer de mémoire.
Dans la plupart des distributions, je sais que la surcharge est 0. Mais si vous la définissez sur 2, toutes les pages de mémoire seront entièrement sauvegardées par de la mémoire réelle et dans certains cas, sous une pression de mémoire élevée, seront plus stables, mais certains programmes (j'ai fait face à gitk) qui s'appuient sur les sur-engagements échoueront.
la source