Hi.
Ich habe ein externes Programm, welches ich mehrfach ausführen muss (nehmen wir mal als Zahl: "500"mal).
Gibt es irgendeine Möglichkeit dieses Programm speicherarm auszuführen (also nicht die gängigen xMB * 500?
Ich dachte an diese Methode:
Hallo Komandar,
Gibt es irgendeine Möglichkeit dieses Programm speicherarm auszuführen
unter Unix & Co kann man Prozesse forken und so weit ich weiß ist das eine Copy-On-Write-Operation. Kostet also (zunächst so gut wie) keinen Speicher. Da es normalerweise keine schreibenden Zugriffe auf das Code-Segment geben sollte, wird zumindest das Code-Segment dauerhaft geshared und nur irgendwann das Daten-Segment kopiert.
Unter Windows sieht es in dieser Hinsicht m.E. weniger rosig aus. Es gibt dort meines Wissens kein fork im Unix-Sinne.
Viel Speicher kann man trotzdem sparen, wenn man Threads statt Prozesse verwendet, denn alle Threads teilen sich von Hause aus den Code und die Daten (abgesehen vom Stack, also den lokalen Variablen und den Funktionsparametern sowie den Prozessorregistern). Das ist dann aber auch der große Nachteil: Threads sind gegeneinander viel weniger entkoppelt als Prozesse und im schlimmsten Fall reißt ein wildgewordener Thread alle anderen mit den Tod.
C# Launch EXE From Memory
Das bezieht sich nur darauf, wo die Binärdaten der EXE herkommen, also ob sie in einer Datei stehen oder im Hauptspeicher, nicht welchen Speicher die EXE nach dem Starten verbraucht.
herbivore
unter Unix & Co kann man Prozesse forken und so weit ich weiß ist das eine Copy-On-Write-Operation. Kostet also (zunächst so gut wie) keinen Speicher. Da es normalerweise keine schreibenden Zugriffe auf das Code-Segment geben sollte, wird zumindest das Code-Segment dauerhaft geshared und nur irgendwann das Daten-Segment kopiert.
Kann ich bestätigen.
Hallo,
ein interessanter Ansatz wird auf Codeproject vorgestellt:
Use AppDomains To Reduce Memory Consumption in .NET applications
Das ist aber nicht viel anders als Threads und geht nur bei eigenen Programmen, auf fremde Programme hat man nach wie vor keinen Einfluß.
Hallo Coder007,
ich sehe beides anders - AppDomains sind besser voneinander isoliert als reine Threads in einem Prozess und natürlich kann die "Host"-Anwendung auch Fremdassemblies ausführen.
Gerade bei fremden Programmen funktioniert nur diese Lösung, da ein Ausführen in eigenen Threads sonst nicht möglich ist.
unter Unix & Co kann man Prozesse forken und so weit ich weiß ist das eine Copy-On-Write-Operation. Kostet also (zunächst so gut wie) keinen Speicher. Da es normalerweise keine schreibenden Zugriffe auf das Code-Segment geben sollte, wird zumindest das Code-Segment dauerhaft geshared und nur irgendwann das Daten-Segment kopiert.
Es handelt sich tatsächlich um eine Linux-Umgebung auf Basis von Mono.
Daher konnte ich Deine Idee umsetzen.
Danke dafür 😃.