|
Appunti informatica |
|
Visite: 2236 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:La gestione delle memorie di massaLA GESTIONE DELLE MEMORIE DI MASSA Un dato viene rappresentato su un Funzione espoFUNZIONE ESPO Scopo: la funzione calcola ex, nel caso in cui x è negativo Funzione erroriFUNZIONE ERRORI Scopo: la function calcola l'errore relativo e l'errore |
ALLOCATORE DI RISORSE
Nel modello a memoria comune o GLOBALE, e solo in questo caso, si può presentare il problema dei conflitti: due processi potrebbero richiedere l'attribuzione di una singola risorsa comune. Si fa uso allora di un apposito allocatore o gestore di risorsa [1].
L'allocatore della risorsa non è altro che un segmento di codice attraverso il quale 'passano' tutte le richieste fatte dai processi per ottenere l'uso della risorsa. L'allocatore può, secondo il caso, concedere, rifiutare o ritardare l'attribuzione di una risorsa. Esso ha la possibilità di accedere alla struttura dati relativa alla risorsa di cui si è fatta richiesta, e da questa struttura attinge informazioni sul suo stato. Ogni allocatore è, nel modello a memoria globale, a sua volta una risorsa (e come tale è dunque una struttura dati pilotata da un insieme minimo di procedure), allocata staticamente e comune a tutti i processi.
L'allocatore è solitamente composto da due sole procedure, separatamente invocabili dai processi. La prima alloca la risorsa in questione, se ciò è possibile (acquisizione). La seconda la libera per successive richieste di utilizzo (rilascio).
Supponiamo che un processo richieda di scrivere delle informazioni sul disco. I dati che si vuole siano memorizzati in un disco vengono prima registrati in un apposito buffer di memoria che è sempre allocato dinamicamente. Ovviamente il processo non può conoscere la posizione di tale buffer in memoria. Deve quindi invocare l'apposita routine di acquisizione risorse del gestore, la quale consulta la relativa struttura dati e, se la risorsa risulta libera, restituisce l'indirizzo del buffer.
Abbiamo visto che il processo di lettura, elaborazione e scrittura di un N-record fa parte di quella categoria di programmi che non possono essere espressi usando soltanto i costrutti COBEGIN / COEND, per lo meno se il grafo delle precedenze su cui ci si basa è quello di pag. 22. Si nota che ad esempio dal nodo L1, il quale è un nodo cobegin, partono numerosi cammini paralleli terminanti in nodi coend diversi tra loro.
È possibile tuttavia modificare il grafo delle precedenze, in modo che esso possa essere reso solo con le due operazioni summenzionate: lo riportiamo di seguito, unitamente al programma che lo realizza.
Var A, B ,C : T
i :2..N ;
begin
Lettura (A) ; L1
COBEGIN
Lettura (B) ; L2 E1
Elaborazione (A) ;
I : = 2 ;
COEND
C : = A ; A : = B
i : = 2 ;
while i < N do
begin
C : = A ; L3 E2 S1
A : = B ;
I : = 3 ;
COBEGIN
C : = A ; A : = B
Lettura
(B) ;
Elaborazione (A) ;
Stampa (C)
COEND ;
i : = i + 1
end ;
C : = A ;
A : = B ;
COBEGIN
Elaborazione (A) ;
Stampa (C) ;
COEND ;
Stampa (A)
end.
Questa scelta comporta un 'grado di parallelismo' inferiore rispetto alla versione FORK / JOIN. Ad esempio, un cammino unisce i nodi L2 e S1, il che significa che il secondo deve seguire il primo, cosa che invece non risulta necessaria nel grafo di pag.22. Comunque, non è detto che parallelizzando al massimo gli eventi dei processi si ottengano le prestazioni migliori. Ciò dipende anche dal tipo, dal numero e dall'efficienza delle risorse fisiche che la macchina ha a disposizione.
Appunti su: https:wwwappuntimaniacominformaticacomputerallocatore-di-risorse85php, |
|