Sistemi Operativi - Lezione in semi-presenza

Sito: Università di Tor Vergata for UNWTO
Corso: Fondamenti di informatica per il turismo
Libro: Sistemi Operativi - Lezione in semi-presenza
Stampato da: Guest user
Data: sabato, 18 maggio 2024, 23:52

Descrizione

Lezione in semi-presenza

1. Introduzione

SlideSlide

slideSlide

Come facciamo a parlare con una macchina che parla un linguaggio così diverso dal nostro (un linguaggio L)? Usiamo un traduttore, per cui il linguaggio della macchina passa attraverso di esso e lo rende a noi comprensibile. Il Sistema Operativo (S.O.) ha appunto la funzione di traduttore, ci permette di costruire macchine virtuali diverse che poi S.O. renderà simili, garantisce che macchine diverse possano parlare un linguaggio simile, come ? facendo confusione tra Dati e Algoritmi (si ricorda che un Algoritmo è la rappresentazione dell'informazione). La macchina parla il linguaggio L, mentre il traduttore, che anch’esso è un programma, parla il linguaggio L’ (L primo). I dati del programma L’ sono L e L’. Per cui, per il programma traduttore, si sono confusi programmi e dati. Questa confusione determina la flessibilità che ci permette descrivere programmi per noi facili che poi il traduttore lo adatterà alla macchina sottostante. Si può dedurre che l’attività del sistema operativo è permettere di costruire delle macchine astratte che si poggiano su macchine reali attraverso diversi traduttori. L’elemento di traduzione può essere uno, ma possono essere anche molteplici. Servono principalmente per rendere simili macchine diverse. Tutto ciò ci permette di usare la "ricchezza espressiva" del linguaggio, come se esprimessimo lo stesso concetto con una serie di forme diverse. Modi che sempre più si avvicinano al linguaggio della macchina fisica; rimane comunque, di fatto, che il linguaggio non deve essere ambiguo altrimenti il traduttore non riuscirebbe ad operare.

Ricapitolando la CONFUSIONE TRA DATI E ALGORITMI, permette la costruzione di MACCHINE ASTRATTE cioè non esistenti fisicamente, paragonabili alle lingue astratte, una di queste è l’esperanto poiché, benché esso venne completamente specificato, non venne mai usato come lingua universale. Nelle macchine astratte a loro volta troviamo aspettative comuni oltre a elementi comuni tra cui MEMORIA e CPU oltre ai servizi con cui ci mostra cosa sta facendo: INPUT (con cui immettiamo informazioni o comandi) e OUTPUT(con cui vengono fuori i dati elaborati), elementi che permettono di svolgere diverse funzioni, oltre al S.O. Le suddette macchine astratte possono svolgere diverse funzioni: quelle di base e altre specifiche a seconda della diversa esigenza come scrivere in Word oppure di navigare attraverso il Browser. Esse rappresentano un insieme di programmi che realizza una funzionalità utilizzando i servizi forniti dalle macchine di livello inferiore. Impiantare un sistema operativo su una macchina, significa scegliere la famiglia di programmi alla quale ci si vuole rivolgere.

La macchina di Von Neumann è una macchina virtuale cioè solo una delle architetture possibili, ad esempio esiste un’altra architettura, simile per alcuni aspetti a quella di Von Neumann, che è l’architettura di Turing. Di fatto, l’architettura adottata è quella di Von Neumann. Appunto è un S.O. ed ha la funzione di confondere Dati e Algoritmi, quando l'Algoritmo Vitale osserva gli algoritmi come dati. Le macchine astratte per i servizi di base vengono chiamate Sistemi Operativi.

L’uomo riesce a fare più cose insieme perché è una macchina biologica con capacità parallele. L’uomo ha i neuroni che gli consentono di fare molte cose parallelamente, sono una rete di comunicazione e traduzione dei diversi segnali. Per ottenere lo stesso risultato da un Computer cioè come se ci fosse una sola CPU e tanti programmi che girano contemporaneamente, dobbiamo convincerlo che ogni programma abbia una sua CPU e una sua Memoria anche se in realtà ce n’è una sola. Coloro che usano il Sistema Operativo sono, in primo luogo, gli utenti, ma non sono gli unici, vi sono anche i programmi che usano il sistema operativo. E sono proprio i programmi ne sono i maggiori utilizzatori (esempio di utilizzo di programmi contraffatti, se in rete tutti ne scoprono l'utilizzo!).

2. Cos’è il sistema operativo

SlideSlide

SlideSlide

Slide

Il sistema operativo è un insieme di programmi i quali devono essere scritti in un particolare linguaggio, ovvero quello della macchina specifica. E' il gestore delle risorse di elaborazione- l'interfaccia. Ma la sua funzione essenziale è rendere simili le macchine. Dopo che il Sistema operativo gestisce le informazioni e i dati, occorre salvarli questi dati nella memoria. La Memoria è composta da uno o più processori. Il Sistema Operativo si deve occupare della memoria, di uno o più processori, garantendo che i dati permangano nel computer. Se si rompe il computer, si desidererebbe che il Sistema Operativo avesse un po’ di tolleranza nel salvare i dati. Dovrebbe essere tale che, anche se un elemento si rompe, questi dati rimangono. Infatti, le aziende, la cui sopravvivenza è legata ai dati, li salvano ripetutamente su dischi, onde evitarne la perdita. Comunque la sua garanzia è insufficiente al salvataggio dei dati in caso di disastro come un incendio, in tal caso necessita anche una ridondanza geografica.

3. Sistema operativo come macchine astratte

SlideSlide

La Macchina astratta deve garantire la comunicazione tra noi e la macchina fisica, permettendoci di usare linguaggi semplici e tradurli per la macchina fisica. Essa si mette in comunicazione con la macchina fisica attraverso una serie di astrazioni sempre maggiori, creando quindi una serie di strati fino ad arrivare al S.O. il cui 1° elemento quello più interno è l'hardware- Nucleo la prima astrazione - che è necessario per scrivere i programmi e farli girare parallelamente, deve permettere di far funzionare tanti programmi insieme. Comunque ogni strato della macchina S.O. ha un compito diverso e ben determinato e ripeto che il nucleo è lo strato più importante poiché deve garantire che funzionino tutti gli altri strati.

4. Macchine Virtuali: moltiplicazione delle risorse

SlideSlide

Slide

SCHEMA:

NUCLEO PROCESSO il programma (algoritmo nella fase di esecuzione)

CPU Virtuale (si appoggia su quella reale, fisica. Se ogni programma dovesse avere una propria CPU, il computer potrebbe eseguire un programma alla volta.)

MEMORIA Virtuale

Moltiplicazione della CPU

SlideSlide

slideSlide

IL TUTTO PERCHE' OGNI PROGRAMMA CHE DIVENTA PROCESSO CREDE DI AVERE A DISPOSIZIONE UN PROCESSORE TUTTO SUO (cioè una CPU e Memoria sua), si ottiene una moltiplicazione delle risorse dei processori. Parto da un unico processore per più programmi, moltiplico le macchine in virtuali, dividendo in parti temporali, ogni utilizzatore crederà di essere l'unico ad usare la CPU. Se dividiamo la risorsa in 10 parti, avremo 10 processori quindi riusciamo a far eseguire più programmi al computer, ma ci rimette in velocità, perché un processore diviso in 10 sarà più lento. Ottengo macchine più lente, pur guadagnando in funzioni. Quindi per “moltiplicare il processore” divido il tempo per tutte le applicazioni, e assegno a ognuna un tempo per l’utilizzo della CPU che, di fatto, resta una sola. Esempio sulla maggior parte dei cellulari non è possibile eseguire più di un’applicazione alla volta; per poterne eseguire un’altra bisogna prima di tornare al menù principale.

SlideSlide

SlideSlide

SlideSlide

Se S.O. è una collezione di programmi, con quale criterio un programma rilascia o riprende il controllo o possesso della CPU? Si è detto che per eseguire più programmi contemporaneamente- Multitasking , si divide il tempo della CPU, ma questo tempo deve essere assegnato, perciò occorre qualcuno che lo assegni. Il ruolo di assegnare il tempo è regolato da un evento esterno un’interruption- interruzione del programma, simile ad un timer che non è un clock, e ripristina il S.O., cioè il programma principe, che, se in quel momento deve fare qualcosa, la esegue, altrimenti restituisce il controllo al programma che stava lavorando prima dell’interruzione. Qualora il S.O. cede il controllo della CPU non esiste più come tale. Inoltre, se abbiamo una fila di processi che devono tutti essere eseguiti, quale si farà per primo eseguire? Qualcuno deve “ gestire la fila”. Il processo di decisione viene chiamato scheduling.

Il PROGRAMMMA è la traduzione dell'algoritmo in linguaggio macchina, adatto alla CPU. Quando un programma viene eseguito, in un certo senso lo stato della CPU si modifica, cioè occupa uno spazio nella memoria focalizzato e finalizzato, modificando i registri della CPU. Nel caso particolare, un programma occupa un registro specifico, cioè il Program Counter, che contiene l'istruzione successiva che dovrà esser eseguita. L’istruzione suddetta viene caricata dall’Instruction Register, e la macchina eseguirà ciò che è scritto nell’istruzione che è l’istruzione propria del programma. Essa sita nel Program Counter riguarda un programma, il quale non cederà la CPU ad un altro programma fin tanto che non avrà finito di eseguire l’istruzione o le istruzioni che lo riguardano. Sarà sua cura decidere quando rilasciarla. Di sicuro la rilascerà quando sarà giunto all’istruzione “halt”, e sarà sua discrezione decidere se rilasciarla prima. Il S.O.è un programma e segue anche lui questo procedimento: mette e toglie programmi dalla CPU.

Invece un programma che viene interrotto, viene per lo più messo in pausa- attesa e deve venir ripreso dal punto in cui è stato interrotto. La stessa cosa accade nei libri in cui, per riprendere da quel punto, si mette un segnalibro o si fa un’orecchia alla pagina, per definire lo stato di memoria in quel momento rispetto al libro, indica dove si è arrivati nell’assimilare quel libro, e cioè, in che punto si deve riprendere per assimilare il resto. Dopo un determinato periodo di tempo verrà ripreso dal principio poiché ci si ricorderà poco o nulla. Anche nel computer ci sono i segnalibri, ed il vero segnalibro al suo interno è il Program Counter perché ci ricorda dove si è arrivati nell’esecuzione del programma. Il segnalibro di un programma che era stato messo in stato d’attesa, si dovrà, per prima cosa ricordare lo stato del processo, a che punto si era arrivati e ciò viene fatto attraverso il Program counter. Lo stato del processo è: “ qual è la prossima istruzione da eseguire”, “ quali sono i propri dati che dovrebbero trovarsi in memoria”, cioè cosa si è già appreso e cosa si è già fatto. Un processo sequenziale può essere: ATTIVO, cioè mentre le istruzioni del suo programma vengono eseguite, quindi è nella CPU; IN ATTESA, cioè mentre attende di essere attivato; in stato di PRONTO, cioè quando attende di essere eseguito ad un processore. Dallo stato di PRONTO si può passare allo stato di ATTIVO, viceversa, dallo stato di ATTIVO si può passare allo stato di PRONTO. Se si lancia un qualche cosa che ha una durata di tempo ampia, dallo stato di ATTIVO si può passare dallo stato IN ATTESA. Quando la durata è ampia, non si può riprendere la CPU, ma si andrà a finire nello stato di PRONTO. Il posto dove mettiamo il segnalibro, si chiama Process Control Block- PCB, o Blocco di Controllo dei processi (insieme di informazioni a corredo). Esso contiene informazioni riguardo allo stato del programma, del Program Counter, dei Registri della CPU, è il segnalibro, il parcheggio. Il Process Control Block è molto importante perché ci può dire a che punto è arrivato il processo. In metafora, sarebbe l’insieme di pagine che si trovano prima del segnalibro nel libro che stiamo studiando o leggendo. Il suo elemento-principe è il Program Counter. Se perdiamo il segnalibro dal nostro libro, il tempo che impiegheremo per ritrovare l’informazione, sarà diverso dal tempo impiegato per ritrovare l’informazione nel libro con il segnalibro inserito. Quest’attività si chiama di “ ripristino dello stato”. Se il tempo di ripristino dello stato è piccolo, il vantaggio c’è, ma se il tempo è maggiore dello svolgimento stesso del programma non ha senso il ripristino. Nel caso ci siano molte cose da fare e si perde quindi tempo a ripristinare lo stato si chiama Trashing (buttare via il tempo). Un processo ha informazioni a corredo che vanno caricate e scaricate, qualora ciò necessiti troppo tempo non vale la pena. Ci deve essere un processo che faccia in modo che l’intero processo sia efficace. Ma come e perché scelgo un processo rispetto ad un'altro? SCHEDULING esegue un processo fin quando non può più evolvere o fin quando si decide essere utile, lo decide il S.O. Si verifica lo sta del processo in corso e si sceglie quale possa essere il più utile con lo scopo di ottenere il miglior risultato con il miglior danno su tutti i processi. Con lo scopo globale del sistema di riuscire a far in modo che i processi funzionino tutti allo stesso modo.

Sistemi operativi sono molto importanti poiché gli utenti non possono parlare direttamente con la macchina attraverso impulsi elettrici (così sono rappresentate le informazioni nella macchina), ma dobbiamo parlarci tramite un linguaggio a noi vicino. Tale linguaggio, in qualche modo, deve venir comunicato alla macchina. Il computer non svolge un solo programma alla volta, come fa? Ad esempio, La macchina astratta ci deve garantire di poter comunicare con i dispositivi reali (sottostanti) attraverso linguaggi a noi sempre più vicini. Il sistema operativo è costruito a strati e questi strati sono astrazioni sempre maggiori della macchina stessa. Il primo elemento (il più interno) è il nucleo. Il nucleo ci da la prima astrazione, una volta ricevuta la prima astrazione, si può gestire la memoria, poi la seconda astrazione… per dare, in fine, un’interprete dei comandi. Il primo salto è quello che ci serve per far lavorare i programmi semi-contemporaneamente. Quindi il nucleo Per funzionare, il programma ha bisogno di una CPU, ma non è possibile che ogni programma abbia una sua CPU, perciò si appoggia solamente su quella reale. Infatti, L’operazione di partizionare/dividere il tempo consiste nel dividere la risorsa in diverse parti temporali, in ogni parte vale un processore per un certo periodo di tempo. Lo strato più interno, è il nucleo che Il nucleo si trova immediatamente sopra la macchina fisica (in figura HW) che sarebbe la CPU e viene realizzata attraverso l’architettura di Von Neumann. Questa macchina deve poter essere cambiata per usare un calcolatore, un cellulare o una macchina che sia, come si vuole. Perciò, la prima cosa da fare nel nucleo, è far credere a ciascun programma che viene eseguito, di avere una CPU a propria disposizione, cosa che non si potrebbe mai verificare, soprattutto quando più applicazioni vengono eseguite nello stesso momento, perciò non si tratta di un’operazione semplice. Importante è anche il ruolo delle macchine astratte che fanno credere ai programmi di disporre della CPU per un lungo tempo, come se, di fatto, ogni applicazione avesse una CPU per sé. Ma si è visto che ciò non è possibile e quindi si divide il tempo d’uso dell’unica CPU per tutte le applicazioni. Quando un programma è in esecuzione, ciò che accade è che tale programma occuperà spazio in memoria. Ma occuperà quello spazio di memoria adibito a particolari attività, e cioè i Registri della CPU. .E’ il Program Counter, infatti che dice qual è la istruzione successiva . se Il Sistema operativo è un programma che ha lo scopo di fornire una modalità di togliere e mettere programmi nella CPU di modo che possa suddividere il suo tempo in tanti “ segmenti”, quindi, quando nel Program counter viene messa un’istruzione di un altro programma, verrà eseguito dalla CPU quel programma e il Sistema Operativo non ha più il controllo. Come fa a riprenderselo?

L’attività di ripristino dello stato ha un costo in termini di tempo. Se il tempo impiegato per tale attività è maggiore della quantità di tempo che abbiamo a disposizione, o che viene concessa al processo per fare qualche cosa, allora non vale la pena farlo. Avendo un processo che si sta eseguendo nella CPU, lo si esegue fin tanto che non è troppo lungo, o fin tanto che non si decide qual è l’altro processo che vogliamo eseguire. Dati due processi, il processo P e il processo Q, se si decidesse di eseguirli uno di seguito all’altro, l’esecuzione finale si otterrebbe. Un processo comincia a dirsi soddisfatto nel momento in cui comincia ad essere eseguito.

Il concetto di macchina astratta aiuta ad introdurre quello di Sistema Operativo perché il Sistema operativo ha come obiettivo principale quello di rendere simili macchine differenti: costruisce macchine astratte simili su macchine reali differenti.

Data una macchina astratta, la si vuole usare con più programmi contemporaneamente. Si è dovuto introdurre il concetto di “ moltiplicazione delle risorse”, perché ogni programma deve poter avere la macchina così com’era, a sua disposizione.

Su una macchina astratta vivono tanti programmi detti processi i quali sono tutti indipendenti. È proprio la loro indipendenza che crea un problema, poiché devono condividere le risorse (la CPU).

Come fa il sistema operativo a decidere chi ha diritto, in un determinato momento, alla risorsa (che può essere la CPU o la Memoria)?

E, una volta “ servito” un programma, quale sarà il programma successivo della coda ad essere “ servito”?

SlideSlide

Slide

Le politiche per gestirlo sono quelle che ci vengono più naturali, le quali poi si trasformano in algoritmi. Così abbiamo l’algoritmo FIFO, l’algoritmo Shortest-Job-First (compito meno oneroso), algoritmo basato sulla priorità e l’algoritmo Round-Robin.

  • First in-first out (FIFO): principio della fila, il primo che entra sarà il primo ad uscire.
  • Last in-first out (LIFO): anche detto first in-last out, il primo ad entrare sarà l'ultimo ad uscire.
  • Shortest job first: terza politica, chi ha meno lavoro da fare ha la precedenza sugli altri. Questo principio non può venire applicato all’infinito.
  • Principio basato sulla priorità: a lavori diversi corrispondono file diverse. Se io appartengo ad una classe, vengo servita per prima.
  • Round-Robin: è il più utilizzato. Ogni programma fa un pezzetto alla volta, così si fa credere a tutti di procedere contemporaneamente.

L’algoritmo più utilizzato, è il Round-Robin che, in un certo senso, potrebbe usare come scelta tutti i precedenti. Si tratta di un algoritmo che fa credere ai programmi di progredire tutti contemporaneamente.

Per comprendere meglio quest’algoritmo, facciamo l’esempio del bar: la situazione del bar è particolare poiché la coda è quella che si fa per pagare alla cassa, ma il momento del bancone non è propriamente una coda in quanto tutti i clienti sono allineati su una stessa linea orizzontale. Può crearsi anche più di una linea orizzontale, in ogni caso, sembra che gli appartenenti ad una stessa linea, siano serviti tutti nello stesso momento. In realtà non è così, ma piuttosto i baristi, in questo caso, dividono “ l’attività complessa” in tanti sotto-passi.

Il primo sotto-passo è quello di osservare chi ha la necessità di essere servito nella prima linea, l’individuo che deve essere servito da lo scontrino e il barista mette davanti a lui il piattino, quest’azione la fa per tutti coloro che si trovano nella prima linea. Il piattino sarebbe il Program Counter. In questo primo momento, si è serviti in sequenza, ma in un certo senso contemporaneamente. Il secondo passo prevede che qualche cosa venga messo sul piattino (la tazza). Il terzo passo è stabilire il tempo, perché se c’è una fila, la persona non potrà rimanere ore con la tazza davanti al bancone.

Quando si libera un posto, viene servita un’altra persona: è una sorta di coda circolare, ma in questa coda circolare si da un tempo ad ognuno. Ad ogni persona non si può dare più di un tempo “T”.

Quindi sembra che nel Round-Robin tutti i programmi evolvano insieme ed inoltre sembra che vadano anche più velocemente. A ciascun programma viene dato un tempo (tau) uguale. Quando il tempo scade, la CPU gli viene tolta.

Slide

Dati tre processi, P1, P2 e P3, sappiamo che P1 impiega 24 millisecondi, P2 ne impiega 3 e P3 ne impiega anch’esso 3. P2 dovrà attendere, perciò, 24 millisecondi, ma P3 ne dovrà attendere 27 (il tempo d’attesa è lungo). Se dessimo a ogni processo 4ms (tempo che un processo attende per fare qualche cosa e non per completarsi) vedremo che P1 deve attendere 0ms, P2 deve attendere 4 ms (anche se ne impiega 3 per fare la cosa) e P3 attende 7 ms (il tempo d’attesa è piccolo e quindi fare il Round-Robin è vantaggioso).

Il Round-Robin è diverso dalle altre politiche/altri algoritmi; le altre politiche che ho a disposizione si usano per fare la “coda”, ma il resto è un procedimento circolare che prende il nome di Round-Robin.

Tutti questi modelli possono tradurre in algoritmi!!

5. Problemi tipici della convivenza tra processi indipendenti

SlideSlide

SlideSlide