I processi
Che cos’è un processo? Per processo si intende un'istanza di un programma in esecuzione in modo sequenziale. Cioè un'attività controllata da un programma che si svolge su un processore in genere sotto la gestione o supervisione del rispettivo sistema operativo.
Cooperazione e competizione tra processi. Due o più processi possono interagire fra loro secondo due modalità: cooperazione e competizione due processi cooperano se sono logicamente connessi e ciascuno ha bisogno dell’altro per operare due processi competono se potrebbero evolvere indipendentemente, ma entrano in conflitto sulla ripartizione di risorse
Stati di un processo Gli stati in cui un processo si può trovare sono: Nuovo : stato transitorio durante il quale il processo viene caricato in memoria e il SO inizializza i dati che lo rappresentano; esecuzione : il processo ha il controllo di un processore; pronto : il processo è pronto ad essere eseguito, ed è in attesa che lo scheduler lo metta in esecuzione; In attesa: il processo ha eseguito una chiamata di sistema ed è fermo in attesa del risultato; Terminazione: stato transitorio relativo alla fase di terminazione e deallocazione del processo dalla memoria;
Grafico:
Proprietà dei processi Esistono due aspetti differenti di un processo: Il processo è un’unità di allocazione di risorse: -memoria per l’immagine del processo -controllo su altre risorse esterne (dispositivi I/O, file, …) Il processo è un’unità di esecuzione: -identifica un flusso di esecuzione attraverso uno o più programmi - l’esecuzione può essere intervallata / sincronizzata con quella di altri processi -un processo ha uno stato di esecuzione e alcuni attributi che ne determinano le modalità di esecuzione (es. priorità)
Proprietà dei processi Per “alleggerire” la gestione dei processi separiamo questi due aspetti di un processo: L’unità di esecuzione è identificata dal concetto di Thread. L’unità di allocazione delle risorse è identificata dal concetto di processo. Con i thread si introduce una struttura di esecuzione più articolata, basata su: - condivisione di risorse; - differenziazione del flusso di esecuzione all’interno di un unico processo;
LE RISORSE Abbiamo detto che i processi sono programmi in evoluzione e per poter evolvere hanno bisogno delle risorse del sistema di elaborazione. Un RISORSA è tutto ciò che serve per l’avanzamento di un processo. Essa può essere sia hardware che software (ad esempio un file, una cartella, la stampante). Le risorse possono essere suddivise in classi e le risorse che fanno parte della stessa classe vengono chiamate ISTANZA DI UNA CLASSE mentre il numero di risorse che contiene quella classe viene detto MOLTEPLICITÀ DELLA RISORSA.
Thread Un thread è una suddivisione di un processo in due o più filoni o sottoprocessi, che vengono eseguiti concorrentemente da un sistema di elaborazione monoprocessore o multiprocessore . Un thread è una unità di impiego di CPU all’interno di un processo. Un processo può contenere più thread, ciascuno dei quali evolve in modo logicamente separato dagli altri thread.
SINGLE TREADING VS MULTITHREADING In base alla capacità di un sistema di gestire a livello KERNEL i thread, distinguiamo quattro possibili scenari: Singolo processo e thread singolo ( Es. MS-DOS un solo processo utente e un unico thread); Singolo processo e thread multiplo per processo( Es. UNIX più processi utente ciascuno con un unico thread); Processo multiplo e thread singolo per processo( Es. Java un solo processo, più thread); Processo multiplo e thread multiplo per processo(Es. Linux, Windows, Solaris più processi utente ciascuno con più thread);
SINGLE TREADING VS MULTITHREADING
Programma sequenziale e concorrente PROGRAMMA SEQUENZIALE: specifica l'esecuzione sequenziale di una lista di istruzioni. La sua esecuzione e' un processo. PROGRAMMA CONCORRENTE: specifica due o più programmi sequenziali che possono essere eseguiti concorrentemente come processi paralleli.
Cos’è il fork? Un fork , indica lo sviluppo di un nuovo progetto software che parte dal codice sorgente di un altro già esistente. Il fork() consente a un processo di generare un processo figlio: - Padre e figlio condividono lo stesso codice; - Il figlio eredita una copia dei dati (di utente e di kernel) del padre;
Che cos’è il processo padre? Un processo padre è un processo che ha creato uno o più processi figli. Nei sistemi operativi ogni processo è creato quando un altro processo esegue la chiamata di sistema fork(). Il processo che invoca fork() è detto processo padre, mentre il nuovo processo è detto processo figlio. Ciascun processo ha un processo padre, e può avere zero o più processi figli.
Che cos’è il processo figlio? Un processo figlio è un processo che è stato creato da un altro processo, detto processo padre. Nei sistemi operativi un processo figlio è creato (usando la chiamata di sistema fork) come un duplicato del processo padre, da cui eredita una copia di molti degli attributi. Ciò permette di organizzare i processi del sistema in una gerarchia, in cui ogni processo ha un processo padre o più processi figli.
Modello a memoria comune Il sistema è visto come un insieme: Processi Oggetti(risorse) O1 , O4 risorse private O2 , O3 risorse comuni
Il modello a memoria comune rappresenta la naturale astrazione del funzionamento di un sistema in multiprogrammazione costituito da uno o più processori che hanno accesso ad una memoria comune Ad ogni processore può essere associata una memoria privata, ma ogni interazione avviene tramite oggetti contenuti nella memoria comune.
Il modello a scambio di messaggio Ciascun processo evolve in un proprio ambiente che non può essere modificato direttamente da altri processi. Quindi non esiste memoria condivisa e le risorse sono tutte private. Pertanto: non esiste la competizione per l’uso delle risorse non esistendo risorse comuni la cooperazione si realizza mediante lo scambio diretto di messaggi per mezzo di primitive che il S.O. deve rendere disponibili. Il naturale supporto fisico al modello sono i sistemi di elaborazione con architettura distribuita
Mutua esclusione Il problema della mutua esclusione nasce quando più di un processo alla volta può aver accesso a variabili comuni. La regola di mutua esclusione impone che le operazioni con le quali i processi accedono alle variabili comuni non si sovrappongano nel tempo. Nessun vincolo è imposto sull’ordine con il quale le operazioni sulle variabili vengono eseguite.
Affinché sia possibile la mutua esclusione occorrono sei condizioni: un solo processo o thread accede alla regione critica; nessun processo può bloccarsi in sezione critica; evitare deadlock e starvation; nessuna assunzione sulla velocità dei processi; nessun processo fuori dalla sezione critica può impedire ad un altro di entrare; accesso alla sezione critica consentito in un tempo definito.
Startvation e Deadlock Se si scrive un programma in cui diversi thread concorrenti sono in competizione per le risorse, è necessario prendere le dovute precauzioni per garantire l'equità. Un sistema è giusto quando ogni thread diventa abbastanza l'accesso alle risorse limitate a fare progressi ragionevoli. Un sistema equo impedisce lo startvation e deadlock. Lo startvation si verifica quando uno o più thread nel programma sono bloccati di avere accesso ad una risorsa e, di conseguenza, non può fare progressi. Il Deadlock , si verifica quando due o più thread sono in attesa di una condizione che non può essere soddisfatta. Il Deadlock spesso si verifica quando due o più thread sono in attesa di fare qualcosa.
Fine