# data[].attributes.body
I processi indipendenti possono aver bisogno di
sincronizzarsi tra loro in quanto potrebbero ostacolarsi
a vicenda utilizzando contemporaneamente delle
risorse provocando situazioni di blocco individuale o di
starvation cioè morte per inedia o dead-lock, cioè
blocco simultaneo di tutti i processi.

# data[].attributes.body
Oltre alla cooperazione esiste un’altra forma di
interazione tra processi: due (o più) processi possono
ostacolarsi a vicenda compromettendo il buon fine
delle loro elaborazioni, in tal caso si parla di
competizione.

È il caso in cui entrambi i processi competono per
utilizzare la medesima risorsa, che magari è in
quantità limitata nel sistema.

Questo tipo di interazione può portare a situazioni
indesiderate per uno o per entrambi i processi

# data[].attributes.body
La coda a priorità maggiore ha il quanto di tempo di
CPU minore

Un processo entra nella coda dei processi pronti con la
priorità alta ma se non termina alla sua prima
esecuzione , esso ritorna nella coda dei pronti a
priorità minore

# data[].attributes.body
É tipicamente usato in sistemi Time Sharing:

La ready queue viene gestita come una coda FCFS

ad ogni processo viene allocata la CPU per un
intervallo di tempo costante (time slice o,
quanto di tempo).

# data[].attributes.body
Shortest Job First
Per risolvere i problemi dell’algoritmo FCFS:

per ogni processo nella ready queue, viene stimata la lunghezza del
prossimo CPU-burst e viene schedulato il processo con il CPU
burst più piccolo

# data[].attributes.body
First-Come-First-Served: la coda dei processi pronti viene
gestita in modo FIFO:

• i processi sono schedulati secondo l’ordine di arrivo nella
coda

• algoritmo non pre-emptive (Batch)

# data[].attributes.body
Priorità: possono essere definite:

- Internamente: il S.O. attribuisce ad ogni processo una
priorità in base a politiche interne

-Esternamente: criteri esterni al S.O.
.
La priorità viene assegnata ai processi dallo stesso sistema
operativo, in base a criteri legati al tipo di processo e
all’utente che lo ha mandato in esecuzione.
Le priorità possono essere costanti o variare dinamicamente.

# data[].attributes.body
- First Come First Served (FCFS)

- Shortest Job First (SJF)

- Round Robin

- Priority Scheduling

- Multilevel Feedback Queues (MLFQ)

# data[].attributes.body
- Utilizzo della CPU: massimizzare la percentuale
media di utilizzo della CPU nell’unità di tempo.

- Throughput: massimizzare il numero di processi
completati nell’unità di tempo.

- Tempo di Attesa: minimizzare il tempo totale
trascorso nella ready queue da un processo.

# data[].attributes.body
Scheduler = POLITICHE

Dispatcher = MECCANISMI

# data[].attributes.body
Il processo che viene sospeso dovrà successivamente essere
ripristinato senza che rimanga traccia di quanto è successo.

Quando la CPU riattiva un processo che è stato sospeso, per
prima cosa analizza il suo PCB per individuare il suo stack pointer
e quindi da lì recupererà i valori dei registri e del program counter
da ripristinare per poter riprendere l’esecuzione proprio
dall’istruzione che era stata sospesa.

Le operazioni eseguite per il cambio di contesto hanno
generalmente la durata dell’ordine dei millisecondi.

# data[].attributes.body
Questi sono i campi contenuti nel descrittore del
processo (PCB):

identificatore unico (PID);

stato corrente;

program counter;

Registri;

priorità;

puntatori alla memoria del processo;

puntatori alle risorse allocate al processo.

# data[].attributes.body
- Il codice che è composto dalle istruzioni.

- I dati del programma, a loro volta suddivisi in:

– variabili globali, allocate in RAM nell’area dati globali;

– variabili locali e non locali delle procedure del programma,
memorizzate in uno stack;

– variabili temporanee (tra cui ricordiamo il program counter)
caricate nei registri del processore;

– variabili allocate dinamicamente durante l’esecuzione,
memorizzate in uno heap.

# data[].attributes.body
Multitasking: è l'esecuzione di programmi indipendenti sulla CPU e sul processore di I/O.

Multiprocessing: è la multiprogrammazione estesa a macchine dotati di più CPU e processori di I/O.

# data[].attributes.body
Programma: è l’insieme di
istruzioni, memorizzate su memoria di massa. E un’entità statica.

Il processo è: un’istanza di un
programma in evoluzione, cioè che è eseguito
dal processore, quindi deve essere residente
in memoria RAM. E' un’entità dinamica.