Esercizio produttore/consumatore Sistemi Operativi

di il
2 risposte

Esercizio produttore/consumatore Sistemi Operativi

Ciao a tutti ragazzi,
avrei bisogno del vostro aiuto per comprendere bene del codice che il prof ha dato come esempio di tema d'esame.In pratica questo esercizio utilizza i semafori per gestire processi concorrenti.Il mio problema è che non riesco a comprendere una porzione del codice.
Il testo è il seguente:
i produttori producono interi > 0.
Un produttore può produrre un intero x solo se x non è maggiore della somma degli elementi
prodotti e non ancora consumati.
Se il produttore tenta di produrre l'intero x senza soddisfare questa condizione deve
attendere a produrre x nel momento opportuno.

Un consumatore non può consumare se l'elemento che dovrebbe essere consumato è maggiore o
uguale a tutti gli elementi prodotti dopo l'ultimo reset. Se il consumatore pensa a
consumare un elemento che non soddisfa queste condizioni, allora deve attendere a riprovare
a consumare al momento opportuno.
Svoglimento:
Inizialmente l'array è vuoto cioè contiene tutti elementi nulli. Quando un elemento dell'array
contiene un valore > 0 significa che quell'elemento è pieno. La somma degli elementi prodotti
e non ancora consumati è data dalla somma degli elementi presenti nell'array.
Produttore: se l'intero x è maggiore della somma degli elementi allora il processo deve essere
messo in stato di waiting
Consumatore: se l'elemento da prelevare è superiore al valore massimo presente nell'array, quindi
è superiore di tutti gli elementi dell'array(il processo va in waiting).
Ecco il codice:
produttore(){

	while(true){
		x = inserimento valore;
		wait(empty);	//attendo che il buffer sia libero
		wait(sem_p);	
	
		if(x > max){
			max = x;}
	
		if(x > somma && somma > 0){
			wait(sem_somma_prod);	//caso particolare in cui x è maggiore della somma degli elementi disponibili
			a[i] = x;
			i=(i+1)%N;
			somma = somma+x;
		
			signal(sem_p);  //potrei effettuare le signal una sola volta per tutti e 3 gli if
			signal(full);
		}

		if(x < somma && somma > 0){
			a[i] = x;
			i=(i+1)%N;
			somma = somma+x;

			signal(sem_p);
			signal(full);
		}

		if(x>somma && somma == 0){
			a[i] = x;
			i=(i+1)%N;
			somma = somma+x;

			signal(sem_p);
			signal(full);}

	}

}




consumatore(){
	
	while(true){

		wait(full);
		wait(sem_c);
	
		if(a[j] >=max){
			wait(sem_magg_cons);
			x = a[j];
			j = (j+1)%N;
			somma = somma - x;   //decremento la somma al prelievo dell'intero
	
			if(x == max){
				max = a[0];
				k = 0;
			
				while(a[k]!=0){
		
					if(a[k] > max)
						max = a[k];
						k++;}
				}
				signal(empty);
				//signal(sem_somma_prod); ??
				signal(sem_c);
			}
		}else{
			x = a[j];
			j = (j+1)%N;
			somma = somma - x;
			signal(empty);
			//signal(sem_somma_prod); ??
			signal(sem_c);
			
	}
}






reset(){

	for(i = 0, i < N, i++){
		a[i] = 0;	//imposta tutti gli elementi dell'array a 0
	} 
	
	somma = 0;
	max = 0;
	empty = N;
	full = 0;
	sem_p = 1;
	sem_C = 1;
	sem_somma_prod = 0;
	sem_magg_cons = 0;
	
}


sem_p e sem_c sono le 2 mutex
La parte che non mi è chiara è quella relativa al consumatore e nello specifico il secondo if contenuto all'interno del ciclo while!Qualcuno riesce ad aiutarmi??Grazie mille e buona giornata!

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte