|
Appunti informatica |
|
Visite: 1949 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:Il meccanismo semaforicoIL MECCANISMO SEMAFORICO Soffermiamoci ora sul modello di programmazione a L'inventore del microprocessoreL'inventore del microprocessore Sono passati quasi trent'anni dalla sua straordinaria La gestione della memoriaLa gestione della memoria Quando un processo diventa Running, è necessario |
I sistemi operativi
Un SISTEMA OPERATIVO è un insieme di programmi, scritto allo scopo di rendere disponibili all'uso le risorse di calcolo e i dispositivi collegati al computer.
Dato che alcuni dei programmi del sistema operativo interagiscono con le componenti hardware che costituiscono i calcolatori, questi devono conoscere le caratteristiche dei dispositivi in modo da poterli controllare e adoperare. È opportuno che il sistema operativo sia in grado di accedere anche a dispositivi non previsti inizialmente, purché questi vengano forniti con il DEVICE DRIVER (pilota del dispositivo). Ovviamente, un device driver scritto per uno specifico dispositivo può non funzionare con un altro simile ma non identico.
Sui sistemi operativi moderni questo compito viene svolto spesso in modo automatico attraverso i dispositivi realizzati in tecnologia plug and play (inserisci e usa).
Un sistema operativo aperto è un sistema operativo costruito in modo da poter operare con una molteplicità di dispositivi (sistema operativo Unix). Al contrario, un sistema operativo proprietario è scritto per essere eseguito su un insieme ristretto e ben specifico di macchine, corredate o meno di specifici dispositivi.
Le richieste dell'utilizzatore vengono acquisite e gestite dal sistema operativo in modo coordinato, rispettando le cosiddette politiche di gestione, che sono regole scelte fra molte possibili per realizzare i meccanismi desiderati: indicano al calcolatore come reagire agli stimoli e come rispondere alle richieste dell'utente, stabilendo gerarchie e priorità con le quali ogni richiesta deve essere servita.
La struttura formale di un sistema operativo è gerarchica: questo significa che i programmi che lo compongono si collocano a livelli diversi, si servono di programmi che stanno a livelli sottostanti e servono i programmi dei livelli superiori. All'interno di ogni livello, si usa raggruppare tutti i programmi scritti per risolvere un problema in moduli. Ogni modulo si può vedere come una scatola nera che contiene le competenze per risolvere un problema, quindi all'occorrenza il modulo può essere modificato o anche riscritto.
Per i programmi che fanno uso del modulo, la cosa veramente importante è che questo continui a rispondere coerentemente alle richieste effettuate attraverso un insieme di procedure standard; ognuna di esse per mezzo della quale il modulo mette a disposizione i servizi è detta primitiva.
Questi moduli permettono di richiedere risorse i dispositivi usando comandi più comprensibili. Si dice che virtualizzano i dispositivi, ossia li trasformano in macchine astratte o macchine virtuali in grado di eseguire operazioni più complesse definite in modo logico piuttosto che fisico.
Un'operazione logica corrisponde all'esigenza dell'utente di ottenere un risultato; un'operazione fisica consiste nell'eseguire molte operazioni elementari dipendenti dal particolare operatore sul quale l'operazione logica è stata richiesta.
Un modulo è una collezione di routine che attivano i meccanismi fisici necessari per risolvere problemi logici di uno stesso tipo (per esempio le operazioni di I/O).
I moduli devono mantenere un elevato grado di indipendenza ; l'unico modo in cui un modulo può comunicare con un altro è attraverso le primitive da essi implementate.
Per portabilità del sistema operativo si intende la sua attività ad essere eseguito su macchine diverse.
I sistemi operativi gestiscono le risorse della macchina in modo diverso a seconda della esigenze dell'utente: lo stesso processore può infatti essere usato in modo che un solo utente ne sfrutti le capacità, oppure in modo che diversi utenti possano a turno accedere alle stesse.
Ad un primo livello i sistemi operativi possono essere valutati descrivendo le due modalità di funzionamento delle macchine: monoprogrammazione e multiprogrammazione.
Possiamo avere dei dispositivi hardware simili nella struttura ad un'unità centrale, dedicate allo svolgimento di particolari funzioni. Il loro impiego è settoriale e non costituisce un punto di interesse primario per una trattazione dei sistemi operativi (gli elaboratori di canale, i dispositivi multimediali, i coprocessori matematici).
Un sistema viene detto monoprogrammato quando la sua memoria centrale contiene, in un dato istante, codice utente proveniente da un unico programma.
Il codice in oggetto viene eseguito dalla CPU che preleva le istruzioni dalla memoria nella sequenza corretta e le esegue una per volta. Il registro contatore di programma provvede a segnalare quale istruzione debba essere eseguita, e gli altri eventuali registri della CPU contengono le diverse informazioni che consentono al processore di eseguire i suoi compiti.
Talvolta, l'esecuzione di un'istruzione del programma utente comporta la chiamata di qualche routine di sistema (l'accesso a qualche periferica). Quando si scrive un programma in linguaggi evoluti come C o Pascal, è il compilatore che provvede a generare il codice appropriato per il sistema operativo usato.
In ogni caso, il compilatore genera una sequenza di istruzioni in codice macchina.
Quando il flusso dell'esecuzione attraversa la chiamata, occorre che il programma utente sia momentaneamente sospeso in favore del sistema operativo, dopo aver salvato alcune informazioni che consentiranno al programma utente di ripartire correttamente. Il salvataggio dei registri è sufficiente a garantire che il programma possa ripartire correttamente, alla condizione che l'area di memoria che contiene le istruzioni e i dati del programma non venga intaccata dalla routine di sistema. Qualora questo non avvenisse i registri vengono ricaricati dalla memoria, il contatore di programma indica di riprendere l'esecuzione. Succede allora che il programma prosegue eseguendo operazioni diverse da quelle previste, oppure che il flusso di esecuzione si interrompe.
Si può dividere il tempo che intercorre tra l'inizio e la fine del programma in intervalli:
Esecuzione di istruzioni del programma utente (TEMPO UTENTE);
Esecuzione di istruzioni del sistema operativo (TEMPO SISTEMA);
Inattività, per esempio quando attende un input da tastiera (TEMPO INATTIVO).
Il TEMPO INATTIVO può essere grande
rispetto agli altri, perché
Il sistema operativo ottenuto viene detto multiprogrammato.
Per raggiungere questo obiettivo occorre complicare il sistema operativo che deve disporre di nuove capacità, in particolare occorre che vengano sviluppate le routine di sistema che permettono di:
Decidere quale istruzione far eseguire dopo quella attuale;
Realizzare meccanismi di protezione tra i diversi programmi;
Risolvere eventuali conflitti che possono sorgere per l'assegnazione di una determinata risorsa.
Il sistema operativo deve intervenire periodicamente di propria iniziativa; questo significa che il TEMPO INATTIVO recuperato non è del tutto utilizzabile per l'esecuzione dei programmi degli utenti ma viene ripartito tra questi e le routine del sistema operativo. Si parla di system overhead, ossia di carico di lavoro in più imposto dal sistema operativo.
Si dice che una risorsa viene gestita in modo time sharing (a partizione di tempo), quando il suo uso viene concesso per un tempo che non può superare un massimo: questo intervallo viene chiamato time slice (fetta di tempo).
Il time sharing è un concetto che viene applicato ai singoli
dispositivi. Se
Il programma utente termina;
Il programma utente richiede che vengano effettuate operazioni che coinvolgono altri dispositivi;
Scade il time slice.
Appena accade uno di questi eventi, il controllo dell'unità centrale passa al sistema operativo che decide a quale tra gli altri programmi in memoria centrale spetti il prossimo time slice. Quindi il sistema operativo deve disporre di un meccanismo automatico che verifichi a chi toccherà disporre della CPU per il prossimo time slice.
Il tempo necessario a prendere tale decisione si chiama tempo di riassegnamento
La realizzazione più semplice consiste nell'assegnamento round robin (a rotazione). Il programma a cui è stata tolta la risorsa viene messo in fondo ad una coda di programmi in attesa. Quando tutti gli altri avranno eseguito le operazioni nei time slice di competenza esso ripartirà da dove è arrivato.
Classificazione dal punto di vista dell'utente
Le tre configurazioni fondamentali con le quali un sistema viene offerto agli utenti sono: sistema dedicato, sistema batch, sistema interattivo multiutente.
SISTEMI DEDICATI
I sistemi dedicati sono i sistemi che prevedono l'utilizzo da parte di un solo utente per volta. I sistemi dedicati attuali supportano il multitasking che è un tipo particolare di multiprogrammazione nella quale più applicazioni (task) vengono eseguite contemporaneamente sulla stessa macchina scambiando tra loro dati e risultati. Un altro termine utilizzato a proposito di questi sistemi operativi è multithreading, che rispetto al primo indica meccanismi di protezione tra i programmi, più evoluti e sicuri, tipici dei sistemi di livello superiore: un task può essere scomposto in parti più piccole parallelizzabili, chiamate thread, che procedono indipendentemente.
Nei sistemi dedicati e multitasking spesso le varie applicazioni possiedono un'interfaccia utente che occupa una parte delimitata dello schermo. In questo modo si possono vedere contemporaneamente diverse applicazioni in esecuzione e si può passare dall'una all'altra.
SISTEMI BATCH
In un sistema batch l'utente non interagisce con il calcolatore durante l'esecuzione dei programmi. Il lavoro batch può quindi essere considerato l'opposto di interattività, intendendo con questo termine la possibilità di ottenere risultati parziali durante l'esecuzione.
Siccome l'attività della CPU è limitata principalmente dai tempi di attesa per le operazioni di I/O, durante i quali l'unità centrale è inattiva, una riduzione di questi tempi aumenta l'efficienza del sistema. I tempi di inattività sono dovuti sia alla lentezza dei dispositivi meccanici rispetto a quelli elettronici, sia al ritardo con cui l'utente soddisfa alle richieste di input del programma.
Il tempo di attesa della CPU durante le operazioni di ingresso viene così ridotto automaticamente. Il tempo di attesa per l'output viene diminuito eseguendo le operazioni di uscita verso le memorie di massa.
Una
volta che il lavoro richiesto dall'utente è terminato, tutto l'output sta su
disco ed occorre eseguirne la stampa. Questa operazione non deve però
coinvolgere in alcun modo
Gli elaboratori di canale possono essere associati a qualsiasi periferica e sono costituti da un'area di memoria detta Buffer (memoria temporanea), nella quale si accumulano i caratteri da trasferire, e da un dispositivo logico che ne controlla il flusso della sorgente al buffer e da questo alla destinazione.
Le fasi del lavoro batch sono: preparazione dei dati, inoltro all'elaboratore e ritiro dei risultati.
I diversi utenti preparano i propri job (lavori) su dispositivi offline (non connessi, nastri o personal computer). Opportune periferiche provvedono a portare online i job: queste possono essere lettori di dischi o nastri perforati.
Il nome tecnico con il quale viene indicata una sequenza di fasi da eseguire in modo batch è job stream (traccia del lavoro).
Quando il job stream è pronto, l'elaboratore di canale provvede a metterlo in linea sui dispositivi di memoria di massa e a caricarlo in una coda per la sua effettiva elaborazione.
Quando il job termina, il sistema operativo deve riconoscere che l'output generato è stampabile, e quindi porlo in una coda di stampa
SISTEMI INTERATTIVI MULTIUTENTE
L'uso del time sharing della CPU ha come obiettivo quello di mettere a disposizione di ciascun operatore una periferica interattiva come il videoterminale. La risorsa CPU viene dedicata a ciascun utente a turno per un tempo stabilito. La velocità della CPU costituisce un parametro critico di un sistema dove essa viene gestita in time sharing.
Per evitare i sovraccarichi, occorre eseguire in ogni time slice un numero sufficiente di operazioni di CPU.
Il time slice deve essere piccolo per garantire che in un tempo percettibile da una persona si trovi un numero elevato di time slice, per poter offrire il servizio a tutti gli utenti almeno una volta.
SISTEMI TRANSAZIONALI
Tra i sistemi interattivi multiutente, evidenziamo i sistemi transazionali, strutturati appositamente per gestire le transazioni, ossia le operazioni di updating (aggiornamento) di archivi e basi di dati di dimensioni rilevanti, che hanno la loro collocazione naturale in applicazioni di tipo gestionale.
SISTEMI REAL TIME
Comunemente si dice che un sistema lavora in real time (tempo reale) quando risponde istantaneamente agli stimoli provenienti dall'esterno.
In un sistema real time, un'elaborazione può considerarsi corretta non solo quando fornisce risultati esatti, ma soprattutto quando li fornisce in tempo.
Il sistema di calcolo deve pertanto avere tempi di reazione minori.
Due parametri che possano misurare le prestazioni di un sistema di calcolo sono:
CPU activity (attività della CPU)
È il
rapporto espresso in percentuale tra il tempo in cui
Tempo Utente il tempo totale dedicato ai programmi degli utenti, comprese le routine di sistema;
Tempo Sistema il tempo dedicato alle attività di sistema svolte in modo automatico;
Tempo Inattivo il tempo in cui il sistema resta in attesa.
La somma di questi tempi dà il Tempo Totale, un intervallo di tempo in cui il sistema è al servizio degli utenti.
Throughput (produttività)
Indica qualsiasi parametro che misura quanto lavoro si può svolgere in una unità di tempo.
La
produttività differisce dalla CPU activity in quanto considera il tempo di
sistema nello stesso modo del tempo inutilizzato. Perciò se troppi utenti sono
connessi al sistema,
I processi
Il termine processo definisce un insieme formato da un elenco finito di azioni da eseguire in sequenza e dai dati che vengono elaborati dalle stesse azioni.
Questo concetto è diverso da quello di programma almeno per due aspetti:
PROCESSO |
PROGRAMMA |
1. EVOLVE NEL TEMPO; |
1. INTESI COME TRADUZIONI DI ALGORITMI; |
2. SONO SEQUENZIALI. |
2. CONTENGONO SALTI E CICLI. |
Chiamiamo processore l'oggetto che causa l'evoluzione del processo.
In memoria centrale possiamo trovare un certo numero di processi, uno dei quali sta evolvendo; l'esecuzione di un programma genera almeno uno di questi processi.
Questo può avvenire per tre motivi:
Il processo termina (Il sistema operativo libera l'area di memoria centrale occupata dal processo);
Il time slice finisce (Il sistema operativo sospende il processo attribuendogli lo stato di pronto);
Il processo richiede un'operazione di I/O (Il processo non potrà proseguire finché l'operazione di I/O richiesta non sarà terminata).
Quindi gli stati possibili nei quali si può trovare un processo sono:
PARCHEGGIO, quando attende di essere caricato in memoria centrale;
PRONTO, quando attende che gli venga assegnata
ESECUZIONE, quando il processo è in evoluzione perché gli è stata
assegnata
ATTESA, quando richiede un'operazione di I/O su una periferica;
TERMINAZIONE, quando il processo è stato completato e può essere tolto dalla memoria centrale.
I passaggi di stato sono:
Da parcheggio a pronto;
Da pronto ad esecuzione;
Da esecuzione a pronto;
Da esecuzione ad attesa;
Da attesa a pronto;
Da esecuzione a terminazione.
Si possono distinguere tre tipi fondamentali di interruzione:
Interrupt asincroni, generati solo dall' hardware, che servono a segnalare alla CPU eventi non correlati al suo orologio interno, cioè che dipendono da fattori esterni al sistema (la fine di una stampa). Il verificarsi di questi eventi viene comunicato alla CPU usando il meccanismo di interrupt (interruzione). Si segnala alla CPU che è successo qualcosa e che deve interrompere momentaneamente la sua attività per eseguire un compito particolare. A seconda del tipo di interruzione vengono attivate diverse routine. In ogni caso queste comprendono il salvataggio dello stato del processo in esecuzione: questo avviene copiando questi valori nel vettore di interrupt
Interrupt sincroni generati dall' hardware, che segnalano eventi accaduti in relazione all'orologio interno;
Interrupt sincroni provocati via software usati per accedere a routine particolari.
Modello a macchine virtuali
Una macchina virtuale è un oggetto costituito da una macchina più semplice, in grado di eseguire un certo insieme di operazioni fisiche, e da un modulo che fornisce un'interpretazione logica di tali operazioni.
Il modello onion skin (buccia di cipolla
Rappresenta il sistema operativo come una successione di strati costruiti sopra un nocciolo costituito dalla macchina hardware. Ciascuno strato costituisce un modulo, composto da programmi che vedono solo le procedure implementate dagli strati sottostanti, attraverso le primitive. A qualsiasi livello ci si collochi all'interno del modello, gli strati sottostanti vengono visti come un oggetto unico (una macchina virtuale).
Il nucleo
Il nucleo, chiamato anche kernel, è la parte del sistema operativo più vicina alla macchina, ed è strettamente dipendente dall' hardware. Le funzioni fondamentali del nucleo sono:
Avvio e terminazione dei processi;
Assegnazione della CPU ai diversi processi;
Sincronizzazione tra i processi;
Sincronizzazione dei processi con l'ambiente esterno.
Il nucleo comprende tutte le routine di risposta alle interruzioni e le procedure che vengono chiamate politiche di scheduling (gestione della risorsa).
Tra esse la più semplice è quella round robin che prevede una coda di processi pronti ed un insieme di processi in attesa.
Il gestore dei processi scheduler che è anch'esso un processo, ha la priorità massima, così come il processo che si occupa della gestione delle interruzioni (interrupt handler
La gestione della memoria La memoria centrale viene utilizzata secondo due diverse politiche:
A PARTIZIONE FISSA: i diversi indirizzi vengono ripartiti in blocchi di dimensioni fisse; quando si richiede l'esecuzione di un programma,il sistema operativo consulta la tabella e lo carica in un blocco libero, mentre quando un problema termina provvede a liberare il blocco corrispondente. Questo è il metodo più semplice da realizzare ma presenta due limiti fondamentali: il numero di processi che possono essere allocati in memoria è prefissato; un blocco contenente un processo molto breve viene considerato occupato e quindi lo spazio rimanente risulta sprecato.
A PARTIZIONE VARIABILE: questo metodo sfrutta meglio della precedente la risorsa, al prezzo però di un maggior carico di lavoro svolto del sistema operativo.
La scelta della partizione dove caricare un nuovo programma può essere fatta in due modi:
Si carica nella prima zona libera sufficientemente grande per contenere il programma (first fit primo accordo più efficace del primo perché si perde meno tempo);
Si carica nella zona libera più piccola tra quelle adatte a contenere il programma best fit miglior accordo).
La gestione della memoria virtuale si realizza attraverso due diverse tecniche di suddivisione dei programmi in blocchi: la paginazione e la segmentazione.
Paginazione
Ogni programma viene considerato diviso in blocchi di eguali dimensioni detti pagine logiche; analogamente la memoria centrale viene divisa in pagine fisiche di dimensione uguali a quelle delle pagine logiche. Il vantaggio principale della paginazione è la semplicità dovuta al fatto che tutte le pagine logiche o fisiche, hanno eguali dimensioni, mentre il difetto più importante è l'arbitrarietà con cui le pagine logiche vengono generate suddividendo il programma. La paginazione riguarda solo la parte di memoria centrale libera.
Segmentazione
La suddivisione del programma viene effettuata sulla base di criteri logici e può essere controllata dal programmatore. Ciascun blocco risultante da tale suddivisione ha lunghezza arbitraria e viene detto segmento
La segmentazione presenta degli svantaggi:
La memoria si frammenta rapidamente, dato che quando si scarica un segmento viene rimpiazzato da uno più piccolo, lasciando dello spazio inutilizzato;
Non è semplice costruire con scaricamenti aree libere di dimensioni assegnate.
Tra i vantaggi:
La possibilità di far condividere a più processi alcuni segmenti;
La mancanza di vincoli sul numero di segmenti caricabili in memoria
Le periferiche virtuali
Il terzo livello del sistema operativo consente di definire dispositivi virtuali secondo alcuni criteri principali. Il sistema operativo offre a diversi utenti la possibilità di aumentare in modo virtuale il numero delle periferiche stesse attraverso lo spooling: il termine deriva da SPOOL; esso consente a diversi processi l'uso contemporaneo della stessa periferica.
Il file system
Il file system provvede alla virtualizzazione delle memorie di massa e genera una macchina costituita da una pluralità di dispositivi indipendenti l'uno dall'altro, ciascuno dei quali ha a disposizione tutte le risorse virtuali che gli possono occorrere. Tutto ciò viene registrato in MDM e prende il nome di file, organizzati a record. Il file system consente di riferirsi alle informazioni registrate in termini di identificatori adoperando allo scopo le direttrici. Inoltre possono essere memorizzate le password di accesso al file. L'organizzazione dei file è strutturata ad albero; la directory principale è detta root. I movimenti lungo l'albero corrispondono a caricamenti in memoria centrale delle diverse direttrici: quella presente in un certo momento è la direttrice corrente.
Pathname assoluto = quando viene richiamata la directory partendo da quella principale;
Pathname relativo = quando partiamo da una sotto directory.
L'interprete dei comandi
Esso è un programma che riceve in ingresso le richieste di esecuzione di operazioni, espresse usando il linguaggio comandi.
Una componente importante degli interpreti tradizionali a riga comandi è l'analizzatore sintattico, un programma che verifica la correttezza formale.
Gli ambienti di sistema
Gli ambienti di sistema comprendono:
Editori di testi che consentono di scrivere e modificare i programmi sorgente;
Compilatori, ambiente di sistema che traduce il programma sorgente in linguaggio macchina;
Linker, tutto ciò che collega quello che abbiamo scritto con le librerie di sistema;
Interpreti quando è in esecuzione svolge la funzione di traduttore simultaneo;
Debugger spulciatore di programma che fa vedere istruzione per istruzione e scopre l'errore;
Gestori di maschere per il data entry facilitano le operazioni di creazione e modifica degli archivi;
Gestori delle comunicazioni funzioni connesse con il collegamento tra risorse informatiche;
Compilazione trasforma le istruzioni del linguaggio evoluto in codice macchina. Svolge la funzione di interfaccia tra l'algoritmo del programmatore e la macchina che comprende solo istruzioni in codice oggetto.
Rilocazione trasforma gli indirizzi rilocabili del programma in indirizzi assoluti sommando a ciascuno l'indirizzo di impianto. Questo può avvenire in tre modi:
Rilocazione statica = nei sistemi dedicati i programmi utente vengono sempre caricati nella stessa zona di memoria;
Se l'indirizzo d'impianto non è noto al clinker = la rilocazione può essere effettuata ogni volta che il programma viene caricato;
Rilocazione dinamica = si effettua caricando gli indirizzi assoluti degli operandi nell'istante in cui l'istruzione che fa riferimento ad essi viene eseguita;
Esecuzione quando il programma può essere eseguito.
Le protezioni e la sicurezza
Il nome che si dà alle procedure di copia per salvataggio è backup, mentre l'operazione di recupero di dati dalle copie di sicurezza si chiama restore. I programmi di backup offrono la possibilità di crittografare i dati su cui si operano, specificando una parola chiave. Occorre infine citare i problemi legati alla diffusione dei cosiddetti virus, programmi nascosti entro altri programmi e inventati per danneggiare i sistemi informatici. A parte le precauzioni standard, una protezione antivirus significativa si può ottenere usando programmi appositamente ideati, che sono in grado di rilevare la presenza di programmi contaminati.
I sistemisti
Il sistemista è colui che si occupa dei sistemi operativi e del software di base. In generale il sistemista propone una configurazione del sistema di elaborazione in termini di risorse hardware e software: la configurazione deve essere dimensionata in modo corretto sulle esigenze presenti e future. Successivamente si occupa dell'installazione del sistema presso l'azienda, alla manutenzione e, svolge un lavoro di supporto ai produttori di nuovi programmi applicativi.
Il sistemista che si occupa della gestione del sistema operativo si chiama amministratore di sistema.
Appunti su: |
|