Estratto del documento

Capitolo 1

Servizi di un sistema operativo

Un sistema operativo offre un ambiente in cui eseguire i programmi e fornire servizi. Un primo insieme di servizi offre funzionalità utili all’utente:

  • Interfaccia con l’utente
  • Esecuzione di un programma
  • Operazioni di I/O
  • Gestione del file system
  • Comunicazioni
  • Rilevamento di errori
  • Allocazione delle risorse
  • Logging
  • Protezione e sicurezza

Interfaccia con l’utente

Tutti i sistemi operativi hanno un’interfaccia con l’utente (User Interface). Essa può assumere diverse forme in base al tipo di sistema operativo: interfaccia grafica (GUI) che può essere di tipo touch-screen o no, oppure interfaccia a riga di comando che utilizza comandi di testo e un mezzo per inserirli (un esempio può essere Linux Server).

Esecuzione di un programma

Il sistema deve poter caricare un programma in memoria ed eseguirlo. Il programma deve poter terminare la propria esecuzione in modo normale o anomalo (indicando l’errore).

Operazioni di I/O

Un programma per il suo svolgimento necessita di operazioni di I/O che implicano l’obbligo di gestione di tali risorse da parte del sistema operativo. Per motivi di efficienza, di solito ad un utente non è permesso controllare direttamente i dispositivi di I/O.

Gestione del file system

La gestione del file system riguarda operazioni di scrittura e lettura e organizzazione dei file e i corrispettivi permessi di accesso, concedendo a disposizione dell’utente dei comandi per modificare, cancellare, inserire e cercare dei file all’interno del sistema.

Comunicazione

In molti casi un processo ha necessità di scambiare informazioni con un altro processo. Ciò avviene principalmente in due modi: tra processi in esecuzione sullo stesso calcolatore e tra processi in esecuzione su calcolatori diversi. Per quanto riguarda i processi in esecuzione sullo stesso calcolatore, la soluzione consiste nel definire una memoria condivisa che permette a due o più processi di leggere e scrivere in una porzione di memoria che condividono. Nel secondo caso la comunicazione avviene attraverso lo scambio di messaggi attraverso la rete aprendo delle porte di comunicazione tra le due macchine.

Rilevamento di errori

Un sistema operativo deve essere sempre capace di rilevare gli errori che si verificano all’interno di esso e adottare le soluzioni più opportune al fine di riuscire a risolverli. Nei casi peggiori, un sistema operativo può essere costretto all’arresto.

Allocazione delle risorse

Un sistema operativo dispone di diversi tipi di risorse. All’interno di esso vi sono dei software di scheduling che definiscono l’allocazione ottimale delle risorse attraverso l’utilizzo di vari algoritmi.

Logging

Un amministratore di sistema può necessitare di dati statistici relativi agli accessi che sono avvenuti da parte degli utenti e i programmi che sono stati utilizzati da essi.

Protezione e sicurezza

La sicurezza di un sistema operativo deve cominciare dal momento dell’accesso e deve esistere in ogni parte del sistema operativo. La sicurezza di un sistema operativo è come una catena dove la forza della catena equivale al suo anello più debole. Per protezione, quindi, si intende ciascuna strategia di controllo dell’accesso alle risorse possedute da un elaboratore, da parte di processi o utenti.

Concetto di processo

Un sistema operativo esegue una varietà di programmi in contemporanea. Esistono due tipi di sistemi: sistemi a batch e sistemi time-sharing. I sistemi batch (lotti) eseguono dei job mentre i sistemi time-sharing (partizione del tempo) eseguono programmi utente o task. Persino un sistema monoutente può fare eseguire diversi programmi contemporaneamente. Anche se un utente esegue un solo programma, quel programma al suo interno genera diversi processi che lavorano in contemporanea per far fronte alle richieste dell’utente. Queste attività sono denominate processi. Un tempo un processo veniva definito anche come job.

Il processo

Informalmente un processo viene definito come un programma in esecuzione. È qualcosa di più del codice di un programma, talvolta noto anche come sezione di testo: comprende l’attività corrente, rappresentata dal valore del contatore di programma e dal contenuto dei registri della CPU; normalmente comprende anche la propria pila (stack), contenente a sua volta i dati temporanei, come i parametri di un metodo, gli indirizzi di rientro e le variabili locali, e una sezione di dati contenente le variabili globali. Un processo può includere uno heap, ossia della memoria dinamicamente allocata durante l’esecuzione del processo.

La struttura di un processo è, dunque, suddivisa in più sezioni:

  • Sezione di testo contiene il codice eseguibile
  • Sezione dati contiene le variabili globali
  • Heap allocata dinamicamente durante l’esecuzione del programma
  • Stack temporaneamente utilizzata durante le chiamate di funzioni (parametri, funzioni, indirizzi di ritorno e le variabili locali)

I parametri di sezione di testo e sezione dati non variano mentre l’Heap e Stack possono variare durante l’esecuzione del programma. Sottolineiamo che un programma di per sé non è un processo; un programma è un’entità passiva, come il contenuto di un file memorizzato in un disco, mentre un processo è un’entità attiva, con un contatore di programma che specifica qual è l’istruzione successiva da eseguire e un insieme di risorse associate. Un programma diventa un processo allorquando il file eseguibile che lo contiene è caricato in memoria.

Starvation

Un processo non riesce ad andare avanti nella propria esecuzione, mentre altri processi riescono a continuare la propria esecuzione, difficile da individuare.

Deadlock

Tutti i processi sono bloccati. Nessuno riesce ad avanzare nella propria esecuzione.

Stato del processo

Un processo durante l’esecuzione è soggetto a cambiamenti del suo stato, definito in parte dall’attività corrente del processo stesso. Un processo può trovarsi in uno tra i seguenti stati:

  • Nuovo (new): si crea il processo, una creazione di un processo può essere legata a diversi fattori tra cui: inizializzazione di sistema, richiesta di un utente, iniziazione di un batch job.
  • Esecuzione (Running): un’unità d’elaborazione esegue le istruzioni del relativo programma.
  • Attesa (Waiting): il processo attende che si verifichi qualche evento (come il completamento di un’operazione di I/O o la ricezione di un segnale).
  • Pronto (ready): Il processo attende di essere assegnato a un’unità d’elaborazione.
  • Terminato (Terminated): il processo ha terminato l’esecuzione.

Blocco di controllo del processo (PCB)

Ogni processo è rappresentato nel sistema operativo da un blocco di controllo (process control block, PCB). Un PCB contiene molte informazioni connesse a un processo specifico, tra cui le seguenti:

  • Stato del processo: Lo stato può essere: nuovo, pronto, esecuzione, attesa, arresto e così via.
  • Contatore di programma: Il contatore di programma contiene l’indirizzo della successiva istruzione da eseguire per tale processo.
  • Registri della CPU: I registri variano in numero e tipo secondo l’architettura del calcolatore. Essi comprendono accumulatori, registri d’indice, puntatori alla cima delle strutture a pila (stack pointer), registri d’uso generale e registri contenenti informazioni relative ai codici di condizione. Quando si verifica un’interruzione della CPU, si devono salvare tutte queste informazioni insieme con il contatore di programma, in modo da permettere la corretta esecuzione del processo in un momento successivo.
  • Informazioni sullo scheduling di CPU: Queste informazioni comprendono la priorità del processo, i puntatori alle code di scheduling e tutti gli altri parametri di scheduling.
  • Informazioni sulla gestione della memoria: Queste informazioni possono includere elementi quali il valore dei registri di base e di limite, le tabelle delle pagine o le tabelle dei segmenti, a seconda del sistema di gestione della memoria usato dal sistema operativo.
  • Informazioni di accounting: Queste informazioni comprendono il tempo di uso della CPU e il tempo di utilizzo della stessa, i limiti di tempo, i numeri dei processi e così via.
  • Informazioni sullo stato dell’I/O: Queste informazioni comprendono la lista dei dispositivi di I/O assegnati a un determinato processo, l’elenco dei file aperti, e così via.

In sintesi, il PCB si usa semplicemente come deposito per tutte le informazioni relative ai vari processi.

Thread

Il modello dei processi illustrato fin qui sottintende che un processo è un programma che si esegue seguendo un unico percorso d’esecuzione, detto thread. In molti sistemi operativi moderni si è esteso il concetto di processo introducendo la possibilità d’avere più percorsi d’esecuzione, in modo da permettere che un processo possa svolgere più di un compito alla volta. Questa funzione è particolarmente utile sui sistemi multicore, in cui più thread possono essere eseguiti in parallelo. In un sistema che supporta i thread, il PBC viene esteso per includere informazioni su ogni thread.

Creazione di un processo

Un processo può creare a sua volta altri processi figli, formando un albero di processi. Vi sono vari tipi di criteri di esecuzione e allocazione delle risorse:

Condivisione delle risorse

In generale, per eseguire il proprio compito, un processo necessita di alcune risorse (tempo d’elaborazione, memoria, file, dispositivi di I/O). Quando un processo crea un sottoprocesso, quest’ultimo può essere in grado di ottenere le proprie risorse direttamente dal sistema operativo, oppure può essere vincolato a un sottoinsieme delle risorse del processo genitore. Il processo genitore può avere la necessità di spartire le proprie risorse tra i suoi processi figli, oppure può essere in grado di condividerne alcune, come la memoria o i file, tra più processi figli. Limitando le risorse di un processo figlio a un sottoinsieme di risorse del processo genitore, si può evitare che un processo sovraccarichi il sistema creando troppi sottoprocessi.

Dunque, abbiamo tre casi:

  • Il padre e il figlio condividono le loro rispettive risorse (il figlio è una duplicazione del padre)
  • Il processo figlio dispone di una sotto parte delle risorse disponibili al padre
  • Il processo padre e il processo figlio non condividono le risorse (il processo padre aspetta che il processo figlio termini)

Esecuzione

  • Padre e figlio vengono eseguiti in contemporanea.
  • Il processo padre aspetta che il processo figlio termini la sua esecuzione.

Terminazione di un processo

Condizione di terminazione di un processo:

  • Terminazione uscita normale (normal exit)
  • Terminazione dell’esecuzione con errore (error exit)
  • Terminazione per errore fatale (fatal error)
  • Terminazione per via di un altro processo (killed by another process)

Cambio di contesto (Context switch)

In presenza di una interruzione, il sistema deve salvare il contesto del processo corrente, per poterlo poi ripristinare quando il processo stesso potrà ritornare in esecuzione. In termini generali, si esegue un salvataggio dello stato corrente della CPU, sia che essa esegua in modalità utente o in modalità di sistema; in seguito, si attuerà un corrispondente ripristino dello stato per poter riprendere l’elaborazione dal punto in cui era stata interrotta.

Il passaggio della CPU a un nuovo processo implica la registrazione dello stato del processo vecchio e il caricamento dello stato precedentemente registrato del nuovo processo. Questa procedura è nota col nome di cambio di contesto (context switch). Nell’evenienza di un cambio di contesto, il sistema salva nel suo PCB il contesto del processo uscente, e carica il contesto del processo subentrante, salvato in precedenza. Il cambio di contesto comporta un calo delle prestazioni, perché il sistema esegue solo operazioni volte alla corretta gestione dei processi, e non alla computazione. Il tempo necessario varia da sistema a sistema, dipendendo dalla velocità della memoria, dal numero di registri da copiare, e dall’esistenza di istruzioni macchina appropriate (per esempio, una singola istruzione per caricare o trasferire in memoria tutti i registri). In genere si tratta di qualche millisecondo. La durata del cambio di contesto dipende molto dall’architettura.

Scheduling dei processi

L’obiettivo della multiprogrammazione consiste nel disporre dell’esecuzione contemporanea di alcuni processi in modo da massimizzare l’utilizzo della CPU. L’obiettivo della partizione del tempo è di commutare l’uso della CPU tra i vari processi così frequentemente che gli utenti possano interagire con ciascun programma mentre è in esecuzione. Per raggiungere questi obiettivi, lo scheduler dei processi seleziona un processo da eseguire dall’insieme di quelli disponibili. Ogni core della CPU può eseguire un processo alla volta. Se vi sono più processi che core, i processi in eccesso dovranno attendere fino a quando un core diventa libero. Il numero di processi in memoria in un dato istante è noto come il grado di multiprogrammazione.

Un processo I/O impiega la maggior parte del proprio tempo nell’esecuzione di operazioni di I/O. Un processo CPU bound, invece, richiede operazioni di I/O con poca frequenza e impregna la maggior parte del tempo nella elaborazione.

Code di scheduling

Ogni processo è inserito in una coda di processi, composta da tutti i processi del sistema. I processi presenti in memoria centrale, che sono pronti e nell’attesa d’essere eseguiti, si trovano in una lista detta coda dei processi pronti (ready queue). Questa coda generalmente si memorizza come una lista concatenata: un’intestazione della coda dei processi pronti contiene i puntatori al primo e all’ultimo PCB dell’elenco, e ciascun PCB è esteso con un campo puntatore che indica il successivo processo contenuto nella coda dei processi pronti.

Il sistema operativo ha anche altre code. Quando si assegna la CPU a un processo, quest’ultimo rimane in esecuzione per un certo tempo e prima o poi termina, viene interrotto, oppure si ferma nell’attesa di un evento particolare, come il completamento di una richiesta di I/O.

Poiché i dispositivi periferici sono molto più lenti dei processori, il processo dovrà attendere che l’I/O diventi disponibile. I processi in attesa di un determinato evento vengono collocati in una await queue (coda d’attesa). Esiste anche una terza lista contenente tutti i processi con i rispettivi stati al dato momento chiamata job queue.

Un processo si colloca inizialmente nella ready queue, fino a quando il dispatcher non lo seleziona. Una volta che il processo è assegnato alla CPU ed è nella fase d’esecuzione, si possono verificare i seguenti eventi:

  • Il processo può emettere una richiesta di I/O e quindi essere inserito in una coda di I/O.
  • Il processo può creare un nuovo processo figlio e attendere la terminazione.
  • Il processo può essere rimosso forzatamente dalla CPU a causa di un’interruzione, ed essere reinserito nella coda dei processi pronti.

Nei primi due casi, al completamento della richiesta di I/O o al termine del processo figlio, il processo passa dallo stato d’attesa allo stato pronto ed è nuovamente inserito nella coda dei processi pronti. Un processo continua questo ciclo fino al termine della sua esecuzione: a questo punto viene allontanato da tutte le code, rimosso il suo PCB e revocate le varie risorse.

Processi figli

Durante la propria esecuzione un processo può creare numerosi nuovi processi. Come menzionato in precedenza, il processo creante si chiama processo genitore (o padre) mentre il nuovo processo si chiama processo figlio. Ciascuno di questi nuovi processi può creare a sua volta altri processi, formando un albero di processi. La maggior parte dei sistemi operativi utilizza un indice di riferimento per ogni processo chiamato PID (process identifier).

Scheduling della CPU

Il ruolo dello scheduler della CPU è di selezionare un processo nella coda dei processi pronti e allocarlo a un core della CPU. Lo scheduler definisce anche un intervallo di tempo dopo il quale va a sostituire il processo con un altro processo che deve essere eseguito, in modo da allocare al meglio le risorse. Lo scheduler può adottare vari tipi di politiche al fine di ottimizzare le risorse a disposizione cercando di raggiungere un livello più elevato di multiprogrammazione.

Thread

Definizione thread

Un processo è formato da vari flussi di esecuzione, tali flussi di esecuzione vengono definiti thread. Un thread è l’unità di base d’uso della CPU e comprende un identificatore di thread (ID), un contatore di un programma, un insieme di registri e una pila (stack). Condivide con gli altri thread che appartengono allo stesso processo la sezione del codice, la sezione dei dati e altre risorse di sistema, come i file aperti e i segnali. Un processo tradizionale, chiamato anche processo pesante, è composto da un solo thread. Un processo multithreading è in grado di svolgere più compiti in modo concorrente.

Vantaggi

I vantaggi della programmazione multithread si possono classificare in quattro categorie principali:

  • Tempo di risposta: Rendere multithread un’applicazione interattiva può permettere a un programma di continuare la sua esecuzione.
Anteprima
Vedrai una selezione di 14 pagine su 64
Sistemi operativi Pag. 1 Sistemi operativi Pag. 2
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 6
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 11
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 16
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 21
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 26
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 31
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 36
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 41
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 46
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 51
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 56
Anteprima di 14 pagg. su 64.
Scarica il documento per vederlo tutto.
Sistemi operativi Pag. 61
1 su 64
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher gegeball di informazioni apprese con la frequenza delle lezioni di Sistemi operativi e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Bologna o del prof Sangiorgi Davide.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community