# Sistemi operativi: manuale pratico/Processi/Introduzione

Sistemi operativi: manuale pratico
Copertina Tutti i moduli · Sviluppo
Introduzione ai sistemi operativi
* Funzioni principali dei sistemi operativi
* Classificazione dei sistemi operativi
* File system linux
Processi
* Introduzione
* Segnali
* Inter-process communication
* Thread
* Sincronizzazione
* Shell
Comandi linux
* Comandi shell
* Script di shell
* AWK
* Strumenti di programmazione
* Comandi POSIX
Modifica il sommario
Sistemi operativi: manuale pratico/Processi/Introduzione

# Algoritmo

Un algoritmo e' un procedimento logico che permette la risoluzione di un problema in un numero finito di passi

# Programma

Un programma e' un'entita' passiva (file in memoria) che formalizza un algoritmo attraverso un linguaggio di programmazione

# Processo

Un processo e' un'entita' attiva (operazioni compiute dal processore) che corrisponde ad un'astrazione di un programma in esecuzione; un processo e' composto da:
* codice sorgente
* area dati (variabili statiche globali)
* stack (variabili statiche locali)
* heap (variabili dinamiche)

## Processi sequenziali

I processi sequenziali sono processi in cui ogni operazione viene eseguita dopo il termine di quella precedente (comportamento deterministico)

## Processi concorrenti

I processi concorrenti sono processi in cui le operazioni possono essere eseguite contemporaneamente (comportamento non deterministico) La concorrenza puo' essere: reale (sistemi multiprocessore e multi-core) o fittizia

## Processi automatici

I processi automatici sono processi che vengono eseguiti al bootstrap e terminati allo shut-down (attesa messaggi posta elettronica, controllo virus)

## Processi su richiesta dell'utente

I processi su richiesta dell'utente sono processi la cui esecuzione viene avviata in modo esplicito da parte dell'utente (stampante, browser)

# Stati di un processo

Gli stati di un processo durante la sua esecuzione sono:
* new: il processo viene creato e sottomesso al SO
* running: il processo e' in esecuzione
* ready: il processo e' pronto per l'esecuzione e in attesa di risorse dal processore
* waiting: il processo e' in attesa di risorse da parte del sistema
* terminated: il processo termina e rilascia le risorse utilizzate

## Context switch

Un context switch (cambiamento di contesto) e' uno stato del SO in cui avviene un cambio del processo correntemente in esecuzione sulla CPU; il context switch genera un ritardo temporale tra l'esecuzione di un processo e l'altro

# Process Control Block (PCB)

Il PCB e' un blocco di dati associato ad ogni processo; tali dati riguardano:
* stato del processo
* program counter (indirizzo dell'istruzione successiva)
* registri della CPU
* informazioni per lo scheduling della CPU
* informazioni per la gestione della memoria
* informazioni sulle operazioni di I/O

## Process Identifier (PID)

Il PID e' un intero non negativo (UNIX/linux), generato automaticamente dal SO, che identifica in modo univoco ciascun processo

### PID riservati

I PID riservati dal SO UNIX/linux sono:
* PID $=0$: per lo scheduler dei processi
* PID $=1$: per il processo (invocato al termine del bootstrap) che e' l'antenato di tutti i processi

## Terminazione

Un processo puo' essere terminato in $8$ modi:
* standard
** return dal main
** exit o _exit o _Exit da un suo thread
** un suo thread riceve un segnale di terminazione
* non standard
** abort
** ricevere un segnale di terminazione
** cancellare l'ultimo thread del processo
Al termine di ogni processo il kernel invia al padre un segnale SIGCHLD (Signal Child)

# Scheduler

Lo scheduler e' un programma che stabilisce un ordinamento temporale per l'esecuzione dei processi attraverso algoritmi di scheduling; lo scheduler si occupa di:
* inserisce i PCB dei processi che richiedono una risorsa in una coda (ogni coda si riferisce ad un possibile stato dei processi: coda di ready, coda di running,...)
* preleva dalle code i processi che andranno eseguiti

# Architetture parallele

Esistono diverse architetture parallele:
* Single Instruction Single Data (SISD): in un certo istante una singola istruzione viene eseguita da un singolo processo su un singolo dato (no parallelismo; bit)
* Single Instruction Multpile Data (SIMD): in un certo istante una singola istruzione viene eseguita da piu' processi su piu' dati (dati parallelizzati; numeri)
* Multiple Instruction Single Data (MISD): in un certo istante piu' istruzioni vengono eseguite da piu' processi su un singolo dato
* Multiple Instruction Multiple Data (MIMD): in un certo istante piu' istruzioni vengono eseguite da piu' processi su piu' dati (parallelismo su dati e su istruzioni)

## Speed-up

I vantaggi in termini di tempo ottenibili da architetture concorrenti sono lineari (solo per un numero ridotto di processori)

# Grafo di precedenza

Un grafo di precedenza e' un grafo aciclico diretto in cui:
* i nodi corrispondono a istruzioni o a processi
* gli archi corrispondono a condizioni di precedenza: ogni nodo puo' essere eseguito solo dopo che il padre e' terminato

# Condizioni di Bernstein

Le condizioni di Bernstein sono le condizioni necessarie affinché un algoritmo possa essere scritto in modo concorrente; dati due processi Pi e Pj, essi sono parallelizzabili se valgono le seguenti condizioni (R(P): input del processo P; W(P): output del processo P):
* $R(Pi)\cap W(Pj)=\emptyset$
* $W(Pi)\cap R(Pj)=\emptyset$
* $W(Pi)\cap W(Pj)=\emptyset$