# data[].attributes.body
In un sistema sequenziale i processi sono eseguiti uno alla volta senza interferenze tra loro.

# data[].attributes.body
Eseguito durante l'esecuzione del processo
Utilizzo della risorsa

1. Controllo di accesso (Locale o remoto)

2. Autenticazione tramite permessi d'accesso

3. Controllo della correttezza delle operazioni

# data[].attributes.body
Per ogni risorsa, l'O.S. mette a disposizione:

1. Gestore della risorsa

2. Protocollo di accesso alla risorsa (procedura con la quale un processo effettua richiesta di una risorsa, la ottiene, la utilizza e la rilascia)

# data[].attributes.body
Assegnazione delle risorse:

1. Allocazione

2. Disponibilità

3. Costo

# data[].attributes.body
Le risorse sia Hardware che Software devono essere assegnate in maniera alternata ai vari processi per permetterne l'evoluzione.

Le risorse che vengono assegante in questo modo sono dette condivise e i processi che ne fanno uso cooperano.

# data[].attributes.body
La molteplicità di una risorsa indica il numero massimo di processi che possono usare quella risorsa contemporaneamente.

Se il numero di processi che la richiedono è maggiore della molteplicità dela risorsa, i processi competono per ottenerla

# data[].attributes.body
Le risorse sono suddivise in classi.
Si possono avere più risorse della stessa classe contemporaneamente.

Il singolo processo può aver bisogno di più risorse della stessa classe.

# data[].attributes.body
lo stato non si modifica durante l'utilizzo

lo stato è facilmente salvato e ripristinato

# data[].attributes.body
sono risorse che una volta assegnate non possono essere sottratte senza provocare danno

# data[].attributes.body
Accesso contemporaneo di più processi

# data[].attributes.body
Accesso mutuamente esclusivo da parte dei processi (1 solo processo alla volta)

# data[].attributes.body
le risorse prerilasciabili possono essere sottratte al processo prima che abbia terminato di utilizzarle

non danneggiano il lavoro del processo

quando la risorsa viene restituita il processo riprende dal punto in cui è stato interrotto

# data[].attributes.body
La risorsa viene assegnata al dispositivo nel momento in cui la richiede e la rilascia quando ha finito

# data[].attributes.body
La risorsa assegnata alla creazione del processo non varia fino alla fine del processo

# data[].attributes.body
Processo evolve anche senza tutte le risorse a disposizione

# data[].attributes.body
Processo necessita di una risorsa, se non gli viene data viene bloccato (sospeso e messo in attesa)

# data[].attributes.body
Richiesta di 2 o più risorse contemporaneamente

# data[].attributes.body
Richiesta di una sola risorsa alla volta

# data[].attributes.body
Questa classificazione può essere divisa in 2 modalità:

# data[].attributes.body
Il cambio di contesto consiste nel cambio tra un processo e l'altro tramite l'utilizzo della cpu. Ciò aggiunge del lavoro computazionale (overhead) che comporta un "costo di gestione" per realizzare il multitasking.

Processi pesanti

processi leggeri : Thread

-Thread : Unità di esecuzione che condivide lo spazio di indirizzamento (DATA + CODICE) con altri Thread ad esso associati.
-Task : Insieme di Thread che si riferiscono allo stesso codice e agli stessi dati.
-Multithreading : Molteplicità di flusso di esecuzione all' interno di un processo pesante.

Tutti i Thread definiti in un processo:

-condividono le risorse del processo
-Risiedono nello stesso spazio di indirizzamento
-Hanno accesso agli stessi dati

Thread caratterizzati da TCB: Thread control block

1. Identificatore di Thread

2. Pc

3. Registri

4. Stato del processo

5. contesto

6. Stack di esecuzione

7. Spazio di memoria statico per le variabili

8. Accesso alla memoria e alle risorse del processo pesante condiviso con gli altri thread

# data[].attributes.body
Condivisione di memoria: Un thread può condividere variabili con altri thread appartenenti allo stesso task.

Minor costo nel cambio di contesto: Il T.C.B di un thread non contiene alcuna informazione relativa al codice e ai dati.

1. Il cambio di contesto fra thread dello stesso task ha un costo inferiore rispetto a quello dei processi.

Minor protezione: I thread appartenenti allo stesso task possono modificare i dati gestiti da altri thread.

# data[].attributes.body
Maggior efficienza: operazioni di cambio contesto, creazione ed estinzione dei Thread sono più  economiche rispetto al caso dei processi.

Maggior possibilità di utilizzo di architettura multiprocessore

# data[].attributes.headline
Rappresentazione di un processo nell'O.S

# data[].attributes.subject
Rappresentazione di un processo nell'O.S

# data[].attributes.body
Il descrittore rappresenta il processo nell'O.S: Process Control Block (P.C.B)

# data[].attributes.body
Al processo possono essere associate delle risorse dell'O.S come file aperti, connessione rete, accesso a dispositivi etc.

# data[].attributes.headline
Analogia con la programmazione concorrente:

# data[].attributes.subject
Analogia con la programmazione concorrente:

# data[].attributes.body
-La presa delle forchette è analoga al blocco delle risorse limitate nella programmazione reale
-Bloccare una risorsa è una tecnica utilizzata per garantire l' accesso da parte di un solo programma o di una sola parte di esso alla volta
-Se un programma richiede una risorsa bloccata, esso dovrà aspettare che essa si sblocchi prima di accedere al suo contenuto
-Se il blocco coinvolge più risorse, è possibile che si verifichi un deadlock

# data[].attributes.body
L' esecuzione parallela può condurre a un' iterazione tra processi quando viene coinvolta una risorsa condivisa

# data[].attributes.body
La concorrenza viene utilizzata molto nei sistemi di elaborazione dove può verificarsi che un insieme di processi o thread vengano eseguiti nello stesso istante

# data[].attributes.body
Si basa sullo studio dei linguaggi, compilatori e applicazioni.

# data[].attributes.body
Non può essere utilizzato per scrivere tutti i tipi di programma. In questo caso è necessario utilizzare il metodo della Programmazione in Parallelo.

# data[].attributes.body
Una possibile soluzione sarebbe quella di:
1) Numerare le forchette e prenderle in modo crescente ed invertire l'ordine delle mani  così che il quinto filosofo possa
accedere alla forchetta 1 ed evitare il deadlock.

# data[].attributes.body
1)Starvation: Che uno dei cinque filosofi muoia di fame
2)DeadLock: Che ogni filosofo tenga in mano una forchetta senza lasciarla e che quindi uno dei filosofi non riesca a prendere entrambe le forchette

# data[].attributes.body
1) 5 filosofi siano seduti ad un tavolo con un piatto e una forchetta alla loro destra e sinistra.
2) Il filosofo può o mangiare con due forchette  o pensare, quindi se non mangia, pensa per forza.
3)Le forchette non possono essere prese in contemporanea dai filosofi.
4) Il filosofo che ha mangiato, può lasciare le forchette a chi non ha ancora mangiato

# data[].attributes.body
Un processo, a differenza del programma che è un'entità passiva, è un'entità attiva. È  rappresentato da:

Codice (txt) del programma eseguito.

Dati, variabili globali/locali.

Program counter (PC).

Registri della CPU.

Stack (Pila lifo).

# data[].attributes.body
Sistemi di macchine virtuali: "Una macchina virtuale per processo" (compito completo)

# data[].attributes.body
Definisce un sistema di macchine virtuali che realizzano delle attività e non un compito completo

# data[].attributes.body
Insieme di programmi sequenziali che possono anche essere eseguiti in parallelo.

# data[].attributes.body
I processi hanno bisogno delle risorse di sistema.
Il computer può essere considerato come un'insieme di risorse

I processi possono entrare in conflitto per aver accesso ad alcune risorse, per esempio:
-RAM;
-STAMPANTE;
-Interfaccia di rete.

# data[].attributes.body
È un flusso di controllo che può essere attivato in parallelo ad altri thread nell'ambito dello stesso processo e quindi nell'esecuzione dello stesso programma.

# data[].attributes.body
Il processo è un'entità autonoma che si presta poco alla scrittura di applicazioni cooperanti

# data[].attributes.body
È una componente (Software o Hardware) indispensabile per il sistema o per l'evoluzione del processo

# data[].attributes.body
Possiamo classificare le risorse in 3 modi:

# data[].attributes.body
Il problema dei filosofi a cena è un esempio per dimostrare il problema di controllo della concorrenza tra processi paralleli in informatica

# data[].attributes.body
Una programmazione viene definita concorrente quando è caratterizzata da programmi o attività eseguiti in parallelo che interagiscono tra loro scambiandosi messaggi oppure accendendo alle stesse strutture di dati condivise