Hi Leute!
Ich hab hier folgenden Code:
1 | while(true)
|
2 | {
|
3 | //produce item
|
4 | wait(empty);
|
5 | wait(mutex);
|
6 |
|
7 | //add the item to the buffer
|
8 |
|
9 | signal(mutex);
|
10 | signal(full);
|
11 | }
|
Ich will jetzt wissen was dieser Code genau macht. Meines Erachtens
bestehen die wait und signal Semaphoren aus diesen Code:
1 | wait(S)
|
2 | {
|
3 | value--;
|
4 | if(value < 0)
|
5 | {
|
6 | //add process to waiting queue
|
7 | }
|
8 | }
|
9 |
|
10 |
|
11 | signal(S)
|
12 | {
|
13 | value++;
|
14 | if(value <= 0)
|
15 | {
|
16 | //remove process from the waiting queue
|
17 | }
|
18 | }
|
Was passiert nun wenn die Variablen folgendermaßen intialisiert sind:
mutex=1; full=0; empty=N
empty: wie viel ist im Buffer noch frei
Ich gehe nun davon aus, dass der Buffer komplett frei ist. Der Buffer
soll 10 Speicherstellen aufweisen. Wenn ich das jetzt von oben
durchgehe, dann is quasi empty=10. wait verringert von 10 auf 9 und
prüft ob der Wert kleiner 0 ist; ist er aber nicht und kommt somit nicht
in das if rein und der Prozess kommt somit auch nicht zum Warten in die
"waiting queue" sondern darf weiter zum wait(mutex). mutex=1 wird zu
mutex=0, das if ist also wieder nicht erfüllt und ich kann in den Puffer
schreiben. Dann gehts weiter zum signal(mutex). mutex=0 wird mutex=1
erhöht, das if ist erfüllt und es wird ein momentan wartender Prozess
von der waiting queue entfernt.
-> Was passiert an dieser Stelle? Wo wird da welcher Prozess von der
waiting queue entfernt? Mache ich an dieser Stelle nun mit der letzten
Semaphore (signal(full)) weiter oder beginne ich jetzt an einer anderen
Stelle?
Könnt ihr mir ein bisschen helfen?