Copertina
Autore Abraham Silberschatz
CoautorePeter Baer Galvin, Greg Gagne
Titolo Sistemi operativi
Sottotitolocon esempi per l'uso in Java
EdizioneApogeo, Milano, 2005, Idee & Strumenti , pag. 716, ill., cop.fle., dim. 168x240x25 mm , Isbn 978-88-503-2100-1
OriginaleOperating system concepts with Java
EdizioneWiley, New York, 2004
CuratoreVincenzo Piuri
TraduttoreAngelo Cariboni, Daniele Cariboni, Vincenzo Piuri
LettoreCorrado Leonardo, 2005
Classe informatica: sistemi
PrimaPagina


al sito dell'editore


per l'acquisto su IBS.IT

per l'acquisto su BOL.IT

per l'acquisto su AMAZON.IT

 

| << |  <  |  >  | >> |

Indice

Presentazione dell'edizione italiana              xxi

Prefazione                                      xxiii

Parte I - Panoramica                                1


Capitolo 1 - Introduzione                           3

1.1 Che cosa fanno i sistemi operativi?             3
    1.1.1 Il punto di vista dell'utente             4
    1.1.2 Il punto di vista del computer            5
    1.1.3 Definizione di sistema operativo          6
    1.1.4 Scopi di un sistema operativo             6
1.2 Sistemi mainframe                               7
    1.2.1 Sistemi a lotti                           7
    1.2.2 Sistemi multiprogrammati                  8
    1.2.3 Sistemi time-sharing                     10
1.3 Sistemi desktop                                11
1.4 Sistemi multiprocessore                        12
1.5 Sistemi distribuiti                            14
    1.5.1 Reti di computer                         14
    1.5.2 Sistemi client-server                    15
    1.5.3 Sistemi punto-a-punto                    16
    1.5.4 Sistemi operativi distribuiti            16
1.6 Sistemi cluster                                17
1.7 Sistemi in tempo reale                         18
1.8 Sistemi palmari                                19
1.9 Migrazione delle caratteristiche               20
1.10 Ambienti di elaborazione                      21
    1.10.1 Elaborazione tradizionale               21
    1.10.2 Elaborazione basata sul Web             22
    1.10.3 Elaborazione embedded                   22
    1.10.4 Elaborazione multimediale               23
1.11 Riassunto                                     23
    Esercizi                                       24
    Note bibliografiche                            25

Capitolo 2 - Architettura del computer             27

2.1 Funzionamento del computer                     27
2.2 Struttura dell'input/output                    29
    2.2.1 Interruzioni di input/output             30
    2.2.2 Trasferimenti in DMA                     32
2.3 Struttura della memoria                        33
    2.3.1 Memoria centrale                         34
    2.3.2 Dischi magnetici                         35
    2.3.3 Nastri magnetici                         37
2.4 Gerarchia di memorizzazione                    37
    2.4.1 Caching                                  39
    2.4.2 Coerenza/consistenza                     40
2.5 Protezione hardware                            41
    2.5.1 Funzionamento in modalità
          differenziate                            41
    2.5.2 Protezione dell' I/O                     43
    2.5.3 Protezione della memoria                 44
    2.5.4 Protezione della CPU                     45
2.6 Struttura di rete                              47
    2.6.1 Reti locali                              47
    2.6.2 Reti geografiche                         48
2.7 Riassunto                                      50
    Esercizi                                       51
    Note bibliografiche                            52

Capitolo 3 - Struttura dei sistemi operativi       53

3.1 Componenti del sistema operativo               53
    3.1.1 La gestione dei processi                 54
    3.1.2 La gestione della memoria centrale       55
    3.1.3 La gestione dei file                     55
    3.1.4 La gestione dell'input/output            56
    3.1.5 La gestione delle unità di
          memorizzazione secondarie                56
    3.1.6 Le reti informatiche                     57
    3.1.7 Il sistema di protezione                 58
    3.1.8 L'interprete dei comandi                 58
3.2 Servizi del sistema operativo                  59
3.3 Chiamate di sistema                            60
    3.3.1 Il controllo del processo                63
    3.3.2 La gestione dei file                     66
    3.3.3 La gestione dei dispositivi              67
    3.3.4 La gestione delle informazioni
          di sistema                               67
    3.3.5 Le comunicazioni                         67
3.4 Programmi di sistema                           68
3.5 Struttura del sistema                          71
    3.5.1 Una struttura semplice                   71
    3.5.2 La struttura stratificata                73
    3.5.3 I microkernel                            74
    3.5.4 La struttura modulare                    76
3.6 Macchine virtuali                              77
    3.6.1 Implementazione                          78
    3.6.2 Vantaggi                                 79
    3.6.3 Esempi                                   80
3.7 Java                                           80
    3.7.1 Il linguaggio di programmazione          81
    3.7.2 L'interfaccia per i programmi
          applicativi                              81
    3.7.3 Java Virtual Machine                     81
    3.7.4 L'ambiente di sviluppo per Java          83
    3.7.5 Sistemi operativi in linguaggio Java     83
3.8 Progettazione e implementazione di un
    sistema operativo                              84
    3.8.1 Obiettivi del progetto                   84
    3.8.2 Meccanismi e politiche                   85
    3.8.3 Implementazione                          86
3.9 Generazione del sistema operativo              87
3.10 Avvio del sistema operativo                   88
3.11 Riassunto                                     89
    Esercizi                                       90
    Note bibliografiche                            91


Parte II - Gestione dei processi                   93


Capitolo 4 - I processi                            95

4.1 Il concetto di processo                        95
    4.1.1 I processi                               96
    4.1.2 Lo stato dei processi                    96
    4.1.3 Il blocco di controllo del processo      97
    4.1.4 I thread                                 99
4.2 Schedulazione dei processi                     99
    4.2.1 Le code di schedulazione                 99
    4.2.2 Gli schedulatori                        101
    4.2.3 Il cambio di contesto                   102
4.3 Operazioni sui processi                       103
    4.3.1 Creazione dei processi                  103
    4.3.2 Terminazione dei processi               106
4.4 Processi cooperanti                           107
4.5 Comunicazione tra processi                    109
    4.5.1 Lo scambio di messaggi                  110
    4.5.2 La denominazione dei processi           110
    4.5.3 La sincronizzazione                     112
    4.5.4 La bufferizzazione                      113
    4.5.5 Esempio di produttore-consumatore       113
    4.5.6 Un esempio: Mach                        115
    4.5.7 Un esempio: Windows XP                  116
4.6 La comunicazione in sistemi client-server     117
    4.6.1 I socket                                117
    4.6.2 La chiamata di procedura remota         120
    4.6.3 La chiamata di metodo remoto            123
4.7 Riassunto                                     128
    Esercizi                                      129
    Note bibliografiche                           130

Capitolo 5 - I thread                             131

5.1 Generalità                                    131
    5.1.1 Motivazioni                             131
    5.1.2 Benefici                                133
    5.1.3 Thread nello spazio utente e
          nello spazio kernel                     133
    5.1.4 Le librerie di thread                   133
5.2 Modelli multithread                           134
    5.2.1 Il modello molti-a-uno                  134
    5.2.2 Il modello uno-a-uno                    135
    5.2.3 Il modello molti-a-molti                135
5.3 Problematiche relative ai thread              136
    5.3.1 Le chiamate di sistema fork() ed
          exec()                                  136
    5.3.2 Cancellazione                           137
    5.3.3 La gestione dei segnali                 137
    5.3.4 Gruppi di thread                        139
    5.3.5 Dati specifici dei thread               139
    5.3.6 Attivazione dello schedulatore          140
5.4 Pthread                                       141
5.5 I thread di Windows XP                        143
5.6 I thread di Linux                             144
5.7 I thread di Java                              144
    5.7.1 Creazione di un thread                  145
    5.7.2 Gli stati di un thread                  147
    5.7.3 Ricongiunzione di thread                147
    5.7.4 Cancellazione dei thread                148
    5.7.5 Dati specifici del thread               149
    5.7.6 La JVM e il sistema operativo ospite    149
    5.7.7 Esempio di soluzione multithread        151
5.8 Riassunto                                     151
    Esercizi                                      153
    Note bibliografiche                           154

Capitolo 6 - Schedulazione della CPU              155

6.1 Concetti di base                              155
    6.1.1 Il ciclo di picco di CPU e di I/0       156
    6.1.2 Lo schedulatore della CPU               157
    6.1.3 Schedulazione con sospensione
          dell'esecuzione dei processi            157
    6.1.4 Caricamento del processo sulla CPU      159
6.2 Criteri di schedulazione                      159
6.3 Gli algoritmi di schedulazione                160
    6.3.1 Schedulazione First-Come, First-Served  160
    6.3.2 Schedulazione Shortest-Job-First        161
    6.3.3 Schedulazione a priorità                164
    6.3.4 Schedulazione Round-Robin               166
    6.3.5 Schedulazione con coda a più livelli    168
    6.3.6 Schedulazione con coda a più livelli
          con retroazione                         170
6.4 Schedulazione per sistemi multiprocessore     171
6.5 Schedulazione per sistemi in tempo reale      172
6.6 Schedulazione dei thread                      175
    6.6.1 Visibilità della competizione           175
    6.6.2 Schedulazione di Pthread                176
6.7 Esempi di sistemi operativi                   177
    6.7.1 Esempio: la schedulazione in Solaris    177
    6.7.2 Esempio: la schedulazione in Windows XP 180
    6.7.3 Esempio: la schedulazione in Linux      182
6.8 Schedulazione dei thread in Java              183
6.8.1 Priorità dei thread                         184
6.9 Valutazione degli algoritmi di schedulazione  185
    6.9.1 Modellazione deterministica             185
    6.9.2 Modelli a reti di code                  187
    6.9.3 Simulazioni                             188
    6.9.4 Implementazione                         189
6.10 Riassunto                                    190
    Esercizi                                      191
    Note bibliografiche                           193

Capitolo 7 - Sincronizzazione dei processi        195

7.1 Il problema della sincronizzazione            195
7.2 Il problema della sezione critica             197
7.3 Soluzioni per due processi                    198
    7.3.1 Algoritmo 1                             199
    7.3.2 Algoritmo 2                             200
    7.3.3 Algoritmo 3                             201
7.4 Hardware per la sincronizzazione              202
7.5 Semafori                                      205
    7.5.1 Impiego                                 205
    7.5.2 Implementazione                         206
    7.5.3 Stalli e starvation                     208
7.6 Problemi classici di sincronizzazione         209
    7.6.1 Il problema del buffer limitato         209
    7.6.2 Il problema dei lettori-scrittori       212
    7.6.3 Il problema del pranzo dei filosofi     215
7.7 Monitor                                       217
7.8 La sincronizzazione in Java                   221
    7.8.1 Buffer limitato                         221
    7.8.2 Notifiche multiple                      226
    7.8.3 Il problema dei lettori-scrittori       228
    7.8.4 Sincronizzazione del blocco             230
    7.8.5 Semafori Java                           231
    7.8.6 Regole di sincronizzazione              231
    7.8.7 I monitor in Java                       232
    7.8.8 Gestione della InterruptedException     232
7.9 Esempi di sincronizzazione                    234
    7.9.1 La sincronizzazione in Solaris          234
    7.9.2 La sincronizzazione in Windows XP       235
    7.9.3 La sincronizzazione in Linux            236
    7.9.4 La sincronizzazione in Pthread          236
7.10 Transazioni atomiche                         237
    7.10.1 Modello del sistema                    237
    7.10.2 Recupero basato sui log                238
    7.10.3 Punti di verifica                      239
    7.10.4 Transazioni atomiche concorrenti       240
    7.11 Riassunto                                245
    Esercizi                                      246
    Note bibliografiche                           250

Capitolo 8 - Lo stallo (deadlock)                 253

8.1 Il modello delle risorse di sistema e
    dei processi                                  253
8.2 Caratterizzazione del deadlock                255
    8.2.1 Condizioni per il verificarsi
          del deadlock                            255
    8.2.2 Grafo di allocazione delle risorse      255
8.3 Metodi di gestione dei deadlock               259
8.4 Prevenire il deadlock                         263
    8.4.1 Mutua esclusione                        263
    8.4.2 Possesso ed attesa                      263
    8.4.3 Nessun rilascio anticipato              264
    8.4.4 Attesa circolare                        265
8.5 Evitare il deadlock                           266
    8.5.1 Lo stato sicuro                         267
    8.5.2 Algoritmo del grafo di allocazione
          delle risorse                           268
    8.5.3 L'algoritmo del banchiere               269
8.6 Rilevazione del deadlock                      272
    8.6.1 Singola istanza di ogni tipo di risorsa 273
    8.6.2 Istanze multiple di un tipo di risorsa  273
    8.6.3 Uso dell'algoritmo di rilevazione       275
8.7 Ripristino dal deadlock                       276
    8.7.1 Termine del processo                    276
    8.7.2 Rilascio anticipato delle risorse       277
8.8 Riassunto                                     277
    Esercizi                                      278
    Note bibliografiche                           282


Parte III - Gestione della memoria                283


Capitolo 9 - Gestione della memoria centrale      285

9.1 Concetti generali                             285
    9.1.1 Collegamento degli indirizzi            286
    9.1.2 Spazio di indirizzamento logico e
          spazio di indirizzamento fisico         287
    9.1.3 Caricamento dinamico                    289
    9.1.4 Collegamento dinamico e
          librerie condivise                      289
    9.1.5 Overlay                                 290
9.2 Swapping                                      292
9.3 Allocazione contigua di memoria               294
    9.3.1 Protezione della memoria centrale       295
    9.3.2 Allocazione della memoria centrale      296
    9.3.3 Frammentazione                          297
9.4 Paginazione                                   298
    9.4.1 Metodo base                             299
    9.4.2 Supporto hardware                       303
    9.4.3 Protezione                              306
    9.4.4 Struttura della tabella delle pagine    307
    9.4.5 Pagine condivise                        312
9.5 Segmentazione                                 314
    9.5.1 Metodo base                             314
    9.5.2 Hardware                                315
    9.5.3 Protezione e condivisione               316
    9.5.4 Frammentazione                          319
9.6 Segmentazione con paginazione                 320
9.7 Riassunto                                     322
    Esercizi                                      324
    Note bibliografiche                           326

Capitolo 10 - La memoria virtuale                 327

10.1 Ambiente                                     327
10.2 Richiesta di paginazione                     331
     10.2.1 Concetti fondamentali                 332
     10.2.2 Prestazioni della richiesta
            di paginazione                        335
10.3 Copia durante la scrittura                   338
10.4 Sostituzione della pagina                    339
     10.4.1 Sostituzione di base della pagina     340
     10.4.2 Sostituzione FIFO della pagina        343
     10.4.3 Sostituzione ottimale della pagina    345
     10.4.4 Sostituzione LRU della pagina         345
     10.4.5 Sostituzione della pagina con
            approssimazione dell'algoritmo LRU    348
     10.4.6 Sostituzione della pagina basata
            sul conteggio                         350
     10.4.7 Algoritmi per l'uso del buffer
            delle pagine                          350
     10.4.8 Le applicazioni e la sostituzione
            della pagina                          351
10.5 Allocazione dei frame                        352
     10.5.1 Numero minimo di frame                352
     10.5.2 Algoritmi di allocazione              353
     10.5.3 Confronto tra le allocazioni con
            sostituzioni locale e globale         354
10.6 Thrashing                                    355
     10.6.1 Cause del thrashing                   355
     10.6.2 Il modello working set                358
     10.6.3 Frequenza delle mancanze di pagina    359
10.7 File mappati in memoria                      360
     10.7.1 File mappati in memoria in Java       361
10.8 Altre considerazioni                         363
     10.8.1 Prepaginazione                        363
     10.8.2 La dimensione della pagina            364
     10.8.3 Estensione della TLB                  365
     10.8.4 Tabella delle pagine invertita        366
     10.8.5 Struttura del programma               366
     10.8.6 Blocco dei dispositivi di I/O         368
     10.8.7 Elaborazione in tempo reale           369
10.9 Esempi di sistemi operativi                  370
     10.9.1 Windows XP                            370
     10.9.2 Solaris                               371
10.10 Riassunto                                   372
     Esercizi                                     373
     Note bibliografiche                          377

Capitolo 11 - L'interfaccia del file system       379

11.1 Il concetto di file                          379
     11.1.1 Attributi del file                    380
     11.1.2 Operazioni sui file                   381
     11.1.3 Tipi di file                          385
     11.1.4 Struttura del file                    387
     11.1.5 Struttura interna dei file            388
11.2 Metodi di accesso                            389
     11.2.1 Accesso sequenziale                   389
     11.2.2 Accesso diretto                       389
     11.2.3 Altri metodi di accesso               391
11.3 Struttura della directory                    392
     11.3.1 Directory a singolo livello           393
     11.3.2 Directory a due livelli               394
     11.3.3 Directory strutturata ad albero       396
     11.3.4 Directory a grafo aciclico            398
     11.3.5 Directory a grafo generale            400
11.4 Montaggio del file system                    402
11.5 Condivisione dei file                        403
     11.5.1 Il caso di più utenti                 404
     11.5.2 File system remoti                    405
     11.5.3 Semantica della coerenza              408
     11.5.4 Semantica UNIX                        408
     11.5.5 Semantica della sessione              409
     11.5.6 Semantica dei file condivisi
            immutabili                            409
11.6 Protezione                                   409
     11.6.1 Tipi di accesso                       410
     11.6.2 Controllo dell'accesso                410
     11.6.3 Altri metodi di protezione            412
     11.6.4 Un esempio: UNIX                      413
11.7 Riassunto                                    413
     Esercizi                                     414
     Note bibliografiche                          416

Capitolo 12 - Implementazione del file system     417

12.1 Struttura del file system                    417
12.2 Realizzazione del file system                419
     12.2.1 Panoramica sulla realizzazione
            del file system                       419
     12.2.2 Partizioni e montaggio                422
     12.2.3 File system virtuali                  423
12.3 Realizzazione della directory                425
     12.3.1 Lista                                 425
     12.3.2 Tabella di hash                       426
12.4 Metodi di allocazione                        426
     12.4.1 Allocazione contigua                  426
     12.4.2 Allocazione collegata                 429
     12.4.3 Allocazione indicizzata               431
     12.4.4 Prestazioni                           434
12.5 Gestione dello spazio libero                 435
     12.5.1 Vettore di bit                        435
     12.5.2 Lista collegata                       436
     12.5.3 Raggruppamento                        437
     12.5.4 Conteggio                             437
12.6 Efficienza e prestazioni                     437
     12.6.1 Efficienza                            437
     12.6.2 Prestazioni                           439
12.7 Recupero del file system                     442
     12.7.1 Controllo della coerenza              442
     12.7.2 Backup e ripristino                   443
12.8 File system basato sulla registrazione
     delle attività                               443
12.9 NFS                                          445
     12.9.1 Descrizione                           445
     12.9.2 Il protocollo di montaggio            447
     12.9.3 Il protocollo NFS                     448
     12.9.4 Traduzione del nome del percorso      450
     12.9.5 Operazioni remote                     450
12.10 Riassunto                                   451
     Esercizi                                     452
     Note bibliografiche                          454


Parte IV - Sistemi di ingresso/uscita             455


Capitolo 13 - Sottosistemi di ingresso/uscita     457

13.1 Panoramica                                   457
13.2 L'hardware di I/O                            458
     13.2.1 Attesa attiva                         461
     13.2.2 L'interrupt                           462
     13.2.3 Accesso diretto alla memoria          466
13.3 Le interfacce di I/O per le applicazioni     468
     13.3.1 Dispositivi con trasferimento dei
            dati a caratteri e a blocchi          470
     13.3.2 Le periferiche di rete                471
     13.3.3 Orologi e temporizzatori              472
     13.3.4 I/O bloccante e non bloccante         473
13.4 Il sottosistema di I/O del kernel            474
     13.4.1 Schedulazione dell' I/O               474
     13.4.2 Buffering                             474
     13.4.3 Caching                               476
     13.4.4 Spooling e prenotazione dei
            dispositivi                           476
     13.4.5 Gestione degli errori                 477
     13.4.6 Strutture dati del kernel             478
13.5 Trasformazione dell'I/O in operazioni
     hardware                                     479
13.6 STREAMS                                      482
13.7 Le prestazioni                               484
13.8 Riassunto                                    487
     Esercizi                                     488
     Note bibliografiche                          489

Capitolo 14 - Struttura delle memorie di massa    491

14.1 Struttura dei dischi                         491
14.2 Schedulazione degli accessi al disco         492
     14.2.1 Schedulazione FCFS                    493
     14.2.2 Schedulazione SSTF                    494
     14.2.3 Schedulazione SCAN                    495
     14.2.4 Schedulazione C-SCAN                  495
     14.2.5 Schedulazione LOOK                    496
     14.2.6 Selezione dell'algoritmo di
            schedulazione del disco               497
14.3 Amministrazione del disco                    498
     14.3.1 Configurazione del disco              498
     14.3.2 Il blocco di avvio                    499
     14.3.3 Blocchi difettosi                     500
14.4 Gestione dello spazio di swap                501
     14.4.1 Uso dello spazio di swap              501
     14.4.2 Locazione dello spazio di swap        502
     14.4.3 Gestione dello spazio di swap:
            un esempio                            502
14.5 La struttura RAID                            504
     14.5.1 Miglioramento dell'affidabilità
            mediante la ridondanza                504
     14.5.2 Il miglioramento delle prestazioni
            con il parallelismo                   505
     14.5.3 Livelli di RAID                       506
     14.5.4 Scelta di un livello RAID             510
     14.5.5 Le estensioni                         510
14.6 Collegamento dei dischi                      510
     14.6.1 Memorizzazione con collegamento
            all'host                              511
     14.6.2 Memorizzazione con collegamento
            di rete                               511
     14.6.3 Rete della zona di memorizzazione     512
14.7 Implementazione dell'archiviazione stabile   513
14.8 Struttura di memorizzazione terziaria        514
     14.8.1 Periferiche di archiviazione
            terziaria                             514
     14.8.2 Compiti del sistema operativo         517
     14.8.3 Problematiche relative alle
            prestazioni                           519
14.9 Riassunto                                    524
     Esercizi                                     525
     Note bibliografiche                          531


Parte V - Sistemi distribuiti                     533


Capitolo 15 - Strutture dei sistemi distribuiti   535

15.1 Concetti di base                             535
     15.1.1 Vantaggi dei sistemi distribuiti      536
     15.1.2 Tipi di sistemi operativi distribuiti 537
     15.1.3 Sintesi delle nozioni                 541
15.2 Topologia                                    542
15.3 Comunicazione                                543
     15.3.1 Attribuzione e risoluzione dei nomi   544
     15.3.2 Strategie di instradamento            546
     15.3.3 Strategie di pacchetto                548
     15.3.4 Strategie di connessione              548
     15.3.5 Gestione dei conflitti                549
15.4 Protocolli di comunicazione                  550
15.5 Robustezza                                   554
     15.5.1 Individuazione dei guasti             554
     15.5.2 Riconfigurazione del sistema          555
     15.5.3 Recupero da un guasto                 555
15.6 Problemi progettuali                         555
15.7 Un esempio: il networking                    558
15.8 Riassunto                                    560
     Esercizi                                     560
     Note bibliografiche                          562

Capitolo 16 - File system distribuiti             563

16.1 L'ambiente distribuito                       563
16.2 Attribuzione dei nomi e trasparenza          564
     16.2.1 Le strutture di attribuzione dei nomi 565
     16.2.2 Gli schemi di attribuzione dei nomi   567
     16.2.3 Tecniche di implementazione           567
16.3 Accesso remoto ai file                       568
     16.3.1 Schema di base per l'uso della cache  569
     16.3.2 Locazione della cache                 569
     16.3.3 Politica di aggiornamento della cache 570
     16.3.4 Coerenza                              571
     16.3.5 Confronto tra i servizi con cache
            e quelli remoti                       572
16.4 File server con e senza stato                573
16.5 Replica dei file                             574
16.6 Un esempio: AFS                              575
     16.6.1 Panoramica                            576
     16.6.2 Lo spazio dei nomi condiviso          577
     16.6.3 Operazioni sui file e coerenza        578
     16.6.4 Implementazione                       579
16.7 Riassunto                                    580
     Esercizi                                     581
     Note bibliografiche                          581

Capitolo 17 - Coordinamento distribuito           583

17.1 Ordinamento degli eventi                     583
     17.1.1 La relazione accaduto prima           583
     17.1.2 Implementazione                       584
17.2 Mutua esclusione                             586
     17.2.1 Metodo centralizzato                  586
     17.2.2 Metodo completamente distribuito      586
     17.2.3 Il metodo del passaggio di token      588
17.3 Atomicità                                    588
     17.3.1 Il protocollo di commit a due fasi    589
     17.3.2 Gestione dei guasti nel protocollo
            2PC                                   590
17.4 Controllo della concorrenza                  591
     17.4.1 Protocolli bloccanti                  592
     17.4.2 Marca di tempo                        594
17.5 Gestione delle situazioni di stallo          596
     17.5.1 Prevenzione delle situazioni di
            stallo                                596
     17.5.2 Rilevamento delle situazioni di
            stallo                                597
17.6 Algoritmi di elezione del coordinatore       603
     17.6.1 Algoritmo del bullo                   603
     17.6.2 Algoritmo dell'anello                 605
17.7 Raggiungimento dell' accordo                 605
     17.7.1 Comunicazioni inaffidabili            606
     17.7.2 Processi difettosi                    607
17.8 Riassunto                                    607
     Esercizi                                     608
     Note bibliografiche                          609


Parte VI - Protezione e sicurezza                 611


Capitolo 18 - Protezione                          613

18.1 Obiettivi della protezione                   613
18.2 Domini di protezione                         614
     18.2.1 Struttura del dominio di protezione   615
     18.2.2 Le protezioni nel sistema operativo
            UNIX                                  616
     18.2.3 Le protezioni nel sistema operativo
            MULTICS                               617
18.3 Matrice di accesso                           619
18.4 Implementazione della matrice di accesso     623
     18.4.1 Tabella globale                       623
     18.4.2 Liste di controllo degli accessi      623
     18.4.3 Liste di capacità dei domini          623
     18.4.4 Il meccanismo lock-key                624
     18.4.5 Confronto                             624
18.5 Revoca dei diritti di accesso                625
18.6 Sistemi basati sulle capacità                627
     18.6.1 Il sistema operativo Hydra            627
     18.6.2 Il sistema operativo CAP System       629
18.7 Protezione basata sul linguaggio             629
     18.7.1 Applicazione basata sui compilatori   630
     18.7.2 Protezione in Java 2                  633
18.8 Riassunto                                    635
     Esercizi                                     636
     Note bibliografiche                          637

Capitolo 19 - Sicurezza                           639

19.1 Il problema della sicurezza                  639
19.2 Autenticazione dell'utente                   641
     19.2.1 Le password                           641
     19.2.2 Vulnerabilità della password          641
     19.2.3 Password criptate                     643
     19.2.4 Password monouso                      643
     19.2.5 Biometria                             644
19.3 Pericoli relativi ai programmi               645
     19.3.1 Cavalli di Troia                      645
     19.3.2 Trap door                             646
     19.3.3 Stack overflow e buffer overflow      646
19.4 Pericoli relativi ai sistemi                 647
     19.4.1 Worm                                  647
     19.4.2 Virus                                 650
     19.4.3 Negazione del servizio                652
19.5 Garantire la sicurezza dei sistemi e delle
     funzioni                                     653
19.6 Rilevamento delle intrusioni                 655
     19.6.1 Che cosa costituisce un'intrusione?   655
     19.6.2 Monitoraggio e analisi del registro
            degli eventi                          657
     19.6.3 Tripwire                              658
     19.6.4 Controllo delle chiamate di sistema   659
19.7 Crittografia                                 661
     19.7.1 Autenticazione                        662
     19.7.2 Algoritmi di crittografia             663
     19.7.3 Un esempio: SSL                       664
     19.7.4 Uso della crittografia                665
19.8 Classificazione della sicurezza dei computer 666
19.9 Un esempio: Windows NT                       668
19.10 Riassunto                                   669
     Esercizi                                     670
     Note bibliografiche                          671

Bibliografia                                      673

Indice analitico                                  697


Capitoli e appendici disponibili online:

Il sistema operativo Linux

Il sistema operativo Windows XP

Il sistema operativo Windows 2000

Il sistema operativo FreeBSD

Sistemi operativi storici

Le comunicazioni in ambiente distribuito

 

 

| << |  <  |  >  | >> |

Pagina XXIII

Prefazione


Il sistema operativo è una parte essenziale del computer; un corso dedicato ai sistemi operativi è quindi parte essenziale della formazione in informatica. Questo campo sta subendo cambiamenti sempre più rapidi; i concetti fondamentali, tuttavia, sono abbastanza semplici, ed è su di essi che abbiamo basato la trattazione qui presentata.

Questo libro è stato scritto come testo per un corso di carattere introduttivo sui sistemi operativi, a livello universitario o postuniversitario; speriamo che anche i professionisti lo trovino utile.

Il libro fornisce una descrizione chiara dei concetti che sono alla base dei sistemi operativi moderni. A livello di prerequisiti, supporremo che il lettore abbia una conoscenza di base delle strutture dati, dei componenti di un computer e di un linguaggio ad alto livello, quale il C. Gli strumenti hardware richiesti per una comprensione adeguata dei sistemi operativi sono illustrati nel Capitolo 2. Per gli esempi di codice, useremo il linguaggio Java e qualche volta il C, ma il lettore dovrebbe essere in grado di capire le procedure illustrate anche senza una conoscenza completa di questi linguaggi.

I concetti sono presentati usando descrizioni intuitive. Vengono trattati risultati teorici importanti, ma le dimostrazioni formali sono state omesse. Le note bibliografiche contengono riferimenti ai lavori di ricerca in cui sono stati presentati e dimostrati per la prima volta i risultati illustrati nel testo; vi sono pure riferimenti a materiale utile per ulteriori letture. Al posto delle dimostrazioni, come giustificazione dei risultati e guida alla comprensione, si è fatto ricorso a figure ed esempi.

Le idee e le procedure fondamentali trattate nel libro sono spesso basate su soluzioni utilizzate nei sistemi operativi esistenti in commercio. Il nostro scopo, tuttavia, è di illustrare queste idee e procedure in un modo del tutto generale, senza collegamento a un particolare sistema operativo. In ogni caso, presenteremo numerosi esempi relativi ai sistemi operativi più diffusi, tra i quali Solaris della Sun Microsystems; Linux, Mach, Microsoft MS-DOS, Microsoft Windows NT, Microsoft Windows 2000, Microsoft Windows XP, DEC VMS, DEC TOPS-20, IBM OS/2, Apple Macintosh, e MacOS X. Nel libro, quando ci riferiremo a Windows XP come esempio di sistema operativo, intenderemo sia Windows XP che Windows 2000; se vi è una caratteristica di Windows XP che non è disponibile in Windows 2000, lo diremo esplicitamente; analogamente, se una caratteristica è presente in Windows 2000 ma non in Windows XP, faremo riferimento al sistema come Windows 2000.


Contenuto del libro

Il testo è organizzato in sette parti.

• Panoramica. I Capitoli da 1 a 3 spiegano che cosa sono i sistemi operativi, che cosa fanno e come sono progettati e realizzati, illustrando come si è sviluppato il concetto di sistema operativo, quali sono le caratteristiche comuni di un sistema operativo, che cosa fa un sistema operativo dal punto di vista dell'utente e dal punto di vista del sistema di calcolo. La presentazione è di tipo motivazionale, storico ed esplicativo. In questi capitoli abbiamo evitato la discussione sulla struttura interna; tali pagine sono quindi adatte a studenti di corsi introduttivi, che desiderano imparare che cos'è un sistema operativo, senza entrare nei particolari delle sue procedure interne. Il Capitolo 2 tratta argomenti relativi all'hardware che sono importanti per comprendere il funzionamento di un sistema operativo. I lettori che hanno già sufficienti conoscenze in materia, compresi i sistemi di ingresso/uscita (input/output, I/O), l'accesso diretto alla memoria (Direct Memory Access, DMA) e le operazioni sugli hard disk, possono scegliere di leggere rapidamente o in parte questo capitolo, oppure di saltarlo del tutto.

• Gestione dei processi. I Capitoli da 4 a 8 descrivono il concetto di processo e di concorrenza, cioè il cuore dei moderni sistemi operativi. Un processo è l'unità di lavoro in un sistema operativo. In un sistema di elaborazione si ha un insieme di processi in esecuzione concorrente, alcuni dei quali sono processi propri del sistema operativo (quelli che eseguono il codice del sistema stesso), mentre i rimanenti sono processi utente (quelli che eseguono il codice dei programmi dell'utente). Questi capitoli riguardano la schedulazione e la sincronizzazione dei processi, la comunicazione tra processi e la gestione delle situazioni di stallo (deadlock). Vengono inoltre trattati i thread.

• Gestione della memoria. I Capitoli da 9 a 12 esaminano i processi nella memoria principale durante la loro esecuzione. Per migliorare l'utilizzo della CPU e la velocità di risposta agli utenti, il computer deve mantenere parecchi processi in memoria. Ci sono molti schemi differenti per la gestione della memoria, che riflettono approcci diversi. L'efficacia dei vari algoritmi dipende dalla situazione. Poiché la memoria centrale è solitamente troppo piccola per accogliere tutti i dati e i programmi, e poiché non può memorizzare in modo permanente i dati, il computer deve essere dotato di una memoria secondaria che affianchi quella centrale. La maggior parte dei computer moderni usa i dischi come strumento primario di memorizzazione in linea per le informazioni sia sui programmi, sia sui dati. Il file system fornisce il meccanismo per la memorizzazione in linea e l'accesso ai dati e ai programmi che risiedono su disco. Questi capitoli descrivono le procedure e le strutture di gestione della memoria, offrendo una conoscenza pratica degli algoritmi usati, delle loro proprietà, dei relativi vantaggi e svantaggi.

• Sistemi di ingresso/uscita. I Capitoli 13 e 14 descrivono i dispositivi di ingresso/uscita (input/output, I/O) che si collegano a un computer. Poiché questi dispositivi differiscono ampiamente tra loro, il sistema operativo deve fornire una vasta gamma di funzionalità alle applicazioni, per consentire di controllare tutti i loro aspetti. Questa Parte discute in profondità il sistema di I/O, compresa la progettazione e le interfacce di I/O, nonché le strutture e le funzioni interne del computer. Sotto molti aspetti, i dispositivi di I/O sono tra i componenti più lenti del computer; rappresentando dunque una sorta di "collo di bottiglia", viene esaminato il problema delle prestazioni. Vengono pure illustrati argomenti relativi alla memorizzazione secondaria e terziaria.

• Sistemi distribuiti. I Capitoli da 15 a 17 si occupano di sistemi di elaborazione costituiti da un insieme di processori che non condividono la memoria o l'orologio, i cosiddetti sistemi distribuiti. Fornendo all'utente l'accesso alle varie risorse disponibili, un sistema distribuito può migliorare la velocità di calcolo, la disponibilità e l'affidabilità dei dati. Tale sistema, inoltre, fornisce all'utente un file system distribuito, cioè un servizio per l'accesso ai file in cui gli utenti, i computer e i dispositivi di memorizzazione sono disseminati nei vari luoghi in cui si trova il sistema distribuito. Un sistema distribuito deve fornire vari meccanismi di sincronizzazione e comunicazione per gestire lo stallo nonché la varietà di guasti che non si incontrano in un sistema centralizzato.

• Protezione e sicurezza. I Capitoli 18 e 19 trattano le problematiche relative alla protezione e alla sicurezza in un sistema operativo. A scopo di protezione e sicurezza, appositi meccanismi assicurano che solo i processi che hanno ricevuto un'autorizzazione adeguata dal sistema operativo possano operare sui file, i segmenti di memoria, la CPU e le altre risorse. La protezione è un meccanismo per controllare l'accesso alle risorse di un computer da parte di programmi, processi o utenti. Questo meccanismo deve fornire la possibilità di specificare i controlli da imporre, così come gli strumenti per applicarli. Per "sicurezza" si intendono tutte quelle azioni intraprese per proteggere le informazioni memorizzate nel sistema (dati e codice) e le risorse fisiche del computer da accessi non autorizzati, da una distruzione volontaria o dall'introduzione accidentale di incoerenze.

• Esempi di sistemi operativi. I Capitoli da 20 a 22 e le Appendici da A a C, scaricabili dal sito Web abbinato al libro, integrano i concetti presentati descrivendo sistemi operativi reali, tra cui Linux, Windows XP, Windows 2000, FreeBSD e Mach. Abbiamo scelto Linux e FreeBSD poiché questi sistemi di tipo UNIX sono abbastanza piccoli da risultare comprensibili, ma allo stesso tempo non sono sistemi operativi "giocattolo". La maggior parte delle loro procedure interne sono state selezionate per la semplicità, piuttosto che per la velocità o la sofisticazione. Sia FreeBSD che Linux sono usualmente disponibili nei dipartimenti universitari di informatica, cosicché molti allievi possono sperimentarli personalmente. Abbiamo scelto Windows XP e Windows 2000 perché ci offrono un'occasione per studiare un moderno sistema operativo con un progetto e un'implementazione drasticamente differenti da quelli di UNIX. Il Capitolo 22 descrive brevemente alcuni altri sistemi operativi che hanno avuto qualche influenza storica.

| << |  <  |  >  | >> |

Pagina 128

4.7 Riassunto [I processi]

Un processo è un programma in esecuzione. Mentre vengono eseguiti, i processi cambiano stato. Lo stato di un processo è definito dall'attività corrente del processo medesimo. Ciascun processo può essere in uno dei seguenti stati: nuovo, pronto, in esecuzione, in attesa o terminato, ed è rappresentato nel sistema operativo dal suo Process-Control Block (PCB).

Un processo, quando non è in esecuzione, viene messo in una coda d'attesa. Vi sono due tipi principali di code in un sistema operativo: code per la richiesta di I/O e code per i processi pronti; queste ultime contengono tutti processi che sono pronti per essere eseguiti e attendono la CPU. Ciascun processo è rappresentato da un PCB, e i PCB possono essere riuniti per formare la coda dei processi pronti. La schedulazione dei processi a lungo termine è la selezione dei processi cui è permesso contendersi la CPU. Di solito, lo schedulatore a lungo termine è altamente influenzato da considerazioni sull'allocazione delle risorse, specialmente per la gestione della memoria. La schedulazione a breve termine è la selezione di un processo da mettere in esecuzione dalla coda dei processi pronti. I processi, in molti sistemi operativi, possono essere eseguiti concorrentemente. Ci sono svariate ragioni per consentire l'esecuzione concorrente: la condivisione di informazioni, la velocizzazione della computazione, la modularità e la convenienza. L'esecuzione concorrente richiede un meccanismo per la creazione e la terminazione dei processi.

Il processo in esecuzione nel sistema operativo può essere indipendente o cooperante. I processi cooperanti devono avere i mezzi per comunicare l'un con l'altro. In sintesi, la comunicazione si ottiene attraverso due schemi complementari: la condivisione di memoria e lo scambio di messaggi. I metodi per la condivisione della memoria richiedono che i processi comunicanti condividano alcune variabili, e i processi scambiano informazioni attraverso l'uso di queste variabili condivise. Nel sistema a condivisione di memoria la responsabilità di attuare la comunicazione è dei programmatori dell'applicazione; il sistema operativo deve fornire solo la memoria condivisa. Il meccanismo di scambio dei messaggi permette di trasferire informazioni attraverso i messaggi. La responsabilità di garantire la comunicazione è del sistema operativo. Questi due schemi non sono mutuamente esclusivi e possono essere usati simultaneamente in un singolo sistema operativo.

La comunicazione nei sistemi client-server può usare (1) i socket, (2) le chiamate di procedure remote (RPC) o (3) l'invocazione di metodi remoti di Java (RMI). Un socket è definito come un estremo di un canale di comunicazione: una connessione fra due applicazioni è composta da una coppia di socket, uno a ciascuno degli estremi del canale di comunicazione. Un'altra forma di comunicazione distribuita sono le RPC. Una RPC avviene quando un processo (o thread) chiama una procedura in un'applicazione remota. La RMI è la versione Java della RPC: essa consente a un thread di invocare un metodo su un oggetto remoto come se lo invocasse su un oggetto locale. La differenza principale fra RPC e RMI consiste nel fatto che nella RPC i dati sono passati a una procedura remota attraverso un'ordinaria struttura dati, mentre la RMI permette che siano passati oggetti come parametri.

| << |  <  |  >  | >> |

Pagina 372

10.10 Riassunto [La memoria virtuale]

È desiderabile poter eseguire un processo il cui spazio logico degli indirizzi è più grande dello spazio degli indirizzi della memoria fisica disponibile. Il programmatore può rendere tale processo eseguibile ristrutturandolo mediante overlay (sovrapposizione), ma ciò rappresenta generalmente un'attività di programmazione difficile. La memoria virtuale è una tecnica per permettere a un grande spazio di indirizzi logici di essere mappato in una memoria fisica più piccola. La memoria virtuale permette a processi notevolmente grandi di funzionare, e consente di elevare il livello di multiprogrammazione, aumentando l'utilizzo della CPU. Inoltre, libera i programmatori dalle preoccupazioni relative alla disponibilità di memoria.

La memoria virtuale è comunemente implementata con la richiesta di paginazione. La richiesta di paginazione pura non porta mai a una pagina fino a quando quella pagina non è referenziata. Il primo referenziamento causa una mancanza di pagina nel monitor residente del sistema operativo. Il sistema operativo consulta una tabella interna per determinare, nella memoria ausiliaria, dove si trova la pagina; trova poi un frame libero e carica la pagina dalla memoria ausiliaria. La tabella delle pagine è aggiornata per riflettere questo cambiamento e l'istruzione che ha causato la mancanza di pagina viene fatta ripartire. Questo metodo permette a un processo di funzionare anche se l'intera immagine della memoria non è immediatamente nella memoria centrale. Finché il tasso di mancanze di pagina è ragionevolmente basso, le prestazioni sono accettabili.

Si può usare la richiesta di paginazione per ridurre il numero di frame allocati a un processo. Questa modalità può aumentare il livello di multiprogrammazione (permettendo a più processi di essere disponibili contemporaneamente per l'esecuzione) e, almeno in teoria, l'utilizzo della CPU del sistema. La paginazione permette, inoltre, ai processi di andare in esecuzione anche se le loro richieste di memoria eccedono la memoria fisica totale disponibile, funzionando nella memoria virtuale.

Se le richieste totali di memoria eccedono la memoria fisica, può poi essere necessario sostituire le pagine prese dalla memoria con dei frame liberi per ottenere nuove pagine. Allo scopo si usano vari algoritmi di sostituzione. La sostituzione FIFO della pagina è facile da programmare ma è affetta dall'anomalia di Belady. La sostituzione ottimale della pagina richiede di conoscere il comportamento futuro. La sostituzione LRU è un'approssimazione della sostituzione ottimale della pagina, ma può anche essere difficile da implementare. La maggior parte degli algoritmi di sostituzione delle pagine, quale l'algoritmo della seconda possibilità, sono approssimazioni della sostituzione LRU.

In aggiunta all'algoritmo di sostituzione della pagina, è necessaria una politica di allocazione dei frame. L'allocazione può essere statica, con la sostituzione locale delle pagine, o dinamica, con la sostituzione globale. Il modello working set assume che i processi siano eseguiti in località; il working set consiste nell'insieme delle pagine nella località corrente. In base a tale modello, a ogni processo dovrebbero essere allocati abbastanza frame per il proprio working set.

Se un processo non ha abbastanza memoria per il proprio working set, avverrà un thrashing. Fornire abbastanza frame a ogni processo per evitare il thrashing può richiedere di commutare e schedulare i processi; oltre a richiedere di risolvere i principali problemi di sostituzione della pagina e di allocazione di frame, un'adeguata progettazione di un sistema di paginazione richiede di considerare la dimensione della pagina, l'I/O, il blocco, la prepaginazione, la creazione del processo, la struttura del programma ecc.

Molti sistemi operativi forniscono funzionalità per mappare i file in memoria, permettendo quindi che le chiamate di I/O ai file siano trattate come procedure di accesso alla memoria. Java fornisce un'API per la mappatura della memoria. Ci sono parecchie altre questioni riguardanti la memoria virtuale, tra cui la prepaginazione di un file in memoria, la dimensione di una pagina e la quantità di memoria che può essere referenziata nel buffer look-aside.

La memoria virtuale può essere considerata come un livello in una gerarchia di livelli di memorizzazione in un computer. Ogni livello ha un proprio tempo di accesso, una propria dimensione e propri parametri di costo. Un esempio completo di sistema ibrido e funzionale di memoria virtuale è presentato nel capitolo dedicato al Mach (Appendice B).

| << |  <  |