PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu fork()



dejup
28-01-2002, 17:01
Wenn ich ein Programm mittels frok() in Eltern und Kind - Prozess aufteile, dann in jedem Prozess 2000 mal
printf("%i", getpid())
ausgebe, dann wird 2000 mal hintereinander die Prozess ID des Elternprozesses ausgegeben und anschließend 2000 mal die PID des Kindes.
Wenn ich nun die einzelnen Ausgaben mit einem sleep(1) unterbreche, werden die Prozesse durcheinander ausgeführt. Bei einem Bekannten werden die Prozesse auch ohne sleep(1) versetzt ausgeführt.
Gibt es irgendeine Möglichkeit, die dem Kernel zuweist, nach welcher verbrauchten Prozessorzeit er den laufenden Prozess wechselt?
Oder ist das Verhalten von fork() vollkommen normal?

vielen Dank im vorraus
mfg
de.jup

citizen428
29-01-2002, 12:08
Original geschrieben von dejup
Wenn ich nun die einzelnen Ausgaben mit einem sleep(1) unterbreche, werden die Prozesse durcheinander ausgeführt. Bei einem Bekannten werden die Prozesse auch ohne sleep(1) versetzt ausgeführt.


Vage Vermutung:
Vielleicht anderes OS oder anderer Kernel mit unterschiedlichem Scheduler? Ist jetzt nur mal so geraten...

thommy
29-01-2002, 12:41
Inwiefern Prozesswechsel auftreten, hängt bei diesem einfachen Beispiel von der Geschwindigkeit des Prozessors und von der momentanen Auslastung ab. Vermutlich sind Deine Tasks so schnell, dass alle Ausgaben innerhalb einer Zeitscheibe erfolgen.

Durch das Sleep erzwingst Du einen Prozesswechsel. Da Eltern- und Kindprozess mit derselben Priorität werkeln, führt das zu einer wechselseitigen Ausgabe. Anstatt sleep(1) kannst Du sogar usleep(1) verwenden, da die Dauer des Schlafens unerheblich ist.

Um die Wirkung des Schedulers real zu testen, könntest Du zusätzliche Schleifen ins Testprogramm einbauen, sodass die Prozesse länger rechnen, als es eine einzelne Zeitscheibe zulässt.

Thomas

SeeksTheMoon
22-02-2002, 12:18
Du kannst mit wait() veranlassen, dass der parentprocess auf sein Kind wartet:
...
if((pid=fork())<0)
//fehler
else if(pid == 0)
{
//Kindprozess
}
else //Elternprozess
wait(); //wartet auf Ende des Kindprozesses

...