Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Semafori - dubbio

1 view
Skip to first unread message

Albert

unread,
Nov 29, 2009, 4:33:24 AM11/29/09
to
Salve


osservando l'immagine a seguito

http://img32.imageshack.us/img32/9739/imglpp.jpg

e basandosi sul testo sottolineato in rosso

il senso ᅵ :

che se ho S = 10 (10 risorse disponibili ad esempio)

e i processi che vogliono accedervi sono 16 (P = 16)

allora potro' soddisfare solo 10 processi, mentre gli altri 6 restano in
attesa....e mentre restano in attesa vengono posti in una lista.

Ora basandomi sul contenuto dei due IF

in WAIT c'e' S->valore < 0 ma non dovrebbe essere S->valore = 0 ?
Ossia zero risorse disponibili?

in SIGNAL c'e' S->valore <= 0 ma non dovrebbe essere S->valore > 0 ?
Ossia risorse disponibili?


grazie!

Darkbyte [Google]

unread,
Dec 1, 2009, 3:55:15 AM12/1/09
to
On 29 Nov, 10:33, Albert <Alb...@comma.it> wrote:
> Salve
>
> osservando l'immagine a seguito
>
> http://img32.imageshack.us/img32/9739/imglpp.jpg
>
> e basandosi sul testo sottolineato in rosso
>
> il senso è :

>
> che se ho S = 10   (10 risorse disponibili ad esempio)
>
> e i processi che vogliono accedervi sono 16   (P = 16)
>
> allora potro' soddisfare solo 10 processi, mentre gli altri 6 restano in
> attesa....e mentre restano in attesa vengono posti in una lista.
>
> Ora basandomi sul contenuto dei due IF
>
> in WAIT c'e' S->valore < 0    ma non dovrebbe essere S->valore = 0 ?
> Ossia zero risorse disponibili?

No, perchè S->valore viene decrementato e può diventare negativo.
Se hai un semaforo con valore iniziale 10 e ci sono 16 processi che
vogliono usare la risorsa associata al semaforo, i primi dieci
processi porteranno S=0, l'undicesimo S=-1, il dodicesimo S=-2, quindi
dal decimo processo in poi il valore del semaforo sarà negativo.
Quindi è lecito S < 0.
Per intenderci: considera un semaforo inizialmente S = 1.
Un processo richiama la wait() ed S viene decrementato.
A quel punto S = 0, ma *quel* processo non deve bloccarsi. Devono
bloccarsi i processi che arriveranno dopo di lui (se lui non ha
rilasciato la risorsa ovviamente).

> in SIGNAL c'e' S->valore <= 0    ma non dovrebbe essere S->valore > 0 ?
>   Ossia risorse disponibili?

Discorso inverso al precedente.
Se S < 0, qualcuno ha tentato di usare una risorsa occupata. S = 0
indica invece una risorsa usata da tutti i processi possibili ma non
bloccante.
Esempio di poco fa: inizi con S = 1.
Un processo può usare la risorsa.

P1 wait() -> S = 0. Fin qui ok. Processo P1 non bloccato.
P2 wait() -> S = -1. Processo P2 bloccato.

P1 signal() -> S = 0. Se è diventato zero vuol dire che ERA negativo,
e c'erano quindi processi bloccati. Quindi S = 0 deve risvegliare un
processo.

> grazie!

Di niente.

0 new messages