Die Standardmethode zum Erstellen neuer Prozesse unter Linux besteht darin, dass der Speicherbedarf des übergeordneten Prozesses kopiert wird und die Umgebung des untergeordneten Prozesses execv
aufgerufen wird, bis .
Über welchen Speicherbedarf sprechen wir, über den virtuellen (was der Prozess anforderte) oder den residenten (was wird tatsächlich verwendet)?
Motivation: Ich besitze ein Gerät mit begrenztem Auslagerungsspeicher und eine Anwendung mit einem großen Unterschied zwischen dem virtuellen und dem residenten Speicherbedarf. Die Anwendung kann aufgrund von Speichermangel nicht verzweigen und möchte wissen, ob der Versuch, die Größe des virtuellen Footprints zu verringern, hilfreich ist.
quelle
If enough is available the kernel will commit to the full virtual size of the parent for both processes after the fork.
Ja Dankeschön. Dies bedeutet, dass die Reduzierung des virtuellen Speicherbedarfs des Prozesses in einer Umgebung mit begrenztem Arbeitsspeicher (RAM und Swap) das Problem lösen kann, dass keine Verzweigung möglich ist.fork
mit einer Fehlermeldung, die auf unzureichenden Arbeitsspeicher hinweist. Dann könnte die Reduzierung des virtuellen Speicherbedarfs des Prozesses vor dem Gabeln Abhilfe schaffen.Mach dir keine Sorgen, es macht eine faule Kopie (Copy-on-Write). Die virtuellen Speicheradressen beider Prozesse verweisen anfangs auf dieselben Seiten, aber wenn der Fork-Prozess versucht, sie zu ändern, erstellt er tatsächlich eine physische Kopie der Seite (von da an befindet sich diese Seite an zwei Stellen in Ihrem RAM).
Beachten Sie, dass keiner der gemeldeten Speicherabdrücke tatsächlich angibt, wie viel RAM der Prozess verwendet. Aufgrund von Auslagerungen, Speicherfreigaben und anderen Problemen mit dem virtuellen Speicher ist es unmöglich, dies genau zu wissen. Einige Teile des Speicherplatzes sind gemeinsam genutzte Bibliotheken (wo werden sie gezählt?), Andere beziehen sich auf Nicht-RAM-Speicher (andere Hardwaregeräte), andere sind derzeit ausgelagert, andere sind noch nicht kopiert (Copy-on-Write) und bald. Lesen Sie dies:
https://lwn.net/Articles/642202/
quelle
Es gibt eine Kernel-Einstellung
/ proc / sys / vm / overcommit_memory
Zitat aus einem ausgezeichneten Artikel :
Dies gilt sowohl für Gabeln als auch für normale Mallocs. Das heißt, wenn Sie es auf 0 setzen, wird Fork beim Schreiben kopiert. Beim Schreiben kopieren bedeutet, dass nach dem Verzweigen der App beide Kopien die Speicherseiten gemeinsam nutzen, wenn das untergeordnete oder das Original den Speicher ändert.
In den meisten Distributionen, von denen ich weiß, dass Overcommit 0 ist. Wenn Sie es jedoch auf 2 setzen, werden alle Speicherseiten vollständig durch den realen Speicher gesichert und in einigen Fällen unter hohem Speicherdruck stabiler, aber einige Programme (ich habe es mit Gitk zu tun), die darauf angewiesen sind On-Overcommits schlagen fehl.
quelle