# data[].attributes.body
Modello client-server

Ogni risorsa del sistema è accessibile a un solo processo che prende il nome di processo servitore (o server) , quando un processo deve utilizzarla (processo cliente) non può accedervi direttamente ma deve chiedere al processo server di effettuare lui stesso le operazioni desiderate sulla risorsa e di comunicargli successivamente l’esito delle elaborazioni.

# data[].attributes.body
Distinguiamo la comunicazione in:

asimmetrica: il mittente nomina esplicitamente il destinatario ma questo non nomina esplicitamente il mittente;

simmetrica: entrambi si nominano in modo esplicito.

Possiamo avere due classiche situazioni:

comunicazione di tipo simmetrico e sincrono a rendez-vous stretto tipico del CSP

comunicazione di tipo asimmetrico e sincrono a rendez-vous esteso tipico del DP

# data[].attributes.body
Abbiamo due tipologie di “rendez-vous”:

stretto: se si limita alla trasmissione di un messaggio dal mittente al destinatario;

esteso: se il destinatario, una volta ricevuto il messaggio, deve inviare una risposta al mittente

# data[].attributes.body
Classificazione dei modelli a scambio di messaggi:

comunicazione asincrona la comunicazione da parte del processo mittente avviene senza che questo rimanga in attesa di una risposta da parte del processo destinatario

comunicazione sincrona lo scambio di informazioni può avvenire solo se mittente e destinatario sono pronti a “parlarsi” e quindi è necessario che si sincronizzino

# data[].attributes.body
Esistono due possibili modalità:

utilizzare linguaggi che prevedono costrutti espliciti per realizzare lo scambio di messaggi, come il CSP (CommunicatingSequentialProcesses) proposto da Tony Hoare

utilizzare la “chiamata di procedura remota”, come il DP (DistributedProcesses), proposto da  Brinch Hansen

# data[].attributes.headline
Modello a scambio di messaggi (ambiente locale, message passing)

# data[].attributes.subject
Modello a scambio di messaggi (ambiente locale, message passing)

# data[].attributes.body
Ogni processo può accedere esclusivamente alle risorse allocate nella propria memoria locale

Questa non può essere modificata direttamente dagli altri processi

# data[].attributes.body
L’interferenza è dovuta:

alla competizione che avviene tra processi che utilizzano senza le opportune autorizzazioni risorse condivise

a una erronea soluzione dei problemi di competizione e di cooperazione

# data[].attributes.body
La cooperazione è un'interazione tra processi prevedibile e desiderata dato che è insita nella logica del programma

La cooperazione tra processi avviene utilizzando una risorsa condivisa. Un processo (o più processi) scrivono un dato nella risorsa (produttori) e un altro processo (o più processi) leggono successivamente dalla risorsa condivisa (consumatori)

# data[].attributes.body
La competizione è una interazione tra processi prevedibile e NON desiderata

Risorse condivise e allocate staticamente:

la competizione avviene al momento dell’accesso alla risorsa: è necessario garantire l’accesso esclusivo (mutua esclusione).

Risorse dedicate e allocate dinamicamente:

la responsabilità di gestione è demandata al gestore e la competizione tra processi avviene al momento della richiesta di utilizzo

# data[].attributes.body
Vediamo nelle diverse situazioni come interagiscono i processi nella situazione di condivisione delle risorse (in situazioni di allocazionestatica e dinamica):

quando competono

quando cooperano

quando interferiscono

# data[].attributes.body
Nel caso di risorse dedicate non è necessario nessun controllo da parte del programmatore per quanto riguarda la sincronizzazione dato che queste sono di utilizzo esclusivo di un singolo processo e vengono assegnate e gestite dal sistema operativo.

Nel caso di risorse condivise il programmatore stabilisce le regole di visibilità e quindi quali processi possono operare sui dati comuni, in quali istanti possono accedere alla risorsa, definendo le modalità di sincronizzazione.

# data[].attributes.headline
Tipologie di allocazione delle risorse nel modello ad ambiente globale

# data[].attributes.subject
Tipologie di allocazione delle risorse nel modello ad ambiente globale

# data[].attributes.body
Per ogni risorsa il relativo gestore definisce istante per istante i processi che hanno il diritto di operare su di essa.

# data[].attributes.body
Un processo che necessita di stampare un documento. Il gestore della risorsa è lo spooler di stampa che all’atto di una richiesta la pone in una coda di attesa e la soddisfa. Quando un processo termina di stampare e lascia libera la stampante.

# data[].attributes.headline
Comunicazione: modelli software e hardware

# data[].attributes.subject
Comunicazione: modelli software e hardware

# data[].attributes.body
Allocazione delle risorse ai processi

Il modello a memoria comune è il solo caso nel quale possono verificarsi problemi per l’accesso
Due (o più) processi che ne potrebbero richiedere l’attribuzione di memoria contemporaneamente
Il sistema operativo associa a ogni risorsa un apposito gestore di risorsa (o allocatore)

L’allocatore ha i seguenti compiti:

deve mantenere aggiornato lo stato di allocazione della risorsa;

deve fornire i meccanismi ai processi che hanno il diritto di utilizzare tale risorsa di accedervi, prenderne possesso, operare su di essa e alla fine del suo utilizzo di “liberarla” per gli altri processi;

deve implementare la strategia di allocazione della risorsa definendo a quale processore per quanto tempo assegnare la risorsa.

# data[].attributes.headline
Modello a memoria comune (ambiente globale, global environment)

# data[].attributes.subject
Modello a memoria comune (ambiente globale, global environment)

# data[].attributes.body
Il modello a memoria comune trova naturale impiego nelle architetture in cui esiste un’unica memoria comune a tutti i processi (o processori)

Ad esempio su macchine monoprocessore con processi multitasking

# data[].attributes.headline
Comunicazione: modelli software e hardware

# data[].attributes.subject
Comunicazione: modelli software e hardware

# data[].attributes.body
Possiamo individuare due modelli di interazione concorrente a prescindere dalla soluzione hardware, cioè sia che stiamo analizzando una architettura distribuita oppure una situazione di multitask su macchina SISM:

modello a memoria comune (ambiente globale, global environment);

modello a scambio di messaggi (ambiente locale, message passing).

# data[].attributes.body
- il modello ad ambiente globale o a memoria condivisa

- il modello ad ambiente locale o a scambio di messaggi

# data[].attributes.headline
LA COMUNICAZIONE TRA PROCESSI (Lezione 3)

# data[].attributes.subject
LA COMUNICAZIONE TRA PROCESSI (Lezione 3)