TU Wien:Betriebssysteme VO (Puschner)/Prüfung 2010-04-28 (und 2009-04-29) - Beispiel 01

Aus VoWi
Zur Navigation springen Zur Suche springen

Mein Lösungsvorschlag:

Init:
initS(M1_writable, 1);
initS(M2_writable, 1);
daten: array[0..1] of boolean;

P1:
do forever(){
	P(M1_writable);
	write_mem1();
	daten[0] = true;
}

P2:
do forever(){
	P(M2_writable);
	write_mem2();
	daten[1] = true;
}

Ausgabeprozess:
do forever(){
	if(daten[0]){
		read_mem1();
		daten[0] = false;
		V(M1_writable);
	}
	if(daten[1]){
		read_mem2();
		daten[1] = false;
		V(M2_writable);
	}
}

28.12.2016 MSZ:

Achtung.. Busy Waiting bei Ausgabeprozess. Hier wird ständig auf daten[0] und daten[1] überprüft. Das muss unbedingt vermieden werden. Hier einen Semaphor davor schalten - siehe untere Lösung.


andere Lösung[Bearbeiten | Quelltext bearbeiten]

Init:
initS(IN1, 1);
initS(IN2, 1);
initS(OUT, 0);
initS(Mutex, 1);

daten: array[0..1] of boolean;

P1:
do forever(){
	P(IN1);
	write_mem1();
	daten[0] = true;
        V(OUT)
}

P2:
do forever(){
	P(IN2);
	write_mem2();
	daten[1] = true;
        V(OUT)
}

Ausgabeprozess:
do forever(){
        P(OUT)
        P(Mutex)
	if(daten[0]){
		read_mem1();
		daten[0] = false;
		V(M1_writable);
	}
	if(daten[1]){
		read_mem2();
		daten[1] = false;
		V(M2_writable);
	}
        V(Mutex)
}

28.12.2016 MSZ:

Der Mutex Semaphor ist hier nicht notwendig.