Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
INFORMAZIONE:
-Trasmissione e ricezione di messaggi relativi a notizie o nozioni ritenute utili o addirittura indispensabili per l'individuo o
la società.
-L'informazione è l'insieme di dati, correlati tra loro, con cui un'idea (o un fatto) prende forma ed è comunicata.
Attraverso un codice di codifica l’informazione può essere capita.
Esistono degli strumenti progettati per trattare le informazioni, un esempio possono essere i calcolatori, attraverso la
programmazione dello strumento è possibile risolvere problemi all’interno del mondo 1 (mondo degli oggetti fisici) senza
intervento di strumenti del mondo 2 (mondo delle esperienze soggettive) e/o del mondo 3 (mondo dei prodotti della
mente umana).
L’uomo ha sempre cercato strumenti di supporto nell’elaborazione delle informazioni, questi strumenti possono essere
di due tipi:
Strumenti formali: (ex. Il sillogismo) consentono di trattare entità di informazione dotate di una certa struttura,
ricavandone delle conclusioni per via puramente elaborativa.
Strumenti materiali: (ex. La galleria del vento, abaco..) che materializzano le entità di informazione su cui si opera e ne
facilitano l’operazione.
Il primo sistema programmabile venne ideato da Charles Babbage esso utilizzava un unico algoritmo e l’output avveniva
attraverso la perforazione di piastre in rame.
La macchina programmabile (analytical engine) era formata da quattro parti:
-store (memoria)
-mill (unità di calcolo)
-input (lettore di schede)
-output (perforatore di schede)
Utilizzava istruzioni di controllo per cambiare il flusso di esecuzione a seconda del valore positivo o negativo di un numero.
Grazie alla macchina nacque la figura del programmatore, la prima fu Ada Augusta Lovelace.
Durante il periodo bellico vennero realizzati diversi sistemi di elaborazione delle informazioni, in Germania, negli anni
30/40, vennero ideate delle macchine calcolatrici automatiche basate su relè elettromagnetici, durante gli anni ‘40 con
lo sviluppo delle valvole termoioniche i relè elettromagnetici vennero resi obsoleti.
Nel 1943 in Inghilterra venne realizzato COLOSSUS il primo calcolatore digitale elettronico che aveva come scopo quello
di decifrare i messaggi segreti tedeschi, qualche anno dopo nel 1946 negli Stati Uniti venne idealizzato ENIAC che aveva
come scopo la risoluzione di problemi di balistica e logistica.
John von Neumann fu un matematico e informatico che partecipò al progetto ENIAC, ebbe due intuizioni fondamentali,
la prima fu quella di memorizzare i programmi in forma digitale nella stessa memoria dei dati per rendere più semplice la
programmazione, la seconda fu quella di utilizzare l’aritmetica binaria invece che quella decimale.
Il suo progetto macchina di von Neumann è alla base di tutti i calcolatori digitali, è caratterizzata da un ipotesi
fondamentale: i dati e le istituzioni che operano su questi possono essere codificati in uno stesso formato, così che un
unico dispositivo può essere impiegato per memorizzare entrambi.
Secondo l’architettura di von Neumann un calcolatore deve essere in grado di:
eseguire istruzioni su dati (sottosistema di elaborazione)
controllare il flusso dell’esecuzione (sottosistema di elaborazione)
memorizzare i dati su cui operare (sottosistema di memoria)
memorizzare successioni di istruzioni (sottosistema di memoria)
interagire con gli utenti e con eventuali altri sistemi (sottosistema di interfaccia)
Questi tre sottosistemi (di elaborazione, memoria e interfaccia) sono interconnessi tra loro e fanno parte del sottosistema
di interconnesione.
Nella macchina di von Neumann il programma non è più una componente hardware ma software.
Ogni dispositivo è dotato di un sottoinsieme di interfaccia che rende possibile l’input dei programmi e dei dati degli utenti
verso il calcolatore e l’output dei risultati dell’elaborazione verso gli utenti.
È grazie a questo sottoinsieme che un calcolatore è in grado di trasmettere informazioni agli altri calcolatori e di ricevere
informazioni da essi, attraverso delle reti di comunicazione.
È possibile schematizzare le possibili tipologie di interazione tra esseri umani e calcolatori:
A B C
F E D
Ciclo A-F (utente → calcolatore locale → utente)
È l’interazione semplice tra un calcolatore e un utente; il calcolatore viene impiegato per la soluzione di un problema
mediante l’esecuzione locale di un programma o per l’accesso a documentazione locale.
Ciclo A-B-C-D-E-F
Interazione tra utenti mediata da calcolatori, per la soluzione di un problema mediante l’esecuzione distributiva e
cooperativa di un programma o per lo scambio di documentazione.
L’alfabeto più semplice che si possa adottare per la codifica di dati e istruzioni è costituito da due soli simboli, di solito
indicati convenzionalmente da 0 e 1, questo alfabeto viene chiamato binario ed è alla base dell’elaborazione automatica
dell’informazione. I dispositivi bistabili vengono chiamati bit, da binary digit (cifra binaria); i bit sono la quantità di
informazione che riesco a rappresentare con la cifra binaria.
Con:
• 1 bit ho 2 configurazioni → 2 entità informazione
• 2 bit ho 4 configurazioni → 4 entità informazione
• 3 bit ho 8 configurazioni → 8 entità informazione
• K bit ho 2k configurazioni → 2k entità informazione
N ≤ 2k → k ≥ log2N→ k =[log2N] (si ipotizza che tutti i codici abbiano la stessa lunghezza)
Es.
40.000.000 auto > N 26*220= 26 bit
Esempio di codifica binaria: assegnare u codice binario univoco a tutti i giorni della settimana.
Giorni della settimana: N=7 → k ≥ log27 → k=3
Con tre bit possiamo ottenere 8 diverse configurazioni.
1 bit 2 bit
4 bit
2 gruppi 4 gruppi
8 gruppi
Il sistema di decodifica più diffuso nella rappresentazione di caratteri alfanumerici è il codice ASCII (American standard
Code for Information Interchange), che utilizza 7 bit e quindi può rappresentare fino a un massimo di 128 caratteri (27=
128).
Simile al codice asci è il codice EBCDIC (Extended Binary-Coded Decimal Interchange Code) sviluppato da IMB e basato su
successioni di 8 bit.
I codici a 8 bit non sono sufficienti per rappresentare l’insieme di tutti i caratteri utilizzati; per rendere possibile la codifica
contemporanea di questo grande insieme di caratteri è stato definito un ulteriore standard, UNICODE, basato su
successioni di 16 bit quindi in grado di decodificare 65535 caratteri diversi.
Per facilitare il passaggio da ASCII a UNICODE i primi 128 caratteri del codice UNICODE sono gli stessi del codice ASCII.
Per rendere possibile l’esecuzione di programmi da parte di un calcolatore è necessario che questi siano codificati
mediante un linguaggio chiamato linguaggio macchina che l’unità di elaborazione del calcolatore è in grado di
interpretare.
A ogni istruzione è assegnato un codice univoco (codice operativo) che l’esecutore deve decodificare per identificare quali
operazioni effettuare.
La scelta delle configurazioni da assegnare alle diverse istruzioni viene compiuta cerando di rendere efficiente la fase di
decodifica, spesso i progressisti preferiscono utilizzare un numero superiore di bit a quello minimo richiesto, quindi
decidono di non utilizzare alcune configurazioni pur di rendere più semplice e veloce la codifica delle istruzioni.
La notazione decimale è la rappresentazione di tipo posizionale, cioè il valore di ogni cifra dipende dalla sua posizione
assunta nella successione di simboli che rappresenta il numero.
Es. 4243 = 4 x 103 + 2 x 102 + 4 x 101 + 3 x 100
Per un generico numero intero composto da n cifre si ha:
cn-1 cn-2 ….. c1c0 = cn-1 x 10n-1 + cn-2 x 10n-2 +c1 x 101 + c0 x 100
dove ci è una cifra tra 0 e 9.
La stessa rappresentazione può essere adottata anche per numeri espressi in una base di numerazione diversa da dieci a
disposizione B cifre, comprese tra 0 e B-1, si ha:
cn-1 cn-2 ….. c1c0 = cn-1 x Bn-1 + cn-2 x Bn-2 +c1 x B1 + c0 x B0
Conversione binario - decimale
Nel caso della numerazione binaria (B=2) l’alfabeto comprende solo due cifre 0 e 1; il valore associato per esempio al
numero 101100due può essere convertito in base dieci:
101100due = 1dieci x 25dieci + 0dieci x 24dieci + 1 dieci x 23dieci + 1 dieci x 21dieci + 0 dieci x 21dieci + 0 dieci x 20dieci =
= 1dieci x 32dieci + 0dieci x 16dieci + 1 dieci x 8dieci + 1dieci x 4dieci + 0dieci x 2dieci +0dieci x 1dieci =
= 32dieci + 8dieci + 4dieci = 44dieci
oppure
101100due=
32 16 8 4 2 1
1 0 1 1 0 0 = 32+8+4=44dieci
somma
1 1 1
0 0 0 1 1 0 0 1 +
0 0 1 1 1 1 0 0 =
0 1 0 1 0 1 0 1
Ottali ed esadecimali
Alfabeto ottale cifre comprese tra 0 e 7
Es. 354otto = 3 x 82 + 5 x 81 + 4 x 80 = 236dieci
Ogni cifra corrisponde a tre cifre binarie
Es. 11101100due = [011][101][100] 354otto
Alfabeto esadecimale cifre da 0 a 9 più lettere alfabeto dalla A alla F
La codifica binaria dei numeri interi consiste nell’indicare il segno seguito dal valore assoluto.
Questa rappresentazione, chiamata codifica con modulo e segno, utilizza il primo bit della successione per indicare il
segno ( 0 se positivo, 1 se negativo) e i restanti per la rappresentazione del valore assoluto del numero.
Quando si hanno a disposizione n bit questa codifica consente di rappresentare i numeri interi compresi tra -2n-1 + 1 e 2n-
1
–1.
Es.
+6dieci = 24+ 6 = 22 [1]0110 0110c2
-6 dieci = 24 – 6 = 10 [0]1010 1010 c2
-4 1 1 0 0
+6 1 0 1 0
+2 [1] 0 1 1 0
Per passare da +2 a -2 (o +6 a -6) o viceversa parto da destr e trascrivo i numeri finche non trovo il primo 1 a quel punto
inverto tutti i numeri
Es. 0 1 1 0
1 0 1 0
+ 0.789 x 10 72
Analogico Digitale
Definizione della codifica Sintetica + Analitica/ elencativa -
Ridefinizione della codifica al variare
dell’insieme dei simboli Nessuna ridefinizione + Estensione della regola definita in precedenza -
Condizioni sul supporto Solo se il supporto ha una struttura - Va bene in ogni caso +
La digitalizzazione
Per codificare in modo digitale una grandezza fisica i cui valori si assumono variabili in un intervallo continuo è necessario
effettuare un’operazione di discretizzazione di tali valori, attraverso un procedimento di approssimazione con uno dei
valori compresi nell’insieme di quelli previsti.
Un esempio di questo procedimento, chiamato quantizzazione, è: l’insieme dei valori che la grandezza in esame può
assumere vene suddiviso in un numero finito di sottoinsiemi, ognuno dei quali viene rappresentato mediante una codifica
digitale.
Nell’esempio (fig. a) è prevista una suddivisione su otto livelli, in modo da poter impiegare una codifica a tre bit. Per
codificare un valore della grandezza fisica si individua il sottoinsieme cui appartiene, e si determina la relativa codifica.
Questo modo di operare comporta sempre una perdita di informazione, perché tutti i valori compresi nello stesso
sottoinsieme sono codificati nello stesso modo e diventano indistinguibili. Questo fenomeno può essere limitato e reso
irrilevante riducendo la dimensione dei sottoinsiemi.
fig. a
La strategia di digitalizzazione diventa ancora più complessa quando occorre codificare grandezze fisiche che variano nel
tempo, oppure nello spazio, oppure sia nel tempo che nello spazio.
L’operazione di quantizzazione deve essere ripetuta per tutti gli istanti di tempo durante i quali si vuole mantenere
l’informazione sulla grandezza; occorre effettuare un’operazione di campionamento della grandezza: si suddivide
l’intervallo di tempo considerato in sottointervalli e per ciascuno di essi si sceglie un istante di riferimento; il valore che
la grandezza assume in quell’istante viene considerato come rappresentativo del valore di tutto l’intervallo. (fig. b)
fig. b
Mentre il parametro che qualifica la quantizzazione è il numero di bit, il campionamento è caratterizzato dalla frequenza
di campionamento, definita come il numero di campioni che vengono acquisiti nell’unità di tempo: per grandezze variabili
con sufficiente rapidità l’unità di tempo impiegata è il secondo, perciò la frequenza di campionamento si misura in
campioni al secondo.
Se con la quantizzazione si discretizza il valore della grandezza, con il campionamento si discretizza il tempo in cui la
grandezza viene osservata. Come accade per la quantizzazione , anche nel caso del campionamento la discretizzazione
provoca una perdita di informazione, dovuta al fatto che si considera un campione come rappresentativo di tutti i valori
che la grandezza assume in un intervallo di tempo. Anche per ridurre la perdita di informazione dovuta al campionamento
è possibile aumentare la frequenza restringendo l’intervallo di tempo che separa i due campioni successivi.
fig. c
Le operazioni di campionamento e quantizzazione si possono applicare anche quando si vuole ottenere una codifica
digitale di grandezze che variano nello spazio invece che nel tempo.
Esempi:
• nelle immagini: il campionamento consiste nel dividere l’immagine in sottoinsiemi, per ognuno dei quali si dovrà
prelevare un campione che si considera rappresentativo del colore di tutto il sottoinsieme. Questi sottoinsiemi
sono trattati come gli elementi di base dell’immagine digitale e sono chiamati pixel.
• Nel campionamento della musica quanti più campioni vengono rilevati nell’unità di tempo tanto più precisa è la
riproduzione del suono.
La compressione dei dati
L’operazione di compressione sfrutta generalmente una serie di informazioni relative alla natura, alla struttura e alla
destinazione d’uso dei dati da comprimere.
Alcune tecniche di compressione risultano particolarmente adatte a una specifica applicazione e potrebbero portare a
una codifica peggiore in termini di bit usati qualora fossero impiegate per altre applicazioni.
Gli algoritmi di compressione dei dati possono essere distinti in due categorie: lossless (senza perdite) e lossy (con
perdite).
Le tecniche di compressione lossless mantengono l’informazione originaria, permettendo di ricostruirla con la semplice
inversione di operazione di compressione, che opera riducendo al limite, o eliminando, le ridondanze presenti
nell’informazione stessa. Si adottano gli algoritmi lossless quando non si può perdere l’informazione.
Gli algoritmi lossless vengono anche utilizzati per la generazione di archivi di file o cartelle che grazie alla compressione
occupano meno spazio.
Il limite degli algoritmi che rientrano in questa categoria è il loro rapporto di compressione che è fortemente variabile in
funzione del tipo di file che viene compresso, a causa della diversa ridondanza dei dati presenti nei vari tipi di file.
Le tecniche lossless possono essere divise in tecniche statistiche e tecniche basate sulla sostituzione.
Nelle tecniche statistiche l’informazione viene analizzata dal punto di vista statistico al fine di assegnare ai simboli una
nuova rappresentazione caratterizzata da una lunghezza di bit variabile, che utilizzi successioni di bit più brevi per i simboli
più frequenti. Un esempio di algoritmo di compressione statistico è dato dall’algoritmo di Huffman.
Le tecniche basate sulla sostituzione sfruttano la regolarità dei dati e operano sostituendo simboli elementari della nuova
rappresentazione a successioni di simboli ripetute dalla rappresentazione originale.
Le tecniche di compressione lossy sono basate su alcune considerazioni concernenti la qualità dell’informazione
realmente necessaria per l’uso che sene deve fare.
Il principio è che si può accettare di perdere durante la compressione una parte dell’informazione originale se il risultato
che si ottiene dalla decompressione consente un uso appropriato dell’informazione stessa.
Le tecniche lossy sono impiegate soprattutto per il trattamento di immagini fisse, in movimento e di segnali audio. In
esempio molto conosciuto in cui le tecniche di compressione lossy vengono utilizzate è YouTube.
Per quanto riguarda le immagini fisse, le tecniche si basano sulla scarsa capacità di risoluzione dell’occhio umano o sulla
sua capacità di reintegrare automaticamente l’informazione eliminata in un’immagine riducendo il numero e i gradienti
di colore, o sostituendo i gradienti originali con una versione ricostruita in base a un’informazione parziale.
Per quanto riguardai segnali video, alle possibilità delle immagini fisse si somma quella offerta dalla ridondanza del flusso
di informazione nel tempo: ogni fotogramma può essere codificato mantenendo solamente le differenze rispetto al
fotogramma precedente.
Per quanto riguarda i file audio, si sfruttano le conoscenze sulla risposta meccanica dell’orecchio umano agli stimoli per
eliminare i dettagli che non sono nella gamma delle frequenze udibili o che non sono intelligibili perché coperti da suoni
riavvicinati a volume maggiore.
3. L’algebra booleana.
Gli algoritmi contengono spesso delle istruzioni di controllo, che consentono di modificare il flusso di esecuzione in
funzione del valore, vero o falso, assunto da condizioni logiche.
Le regole che .stabiliscono come combinare le condizioni sono quelle di algebra booleana.
Gli operandi dell’algebra booleana binaria possono assumere solo due valori 0 e 1 (true e false).
Le operazioni di base sono tre: “NOT”, “AND” e “OR”.
“NOT” : si applica a un operando, restituisce il valore opposto a quello dell’operando cui viene applicato (il risultato è vero
se è falso: not(F) = T, not(T) = F)
“AND” : si applica a due operandi e restituisce un valore true quando entrambi gli operandi sono true altrimenti se almeno
uno dei due è falso il risultato è falso (X)
F and T = F / T and T = T
F and F = F / T and F = F
F and T = F / T and F = F
“OR” : si applica a due operandi e restituisce valore true, altrimenti restituisce false, perciò F or T = T mentre F or F = F
anche in questo caso valgono la proprietà commutativa (a or b = b or a), associativa (a or (b or c) = (a or b) or c) e di
idempotenza (a or a = a) (+)
La somma booleana di F non cambia il valore di a (F or F = F / T or F = T)
Quando si fa la somma booleana di F a un qualsiasi valore si ottiene come risultato T (F or T = T / T or T = T)
La somma booleana di un valore e del suo complemento da come risultato T (F or T = T / T or F = T)
“ ≡ ” : il risultato è vero se i due operandi sono uguali tra loro ( T ≡ T = T / F ≡ F = T)
“XOR” : il risultato è vero solo se uno dei due è vero e l’altro è falso, non se entrambi sono veri (T xor T = F / T xor F = T)
“NAND” : negazione di AND
“NOR” : negazione di OR
Qualsiasi espressione booleana può essere scritta usando solo “NAND” O “NOR” oppure “AND+NOT”
Proprietà distributiva: nell’algebra booleana si applica anche al prodotto rispetto alla somma (a + (b x c) = (a + b) x (a + c))
e non solo alla somma rispetto al prodotto (a x (b + c) = (a x b) + (a x c))
Proprietà di assorbimento: della somma rispetto a prodotto (a x (a + b) = a)
e del prodotto rispetto alla somma (a + (a x b) + (a x c))
Proprietà di De Morgan: il complemento del prodotto di due termini si ottiene dalla somma dei complementi dei due
termini (-(a x b) = (-a) + (-b)) e il complemento della somma di due termini si ottiene dal prodotto dei complementi dei
due termini (-(a + b ) = (-a) x (-b))
7 le infrastrutture software
Un sistema operativo è un insieme di programmi che agiscono da intermediario tra l’utente e la macchina hardware;
fornisce all’utente vari strumenti: un ambiente per l’esecuzione di altri programmi e una visione astratta dell’hardware.
Oltre a quanto necessario per gestire in modo ottimale le risorse fisiche del sistema operativo, comprendono spesso
anche dei programmi di utilità, che mirano a semplificare l’interazione dell’utente con il sistema.
Oltre alla sua funzione principale, ovvero fornire dei servizi ai programmi applicativi e agli utenti rendendo utilizzabili le
risorse fisiche presenti nel sistema informatico, un sistema operativo deve anche:
• Garantire la correttezza e la precisione nell’elaborazione e nella trasmissione dell’informazione
• Consentire all’utente di sfruttare la presenza di una rete che gli permetta di accedere alle applicazioni da ogni
luogo e in ogni momento
• Garantire affidabilità, disponibilità e sicurezza dei sistemi
• Assicurare la privatezza dei dati
• Garantire la realizzazioni aperte, ovvero consentire il funzionamento in uno stesso sistema di componenti
hardware e software forniti da diversi produttori
• Superare i problemi legati alla limitazione del numero di risorse e regolamentarne l’impiego evitando conflitti di
accesso
Il sistema operativo rappresenta una infrastruttura software che si pone come interfaccia tra l’infrastruttura hardware e
l’utente o il software applicativo e che serve a facilitare l’utilizzo e la gestione delle varie risorse del sistema.
Un SO deve essere in grado di svolgere delle funzioni di servizio, tra cui:
• Controllo dell’esecuzione delle applicazioni: esso gestisce per conto dell’utente operazioni (es. caricamento del
programma nella memoria centrale, inizializzazione dei dispositivi di ingresso/uscita, preparazione e gestione di
altre risorse come la rete di comunicazione).
• Accesso ai dispositivi di ingresso/uscita: maschera i dettagli di basso livello di controllo delle periferiche (es.
gestione dei segnali necessari per il trasferimento dei dati, consente all’utente di ragionare in termini di
operazioni astratte di lettura e scrittura).
• Archiviazione di dati e programmi: per particolari dispositivi di memorizzazione il SO si occupa di fornire
un’organizzazione logica dei dati sotto forma di cartelle e file, gestendo le relative operazioni di basso livello di
ingresso e uscita.
• Il controllo di accesso: nei sistemi che prevedono la condivisione di risorse da parte di più utenti o applicazioni,
il SO introduce dei meccanismi di protezione e politiche di risoluzione degli eventuali conflitti d’uso.
• Contabilizzazione: in situazioni particolari l’uso delle risorse può essere soggetto a monitoraggio da parte del SO
al fine di ottimizzare il tempo di risposta dei programmi interattivi oppure di fatturare agli utenti i costi
dell’impiego del sistema.
• Gestione dei malfunzionamenti: il SO si occupa di rivelare e di risolvere eventuali malfunzionamenti provocati
da guasti hardware o da operazioni scorrette compiute dal software applicativo.
L’interprete dei comandi è un modulo direttamente accessibile dall’utente e che ha la funzione di interpretare i comandi
che gli giungono e di attivare i programmi corrispondenti. Le operazioni che esso svolge in modo trasparente all’utente
sono:
• Lettura della memoria di massa del programma da eseguire
• Allocazione della memoria centrale
• Caricamento del programma e dei relativi dati della memoria allocata
• Creazione e attivazione del processo corrispondente
I programmi di utilità consentono di ampliare le funzionalità del sistema operativo, al fine di facilitare e ottimizzare
l’utilizzo del calcolatore da parte sia degli utenti sia degli amministratori del sistema.
L’architettura di Von Neumann è basata sul principio dell’esecuzione sequenziale di operazioni elementari.
Il concetto di elaborazione parallela si riferisce :
• Ai dati che potrebbero essere trattati parallelamente
• Alle istruzioni che potrebbero essere eseguite contemporaneamente nel caso di operazioni indipendenti che
trattano dati distinti
• Ai programmi che potrebbero essere in esecuzione nello stesso tempo
Il parallelismo a livello di dati e istruzioni è possibile solo con l’impiego di architetture di elaborazione parallela, basate
sulla presenza di più unità di elaborazione in grado di eseguire istruzioni in modo concorrente ma anche di adeguati
linguaggi di programmazione.
Un SO deve gestire un insieme di risorse scarse, con l’obbiettivo di ridurne i periodi di inutilizzo, aumentare l’utilizzo del
sistema e ridurre i tempi di risposta.
Le condizioni che un sistema operativo deve soddisfare sono:
• Efficienza: occorre assicurare un impiego ottimale di tutte le risorse
• Interattività: il tempo di risposta è un fattore determinante per definire la qualità del sistema operativo
• Sincronizzazione/cooperazione: gestire la conseguente presenza di più agenti in grado di operare sul sistema in
modo concorrente, al fine di evitare malfunzionamenti.
Le condizioni di parallelismo a livello di programma vengono descritte facendo riferimento ai processi (programmi in
esecuzione): ogni processo è caratterizzato da un programma eseguibile, dai relativi dati e dalle informazioni ausiliarie
relative al suo contesto necessarie per l’esecuzione del programma.
I processi hanno una natura dinamica ed evolvono nell’ambiente rappresentato il loro contesto.
A un programma può corrispondere più di un processo, nel caso in cui a un unico eseguibile siano associati diversi processi
(figli) ognuno afferente a una diversa parte del programma originario (padre).
Il componente in grado di eseguire i processi viene detto genericamente processore. Nel caso in cui sia presente una sola
CPU, il sistema operativo simula il parallelismo fra i processi, mentre in sistemi con più processori ogni processo od ogni
gruppo di processi può essere assegnato a un processore diverso.
Il processore ha la possibilità di lavorare in due modalità di esecuzione diverse: la modalità utente e la modalità
supervisione.
In modalità supervisore il processore ha accesso a tutta la memoria ed è in grado di eseguire tutte le istruzioni.
L’esecuzione in modalità utente non consente l’accesso a tutte le risorse fisiche e possono essere eseguite solo alcune
istruzioni.
Le istruzioni eseguibili solo in modalità supervisore sono dette privilegiate. Il sistema operativo viene eseguito in modalità
supervisore e si incarica di fornire servizi richiesti dai programmi applicativi che lavorano in modalità utente.
Nella gestione dei processi da parte del sistema operativo ogni processo può trovarsi in uno di questi quattro stati:
• In esecuzione in modalità utente: con il processore a disposizione per l’esecuzione del proprio codice. (in
calcolatori dotati di un solo processore solo un processo può trovarsi in questo stato)
• In esecuzione in modalità supervisore: in esecuzione di istruzioni privilegiate o delle funzionalità del sistema
operativo.
• Pronto: in grado o in attesa di essere eseguito, non appena il processore sarà disponibile dopo il suo rilascio da
parte del processo correntemente in esecuzione. I processi in questo stato vengono solitamente posti in una
coda gestita tipicamente secondo la politica first in first out.
• In attesa: non è in grado di essere eseguito dal processore poiché in attesa del verificarsi di un evento esterno.
In un dato istante solo un processo può essere in esecuzione, ma essendo i sistemi operativi attuali multiprogrammabili
più processi possono essere in stato di pronto o in attesa di eventi esterni.
Problematiche di concorrenza fra processi.
L'esecuzione concorrente di più processi può portare notevoli benefici rispetto a un'esecuzione rigidamente sequenziale,
e in particolare la possibilità di:
• impiegare calcolatori con più di un processore, suddividendo il carico computazionale di più processi in
esecuzione contemporanea su differenti CPU. In modo concettualmente analogo, è possibile distribuire il carico
sulle CPU di diversi calcolatori collegati in rete e accedere contemporaneamente, da parte di diversi utenti, a
una base di dati comune e centralizzata per ottenere delle risposte con brevi tempi di attesa
• aumentare l'utilizzo della CPU nei sistemi a partizione di tempo, ove si eseguono più lavori in quasi parallelismo
• condividere la stessa risorsa fisica fra diversi utenti in modo del tutto trasparente ma controllato.
Spesso la memoria centrale non ha dimensioni tali da contenere tutti i programmi che occorre eseguire in modo
concorrente per motivi di poco spazio per attivare nuovi processi o per mancanza di spazio per consentire l’evoluzione di
qualche processo in esecuzione; la soluzione è trasferire il contenuto di un’area della memoria centrale in un’area della
memoria di massa (area di swap).
Questa tecnica detta swapping viene applicata trasferendo su disco i dati relativi ai processi in stato di attesa o di pronto
per l’esecuzione. Per motivi di efficienza vengono messi in esecuzione solo i processi presenti in memoria centrale al fine
di evitare l’onerosa operazione preliminare di caricamento da disco.
Un’ulteriore miglioramento nell’uso della memoria si ottiene suddividendo il programma in un certo numero di sezioni,
di dimensioni fisse e uguali fra loro dette pagine logiche e in corrispondenza organizzando allo stesso modo anche la
memoria fisica in pagine fisiche della stessa dimensione delle pagine logiche. Questa soluzione rende possibile:
• Estendere la dimensione di un processo utilizzando delle zone di memoria non necessariamente contigue.
• Tenere in memoria solo la porzione ridotta del programma che si sta utilizzando.
La paginazione si basa sul principio di località spazio-temporale, non vale la pena caricare sulla RAM l’intero codice poiché
l’esecuzione in un dato istante di tempo si limita ad una sezione limitata del codice stesso che viene rieseguita.
La memorizzazione in pagine fisiche delle pagine logiche permette di caricare i programmi in memoria centrale anche se
non esiste un’area contigua sufficientemente ampia per contenerli, purché sia globalmente disponibile una quantità di
memoria sufficiente.
Vengono caricate, in alcune pagine fisiche su RAM, solo alcune pagine logiche del codice in esecuzione. Le pagine logiche
necessarie vengono caricate di volta in volta, in base all’esigenza.
Si ipotizza di avere un processo (processo 1) composto da due pagine logiche (PL0, PL1) che corrispondono alle pagine
fisiche (PF3, PF4): in questo caso viene mantenuta la contiguità dello spazio di indirizzamento.
Il permanere di questa situazione renderebbe problematica la presenza in memoria di un secondo processo che è lungo
più di tre pagine logiche, data l’assenza di un insieme di pagine contigue libere in grado di contenerlo.
La gestione della memoria in modo paginato consente di risolvere questo genere di problemi, solitamente serve un
dispositivo hardware aggiunto in grado di convertire gli indirizzi logici cui fa riferimento il programma nei corrispondenti
indirizzi fisici; Memory Management Unit.
La MMU utilizza una tabella delle pagine in modo da mantenere la relazione tra ogni pagina logica e l’indirizzo della pagina
fisica corrispondente.
Al fine di ottimizzare ulteriormente l’utilizzo della memoria è possibile tener in memoria solo le pagine logiche del
processo al quale si sta accedendo più frequentemente.
Ogni volta che si cerca di accedere a un indirizzo relativo a una pagina non in memoria il sistema operativo provvede a
liberare dello spazio in memoria e a caricare la pagina richiesta.
Un opportuno dimensionamento su base statistica del numero di pagine logiche da tenere in memoria consente in genere
di ridurre il numero di page fault che comportano un rivelante sovraccarico per il sistema operativo.
Questa tecnica di memoria virtuale permette di operare con programmi la cui dimensione supera quella della memoria
fisica poiché non è più necessario che siano contenuti interamente in memoria centrale.
La paginazione risolve contemporaneamente tre problemi:
• Dove mettere il processo in memoria
• Superare il numero di processi che posso gestire contemporaneamente
• Superare la dimensione fisica della memoria di lavoro
La memoria di un processo può essere distinta anche in base alla tipologia di informazione che contiene. La suddivisione
della memoria di un processo in base alla tipologia di informazione che contiene si chiama segmentazione.
Uno dei vantaggi della segmentazione è la possibilità di far condividere lo stesso codice a più processi, lasciando che
agiscano su dati differenti.
I segmenti possono essere gestiti in modo paginato.
Gestione delle periferiche
Le funzionalità che un sistema operativo mette a disposizione dell’utente per interagire con le periferiche consentono di
effettuare operazioni di lettura e scrittura mediante programmi indipendenti dalla struttura hardware delle periferiche
in questione, in modo del tutto analogo a quanto accade per la gestione dei file. Questi comandi ad alto livello sono
realizzati facendo uso di meccanismi di gestione di bassi livello che comprendono:
• Controller: dispositivi hardware che servono ad effettuare a livello fisico le operazioni di trasferimento dei dati
con le periferiche.
• Driver: programmi software finalizzati alla gestione delle periferiche. Appartengono al sistema operativo anche
se vengono spesso realizzati e forniti dai produttori delle periferiche.
I sistemi operativi contengono i driver per la gestione delle periferiche più comuni. Ogni aggiunta o modifica alla
configurazione standard comporta l’installazione di software addizionale (driver aggiuntivi).
I sistemi operativi più recenti sono dotati di sistema Plug&Play che permettono la configurazione automatica dei driver
(all’attivazione il SO scandisce ed esamina tutte le periferiche collegate del sistema).
Un sistema PnP consente di aggiungere (plug) nuove periferiche al sistema che possono essere utilizzate (play), senza la
necessità di intervento da parte dell’utente per la selezione e l’installazione dei driver.
I driver servono anche a virtualizzare la presenza di più periferiche intrinsecamente non condivisibili, tramite la tecnica
di spooling.
File system
L’obbiettivo del file system è quello di presentare all’utente l’organizzazione logica dei dati e le operazioni che è
possibile compiere su di essi
Operazioni di base di un file system:
• Recupero di dati precedentemente memorizzati
• Eliminazione dei dati obsoleti modifica/aggiornamento dei dati preesistenti
• Copia dei dati per backup o trasferimento
I servizi che il file system fornisce vengono forniti sia ai programmi applicativi che agli utenti.
I nomi dei file sono generalmente composti da due parti: il nome (assegnato dall’utente) e l’estensione ( associata al
programma che ha generato il file e consente di identificare la tipologia dei dati contenuti nel file).
I file sono generalmente organizzati in cartelle o sottocartelle in una gerarchia ad albero