Torna alla pagina di Sistemi Operativi
:: Appunti caotici ::
Lezione 5
Comunicazione con Mailbox
Pag 2
Modello della comunicazione con mailbox
Con questa tecnica il processo mittente genera il messaggio senza sapere chi sarà il ricevente; si tratta quindi di comunicazione indiretta.
Il messaggio viene depositato in una mailbox (detta anche porta), una struttura dati presente nel sistema operativo, caratterizzata da un nome cui si farà riferimento per accedere ai messaggi da lei contenuta. Il processo ricevente prelevererà il messaggio accedendo ad essa.
Messaggi
Il messaggio può contenere diverse informazioni, come:
- Identità del processo mittente;
- Mailbox destinataria;
- Informazioni da trasmettere;
- Eventuali altre informazioni di supporto relative alla gestione della mailbox, ad esempio se vanno tolti messaggi con deadline scaduta o come ordinare i messaggi.
I messaggi possono avere dimesione Fissa o ''Variabile.
Pag 3
Mailbox
Va anzitutto ricordato che non stiamo assegnando i messaggi ad una coppia di processi, ma li stiamo inserendo in una struttura accessibile (teoricamente) da tutti. Certo, esisteranno comunque delle politiche di accesso: solo e tutti quei processi che avranno ottenuto dal sistema operativo i diritti di lettura potranno leggere i messaggi.
La mailbox può avere capacità:
- Illimitata: possono essere immessi un numero illimitati di messaggi;
- Limitata: c'è un numero limitato di messaggi che possono essere immessi;
- Nulla: nessun messaggio può essere posto nella mailbox.
Funzioni (1)
La mailbox prima di essere utilizzata deve essere creata, e se in un secondo momento non serve più la si può cancellare. Vengono quindi messe a disposizione delle funzioni che permettono tali operazioni:
- create(M): crea la mailbox, M è il nome simbolico della mailbox che si vuole creare;
- delete(M): cancella la mailbox M.
Pag 4
Funzioni (2)
Vengono fornite anche delle funzioni apposite per l'invio e la ricezioni di messaggi.
Invio: send(M, messaggio)
Questa funzione deposita i messaggi nella mailbox e risulta bloccante in base alla capacità della mailbox:
- Capacità illimitata: funzione non bloccante, il processo mittente depositerà sempre il suo messaggio dato che non troverà mai la mailbox piena. Per realizzarla potrei utilizzare ad esempio una lista a puntatori espliciti, quindi con uno spazio allocato dinamicamente. Bisogna precisare tuttavia che il termine "illimitato" è teorico, dal momento che potrei comunque esaurire lo spazio di memoria del sistema. Se quindi da un punto di vista fisico potrebbe risultare (caso limite) bloccante, dal punto di vista logico non lo è mai;
- Capacità limitata: la funzione può essere bloccante se la mailbox è piena, quindi costringe il processo mittente ad aspettare che nella mailbox si liberi spazio per far depositare il suo messaggio;
- Capacità nulla: la funzione è bloccante se non c'è un processo in ricezione.
Funzioni(3)
Ricezione: ''receive(M, messaggio).
Tale funzione consente di ricevere il messaggio dalla mailbox. Risulta bloccante se non c'è almeno un messaggio da ricevere.
E' solo in fase di ricezione che si completa l'identificazione delle identità da parte dei processi.
Pag 5
Funzioni(4)
Ci sono anche delle funzioni di invio e di ricezione condizionale.
Invio Condizionale: cond_send(M, messaggio): error_status
Questa funzione deposita il messaggio nella mailbox solo se trova spazio al suo interno. Tale funzione quindi non è bloccante, se non trova spazio non costringe il processo a rimanere in attesa che si liberi spazio sufficiente nella mailbox per poter depositare il messaggio. Viene quindi introdotto una condizione, che mi ritorna errore nel caso il processo non riesca a depositare il messaggio.
Funzioni(5)
Ricezione Condizionale: cond_receive(M, messaggio): error_status
Tale funzione riceve un messaggio solo se ce ne è almeno uno nella mailbox. In caso contrario ritorna la condizione di errore, non bloccando di conseguenza il processo ricevente.
Pag 6
Sincronizzazione
Le politiche di sincronizzazione sono stabilite sempre in base alla capacità della mailbox:
- Illimitata: ho una comunicazioe Asincrona, ovvero il mittente depone il suo messaggio indipendentemente dallo stato di computazione del processo ricevente;
- Nulla: ho una comunicazione Sincrona. Ho infatti un processo mittente che non trova spazio per deporre il suo messaggio, ed è dunque obbligato a mettersi in attesa. Quando un processo Q invocherà una receive, lo troverà ancora in quello stato, e a questo punto i due processi cominceranno a passarsi l'informazione direttamente in modo sincrono. Questo meccanismo prende il nome di rendez-vou, ed implica che P sappia a che punto della computazione si trovi il processo ricevente quando richiede la comunicazione;
- Limitata: comunicazione bufferizzata.
Caratteristiche e problemi
Una caratteristica di questa tecnica è che non ho un'indentificazione dei processi che comunicano, quindi ho una comunicazione indiretta. La sincronizzazione è gestita in maniera automatica da parte del sistema operativo.
Pag 7
Ordinamento delle code dei messaggi e dei processi in attesa
Ci sono varie tecniche di ordinamento dei messaggi all'interno della mailbox, tali tecniche si riferiscono anche ai processi che sono in attesa. Tali tecniche sono:
- FIFO: First In Firt Out, ovvero il primo messaggio che entra sarà il primo ad uscire, lo stesso per i processi;
- Priorità: viene stabilita una priorità dei messaggi, coloro che hanno priorità più alta saranno i primi ad essere prelevati. Avviene lo stesso per i processi che devono depositare dei messaggi, coloro che hanno priorità più alta depositano per primi i messaggi;
- Scadenza: un'altra tecnica per stabilire l'ordinamento con cui i mesaggi potranno essere prelevati è utilizzando un tempo massimo di attesa. Il problema che potrebbe sorgere con la priorità è che un messaggio (o precesso) con priorità bassa potrebbe rimanere indefinitivamente in attesa fin tanto che c'è un messaggio (o processo) con priorità più alta.
Proprietà della mailbox
Dato che la mailbox non è proprietà del processo ma bensì del sistema operativo (ricordiamo che è nel suo spazio di indirizzamento!), posso stabilire delle proprietà su di essa. Posso attribuire la mailbox ad un processo proprietario, l'unico a poter ricevere messaggi, mentre tutti gli altri processi possono solo inviarli. Se il processo proprietario scompare, la mailbox scompare con esso.
Pag 8
Comunicazione con molti possibili processi mittenti o riceventi
Ci possono essere comunicazioni con molti possibili mittenti o riceventi. Ogni comunicazione coinvolgerà sempre minimo due processi, ma la struttura della mailbox consente che ci siano più processi mittenti e più processi riceventi che possono partecipare nella comunicazione. La struttura della mailbox non mi consente però di sapere a priori chi siano tali processi.
Notare anche come la struttura dati mailbox disgiunga naturalmente il processo mittente dal ricevente.
Comunicazione molti a uno
Una differenza sostanziale nella comunicazione molti a uno rispetto a quella precedente è che ho un solo processo di servizio (S, nello schema). Nel caso un cui il processo di servizio schiatti, il sistema operativo può farlo ripartire eseguendone una copia (a cui cambierà l'id). I richiedenti non si accorgono di nulla, tranne quello che S stava servendo nel momento in cui è esploso (il nuovo servizio non sa che c'era una richiesta pendente).
Pag 9
Comunicazioni uno a molti
Una struttura uno a molti mi consente di avere più processi di servizio ed un unico processo richiedente, che verrà sempre servito per quanto possa rompere con le sue richieste.
I processi che si occuperanno del servizio saranno delle copie dello stesso processo, pronte a servire ognuna una richiesta di entrata spacifica. Ciò è reso possibile dal fatto che si da per assunto che tali processi serventi compino operazioni di I/O, così che abbiano tempi morti nello sfruttamento del processore, durante i quali possa avvenire la turnazione.
Questa tecnica è auspicabile quando ho un singolo processo che ha più richieste e che vuole vengano soddisfatte contemporaneamente.
Comunicazione molti a molti
In questa tecnica ho più processi di servizio e più processi che effettuano richieste. Nel metodo uno a molti potevo soddisfare in parallelo più richieste effetuate da un singolo processo, potevo però avere momenti in cui alcuni processi di servizio rimanevano in stato di attesa. Con questo metodo ottimizzo quei tempi morti soddisfacendo richieste effettuate da altri processi.
Torna alla pagina di Sistemi Operativi