Schrift
[thread]7844[/thread]

win32 ActivePerl fork und Speicher: beendete kindprozesse liegen im speicher

Leser: 1


<< >> 8 Einträge, 1 Seite
ash77
 2006-03-31 12:43
#64229 #64229
User since
2006-03-30
2 Artikel
BenutzerIn
[default_avatar]
Hallo,

in einem Skript forke ich einen (kurzen und kleinen) Prozess ungefähr zehn mal, und das ganze bis zu 100 mal in dem Skript (hintereinander, nicht gleichzeitig). Auf Linux-Systemen funktioniert das auch toll, schnell und speicherschonend. Wenn ich dasselbe Skript mit ActivePerl auf Windows (XP,SP2) ausführe, dauert es nicht lange, bis der ganze Speicher von ActivePerl belagert ist und das System nahezu zum Erliegen kommt. Dabei kann man zugucken, wie jedes weitere fork ein paar MB mehr in den Speicher haut. Ich denke also, dass (im Gegensatz zu Linux, wo beendete Kindprozesse offensichtlich aus dem Speicher gelöscht werden) die beendeten Kindprozesse erst aus dem Speicher gelöscht werden, wenn der Vaterprozess beendet ist. Ist dem so ? Kann man das umgehen ?

Danke schonmal für die Antworten.
murphy
 2006-03-31 14:01
#64230 #64230
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ich denke das Problem wird hautpsächlich damit etwas zu tun haben, dass es unter Windoof keinen echten fork Systemcall gibt, weshalb er teuer emuliert werden muss. Da sollte man besser zu etwas wie CPAN:Win32::Process greifen.
When C++ is your hammer, every problem looks like your thumb.
ash77
 2006-03-31 14:21
#64231 #64231
User since
2006-03-30
2 Artikel
BenutzerIn
[default_avatar]
Da hast du ja recht, aber da ich das Skript letztendlich auf einem Linux-Server laufen lasse, und ich das ganze nur auf einem Windows-Rechner teste, möchte ich beim forken bleiben. Cygwin schafft es ja beispielsweise auch, eine ordentliche fork-Version für Windows zu simulieren. Das Skript läuft auf cygwin ja auch sehr ordentlich. Die Frage ist für mich nur, ob es irgendwo explizit beschrieben wird, ob und warum der ActivePerl-fork beendete Kindprozesse nicht aus dem Speicher löscht (habe dazu nämlich nirgends etwas gefunden).
murphy
 2006-03-31 15:06
#64232 #64232
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Hmm, ich meine mich schwach zu erinnern, dass ActiveState Perl fork über Threads emuliert. Das würde einen höheren Speicherverbrauch der Methode erklären. Aber ich bin mir nicht sicher und kenne mich mit Windows auch nicht wirklich gut aus...

Vielleicht musst du die Kindprozesse ja explizit mit wait einsammeln, damit die Resourcen aufgeräumt werden.
When C++ is your hammer, every problem looks like your thumb.
sesth
 2006-03-31 15:16
#64233 #64233
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Unter Windows bekommst Du bei fork nur Pseudoprozesse, die in Wahrheit Threads sind:
Quote
The fork() emulation is implemented at the level of the Perl interpreter. What this means in general is that running fork() will actually clone the running interpreter and all its state, and run the cloned interpreter in a separate thread, beginning execution in the new thread just after the point where the fork() was called in the parent. We will refer to the thread that implements this child ``process'' as the pseudo-process.

To the Perl program that called fork(), all this is designed to be transparent. The parent returns from the fork() with a pseudo-process ID that can be subsequently used in any process manipulation functions; the child returns from the fork() with a value of 0 to signify that it is the child pseudo-process.

Da jedesmal der gesamte Interpreter in den neuen Thread geklont wird, ist der Speicher schnell voll. Das Betriebssystem sollte aber den Threadspeicher wieder freigeben, wenn der Thread ordnungsgemäß beendet wurde.
Gruß
Thomas
esskar
 2006-03-31 16:59
#64234 #64234
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=sesth,31.03.2006, 13:16]Das Betriebssystem sollte aber den Threadspeicher wieder freigeben, wenn der Thread ordnungsgemäß beendet wurde.[/quote]
hmm, wenn ich unter c ein malloc in einem thread durchführe und dieses stück speicher nicht freigeben wird, bleibt es alloziert, auch dann, wenn der thread beendet wird.
sesth
 2006-03-31 17:05
#64235 #64235
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,31.03.2006, 14:59][quote=sesth,31.03.2006, 13:16]Das Betriebssystem sollte aber den Threadspeicher wieder freigeben, wenn der Thread ordnungsgemäß beendet wurde.[/quote]
hmm, wenn ich unter c ein malloc in einem thread durchführe und dieses stück speicher nicht freigeben wird, bleibt es alloziert, auch dann, wenn der thread beendet wird.[/quote]
Bei malloc wird der speicher vom globalen Heap des Prozesses geholt, dass ist m.E. eine Prozess-Ressource. Wenn Du den Thread startest, gibts Du ihm aber initial Speicher mit (ich glaube Default = 1MB, kannst Du aber per Parameter anders einstellen). Dieser Speicher wird beim Beenden des Threads wieder freigegeben. Das kann man im Performance-Monitor schön beobachten.
Gruß
Thomas
esskar
 2006-03-31 19:13
#64236 #64236
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=sesth,31.03.2006, 15:05]Wenn Du den Thread startest, gibts Du ihm aber initial Speicher mit (ich glaube Default = 1MB, kannst Du aber per Parameter anders einstellen). Dieser Speicher wird beim Beenden des Threads wieder freigegeben. Das kann man im Performance-Monitor schön beobachten.[/quote]
selbstverständlich.
<< >> 8 Einträge, 1 Seite



View all threads created 2006-03-31 12:43.