Estratto del documento

Università degli Studi di Messina

Corso di laurea in Ingegneria Elettronica ed Informatica A.A. 2022/23

Sistemi operativi

Capitolo 1 – Concetti introduttivi

Cos'è il sistema operativo?

Il sistema operativo è un software che sta a stretto contatto con la macchina fisica, e rappresenta un ambiente per l'esecuzione dei programmi applicativi lanciati dall'utente. Difatti, se andiamo a vedere la struttura di un calcolatore, vediamo come tra l'hardware e i programmi applicativi che necessitano delle risorse dell'hardware abbiamo il sistema operativo.

Andiamo quindi a vedere lo schema di un calcolatore moderno: vediamo come il sistema operativo appunto sta nel mezzo tra la macchina fisica e i programmi applicativi (che vengono lanciati dall'utente).

Cosa fa il sistema operativo?

Il sistema operativo sta nel mezzo tra hardware e programmi applicativi perché va a gestire lui stesso le risorse della macchina fisica. Significa che è il sistema operativo ad assegnare le risorse ai programmi applicativi; dunque, i programmi applicativi non sfruttano direttamente la macchina fisica, ma lo sfruttano indirettamente passando dal sistema operativo.

È necessario che il sistema operativo conosca a fondo l'architettura della nostra macchina, sennò non va a gestire bene quelle che sono le risorse hardware (oltre che potrebbero esserci bug in caso di non conoscenza totale della macchina nel quale deve girare il sistema operativo). Non a caso quando si va ad installare Windows si fa la distinzione per i processori con architettura ARM e processori con architettura x86, perché sono sistemi operativi diversi.

Perché è necessario un sistema operativo?

Il sistema operativo è diventato necessario nel tempo perché i calcolatori tendono ad eseguire sempre più programmi applicativi insieme ed in maniera più complessa, e gestire direttamente dal programmatore le risorse del calcolatore non è per nulla semplice.

Il sistema operativo è dunque un modo per rendere più efficiente la gestione delle risorse, cosa che sarebbe molto complessa se fatta da un programmatore (che può anche sbagliare quindi creare bug all'interno del sistema). Inoltre, il sistema operativo è anche un luogo per lo sviluppo software, in quanto se dovessimo andare a programmare direttamente in hardware lo dovremmo fare tramite codice macchina, ben più complesso rispetto ai linguaggi di alto livello.

Ricapitolando quindi, il sistema operativo è un software che sta sempre in esecuzione all'interno della macchina fisica e va a gestire le risorse stesse della macchina fisica nel quale gira. Faremo riferimento al sistema operativo, cioè quel programma che sta sempre in esecuzione nella macchina fisica, definendolo kernel.

Tipi di programmi

  • Programmi di sistema: Sono dei programmi che hanno necessità di conoscere l'architettura del calcolatore, per esempio i compilatori sono dei software che prendono delle istruzioni scritte in un linguaggio e lo traducono in linguaggio macchina (che, come sappiamo, è specifico per la macchina nel quale abbiamo installato il compilatore). Questi programmi di sistema non sono legati al kernel perché non vanno a gestire le risorse del calcolatore. Sono associati al sistema operativo, ma che non fanno necessariamente parte del kernel;
  • Programmi applicativi: I programmi applicativi non devono conoscere l'architettura del calcolatore, e non sono neanche dei programmi che vanno a gestire le risorse del calcolatore; quindi, sono solamente dei programmi che sfruttano le risorse offerte dal sistema operativo per offrire un servizio all'utente. Non sono correlati al funzionamento del sistema.

Negli smartphone troviamo anche il middleware, cioè un ulteriore strato tra il sistema operativo e i programmi applicativi, che serve a fornire a livello applicativo delle caratteristiche per utilizzare meglio le risorse hardware.

Sistema di elaborazione

Vediamo uno schema tipico di un calcolatore: possiamo distinguere gli elementi appartenenti ad un tipico sistema di elaborazione (calcolatore), in tre parti principali:

  • CPU;
  • Memoria;
  • Dispositivi periferici I/O.

Tutte queste componenti sono legate tra loro da un bus di sistema che permette di eseguire comunicazioni tra queste componenti del calcolatore. Per interfacciare i dispositivi I/O con il resto del calcolatore è necessario installare dei driver, cioè delle parti di codice che si integrano nel kernel, e servono per permettere al sistema operativo di andare a gestire le periferiche esterne (quindi i driver che gestiscono le risorse delle periferiche esterne si possono considerare parte integrante del sistema operativo). Ogni driver è specifico per un singolo dispositivo. I dati inviati dalle periferiche vengono inviati al controllore della periferica che regola lo scambio dei dati con il driver (cioè, il sistema operativo), andando ad utilizzare il bus di sistema.

Gestione delle interruzioni

La CPU e i controllori possono eseguire delle operazioni in parallelo, però quando il controllore finisce, deve trasferire i dati dal controllore alla CPU andando ad occupare il bus. La CPU deve essere avvertita dello scambio e, per essere avvertita, sfrutta i segnali di interruzione (interrupt). I segnali di interruzione servono quindi per andare a gestire gli scambi, quindi, fanno parte della gestione interna del calcolatore. La CPU non va a gestire l'interruzione mentre esegue un'istruzione, perché ovviamente lasciare un'istruzione a metà comporterebbe dei problemi, ma gestisce l'interruzione dopo aver finito un'istruzione e prima di cominciarne un'altra, quindi, va a controllare il flag di interruzione tra un'istruzione ed un'altra.

Ci sono due tipi di interruzioni:

  • Interruzione mascherabile: si tratta di un tipo di interruzioni che non devono essere gestite immediatamente dalla CPU, dunque, possono essere gestite successivamente;
  • Interruzione non mascherabile: Questo tipo di interruzioni deve essere gestito urgentemente dalla CPU appena finisce l'istruzione che sta eseguendo.

Quindi, le interruzioni non vanno a notificare esclusivamente errori nel calcolatore, ma servono per la normale gestione delle routine delle richieste delle periferiche I/O. Ogni tipo di segnalazione viene identificata tramite un indice. Sostanzialmente si ha una tabella, e ad ogni indice della tabella corrisponde un tipo di segnalazione. La segnalazione comporta l'esecuzione di una parte di codice che è proprio specifica per la segnalazione. Difatti, la tabella non è altro che un array di puntatori, dove il puntatore della tabella punta all'indirizzo della prima istruzione da eseguire per la gestione dell'interrupt. In memoria centrale avremo salvati 256 indirizzi di memoria (ovviamente gli indici dell'array non vanno salvati in memoria).

Struttura della memoria

Possiamo distinguere due tipi di memoria:

  • Memoria centrale: La memoria centrale è un tipo di memoria volatile (quando non è alimentata non memorizza nulla ed elimina tutto quello che ha memorizzato fino a quel momento), e ad accesso casuale (a qualunque zona della memoria vogliamo accedere ci impieghiamo lo stesso tempo). La memoria centrale è quella a cui fa riferimento il processore. I computer utilizzano una memoria di sola lettura elettricamente cancellabile e programmabile (EEPROM) e altre forme di archiviazione del firmware che vengono riscritte raramente e che non sono volatili.
  • Memoria secondaria: La memoria secondaria è un tipo di memoria non volatile (mantiene dati in memoria anche quando non è alimentata), ma generalmente è un tipo di memoria ad accesso sequenziale. È all'interno della memoria secondaria che troviamo tutti i dati del nostro calcolatore che poi vengono caricati in memoria centrale quando vengono eseguiti dal calcolatore.

Per l'accesso alla memoria secondaria il processore si interfaccia con il controllore della memoria secondaria, mandando una richiesta I/O, e richiedendo che blocchi di memoria vengono inviati alla memoria principale, in modo tale che il processore possa prelevare tali blocchi di memoria e poter operare su di essi. Per evitare che troppo spesso avvenga la richiesta di blocchi di memoria da parte della CPU, il controllore della memoria secondaria può utilizzare una tecnica chiamata DMA (Direct Access Memory) che permette lo scambio continuo di blocchi di memoria dalla memoria secondaria alla memoria primaria (principale), senza che la CPU si scomodi a richiedere sempre lei stessa i blocchi di dati al controllore della memoria secondaria, e infatti risulta anche essere una tecnica che migliora l'efficienza stessa dello scambio di dati tra la memoria secondaria e la principale.

Esecuzione di un'istruzione

Per l'esecuzione di un'istruzione abbiamo i seguenti passaggi:

  • Fetch: viene prelevata dalla memoria centrale l'istruzione all'indirizzo memorizzato nel PC;
  • Decode: interpretazione dell'istruzione con eventuale prelievo di argomenti dalla memoria centrale. Il PC è automaticamente aggiornato all'indirizzo dell'istruzione successiva;
  • Execute: esecuzione della istruzione che coinvolge la ALU e i registri della CPU.

Architettura degli elaboratori

I calcolatori nel tempo si sono andati ad evolvere, e ad oggi possiamo distinguere due tipi di architetture, classificate in base al numero di unità elaborative presenti nel calcolatore. Abbiamo dunque sistemi:

  • Monoprocessore a singola unità di elaborazione: Sono dei sistemi che hanno un singolo processore che all'interno hanno una sola CPU quindi una sola unità di elaborazione;
  • Multiprocessore con più unità di elaborazione: Questi sistemi con questo tipo di architettura sono quelli che si sono evoluti nel tempo, difatti per le macchine generiche come i calcolatori l'architettura è sempre di questo tipo.

Possiamo trovare varie combinazioni di sistemi multiprocessore, per esempio un calcolatore che ha più processori ognuno con una singola CPU, oppure un calcolatore che ha un singolo processore con più CPU al suo interno. In ogni caso avere N unità di elaborazione non significa che la potenza di calcolo è N volte maggiore, perché ogni CPU potrebbe avere la necessità di accedere alla memoria centrale, ed essendo la memoria centrale unica c'è il problema della contesa per l'accesso alla memoria. Per questo motivo si cerca di scalare la memoria, cioè, fornire delle memorie locali alle singole CPU in modo tale che esse possano accedere a quell'area di memoria senza doversi preoccupare di una possibile contesa con altre CPU.

I componenti di un sistema di elaborazione

  • CPU: componente hardware che esegue le istruzioni.
  • Processore: chip che contiene una o più CPU.
  • Unità di calcolo (core): unità di elaborazione di base della CPU.
  • Multicore: che include più unità di calcolo sulla stessa CPU.
  • Multiprocessore: che include più processori.

Attività del sistema operativo

All'accensione il calcolatore esegue un programma chiamato programma d'avviamento (bootstrap program), che va a caricare il loader, un ulteriore programma, che va a caricare il sistema operativo (kernel).

Bootstrap program -> loader -> kernel

Dopo il caricamento del kernel il calcolatore rimane fermo fin quando non arriva un input dall'utente, input che viene gestito dal calcolatore come se fosse un'interruzione. Il sistema deve assicurare la protezione del dispositivo, per questo motivo non tutte le istruzioni che esegue l'utente sono consentite perché, se facesse un'operazione sbagliata potrebbe portare al crash del sistema. Per questo motivo all'interno di un calcolatore possiamo distinguere due tipi di modalità, che permettono di eseguire istruzioni differenti:

  • Modalità privilegiata (modalità kernel): In questa modalità possono essere eseguite tutte le istruzioni presenti nell'instruction set dell'hardware;
  • Modalità utente: In questa modalità possono essere eseguite solo un sottoinsieme delle istruzioni dell'instruction set, questo perché si vanno ad escludere tutte quelle istruzioni che possono rappresentare un pericolo per il sistema. Infatti, per eseguire le istruzioni privilegiate bisogna essere nella modalità privilegiata.

Per indicare quale sia la modalità attiva, l'architettura della CPU deve essere dotata di un bit, chiamato appunto bit di modalità:

  • Se il bit è 0 allora la modalità impostata è la modalità kernel;
  • Se il bit è 1 allora la modalità impostata è la modalità utente.

Ovviamente è necessario passare dalla modalità utente a quella privilegiata perché i programmi devono andare ad utilizzare le risorse hardware, quindi, devono andare a richiedere queste risorse al sistema operativo che gli fornirà le risorse necessarie. Per richiedere le risorse si va ad utilizzare la chiamata di sistema, cioè, il programma fa una chiamata di sistema ed il sistema operativo fornisce il servizio richiesto dal programma. La necessità delle due modalità è sempre la stessa: operare a livello hardware, ed in questo caso andare ad assegnare delle risorse hardware ad un programma è molto complesso, quindi lo fa il sistema operativo.

Di tanto in tanto un timer invia un interrupt alla CPU ad intervalli di tempo ed assicura che il sistema operativo mantenga il controllo della CPU, come nel caso di un ciclo infinito; esso può essere interrotto da un interrupt inviato da un timer.

Sicurezza e protezione

Per quanto riguarda la sicurezza quello che possiamo dire è che il sistema deve essere in grado di distinguere tutti i possibili utenti della macchina e non permettere l'accesso a file ad utenti non autorizzati. Per questo motivo viene usato un identificatore utente ID, che permette di discriminare l'accesso ad un file.

Mappe hash

Una funzione hash è una funzione con un dominio che può essere di qualunque natura, e la funzione ritorna un valore che è sicuramente naturale, che rappresenta l'indice della posizione della chiave nel quale l'elemento è stato salvato. La mappa hash ci permette di avere un costo unitario nella ricerca, come se stessimo prelevando un elemento di un array, che sappiamo essere ad accesso casuale.

Capitolo 2 – Chiamate di sistema e struttura di un sistema operativo

Servizi di un sistema operativo

Un sistema operativo deve fornire molti servizi, tra cui il principale quello di fornire un ambiente per l'esecuzione dei programmi, poiché senza di esso andare ad eseguire i programmi risulterebbe troppo complesso poiché la gestione dell'hardware dovrebbe essere a carico dell'utente. Il sistema operativo offre dei servizi che vengono erogati ai programmi quando i programmi li richiedono tramite chiamate di sistema.

Le interfacce ci permettono di andare ad interagire con il sistema operativo; quindi, ci permettono di andare a lanciare programmi che richiedono un servizio dal sistema operativo. I tipi di interfacce sono:

  • Interfaccia a riga di comando:
    • L'interfaccia a riga di comando è una modalità di interazione testuale con un computer o un software.
    • Gli utenti comunicano con il sistema inserendo comandi in una riga di testo, solitamente tramite una shell o una console.
    • Questo tipo di interfaccia è molto potente e flessibile, ma richiede una conoscenza specifica dei comandi e dei parametri.
  • Interfaccia grafica GUI (graphic user interface):
    • Le interfacce grafiche utente (GUI) forniscono un'interazione visuale con il computer o il software.
    • Utilizzano elementi visivi come finestre, icone, menu a discesa e pulsanti per semplificare l'interazione dell'utente.
    • Le GUI sono comunemente utilizzate in sistemi operativi come Windows, macOS e molte applicazioni desktop.
  • Interfaccia touch-screen:
    • Questa è una variante delle GUI in cui l'utente interagisce con il dispositivo toccando direttamente lo schermo, senza l'uso di un mouse o di una tastiera.
    • Le interfacce touch-screen sono spesso utilizzate su dispositivi mobili, tablet, e kioschi interattivi.
    • Consentono un'interazione intuitiva e diretta, in quanto l'utente può toccare direttamente gli elementi sullo schermo.

Chiamate di sistema

Per ogni chiamata di sistema si va ad eseguire una specifica routine, dunque, ogni chiamata di sistema può essere vista come un'interfaccia per un servizio. Ad esempio, le funzioni in C hanno al loro interno delle chiamate di sistema, per esempio l'implementazione della printf sicuramente avrà delle chiamate di sistema all'interno che permettono di interagire con il sistema operativo. Nella maggior parte dei casi vi si accede dai programmi attraverso Application Program Interface (API) piuttosto che usare le chiamate di sistema direttamente proprio perché quello che ci interessa è andare a passare i parametri ed ottenere parametri di ritorno.

Vengono usate le API piuttosto che le chiamate di sistema perché:

  • Le chiamate di sistema (system call) costituiscono un'interfaccia per i servizi resi disponibili dal sistema operativo.
  • API specifica un insieme di funzioni a disposizione del programmatore e dettaglia i parametri necessari all'invocazione di queste funzioni, insieme ai valori restituiti.

Un'Application Programming Interface (API) è un insieme di regole e protocolli che consentono a diversi software o componenti di comunicare tra loro. Un'API definisce i metodi e le strutture dati che possono essere utilizzati da sviluppatori di software per interagire con un'applicazione, un servizio o un sistema operativo.

Anteprima
Vedrai una selezione di 13 pagine su 56
Sistemi operativi - Appunti Pag. 1 Sistemi operativi - Appunti Pag. 2
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 6
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 11
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 16
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 21
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 26
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 31
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 36
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 41
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 46
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 51
Anteprima di 13 pagg. su 56.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 56
1 su 56
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 agnese.pino 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 Messina o del prof Scarpa Marco.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community