App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Linux: Prozess, fork
- Ersteller moha
- Erstellt am
hi, ich hoffe ich habe mit der frage das richtige forum getroffen.
es geht um folgendes. ich probiere gerade etwas mit prozessen und prozesszuständen unter linux rum.
bei wikipedia habe ich folgendes beispiel gefunden.
http://de.wikipedia.org/wiki/Prozess_(Computer)
das verstehe ich soweit, fork wird aufgerufen, der prozess dubliziert:
*der childprozess geht in if-schleife
*der parentprozess in die else.
das ganze kann aber doch nicht gleichzeitig passieren. wie läuft das "prozesszustandstechnisch" ab, geht nach dem erzeugen des childs (mit fork) der parent in sleep bis er das ergebnis vom child zurückbekommt, oder wie läuft das. ich habe jetzt schon länger gesucht und finde kein beispiel wo das genau erklärt wird.
wäre euch für etwas hilfe echt dankbar
es geht um folgendes. ich probiere gerade etwas mit prozessen und prozesszuständen unter linux rum.
bei wikipedia habe ich folgendes beispiel gefunden.
http://de.wikipedia.org/wiki/Prozess_(Computer)
Code:
Process p {
result = fork();
if(result==0) {
// wird von child ausgeführt
} else {
// wird von parent ausgeführt
}
}
Unter Unix wird ein neuer Prozess mittels des Systemaufrufs fork (Gabelung) erzeugt. Dabei wird ein zweiter identischer Prozess gestartet, während der erzeugende Prozess (auch Elternprozess genannt) weiterläuft. Alle Daten des ersten Prozesses, beispielsweise auch geöffnete Dateien, werden für den zweiten Prozess kopiert und stehen für diesen nun getrennt zur Verfügung. Jeder Prozess hat seinen eigenen Speicher. Der zweite Prozess ist ein vollwertiger Prozess ohne Einschränkung. Beide Prozesse können dann eigenständig weiterlaufen.
das verstehe ich soweit, fork wird aufgerufen, der prozess dubliziert:
*der childprozess geht in if-schleife
*der parentprozess in die else.
das ganze kann aber doch nicht gleichzeitig passieren. wie läuft das "prozesszustandstechnisch" ab, geht nach dem erzeugen des childs (mit fork) der parent in sleep bis er das ergebnis vom child zurückbekommt, oder wie läuft das. ich habe jetzt schon länger gesucht und finde kein beispiel wo das genau erklärt wird.
parent
|
fork-----------------------
|......................... |
parent(sleep) ....child(running)
wäre euch für etwas hilfe echt dankbar
OBrian
Moderation MBDB, ,
- Mitglied seit
- 16.10.2000
- Beiträge
- 17.032
- Renomée
- 267
- Standort
- NRW
- Prozessor
- Phenom II X4 940 BE, C2-Stepping (undervolted)
- Mainboard
- Gigabyte GA-MA69G-S3H (BIOS F7)
- Kühlung
- Noctua NH-U12F
- Speicher
- 4 GB DDR2-800 ADATA/OCZ
- Grafikprozessor
- Radeon HD 5850
- Display
- NEC MultiSync 24WMGX³
- SSD
- Samsung 840 Evo 256 GB
- HDD
- WD Caviar Green 2 TB (WD20EARX)
- Optisches Laufwerk
- Samsung SH-S183L
- Soundkarte
- Creative X-Fi EM mit YouP-PAX-Treibern, Headset: Sennheiser PC350
- Gehäuse
- Coolermaster Stacker, 120mm-Lüfter ersetzt durch Scythe S-Flex, zusätzliche Staubfilter
- Netzteil
- BeQuiet 500W PCGH-Edition
- Betriebssystem
- Windows 7 x64
- Webbrowser
- Firefox
- Verschiedenes
- Tastatur: Zowie Celeritas Caseking-Mod (weiße Tasten)
Nein, das IF selbst wird natürlich im Elternprozeß entschieden, und falls die Bedingung nicht erfüllt wird, geht es da auch weiter. Mit dem Fork kann man jetzt sagen, daß es gleich im Elternprozeß weitergeht, egal ob IF oder ELSE. Falls die IF-Bedingung erfüllt ist, wird in den Kindprozeß abgezweigt, und der rechnet solange nebenher, bis er soweit ist.
Auf ein Return muß ja nicht gewartet werden (man sollte dann natürlich keine Variablen im Elternprozeß verwursten, die erst zeitlich danach im Kindprozeß sinnvoll gefüllt werden).
Also:
Wenn result = 1 ist, dann steht in der Ausgabe:
Thread 1 ist fertig
alles ist fertig
ist result = 0, steht da:
Thread 1 ist fertig
alles ist fertig
Thread 2 ist fertig
und würde man das ohne fork() machen, stände da bei result = 0:
Thread 2 ist fertig
Thread 1 ist fertig
alles ist fertig
(ich bin jetzt mal davon ausgegangen, daß der Computer die drei Zeilen schneller als eine Sekunde abarbeitet^^)
Auf ein Return muß ja nicht gewartet werden (man sollte dann natürlich keine Variablen im Elternprozeß verwursten, die erst zeitlich danach im Kindprozeß sinnvoll gefüllt werden).
Also:
Code:
Process p {
result = fork();
if(result==0) {
wait(1000);
printf("Thread 2 ist fertig");
} else {
printf("Thread 1 ist fertig");
}
printf("alles fertig");
}
Wenn result = 1 ist, dann steht in der Ausgabe:
Thread 1 ist fertig
alles ist fertig
ist result = 0, steht da:
Thread 1 ist fertig
alles ist fertig
Thread 2 ist fertig
und würde man das ohne fork() machen, stände da bei result = 0:
Thread 2 ist fertig
Thread 1 ist fertig
alles ist fertig
(ich bin jetzt mal davon ausgegangen, daß der Computer die drei Zeilen schneller als eine Sekunde abarbeitet^^)
Jup, das If bezieht sich auf den fork-Aufruf, nicht auf irgendein Resultat des neuen Prozesses.
Sprich beide Prozesse führen das if unabhängig voneinander aus, nur beim parent ist result eben nicht 0, sonst könnte man ja nicht mehr unterscheiden welcher Prozess das nun eigentlich gerade ist.
Sprich beide Prozesse führen das if unabhängig voneinander aus, nur beim parent ist result eben nicht 0, sonst könnte man ja nicht mehr unterscheiden welcher Prozess das nun eigentlich gerade ist.
PuckPoltergeist
Grand Admiral Special
Nein, das IF selbst wird natürlich im Elternprozeß entschieden,
Nein, das IF wird in beiden Prozessen ausgewertet, denn ab dem fork()-Aufruf wird der gesamte Code jeweils von beiden Prozessen ausgeführt.
Das stimmt auch nicht. Mit der IF-Abfrage können die Prozesse feststellen, wer sie nun sind, Eltern- oder Kindprozess. Das IF fragt die von fork() zurückgegebene PID (Prozess-ID) ab. Ist diese 0, handelt es sich um den Kindprozess, andernfalls ist es die PID des Kindprozesses, welche dem Elternprozess zurück geliefert wird, welcher das fork() aufgerufen hat.Falls die IF-Bedingung erfüllt ist, wird in den Kindprozeß abgezweigt, und der rechnet solange nebenher, bis er soweit ist.
Nach einem fork() führen beide Prozesse haargenau den selben Code aus, sofern nicht mit einem IF zwischen den beiden Prozessen unterschieden wird. Um das nochmal etwas zu verdeutlichen, noch ein kleines Beispiel:
Code:
result = fork()
printf("Ausgabe 1\n");
if(result == 0)
printf("Ausgabe 2\n");
else
printf("Ausgabe 3\n");
printf("Ausgabe 4\n");
In diesem Beispiel wird "Ausgabe 1" von beiden Prozessen ausgegeben. "Ausgabe 2" wird nur vom Kindprozess ausgegeben, während "Ausgabe 3" nur vom Elternprozess erzeugt wird. "Ausgabe 4" wird dann wiederum von beiden Prozessen ausgegeben, weil hier nicht mehr zwischen den beiden Prozessen unterschieden wird.
Was die ursprüngliche Frage über die Reihenfolge der Abarbeitung angeht, das liegt am Scheduler des Betriebssystems. Es kann hier keine Aussage getroffen werden, wann welcher Prozess abgearbeitet wird, und welcher Prozess zuerst fertig ist.
Zuletzt bearbeitet:
OBrian
Moderation MBDB, ,
- Mitglied seit
- 16.10.2000
- Beiträge
- 17.032
- Renomée
- 267
- Standort
- NRW
- Prozessor
- Phenom II X4 940 BE, C2-Stepping (undervolted)
- Mainboard
- Gigabyte GA-MA69G-S3H (BIOS F7)
- Kühlung
- Noctua NH-U12F
- Speicher
- 4 GB DDR2-800 ADATA/OCZ
- Grafikprozessor
- Radeon HD 5850
- Display
- NEC MultiSync 24WMGX³
- SSD
- Samsung 840 Evo 256 GB
- HDD
- WD Caviar Green 2 TB (WD20EARX)
- Optisches Laufwerk
- Samsung SH-S183L
- Soundkarte
- Creative X-Fi EM mit YouP-PAX-Treibern, Headset: Sennheiser PC350
- Gehäuse
- Coolermaster Stacker, 120mm-Lüfter ersetzt durch Scythe S-Flex, zusätzliche Staubfilter
- Netzteil
- BeQuiet 500W PCGH-Edition
- Betriebssystem
- Windows 7 x64
- Webbrowser
- Firefox
- Verschiedenes
- Tastatur: Zowie Celeritas Caseking-Mod (weiße Tasten)
Achso, dann hab ich das falsch verstanden gehabt. Die Threads bestehen also schon ab result = fork(); und man verteilt mit dem IF nur Aufgaben auf Parent oder Child.
PuckPoltergeist
Grand Admiral Special
Achso, dann hab ich das falsch verstanden gehabt. Die Threads bestehen also schon ab result = fork(); und man verteilt mit dem IF nur Aufgaben auf Parent oder Child.
Jupp, aber es sind Prozesse und nicht nur Threads. Mit einem fork() wird der gesamte Prozess mit allem drum und dran dupliziert, so dass dann zumindest logisch alles doppelt existiert.
Ähnliche Themen
- Antworten
- 0
- Aufrufe
- 4K
- Antworten
- 0
- Aufrufe
- 52K
- Antworten
- 0
- Aufrufe
- 134K
- Antworten
- 0
- Aufrufe
- 87K