Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Unabhängigen Prozess starten (https://www.delphipraxis.net/180524-unabhaengigen-prozess-starten.html)

seppitm 26. Mai 2014 14:43


Unabhängigen Prozess starten
 
Hallo,
hat einer von euch eine Idee wie es möglich ist einen Prozess zu starten ohne das er ein Child / Sub Prozess ist? Ich weiß das es geht, da die Serversoftware von Valve das auch kann. Mir geht es darum die Speicherbeschränkung zu umgehen. wenn ich 10 Childprozesse erstelle ist der Speicher für meine Anwendung irgendwann voll. Deshalb möchte ich gerne Prozesse unabhängig von meiner Anwendung Starten (als hätte der Benutzer sie gestartet).

Wozu das ist:
Ich möchte gerne für meinen Windows Root eine Weboberfläche Basteln über die ich Gameserver starten kann, bis jetzt is es so das irgendwann der Stack für mein Programm voll ist. und die Server sollen auch nicht ausgehen wenn mein Programm aus ist.

mfg
Sebastian

Sir Rufo 26. Mai 2014 14:47

AW: Unabhängigen Prozess starten
 
Meinst du sowas wie MSDN-Library durchsuchenShellExecute?

himitsu 26. Mai 2014 14:51

AW: Unabhängigen Prozess starten
 
Was sind Child-Prozesse und wie erstellst du die?

Jeder Prozess hat in Windows grundsätzlich immer seinen eigenen Speicherbereich.

Dalai 26. Mai 2014 15:54

AW: Unabhängigen Prozess starten
 
Zitat:

Zitat von himitsu (Beitrag 1260293)
Was sind Child-Prozesse [...]?

Naja, jeder Prozess auf jedem Betriebssystem hat irgendeinen Parent(prozess). Kann man sich im Process Explorer angucken, und einige Tools (auch solche für die Kommandozeile) können auch ganze Prozessbäume töten. Prozesse, die keinen (sichtbaren) Parent haben, gibt es zwar auch, aber die sind dann entweder spezielle Prozesse (init bei Linux, System und System Idle Process bei Windows) oder der Parent ist beendet worden.

Zitat:

Jeder Prozess hat in Windows grundsätzlich immer seinen eigenen Speicherbereich.
Hier kann ich nur zustimmen. Dazu gehört auch, dass jeder Prozess seinen eigenen Stack hat usw. Die Prozesse laufen wirklich unabhängig voneinander, und kein Kindprozess kann den Speicher des Vaters volllaufen lassen. Daher bleibt unklar, was eigentlich gemeint ist.

MfG Dalai

Neutral General 26. Mai 2014 16:00

AW: Unabhängigen Prozess starten
 
Zitat:

Zitat von seppitm (Beitrag 1260288)
Hallo,
wenn ich 10 Childprozesse erstelle ist der Speicher für meine Anwendung irgendwann voll. Deshalb möchte ich gerne Prozesse unabhängig von meiner Anwendung Starten (als hätte der Benutzer sie gestartet).

Wie schon gesagt wurde: Jeder Prozess (egal ob Child-Prozess oder nicht) erhält seinen eigenen virtuellen Speicher und kein anderer Prozess hat normalerweise auf den Speicher dieses Prozesses Zugriff.

Wenn du mehrere dieser Prozesse startest und der Arbeitsspeicher ist irgendwann voll, dann liegt das daran dass der Pc einfach nicht genug Arbeitsspeicher hat um alle deine Prozesse zu versorgen.

(Angenommen du hast 4GB RAM und 4 Prozesse die jeweils 1GB verbrauchen -> Arbeitsspeicher voll)

jaenicke 26. Mai 2014 16:12

AW: Unabhängigen Prozess starten
 
Für mich hört sich das so an als würde da ein Aufruf z.B. einer PHP-Seite passieren und darin dann der Prozess gestartet werden, der dann wieder weitere Prozesse startet, richtig?

seppitm 26. Mai 2014 20:12

AW: Unabhängigen Prozess starten
 
Ich starte sie via CreateProcess mit Delphi. Ich habe 32 GB Ram. Wenn ich eine Java Anwendung aus Delphi heraus starte und ihr 128MB RAM zuweise ist alles okay.
Wenn ich Java allerdings 2048MB zuweise, stürzt der Parent (also mein Delphi Programm) ab. Es passiert genau das gleiche wenn ich mehrere Server starte, die irgendwann zu viel RAM nutzen.

In einem Forum habe ich gelesen das die initiale Stack Größe erhört werden kann, den genaue Post habe ich nicht mehr aber das hier ist ähnlich, genau so habe ich es dann auch gemacht:

http://www.delphipraxis.net/148797-m...cht-nicht.html

Das hat auch funktioniert, doch es gibt auch dort ein Limit (was ich schon öfters überschritten habe, was dazu führt das alle Gameserver aus sind). Deshalb möchte ich gerne keinen sub Prozess von mir sondern einen vom System aus Starten. so wie hier zum Beispiel (c++):

http://stackoverflow.com/questions/5...endent-process

Dalai 26. Mai 2014 21:17

AW: Unabhängigen Prozess starten
 
Zitat:

Zitat von seppitm (Beitrag 1260346)
Ich starte sie via CreateProcess mit Delphi.

Hast du dazu mal etwas Code?

Zitat:

Ich habe 32 GB Ram.
Die überhaupt nicht relevant sind. Ich nehme mal an, dass dein Delphi-Programm 32 Bit ist. Dann beschränkt sich dein Adressraum auf 2 GiB.

Zitat:

Wenn ich eine Java Anwendung aus Delphi heraus starte und ihr 128MB RAM zuweise ist alles okay.
Wieso wird die wichtige Info, dass es um Java geht, jetzt erst erwähnt? Die JVM hat teilweise ihr eigenes Verhalten. Auf welche Weise (mit welchem Parameter) weist du denn der JVM den Speicher zu? Um welche Java-Software geht's denn? (Mal wieder Minecraft?)

Zitat:

Wenn ich Java allerdings 2048MB zuweise, stürzt der Parent (also mein Delphi Programm) ab.
Wie genau passiert das? Einfach so sang- und klanglos? Oder gibt's ne Meldung (von Dr. Watson bzw. der Fehlerberichterstattung)? Wenn ja, wie lautet diese?

MfG Dalai

seppitm 26. Mai 2014 21:34

AW: Unabhängigen Prozess starten
 
Habe den befehl nicht mehr habe es in der aktuellen Version mit der ShellAPI gemacht.

Es handelt sich um eine 64Bit Anwendung, ich bin ja nicht dumm...

Es handelt sich um das spiel um Minecraft richtig, was sollte sonst so viel verbrauchen.
Code:
java -Xmx3072M -Xms1024M -XX:MaxPermSize=1024m -Duser.dir="C:\Users\USERNAME\AppData\Roaming\MCPACK\v4" -Dfml.ignorePatchDiscrepancies=true -Djava.library.path="C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\enhaNatives" -cp "C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\argo\argo\2.25_fixed\argo-2.25_fixed.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\com\google\code\gson\gson\2.2.2\gson-2.2.2.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\com\google\guava\guava\14.0\guava-14.0.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\com\paulscode\codecwav\20101023\codecwav-20101023.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\com\paulscode\libraryjavasound\20101123\libraryjavasound-20101123.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\com\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-20100824.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\com\paulscode\soundsystem\20120107\soundsystem-20120107.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\commons-io\commons-io\2.4\commons-io-2.4.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\lzma\lzma\0.0.1\lzma-0.0.1.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\net\java\jinput\jinput-platform\2.0.5\jinput-platform-2.0.5-natives-windows.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\net\minecraft\launchwrapper\1.3\launchwrapper-1.3.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\net\minecraftforge\minecraftforge\9.10.0.845\minecraftforge-9.10.0.845.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\net\minecraftforge\minecraftforge\9.10.1.871\minecraftforge-9.10.1.871.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\net\optifine\optifine\1.6.2_HD_C4\optifine-1.6.2_HD_C4.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\net\sf\jopt-simple\jopt-simple\4.5\jopt-simple-4.5.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\org\apache\commons\commons-lang3\3.1\commons-lang3-3.1.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\org\bouncycastle\bcprov-jdk15on\1.47\bcprov-jdk15on-1.47.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\org\lwjgl\lwjgl\lwjgl\2.9.0\lwjgl-2.9.0.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\org\lwjgl\lwjgl\lwjgl-platform\2.9.0\lwjgl-platform-2.9.0-natives-windows.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.0\lwjgl_util-2.9.0.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\org\ow2\asm\asm-all\4.1\asm-all-4.1.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\org\scala-lang\scala-compiler\2.10.2\scala-compiler-2.10.2.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\libraries\org\scala-lang\scala-library\2.10.2\scala-library-2.10.2.jar;C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\versions\1.6.2-Forge9.10.1.871\1.6.2-Forge9.10.1.871.jar" net.minecraft.launchwrapper.Launch --username USER --session token:1337:1337 --version 1.6.2-Forge9.10.1.871 --gameDir "C:\Users\USERNAME\AppData\Roaming\MCPACK\v4" --assetsDir "C:\Users\USERNAME\AppData\Roaming\MCPACK\v4\assets" --tweakClass cpw.mods.fml.common.launcher.FMLTweaker -Dfml.ignorePatchDiscrepancies=true --server 1313131231232 --port 1337
Das baut mein Tool halt dynamisch zusammen.

Es stürzt einfach ohne Meldung ab, manchmal kommt schon eine aber bekomme die grade nicht reproduziert, es ist allerdings nicht so wenn ich den obigen Befehl in die CMD packe und das so ausführe...

Luckie 26. Mai 2014 21:39

AW: Unabhängigen Prozess starten
 
Zitat:

Zitat von Neutral General (Beitrag 1260309)
(Angenommen du hast 4GB RAM und 4 Prozesse die jeweils 1GB verbrauchen -> Arbeitsspeicher voll)

Was ist denn das für ein Unsinn? Mit 8 GB könnten alsur 8 Prozesse laufen? Guck mal in deinen Taskmanager wie viel Prozesse da schon nach dem Start laufen. Dienste sind auch Prozesse. Das Stichwort ist hier virtueller Adressraum und was alles dazu gehört.

Dalai 26. Mai 2014 22:36

AW: Unabhängigen Prozess starten
 
Zitat:

Zitat von seppitm (Beitrag 1260355)
Habe den befehl nicht mehr habe es in der aktuellen Version mit der ShellAPI gemacht.

Der wäre aber wichtig.

Zitat:

Es handelt sich um das spiel um Minecraft richtig, was sollte sonst so viel verbrauchen.
Na Java ist doch ein bekannter Speicherfresser :lol:. Ne, im Ernst, ich hab keine Ahnung von Spieleservern und was da viel verbraucht und was nicht.
Zitat:

Code:
java -Xmx3072M -Xms1024M [...]

So, du gibst der JVM also minimal 1 GiB und maximal 3 GiB Speicher. Ist es denn ein 64 Bit Java?

Zitat:

Es stürzt einfach ohne Meldung ab [..]
Schau mal in die Ereignisanzeige, ob dort zum Absturzzeitpunkt etwas zu finden ist. Schreibt das Minecraft vielleicht noch irgendwelche Logs (oder kann man ihn bzw. die JVM dazu veranlassen)?

MfG Dalai

Sherlock 27. Mai 2014 08:17

AW: Unabhängigen Prozess starten
 
Zitat:

Zitat von Dalai (Beitrag 1260363)
So, du gibst der JVM also minimal 1 GiB und maximal 3 GiB Speicher. Ist es denn ein 64 Bit Java?

Ist Java nicht maschinenunabhängig?

Sherlock

Neutral General 27. Mai 2014 08:45

AW: Unabhängigen Prozess starten
 
Zitat:

Zitat von Luckie (Beitrag 1260356)
Zitat:

Zitat von Neutral General (Beitrag 1260309)
(Angenommen du hast 4GB RAM und 4 Prozesse die jeweils 1GB verbrauchen -> Arbeitsspeicher voll)

Was ist denn das für ein Unsinn? Mit 8 GB könnten alsur 8 Prozesse laufen? Guck mal in deinen Taskmanager wie viel Prozesse da schon nach dem Start laufen. Dienste sind auch Prozesse. Das Stichwort ist hier virtueller Adressraum und was alles dazu gehört.

Naja wenn jeder der 4 Prozesse tatsächlich 1GB Speicher verbraucht dann ist der physikalische Arbeitsspeicher voll. Natürlich hat jeder (32-Bit)Prozess seinen vollen (theoretischen) 4GB virtuellen Adressraum, aber das vergrößert nicht den Arbeitsspeicher. Klar, es gibt die Auslagerungsdatei aber wenn der physikalische Arbeitsspeicher erst mal voll ist, ist der Nutzen der Auslagerungsdatei auch sehr begrenzt bzw. das ganze wird ggf. sehr langsam..

Dalai 27. Mai 2014 16:50

AW: Unabhängigen Prozess starten
 
Zitat:

Zitat von Sherlock (Beitrag 1260400)
Zitat:

Zitat von Dalai (Beitrag 1260363)
So, du gibst der JVM also minimal 1 GiB und maximal 3 GiB Speicher. Ist es denn ein 64 Bit Java?

Ist Java nicht maschinenunabhängig?

Die Programme, die man mit Java schreibt, sind unabhäüngig von der Plattform und der Maschine. Trotzdem gibt es zwei verschiedene JVMs bzw. Java-"Versionen" für Windows (und IIRC auch für Linux): 32 Bit und 64 Bit. Und wenn die Java-Anwendung in einem 32 Bit Java (java[w].exe ist dann eben 32 bittig) ausgeführt wird, ist der Adressraum auch nicht größer als für jedes andere 32 Bit Programm; es gelten dieselben Grenzen - und da auch die java[w].exe von Java7 kein Flag LARGE_ADDRESS_AWARE gesetzt hat, sind das 2 GiB Adressraum. Anders sieht die Sache natürlich mit einem 64 Bit Java aus, wie auch für normale 64 Bit Programme.

Unabhängig davon darf natürlich der Parentprozess nicht von selbst abschmieren, nur weil ein mittels CreateProcess erzeugter Kindprozess nicht laufen will/kann. Aber da die Informationen diesbzgl. bisher sehr dünn sind, kann man keinerlei Aussage zu möglichen Ursachen treffen.

MfG Dalai

seppitm 27. Mai 2014 17:34

AW: Unabhängigen Prozess starten
 
Ja ist 64 ein 64 Bit java und es gibt keinerlei Logs. :( Das frisst so viel Speicher weil es ein Dev Server ist (modde halt).

Aber ich habe ne Methode gefunden die gut aussieht:
http://stackoverflow.com/questions/8...independent-pr

Klingt logisch wenn man das gelesen hat:
http://stackoverflow.com/questions/5...endent-process

Ich werde es in Delphi ausprobieren, wenns nicht klappt dann Schreibe ich die Lösung halt in Java oder so.

Danke erstmal für die Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz