Sistemi operativi (M. 1)

Al sistema operativo è assegnato il compito di controllare il tempo e lo spazio in memoria di:

  • risorse hardware, gestite in modalità kernel
  • applicazioni software, eseguite in modalità utente

L'astrazione delle risorse permette di rendere i software indipendenti dall'hardware.

Storia

L'evoluzione dei sistemi operativi è suddivisa in:

  1. Iᵃ generazione (1945-1955):

    All'inizio non possedevano un S.O. e venivano riprogrammati cablando i circuiti.

    Successivamente, vennero introdotti S.O. a monoprogrammazione, che permettevano la lettura e l'esecuzione di un job (i.e. programma) alla volta.

  2. IIᵃ generazione (1955-1965):

    Si diffusero S.O. batch (single-stream batch-processing), che permettevano la lettura di più job, assieme ai rispettivi dati in input, e la loro esecuzione consecutiva senza alcun intervento.

    In memoria era solamente presente il compilatore e successivamente il programma, oltre che il S.O.

  3. IIIᵃ generazione (1965-1980):

    Divennero a multiprogrammazione, i.e. CPU condivisibile da più utenti, alternando l'esecuzione tra i job della pool (i.e. insieme di job da eseguire), cosa che portò ai primi algoritmi di scheduling.

    All'inizio veniva cambiato job mentre aspettava il completamento di operazioni I/O, i.e. spooling usando il disco come buffer per i dati da scrivere. In seguito venne introdotto il time-sharing, per cui lo scheduler da un tempo fisso ad ogni job, per poi effettuare un cambio di contesto.

    Avendo ogni processo in memoria, fu necessaria l'invenzione della memoria virtuale.

    Per i job che necessitano del controllo in tempi precisi, vennero introdotti i sistemi real-time.

    Inoltre, fu in questo periodo che venne sviluppato Internet con il TCP/IP.

  4. IVᵃ generazione (1980-):

    Con i personal computer e le workstation furono introdotte le interfacce grafiche e il multithread.

    Tra i nuovi sistemi vennero sviluppati i:

    • sistemi paralleli, cioè aventi più CPU
    • sistemi distribuiti, cioè composti da più computer connessi

    Sopra Internet venne diffuso il modello client/server e il World Wide Web.

    Nella programmazione invece, si diffuse l'Object Oriented Programming e il software open source.

  5. Vᵃ generazione (1990-):

    In questo periodo si sviluppò la tecnologià per la mobilità, come i S.O. mobili e il risparmio energetico.

Componenti

La comunicazione tra dispositivi avviene attraverso i bus, cioè un insieme di tracce o collegamenti elettrici. Nelle trasmissioni di due dispositivi, il bus è detto porta. Quando sono di più invece, è detto canale di I/O.

Tra i bus più importanti, con velocità nell'ordine dei MHz, ci sono:

  • USB (Universal Serial Bus): dedicata a dispositivi plug and play lenti
  • FSB (Front-side bus): collega la CPU alla RAM
  • SATA (Serial AT Attachment): per la connessione di dischi esterni
  • SCSI (Small Computer System Interface): alternativa a SATA
  • PCIe (Peripheral Component Interconnect Express): collegamento standard per periferiche aggiuntive
  • DMI (Direct Media Interface): connette la CPU con il controller di periferiche
  • AGP (Accelerated Graphic Port): per il collegamento di schede video

Mentre, tra i componenti software del S.O. ci sono:

  • Scheduler
  • Gestore della memoria
  • Gestore del I/O
  • Gestore dell'IPC
  • Gestore del filesystem

Tipi

Ogni S.O. è progettato in base al suo scopo, tra cui in particolare:

  • Embedded (e.g. elettrodomestici): in grado di gestire efficacemente le risorse su dispositivi limitati
  • Smartphone (o PDA con telefonia)
  • Real-time: per programmi che richiedono poco timeout
  • Server: supportano molteplici connessioni e servizi
  • Multiprocessore: in grado di gestire la coerenza tra processori
  • Mainframe: per potenti computer centralizzati
  • Distribuito: gestisce le risorse di più computer e tollera guasti, un middleware ne semplifica lo sviluppo

Come struttura invece, può essere:

  • monolitico: le componenti fanno parte del kernel, per cui è efficiente ma difficile da debuggare

  • a livelli: migliora il sistema monolitico isolandolo in livelli, come il THE (Technische Hogeschool Eindhoven)

  • microkernel: limitato ma modulare e quindi estensibile, per cui i livelli comunicano in stile client/server

Architettura

Protezione

Tra i meccanismi di protezione di un S.O., il processore:

  • Impedisce ai processi di accedere ad area di memoria protette
  • Implementa le modalità kernel e utente
  • Gestisce interrupt ed eccezioni generati dai dispositivi passando il controllo al S.O.

Due esempi di dispositivi che generano interrupt sono il timer, che ne genera uno periodicamente per evitare che i processi usino il processore troppo a lungo, ed il clock, che fornisce l'ora del giorno.

Avvio

L'avvio invece, avviene tramite il bootstrapping, per cui:

  1. Il BIOS (Basic Input Output System) inizializza l'hardware
  2. Carica il boot sector dal disco in memoria
  3. Il codice viene eseguito che carica il S.O. dal disco

dove il BIOS è oggi rimpiazzato dall'EFI (Extensible Firmware Interface).

Processi

Un processo è un programma in esecuzione che possiede:

  • uno spazio degli indirizzi
  • risorse tra cui registri, file descriptor e segnali
  • un descrittore
  • un UID (User Identifier) dell'utente che ha avviato il processo

Tra i registri, esiste il Program Status Word contenente lo stato e la modalità in cui si trova il processo.

Per eseguire istruzioni privilegiate, il processo genera una trap (i.e. un'eccezione che porta la CPU in modalità kernel passando il controllo al S.O.) tramite cui viene eseguita una system call. Un esempio di system call è l'accesso ad un dispositivo I/O da parte di un processo.

Possono anche comunicare tra di loro tramite una tecnica chiamata IPC (Inter-process Communication).

Filesystem

Tra i costrutti supportati dai filesystem unix, ci sono:

  • File speciali tra cui dispositivi a blocchi su cui la scrittura avviene a blocchi che possono essere interpretati da dei driver, e i dispositivi a caratteri su cui la scrittura avviene un byte alla volta
  • Pipe dei file buffer che permettono lo scambio di informazioni tra processi