D4rkAng3l
28-05-2007, 18:06
Ciao,
stò studiando sistemi operativi (non sò se è meglio chiedere quì o nel 3d di informatica in scienza e tecnica...)
Stò vedendo la sezione del problema della mutua esclusione di una risorsa da parte di 2 o più processi che vi vorrebbero provare ad accedere in particolare il caso del modello PRODUTTORE-CONSUMATORE (con buffer di capacità unaria).
In pratica ho un processo PRODUTTORE che produce un messaggio da inserire nel buffer (di dimensione 1) ed un processo CONSUMATORE che deve estrarre il messaggio dal buffer ed usarlo per qualche suo scopo.
Quindi i vincoli sono che il PRODUTTORE non può inserire nulla nel buffer se questo è pieno ed il CONSUMATORE non può estrarre nulla dal buffer se questo è vuoto quindi devo risolvere un problema di sincronizzazione dei due processi mediante l'uso DI 2 semafori (in questo caso semafori binari) usando le rispettive primitive: wait e signal.
Quindi avrei una cosa del genere in pseudocodice:
Processo PRODUTTORE{
do{
<PRODUZIONE DEL NUOVO MESSAGGIO>;
wait(spazio_disponibile);
<DEPOSITO DEL MESSAGGIO NEL BUFFER>;
signal(messaggio_disponibile);
}while(!fine);
}
Processo CONSUMATORE{
do{
wait(messaggio_disponibile);
<PRELIEVO DEL MESSAGGIO DAL BUFFER>;
signal(spazio_disponibile);
<CONSUMO DEL MESSAGGIO>
}while(!fine);
}
Facendo l'ipotesir che il buffer è inizialmente vuoto bisogna settare i 2 valori dei semafori:
messaggio_disponibile a 0 e spazio_disponibile ad 1
In pratica il PRODUTTORE per prima cosa produce il messaggio da mettere nel buffer poi tramite la wait verifica se il valore numerico di spazio disponibile che sarà uguale ad 1 che tramite la wait viene dcrementato di 1 e viene eseguita la sezione critica di deposito del messaggio e successivamente viene resa disponibile tramite la signal la risorsa al processo consumatore che potrà estrarre dal buffer.
Ora visto che i 2 processi possono sovrapporsi nel tempo tra loro che succede se durante l'esecuzione del processo PRODUTTORE dopo aver eseguito l'istruzione wait lo scheduler decide che è il turno del processo CONSUMATORE?
Se ho capito bene (e non ne sono certo):
allora nel processo PRODUTTORE è stato prodotto il messaggio da inserire nel buffer poi è stata eseguita la primitiva wait che ha decrementato a 0 il semaforo spazio_disponibile, avviene il cambio di contesto e viene caricato nella CPU il processo consumatore che si trova il semaforo messaggio_disponibile settato a 0 per cui sospende tale processo e mette il suo descrittore nella coda dei processi sospesi relativa a tale semaforo...il processo è sospeso e la sua sezione critica di prelevamento dal buffer impedita. A questo punto il sistema operativo prevede ad un nuovo cambio di contesto a favore del processo PRODUTTORE che riprende da dove era rimasto ovvero inizia l'esecuzione della sua sezione critica in cui deposita il messaggio poi eseguirà la signal che incrementa il semaforo messaggio disponibile e così quando verrà caricato il processo CONSUMATORE potrà eventualmente eseguire la sua sezione critica...
Funzionano grossomodo così sti benedetti semafori o non c'ho capito un ceppotto? :eek: :cry:
Grazie
Andrea
stò studiando sistemi operativi (non sò se è meglio chiedere quì o nel 3d di informatica in scienza e tecnica...)
Stò vedendo la sezione del problema della mutua esclusione di una risorsa da parte di 2 o più processi che vi vorrebbero provare ad accedere in particolare il caso del modello PRODUTTORE-CONSUMATORE (con buffer di capacità unaria).
In pratica ho un processo PRODUTTORE che produce un messaggio da inserire nel buffer (di dimensione 1) ed un processo CONSUMATORE che deve estrarre il messaggio dal buffer ed usarlo per qualche suo scopo.
Quindi i vincoli sono che il PRODUTTORE non può inserire nulla nel buffer se questo è pieno ed il CONSUMATORE non può estrarre nulla dal buffer se questo è vuoto quindi devo risolvere un problema di sincronizzazione dei due processi mediante l'uso DI 2 semafori (in questo caso semafori binari) usando le rispettive primitive: wait e signal.
Quindi avrei una cosa del genere in pseudocodice:
Processo PRODUTTORE{
do{
<PRODUZIONE DEL NUOVO MESSAGGIO>;
wait(spazio_disponibile);
<DEPOSITO DEL MESSAGGIO NEL BUFFER>;
signal(messaggio_disponibile);
}while(!fine);
}
Processo CONSUMATORE{
do{
wait(messaggio_disponibile);
<PRELIEVO DEL MESSAGGIO DAL BUFFER>;
signal(spazio_disponibile);
<CONSUMO DEL MESSAGGIO>
}while(!fine);
}
Facendo l'ipotesir che il buffer è inizialmente vuoto bisogna settare i 2 valori dei semafori:
messaggio_disponibile a 0 e spazio_disponibile ad 1
In pratica il PRODUTTORE per prima cosa produce il messaggio da mettere nel buffer poi tramite la wait verifica se il valore numerico di spazio disponibile che sarà uguale ad 1 che tramite la wait viene dcrementato di 1 e viene eseguita la sezione critica di deposito del messaggio e successivamente viene resa disponibile tramite la signal la risorsa al processo consumatore che potrà estrarre dal buffer.
Ora visto che i 2 processi possono sovrapporsi nel tempo tra loro che succede se durante l'esecuzione del processo PRODUTTORE dopo aver eseguito l'istruzione wait lo scheduler decide che è il turno del processo CONSUMATORE?
Se ho capito bene (e non ne sono certo):
allora nel processo PRODUTTORE è stato prodotto il messaggio da inserire nel buffer poi è stata eseguita la primitiva wait che ha decrementato a 0 il semaforo spazio_disponibile, avviene il cambio di contesto e viene caricato nella CPU il processo consumatore che si trova il semaforo messaggio_disponibile settato a 0 per cui sospende tale processo e mette il suo descrittore nella coda dei processi sospesi relativa a tale semaforo...il processo è sospeso e la sua sezione critica di prelevamento dal buffer impedita. A questo punto il sistema operativo prevede ad un nuovo cambio di contesto a favore del processo PRODUTTORE che riprende da dove era rimasto ovvero inizia l'esecuzione della sua sezione critica in cui deposita il messaggio poi eseguirà la signal che incrementa il semaforo messaggio disponibile e così quando verrà caricato il processo CONSUMATORE potrà eventualmente eseguire la sua sezione critica...
Funzionano grossomodo così sti benedetti semafori o non c'ho capito un ceppotto? :eek: :cry:
Grazie
Andrea