Estratto del documento

Sistemi operativi

Il sistema operativo è un programma che agisce da intermediario tra gli utenti e l'hardware di un computer, allo scopo di eseguire i programmi utente e aiutare gli utenti a risolvere i loro problemi tramite il computer, rendere i computer convenienti da usare e usare l'hardware dei computer in modo efficiente. Esistono altre definizioni importanti di sistema operativo, fra queste ci sono:

  • Allocatore di risorse: deve gestire tutte le risorse e tutte le richieste in conflitto tra loro in modo da garantire un uso efficiente ed equo delle risorse.
  • Programma di controllo: controlla l'esecuzione dei programmi in modo prevenire errori nell'uso del computer.

Parte importante di un sistema operativo è il kernel, ovvero quella parte sempre in esecuzione nel computer. Tutto ciò che non è kernel sarà o un programma di sistema o un programma applicativo (es. deframmentazione disco). Il sistema operativo si usa per caricare all'accensione del computer o al suo riavvio il programma di bootstrap, tipicamente memorizzato in una ROM o EPROM in modo tale che non venga cancellato.

Sistemi mainframe

I sistemi mainframe sono i primi computer in cui sono apparsi i sistemi operativi. Un mainframe è un computer molto grande al quale si può accedere attraverso un terminale. Una volta inserito, tale terminale sottometterà un programma (job) che sarà successivamente eseguito dallo stesso computer e che darà infine una risposta.

Esso potrà svolgere solo un programma per volta in modo automatico e sequenziale e ciò è chiamato “automatic job sequencing”, vi sarà cioè un trasferimento automatico del controllo da un job all'altro. Il programma che svolge questa funzione è chiamato monitor residente ed è definibile come un primo sistema operativo rudimentale. Le sue principali funzioni sono:

  • Controllo iniziale nel monitor
  • Controlla il trasferimento dei job
  • Quando un job è completato il controllo passa al monitor

Se potessimo guardare la memoria RAM di un mainframe avrà questa forma: E questo è chiamato memoria in un sistema batch semplice, dove il termine batch indica un insieme di job. Nel tempo però ci si è accorti che questo tipo di sistema non era né conveniente né funzionale, perciò si è passati ad un sistema batch multiprogrammato in cui numerosi programmi (job pool) sono tenuti in memoria contemporaneamente e la CPU è assegnata a loro di volta in volta. Quindi, le caratteristiche importanti da avere erano: routine di I/O fornite dal memory management, ovvero il sistema deve allocare la memoria a più job; CPU scheduling, ovvero il sistema deve scegliere tra più job pronti ad essere eseguiti; allocazione dei devices ai job.

Sistemi time-sharing

I sistemi che usiamo oggi sono a condivisione di tempo, questo è un approccio concorrente del sistema operativo all'uso delle risorse di processamento attraverso il quale l'esecuzione o attività della CPU viene suddivisa in quanti o intervalli temporali da assegnare di volta in volta tra diversi programmi (jobs) che sono tenuti in memoria. Tale programma caricato in memoria e in esecuzione è detto processo (di elaborazione).

Il time-sharing è l'estensione logica della multiprogrammazione e non implica necessariamente che il sistema sia multiutente, ma se lo è allora più utenti possono, con i loro programmi in esecuzione, interagire con il sistema centralizzato ciascuno con un proprio terminale sempre in timesharing. In questo caso la CPU del computer centrale viene utilizzata per rispondere alle richieste dei singoli utenti, passando rapidamente da uno all'altro dando così l'impressione ad ognuno di avere a disposizione il computer centrale interamente per sé, ovvero dando l'impressione di processamento multiplo in parallelo di più processi verso più utenti.

Un aspetto fondamentale di questi sistemi è quello di avere un “tempo di risposta”, ovvero il tempo che intercorre tra quando si chiede al sistema di eseguire un’operazione a quando l’utente vede che questo inizi effettivamente a farla, molto basso; ciò non avviene nei sistemi mainframe, il cui tempo di risposta è praticamente irrilevante per i suoi scopi.

Moderno sistema di calcolo

I moderni sistemi di calcolo sono composti da un insieme di processori (CPU) e controllori di dispositivi (device controllers) connessi attraverso un bus che fornisce l'accesso ad una memoria condivisa. Dalla figura sottostante si può capire meglio la loro composizione. Tra le caratteristiche più importanti troviamo:

  • I dispositivi di I/O e la CPU possono eseguire operazioni in modo concorrente
  • Ogni device controller è responsabile di un particolare tipo di dispositivo
  • Ogni device controller ha un buffer locale. Il buffering è quella operazione che serve per “disaccoppiare la velocità di produzione dei dati di un componente dalla velocità di consumo di quegli stessi dati di un altro componente”. In pratica, il buffer è una zona di memoria usata temporaneamente per l'entrata o l'uscita dei dati, oppure per velocizzare l'esecuzione di alcune operazioni. Esempio: se la CPU, che lavora ad alta velocità, deve spedire alcuni dati alla stampante, la quale supporta una velocità molto minore, scriverà tali dati nel buffer di memoria, potendo così continuare a lavorare ad un altro processo mentre la stampante può stampare il dato leggendolo dal buffer e non interrompendo la CPU. Viceversa, se la CPU è impegnata in lavori gravosi, potrebbe "perdere" alcuni input se non fossero salvati in un buffer e poi prelevati dal processore.
  • La CPU muove i dati dalla/alla memoria centrale ai/dai buffer locali
  • L’I/O si effettua dal dispositivo al buffer locale del controller
  • Il device controller informa la CPU che ha completato la sua operazione. Per farlo può o usare il metodo del “polling”, ovvero chiedere continuamente alla CPU se ha finito di eseguire la sua operazione (metodo inefficiente), oppure generando una interruzione (interrupt).

Gestione degli interrupt

L’interrupt è un meccanismo asincrono fondamentale dei sistemi operativi moderni, tanto da dire che essi siano guidati da questi stessi interrupt (interrupt driven). La sua funzione consiste semplicemente in un segnale che il dispositivo invia alla CPU per informarlo che ha completato l’operazione di I/O. Come fa un sistema operativo a capire cosa fare quando gli arriva un interrupt? L’interrupt ha un codice e il S.O. deve guardare una tabella chiamata vettore degli interrupt (interrupt vector) che indica cosa deve fare quando arriva quel determinato codice. Per indicare la procedura che si esegue quando si verifica un interrupt si parla di routine di servizio dell’interrupt (interrupt service routine).

In pratica il vettore degli interrupt è un array, presente nella memoria RAM, di lunghezza n, dove n è il numero dei possibili interrupt che si possono generare nel sistema. Quando arriva l’interrupt i-esimo, si va nella cella i-esima del interrupts vector e si cerca l’indirizzo di base della routine che bisogna eseguire in risposta a quell’interrupt. Dopo aver fatto ciò, il sistema operativo conserva lo stato della CPU a seguito di un interrupt memorizzando i valori dei registri e del program counter. Durante la gestione di un interrupt, altri interrupt in arrivo sono disabilitati per evitare la perdita dell’interrupt corrente. Si definisce “trap” un interrupt software generato da un errore o da una particolare richiesta dell’utente. In un diagramma il suo funzionamento si riassume in questo modo: Dalla figura si evince che la CPU o esegue processi o esegue interrupt.

Due metodi di gestione dell'I/O

Esistono due metodi di gestione dell’I/O:

  • Sincrono: Dopo l’avvio di un’operazione di I/O, il controllo ritorna al programma utente solo dopo il completamento dell’I/O (non utilizzato spesso).
    • Istruzione wait che sospende il processo fino al prossimo interrupt
    • Ciclo di attesa
    • Al più una richiesta di I/O per volta (è una limitazione)
  • Asincrono: Dopo l’avvio di un’operazione di I/O, il controllo ritorna al programma utente senza attendere il completamento dell’I/O
    • System call – richiesta al sistema operativo per attendere il completamento dell’operazione di I/O
    • Tabella di stato dei dispositivi contiene elementi per ogni dispositivo di I/O che indica il suo tipo, indirizzo e stato
    • Il sistema operativo accede alla tabella di stato dei dispositivi per determinare lo stato del dispositivo e modificare la sua descrizione

In generale, conviene usare il metodo asincrono quando si ha qualche altra cosa da fare tra l’inizio dell’I/O e il suo completamento (es. si possono fare altre cose quando mandiamo un processo in stampa, perché aspettare che si completi).

Direct memory access (DMA)

Noi sappiamo che il bus è quel componente di trasmissione che permette di spostare i dati dai dispositivi alla memoria RAM con la mediazione della CPU. Questo modello però ha dei limiti, per cui ne è stato introdotto uno nuovo chiamato “Direct Memory Access” (DMA). Questo metodo permette di trasferire dati dal buffer del dispositivo direttamente in RAM senza l’intermediazione della CPU, permettendo quindi, allo stesso tempo, di velocizzare molto il trasferimento dati e di liberare la CPU da questo incarico. Inoltre viene generato un solo interrupt per blocco, invece che un interrupt per ogni byte trasferito.

Struttura della memoria

La memoria è costituita da:

  • Memoria centrale o principale (main memory), ovvero la RAM – celle di memoria accessibili direttamente dalla CPU (oltre ai registri)
  • Memoria secondaria (secondary storage), ovvero i dischi – estensione della memoria centrale in modo da fornire una memoria di grandi dimensioni e non volatile
  • Dischi magnetici – piatti di metallo ricoperti di materiale magnetico. La superficie dei dischi è logicamente divisa in tracce (tracks), a loro volta suddivise in settori (sectors). Il controllore del disco (disk controller) determina l’interazione tra il dispositivo e il computer.

I dispositivi di memoria possono essere classificati in base a tre parametri principali: velocità, costo e volatilità.

Gerarchie dei dispositivi di memoria

I dispositivi di memoria possono essere classificati in questo modo: N.B: Più è grande il riquadro che contiene il dispositivo di memoria, maggiore sarà la sua capacità.

Caching

Il sistema operativo basa moltissimo le sue prestazioni sull’uso delle cache. Esse hanno una funzione di intermediazione fra la RAM e la CPU. Il suo funzionamento si basa sulla prelevazione di blocchi interi di dati dalla RAM che vengono successivamente copiati all’interno della stessa cache e infine, quando si accede ad essa, se il blocco di dati che ci interessa è presente nella cache, questi vengono prelevati risparmiando tempo, altrimenti il blocco di dati lo si va a prendere direttamente dalla RAM (in questo caso si parla di cache miss).

Ovviamente con questa tecnica vi sarà una certa probabilità di “cache miss”, ovvero la mancanza dei dati che si vogliono andare a prelevare, che farà perdere ulteriore tempo. Ma se questa probabilità è molto piccola rispetto al beneficio che ottengo usando questo metodo, allora risulta conveniente. Esistono vari livelli di cache: il primo livello è quello che si trova incorporato nella CPU e sono quindi più veloci; mentre gli altri livelli si trovano all’esterno del processore e sono comunque più veloci della RAM ma non ugualmente performanti.

Protezione hardware

Esistono quattro diversi approcci alla protezione:

  • Funzionamento dual-mode
  • Protezione dell’I/O
  • Protezione della memoria
  • Protezione della CPU

Funzionamento dual-mode

Nei sistemi operativi moderni un’attività può essere svolta in due modi:

  1. Modo utente – esecuzione svolta per conto dell’utente.
  2. Modo monitor (o kernel o system) – esecuzione svolta per conto del sistema operativo.

Per garantire il massimo della protezione hardware è necessario lavorare il più possibile in modalità utente, questo perché in questo modo il danno si circoscrive alle risorse dello stesso programma dell’utente e non si estende ad altro. Quando invece si lavora in modalità kernel potenzialmente si possono arrecare danni al computer.

Protezione dell'I/O

Però tutte le istruzioni di I/O sono istruzioni privilegiate che richiedono quindi la modalità kernel. Bisogna dunque assicurare che un programma utente non possa ottenere il controllo del computer in modo utente. A questo scopo sono usate le system call. Le system call sono diverse a seconda delle macchine utilizzate.

Nella figura sottostante viene rappresentato il funzionamento di una system call. La parte grigia rappresenta la memoria dell’utente, la parte bianca rappresenta il kernel. Supponiamo che stiamo eseguendo delle istruzioni, quando ad un certo punto arriviamo alla “system call n”. Appena avviene questa chiamata, il controllo passa al sistema operativo, cioè si passa dalla modalità utente a quella kernel (modalità privilegiata in cui si può accedere alle risorse del computer) rientrando così in una situazione di pericolo per il funzionamento del computer. A questo punto la system call n finisce nel sistema operativo che controlla in una tabella quale procedura deve eseguire (simile al funzionamento dell’interrupt). In questo caso la procedura è quella di eseguire l’istruzione in modalità di lettura (read) e quando finisce bisogna far ritornare il controllo all’utente. Da quel momento l’utente avrà acquisito i dati di lettura passato dal S.O. e potrà proseguire.

Protezione della memoria

I sistemi operativi hanno dei meccanismi di protezione della memoria che impediscono ad un programma x di scrivere nella memoria di un programma y. Per proteggere la memoria da usi non corretti si usano due registri per determinare l’intervallo di valori corretto che un programma può accedere:

  • Registro base – contiene l’indirizzo iniziale della memoria che un programma può accedere.
  • Registro limite – contiene la dimensione dell’intervallo.

La memoria al di fuori dell’intervallo è protetta. Il funzionamento è descritto dalla figura sotto: Le istruzioni di caricamento e modifica dei registri base e limite vengono eseguite dal sistema operativo in modalità monitor e quindi può accedere a tutte le celle di memoria.

Protezione della CPU

È di fondamentale importanza però che un processo utente non usi indefinitamente la CPU. La soluzione adottata è l’utilizzo di un timer che è un meccanismo di controllo per cui se un processo utilizza la CPU per una quantità di tempo superiore ad una certa soglia, gli viene tolta la CPU per darla a qualcun altro. Per farlo, il timer invia un interrupt dopo un dato intervallo di tempo. Ad ogni tick del clock il timer è decrementato e quando raggiungerà il valore 0 si genererà, appunto, l’interrupt. Il timer viene usato per implementare il time sharing.

Struttura dei sistemi operativi

La struttura dei sistemi operativi si compone di:

  • Componenti
  • Servizi di un sistema operativo
  • System call
  • Programmi di sistema
  • Struttura del sistema operativo
  • Macchine virtuali

Componenti del sistema

Gestione dei processi

Un processo è un programma in esecuzione che ha bisogno di un certo numero di risorse per svolgere il suo compito: CPU, memoria, file e dispositivi di I/O. Il sistema operativo è responsabile delle seguenti attività per la gestione dei processi:

  • Creazione e terminazione dei processi.
  • Sospensione e ripristino dei processi.
  • Meccanismi per:
    • Sincronizzazione di processi, eseguire cioè in una determinata sequenza temporale diversi programmi;
    • Comunicazione tra processi, meccanismi con cui un processo trasmette dati ad un altro processo;
    • Gestione dello stallo (deadlock), che si verifica quando due o più processi o azioni si bloccano a vicenda, aspettando che uno esegua una certa azione che serve all'altro e viceversa.

Gestione della memoria centrale

Le celle di memoria hanno una lunghezza fissa (64 o 32 bit) e si misurano in word. Per quanto riguarda la memoria centrale, questa è uno spazio per conservare dati facilmente accessibili per la CPU e i dispositivi di I/O. Essa è costituita da una sequenza di word ognuna con un proprio indirizzo. Il sistema operativo che si occupa della gestione della memoria principale è responsabile di:

  • Tenere traccia di quali parti della memoria sono correntemente usate e da chi.
  • Decidere quali processi caricare quando la memoria si rende disponibile.
  • Allocare e deallocare lo spazio di memoria.

Gestione dei file (file system)

Il file system è il componente del sistema operativo che si occupa dell’organizzazione logica dei file disco e della loro implementazione.

Anteprima
Vedrai una selezione di 10 pagine su 217
Sistemi Operativi e Reti Pag. 1 Sistemi Operativi e Reti Pag. 2
Anteprima di 10 pagg. su 217.
Scarica il documento per vederlo tutto.
Sistemi Operativi e Reti Pag. 6
Anteprima di 10 pagg. su 217.
Scarica il documento per vederlo tutto.
Sistemi Operativi e Reti Pag. 11
Anteprima di 10 pagg. su 217.
Scarica il documento per vederlo tutto.
Sistemi Operativi e Reti Pag. 16
Anteprima di 10 pagg. su 217.
Scarica il documento per vederlo tutto.
Sistemi Operativi e Reti Pag. 21
Anteprima di 10 pagg. su 217.
Scarica il documento per vederlo tutto.
Sistemi Operativi e Reti Pag. 26
Anteprima di 10 pagg. su 217.
Scarica il documento per vederlo tutto.
Sistemi Operativi e Reti Pag. 31
Anteprima di 10 pagg. su 217.
Scarica il documento per vederlo tutto.
Sistemi Operativi e Reti Pag. 36
Anteprima di 10 pagg. su 217.
Scarica il documento per vederlo tutto.
Sistemi Operativi e Reti Pag. 41
1 su 217
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 luixfux di informazioni apprese con la frequenza delle lezioni di Sistemi operativi e reti 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 Catanzaro - Magna Grecia o del prof Trunfio Paolo.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community