Sei sulla pagina 1di 22

1.

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-E-F (utente → calcolatore remoto/server → calcolatore locale/client)


È l’interazione tra un utente e un calcolatore remoto, mediata da un secondo calcolatore in rete con il primo, per la
risoluzione di un problema mediante l’esecuzione remota o distribuita di un programma o per l’accesso a
documentazione remota.
L’architettura client-server può essere a più livelli.

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.

La comunicazione può essere sincrona (chiamata) o asincrona (messaggistica normale)


Per quanto riguarda la comunicazione asincrona nella messaggistica normale (es. whatsapp) i livelli tra i due utenti non
sono due ma almeno tre, mentre è diverso per la email dove un utente invia un email al server di posta elettronica l’altro
utente si collega a un server per poterla leggere quindi si tratta di un’interazione a due livelli per inviare e a due o più
livelli per leggerle.
2. L’INFORMAZIONE E LA SUA CODIFICA
L’Association for Computing Machinery (ACM) ha definito l’informatica come lo studio sistematica degli algoritmi che
descrivono e trasformano l’informazione: la loro teoria, analisi, progetto, efficienza, realizzazione e applicazione; secondo
un'altra definizione l’informatica è la scienza della rappresentazione dell’elaborazione dell’informazione. Queste
definizioni attribuiscono un ruolo fondamentale al concetto d’informazione considerato fondamentale anche per la
caratterizzazione delle telecomunicazioni, ovvero la trasmissione rapida dell’informazione.
L’informazione deve essere portata, trasmessa, memorizzata o contenuta in qualcosa; essa è disponibile solo se è
accessibile il supporto su cui è mantenuta. Ogni supporto ha le sue caratteristiche in quanto è il mezzo su cui può essere
scritta l’informazione, alcuni supporti sono particolarmente adatti alla trasmissione dell’informazione, ma non alla sua
memorizzazione oppure viceversa.
La stessa informazione può essere scritta su supporti differenti, uno stesso supporto può portare informazioni differenti.
L’insieme delle regole che definiscono la relazione tra informazione e sistemi fisici è una componente fondamentale del
linguaggio.
Si può chiamare codifica l’operazione con cui l’informazione viene scritta su un supporto fisico e decodifica l’operazione
con cui l’informazione viene letta.
La distinzione tra informazione e supporti fisici è in termini di entità logiche e entità fisiche: l’informazione richiede un
supporto fisico ma non coincide con esso.
L’informazione può venire creata e distrutta.
È possibile codificare anche il modo di trattare l’informazione; quando il trattamento dell’informazione non prevede la
sua trasformazione, ma la sua trasmissione si ha la comunicazione.
Si ottiene informazione quando, dato un insieme di alternative a priori possibili, grazie alla lettura del supporto queste
vengono selezionate e altre eliminate.
Non tutti i sistemi fisici risultano adatti come supporti per l’informazione, la condizione necessaria perché un supporto
sia in grado di portare l’informazione è che esso possa assumere configurazioni differenti a ognuna delle quali venga
associata una differente entità di informazione.
Un supporto che non può avere diverse configurazioni non può portare nessuna entità di informazioni.
Per poter interpretare le diverse configurazioni del supporto in termini di informazione è necessario un codice, ovvero
una regola la cui validità è concordata per convenzione tra tutti coloro che debbano usare quell’informazione. La
definizione di un codice comporta che siano identificati in modo ambiguo l’insieme delle possibili configurazioni del
supporto e l’insieme delle possibili entità di informazione a cui ci si vuole riferire.
Variando il codice è possibile riferirsi a entità di informazione differenti utilizzando uno stesso supporto fisico.
Il codice che stabilisce una relazione tra configurazioni del supporto fisico e messaggi è definito da una relazione tra
configurazioni elementari e simboli, e da una regola che specifica come i simboli devono essere composti per generare un
messaggio.
Volendo interpretare un messaggio scritto in una configurazione del supporto fisico basta disporre di un codice che associ
configurazioni elementari a simboli e di una regola che indichi come comporre i simboli in un messaggio. Il codice da
configurazioni elementari a simboli ha un grado di complessità inferiore a quello del codice da configurazioni a messaggi
quindi è anche più semplice da memorizzare e applicare.
Un supporto fisico può essere a più livelli (es. il telegrafo).
Il concetto di informazione interviene su almeno due livelli distinti: un livello fisico (dove l’informazione è connessa alla
selezione di una specifica configurazione da un insieme di configurazioni possibili) e un livello logico (dove per ogni
configurazione si stabilisce un significato in termini di entità di informazione o messaggi).
Si può considerare un terzo livello in cui interviene il concetto di informazione, quando ad una configurazione del supporto
fisico cui si è attribuito un significato si intende associare un valore che metta in evidenza se e in quale misura lo scopo
per cui l’informazione è stata generata/trasmessa/ricevuta è stato raggiunto.
Questi tre livelli possono essere:
• informazione sintattica: quando ci si chiede se un certo supporto fisico è in grado di costruire la base su cui un
certo messaggio può essere scritto. Inoltre ci si pone un problema di relazioni tra segni cioè tra configurazioni
del supporto fisico.
• Informazione semantica: ci si chiede quale significato sia da attribuire a una certa configurazione del supporto
fisico. Ci si pone un problema di relazioni tra segni e significati.
• Informazione pragmatica: ci si chiede quale valore sia da attribuire a una certa configurazione del supporto fisico.
Ci si pone il problema di relazioni tra segni, significati e valori.
La codifica binaria
Un algoritmo è la sequenza di istruzioni scritte in modo in modo tale che l’esecutore possa eseguirle.
Un programma è un algoritmo scritto in modo da poter essere eseguito da un calcolatore.
Per poter scrivere un programma è necessario rappresentare istruzioni e dati in un formato tale che l’esecutore
automatico sia in grado di memorizzare e manipolare.

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

Quanti bit servono per codificare N oggetti?

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.

Lunedì Lunedì Lunedì Lunedì 000


00
Martedì Martedì Martedì Martedì 001
Mercoledì Mercoledì 0 Mercoledì Mercoledì 010
01
Giovedì Giovedì Giovedì Giovedì 011
Venerdì Venerdì Venerdì Venerdì 100
1 10
Sabato Sabato Sabato Sabato 101
Domenica Domenica Domenica Domenica 110
11
101
111

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

conversione decimale – binario


565dieci= 5dieci x 102dieci + 6 dieci x 101dieci + 5dieci x 100dieci =
=101due x 10102dieci + 110due x 1011 due+ 101due x 10100 due =
=101due x 1100100dieci + 110due x 1010due+ 101due x 1 due =
= 111110100dieci + 111100due+ 101 due =
=1000110101due

789dieci : 2 = 394 resto 1


394 : 2 = 197 resto 0
197 : 2 = 98 resto 1
98 : 2 = 49 resto 0
49 : 2 = 24 resto 1
24 : 2 = 12 resto 0
12 :2=6 resto 0
110001010due = 789dieci
6 :2=3 resto 0
3 :2=1 resto 1
1 :2=1 resto 1

Operazioni con numeri binari

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

La codifica binaria dei numeri razionali


In alcuni casi è necessario operare con numeri decimali, un primo problema riguarda il fatto che la rappresentazione
esatta di un numero decimale potrebbe richiedere un numero di cifre illimitato mentre la rappresentazione che può
essere utilizzata da un esecutore automatico deve prevedere solo successioni di bit di lunghezza finita; per questo motivo
è necessario approssimare numeri di questo genere con numeri razionali il cui numero di cifre sia limitato, ma che sia
comunque sufficiente a garantire un grado di precisione appropriato agli scopi dell’elaborazione.
Nelle rappresentazioni basate sulla notazione posizionale le cifre più significative sono quelle associate ai pesi maggiori
(es. 723dieci 7 è la cifra più significativa, associata al peso 103 ).
Quando i numeri da codificare hanno un valore assoluto molto grande o molto piccolo, è spesso sufficiente considerare
solo le cifre più significative, adottando una rappresentazione che viene indicata con il nome di notazione scientifica per
cui un numero viene rappresentato in base 10 come 0.m x 10e , il coefficiente m, detto mantissa e l’esponente e cui
elevare la base di numerazione.

+ 0.789 x 10 72

segno mantissa esponente


Nella rappresentazione si fissano la lunghezza massima di cifre della mantissa e dell’esponente. Per rappresentare numeri
più piccoli in valore assoluto del minimo numero rappresentabile mediante mantissa normalizzata ed esponente minimo
si deroga alla normalizzazione e si ammettono mantisse che abbiano degli zeri iniziali. In questo modo si riduce l’ampiezza
dell’intervallo di numeri non rappresentabili con le ipotesi fissate che costituisce l’area di underflow numeri troppo piccoli
che non riesco a rappresentare).
L’interesse a uniformare la precisione di calcolo nelle diverse situazioni ha condotto alla definizione di uno standard
internazionale (IEEE-754) proposto dall’institute of Electrical and Electronic Engineers (IEEE) che stabilisce la lunghezza di
mantissa ed esponente:
• Per i numeri a “precisione singola” sono previsti 32 bit dei quali il primo indica il segno.
• Per i numeri a “precisione doppia” sono previsti 64 bit dei quali il primo indica il segno.
Codifica analoga e digitale
Esistono due tipi diversi di informazione: classificatoria e più che classificatoria.
Un’informazione classificatoria è fondata sulla possibilità di distinzione, è utile per discriminare tra elementi compresi in
un elemento finito.
Un’informazione più che classificatoria è utile per riconoscere distinzioni, stabilire una relazione d’ordine e stabilire una
metrica.
L’insieme delle entità di informazione ha una struttura, la struttura dice cosa si può fare con le entità di informazione
dell’insieme, in termini di operazione di combinazione e di confronto.
Si tratta di informazione su informazione (meta-informazione) in presenza della quale l’insieme delle entità di
informazione diventa un sistema, ovvero un insieme con struttura.
Ci sono due tipi di meta-informazione esplicita nel supporto e implicita nella regola di codifica.
Meta-informazione esplicita nel supporto: ANALOGICA il supporto ha una struttura corrispondente a quella presente tra
entità di informazione.
Meta-informazione implicita nella regola d codifica: DIGITALE al supporto si richiede solo di avere configurazioni
molteplici e distinguibili l’una dall’altra, viene definita in modo estensionale nella regola di codifica. Nella codifica digitale
vengono utilizzati dei simboli.

Differenza tra codifica analogica e codifica digitale.

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 -

Applicabilità rispetto alla cardinalità


dell’insieme dei simboli Va bene anche per la cardinalità Solo se la cardinalità è finita e con simboli noti a
+ -
non finita priori

Applicabilità rispetto la struttura


dell’insieme dei simboli Solo se c’è una struttura - Va bene in ogni caso +

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”

Due espressioni booleane sono equivalenti se hanno la medesima tavola si verità


Un’espressione booleana è una tautologia se è sempre vera esempio: A or (not A)
Un’espressione booleana è una contraddizione se è sempre falsa esempio: A and (not A)

Proprietà degli operatori booleani

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.

In un sistema operativo si possono tipicamente identificare:


• Sistema di gestione del processore: controlla l’unità centrale di elaborazione e definisce quali programmi sono
da eseguire e quali compiti sono da assegnare alla CPU.
• Sistema di gestione della memoria: controlla l’allocazione della memoria di lavoro ai diversi programmi che
possono essere contemporaneamente in esecuzione
• Sistema di gestione delle periferiche: garantisce l’accesso ai dispositivi di ingresso/uscita e maschera i dettagli di
basso livello e gli eventuali conflitti che possono insorgere nel caso che diverse richiese arrivino
contemporaneamente a uno stesso dispositivo
• Sistema di gestione dei file: consente l’archiviazione e il reperimento dei dati sfruttando le periferiche che
costituiscono la memoria di massa
• Sistema di gestione degli utenti e dei relativi comandi: permette agli utenti di accedere in maniera semplice e
intuitiva alle funzionalità disponibili.
• Sistema di gestione della rete: interfaccia con risorse collegate via rete e di comunicare con processi in
esecuzione su altri calcolatori
Un SO è dunque un insieme di programmi impiegato per controllare altri programmi, eseguiti dallo stesso processore;
in questo caso il sottosistema controllore (SO) e il sottosistema controllato sono analoghi. Ci sono diverse differenze
tra programmi applicativi e sistema operativo:
• I programmi applicativi: hanno accesso a un insieme ridotto di risorse, possono utilizzare solo un
sottoinsieme delle istruzioni del processore (esecuzione in modalità utente), non possono decidere
autonomamente quando e come avere accesso alle risorse del sistema
• Il SO: ha accesso a tutte le risorse, può utilizzare tutte le istruzioni del processore (esecuzione in modalità
supervisione), stabilisce in che ordine e come le richieste che deve ricevere devono essere soddisfatte.
Il sistema operativo è un insieme di programmi (istruzioni che possono essere interpretate da un calcolatore) che agiscono
da intermediario tra utente e macchina hardware.
Il SO può essere caratterizzato come un insieme di processi di servizio e di un gestore detto nucleo o kernel, che opera
come sistema di controllo dei processi.
Due modelli organizzativi di riferimento per i sistemi operativi dei calcolatori stand-alone possono essere il modello
monolitico e il modello a strati.
Il modello monolitico adatto alle realizzazione di sistemi semplici e non soggetti a cambiamenti dell’hardware.
In questo modello il SO è costituito da un solo processo che provvede all’esecuzione delle procedure necessarie alla
gestione del sistema. Solitamente i processi applicativi richiedono al sistema operativo l’esecuzione di particolari servizi
attraverso le chiamate di sistema, memorizzando in un luogo predefinito i parametri che specificano il tipo di servizio
richiesto. Si possono individuare due modalità di funzionamento:
• Utente: per la normale esecuzione dei processi e(non è possibile accedere liberamente a tutte le risorse del
sistema)
• Supervisore: usata per lo svolgimento dei servizi richiesti al sistema operativo da parte di un processo (non esiste
alcun limite alle operazioni effettuabili)
Nel modello a strati il sistema operativo è strutturato in una successione di strat, ognuno costruito a partire da quelli
sottostanti. Le funzioni di gestione delle risorse vengono svolte direttamente dai processi utente: esse sono realizzate
mediante procedure operanti su procedure comuni che devono essere condivisi fra i vari processi.
Grazie a questa struttura a moduli le funzioni realizzate dal sistema operativo sono ripartite in componenti fra loro
relativamente indipendenti e implementate dai processi gestiti dal nucleo, l’unico componente dipendete delle
caratteristiche hardware del calcolatore. Ciò consente una separazione tra meccanismi e politiche di gestione delle
risorse.
Il sistema operativo risulta fortemente portabile: con eccezione del nucleo, l’intero ambiente può essere adattato a
calcolatori diversi con una certa facilità.
Questo modello però offre dei limitati meccanismi di protezione dei dati: ogni processo può accedere ai dati comuni
relativi alle risorse, con la possibilità di interazioni a livello di processi generino risultati non prevedibili e scorretti.
I sistemi operativi attualmente più diffusi hanno risentito di questa impostazione, essendo strutturati su un modello
ulteriormente evoluto, in cui ogni strato corrisponde a una macchina virtuale che usa i servizi di livello sottostante per
per fornire altri di tipo più astratto.
In questi sistemi, la strutturazione à volta alla creazione di un insieme di ambienti protetti entro i quali i vari processi
possono evolvere, ciascuno nell’apparenza di disporre di una macchina virtuale, dotata di tutte le risorse di quella reale
e a esso completamente dedicata. I diversi moduli del sistema operativo visualizzano specifiche risorse fisiche:
• Nucleo o kernel : consente ad ogni processo di considerare il
processore completamente dedicato alla sua esecuzione
• Gestione della memoria: consente di gestire la memoria
centrale come se fosse totalmente dedicata al processo
• Gestione periferiche: permette al processo di interagire con le
periferiche in modo astratto
• Gestione di file (file system): consente al processo di accedere
ai file indipendentemente della struttura fisica del disco.

Ogni macchina virtuale è un insieme di programmi che realizza


funzionalità utilizzando i servizi forniti dal livello inferiore.
Ogni macchina virtuale gestisce risorse specifiche del sistema,
fornendo meccanismi logici di accesso che regolamentano l’uso della
macchina virtuale stessa e sono accessibili con modalità standardizzate
e indipendenti dalla loro realizzazione.
Lo scopo principale del nucleo è quello di gestire i
processi corrispondenti ai programmi che sono
contemporaneamente attivi, originati dalle
applicazioni utente o dedicati alla gestione del
sistema informatico .
Il nucleo fornisce alle macchine virtuali di livello
superiore la visione di un insieme di unità di
elaborazione virtuali che sono dedicate a ogni
processo presente in memoria: gestisce il contesto
di esecuzione dei vari processi e attua una politica
di alternanza nell’accesso alla CPU da parte dei
processi in esecuzione.
Al nucleo si affiancano i gestori delle risorse del
sistema per garantire che i processi che eseguono nelle macchine virtuali abbiano accesso a tali risorse senza conflitti e
in maniera trasparente ed efficiente.

Il gestore della memoria ha il compito di controllare


la memoria centrale, la mancanza di un’accurata
regolamentazione sulle condizioni di accesso alla
memoria stessa porterebbe a un suo utilizzo
inadeguato e a notevoli problemi di protezione dei
dati.
Il gestore della memoria consente ai programmi di
lavorare in un proprio spazio di indirizzamento
virtuale, e di ignorare quindi le effettive zone di
memoria fisica occupata.
Si occupa di:
• Proteggere programmi e i relativi dati
caricati nella memoria di lavoro isolando ogni processo in una propria area di memoria
• Virtualizzare la collocazione fisica dei dati, fornendo al programma più memoria di quanta fisicamente
disponibile attraverso l’impiego di parte della memoria di massa
• Condividere parte degli spazi di memoria associati ai vari programmi per consentire la condivisione dei dati in
maniera efficiente

Il gestore delle periferiche rende disponibili ai processi


periferiche astratte e ne virtualizza le interfacce e le
specifiche operazioni di I/O mediante i driver di periferica,
consentendo ai processi di leggere e scrivere dati anche
in modo concorrente, senza preoccuparsi dei problemi di
indirizzamento e di sincronizzazione delle periferiche
stesse.
Nonostante la memoria di massa rientri tra le unità
periferiche, le sue peculiarità richiedono la presenza di
un modulo appositamente concepito, il gestore di file
(file system); si occupa di organizzare i dati e programmi
in contenitori logici (file) ognuno identificato da un
nome e accessibile tramite comandi ad alto livello che
rendono trasparenti all’utente le operazioni per
l’allocazione e l’accesso alla memoria di massa. Il file
system consente di definire dei diritti di accesso ai file
allo scopo di rendere controllabile l’accesso condiviso ai
file da parte di applicazioni e utenti diversi.

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.

La virtualizzazione delle risorse non è comunque immune da possibili inconvenienti.


• La starvation è un fenomeno che si manifesta quando diversi processi dovrebbero accedere alla medesima
risorsa ma solo alcuni di essi vi riescono, a causa della politica di gestione adottata dal nucleo.
• Il blocco critico avviene quando un insieme di processi rimane bloccato perché ciascuno di essi aspetta delle
risorse che sono occupate da un altro processo compreso in questo stesso insieme.
Evitare o risolvere situazioni blocco critico o di starvation riduce le prestazioni complessive del sistema.
Le interazioni tra processi sono classificabili in:
• Indesiderate e spesso impreviste: i processi competono per le risorse che servono per completare l’esecuzione
causando eventualmente problemi di blocco critico e starvation
• Desiderate e previste: legate a meccanismi di cooperazione fra processi che hanno l’obbiettivo di giungere alla
soluzione di un problema complesso
La gestione delle interazioni fra i processi implica, la sincronizzazione fra le varie attività che ogni processo deve svolgere
in modo parallelo rispetto agli altri, la comunicazione ovvero una modalità per lo scambio dei dati fra i processi.

I processi funzionano in:


• Foreground: quando il processo è abilitato all’interazione con l’utente
• Background: quando il processo non è in grado di interagire direttamente con l’utente, questo è lo stato in cui
si trovano parecchi dei processi relativi alle funzioni interne del sistema operativo
La gestione della memoria applica tecniche per gestire il conflitto fra dimensione della memoria fisica e spazio
complessivo richiesto dai programmi che devono essere eseguiti in modo concorrente e dei relativi dati; combina diverse
strategie:
• Consente il caricamento di un programma a partire da un indirizzo qualunque della memoria
• Riduce la necessità di spazio tenendo in memoria solo una porzione dei programmi e dei dati
• Condivide parte delle istruzioni fra i diversi processi corrispondenti a uno stesso programma
Queste strategie vengono attuale dal gestore della memoria che garantisce ai vari processi uno spazio di indirizzamento
virtuale in cui lavorare che può essere superiore alla memoria fisica presente nel calcolatore, e mette in atto meccanismi
di protezione che tutelano la privatezza dello spazio di lavoro assegnato ad ogni processo.
Esistono due spazi di memoria: lo spazio logico (intervallo di celle contigue che partono dall’indirizzo 0 in cui si immagina
siano collocate le istruzioni durante la compilazione) e lo spazio fisico (lo spazio di memoria in cui risiede effettivamente
il codice).
Per far funzionare il programma caricandolo a partire da una posizione arbitraria bisogna effettuare una rilocazione:
• Per gli indirizzi presenti nel programma: indirizzo + spiazzamento
• Spiazzamento: indirizzo a partire dal quale verrà caricato il programma, valore a partire dal quale sono stati
calcolati gli indirizzi.

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

Potrebbero piacerti anche