AA 2020-2021 Corso "Sistemi Operativi" - Marco Tessarotto - Moodle@Units
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
Cosa è un Sistema Operativo? Sistema operativo: insieme di programmi (software) che gestisce gli elementi fisici di un calcolatore (hardware). 2
Il calcolatore visto a «livelli» • L’utente utilizza il computer attraverso l’interfaccia utente utente (tastiera, mouse, schermo, touchscreen, riconoscimento vocale…) Programmi applicativi (compilatori, browser, • I programmi applicativi (o ambienti di svilluppo, shell, editor etc) programmi utente) utilizzano le risorse di elaborazione per fornire strumenti agli utenti per risolvere Sistema operativo problemi • Il sistema operativo controlla l’hardware e ne coordina l’utilizzo Hardware (CPU, memoria, storage …) da parte dei programmi applicativi • L’hardware fornisce le risorse di elaborazione 3
Compiti di un Sistema Operativo • Il compito di un sistema operativo è di condividere il calcolatore tra più programmi e di fornire un insieme di servizi più utili rispetto a quello che l’hardware da solo offre • i sistemi operativi forniscono modi controllati per i programmi di interagire, in modo che possano condividere dati o lavorare insieme • Il sistema operativo gestisce ed astrae l’hardware di basso livello • condivide l'hardware tra più programmi in modo che vengano eseguiti (o sembrino eseguire) allo stesso tempo tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7 4
Interfaccia del S.O. verso i programmi utente • Un sistema operativo fornisce servizi ai programmi utente tramite un'interfaccia • Progettare una buona interfaccia risulta essere difficile: • Da un lato, vorremmo che l'interfaccia fosse semplice e ridotta al minimo indispensabile («narrow») perché ciò rende più facile implementarla correttamente • D'altra parte, potremmo essere tentati di offrire molte funzionalità sofisticate alle applicazioni • Il trucco per risolvere questa tensione è progettare interfacce che si basino su pochi meccanismi che possono essere combinati per supportare molti casi d’uso. tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7 5
Interfaccia del S.O. verso i programmi utente • Il sistema operativo Unix fornisce un'interfaccia minima i cui meccanismi si combinano bene, offrendo un sorprendente grado di generalità. • Questa interfaccia ha avuto un tale successo che i sistemi operativi moderni - BSD, Linux, Mac OS X, Solaris e persino, in misura minore, Microsoft Windows - hanno interfacce di tipo Unix. tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7 6
Codice sorgente, codice macchina, programma • Per "codice sorgente" si intende qualsiasi descrizione completamente eseguibile di un sistema software • codice sorgente: una raccolta di codice in formato testo, con o senza commenti, scritta utilizzando un linguaggio di programmazione comprensibile dall'uomo • Il codice sorgente di un programma specifica le azioni che devono essere eseguite da un computer • Il codice sorgente viene trasformato da un assemblatore o compilatore in codice macchina che può essere eseguito dal computer. • Il codice macchina viene memorizzato dal compilatore in un «file» (programma) per l'esecuzione in un secondo momento. • In alternativa, il codice sorgente può essere interpretato e quindi eseguito immediatamente. 7
Kernel, processo, istruzioni, dati, stack • Unix assume la forma tradizionale di un kernel (nucleo), un programma speciale che fornisce servizi ai programmi in esecuzione. • Ogni programma in esecuzione, chiamato processo, ha una memoria contenente istruzioni (codice macchina), dati e uno stack (pila). • Le istruzioni (codice macchina) sono il risultato della traduzione fatta dal compilatore a partire dal codice sorgente ed implementano le azioni che deve svolgere il programma. • I dati sono le variabili su cui agiscono le istruzioni. • Lo stack organizza le chiamate di funzioni del programma nel corso dell’esecuzione delle istruzioni tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7 8
System call • Quando un processo deve utilizzare un servizio del kernel, invoca una chiamata di funzione all’interno dell'interfaccia del sistema operativo. • Tale invocazione è detta chiamata di sistema (system call). • La chiamata di sistema entra nel kernel; il kernel esegue il servizio e restituisce il risultato • Quindi un processo alterna l'esecuzione tra spazio utente e spazio kernel. • Ovvero: un processo, nel corso dell’esecuzione, eseguirà istruzioni del programma (nello spazio utente) ed istruzioni del kernel (nello spazio kernel, quando il programma effettuerà delle system call) • Il kernel utilizza i meccanismi di protezione hardware della CPU per garantire che ogni processo in esecuzione nello spazio utente possa accedere solo alla propria memoria. • Il kernel viene eseguito con i privilegi hardware richiesti per implementare queste protezioni; i programmi utente vengono eseguiti senza questi privilegi. • Privilegi hardware: insieme di istruzioni «privilegiate» e dati riservati utilizzabili nello spazio kernel • Quando un programma utente invoca una chiamata di sistema, l'hardware aumenta il livello di privilegi e inizia a eseguire una funzione prestabilita nel kernel. tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7 9
System call tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 8 10
Caratteristiche di un Sistema Operativo • Il sistema operativo gestisce ed assegna le risorse del calcolatore ai programmi • Tempo di CPU, spazio di memoria, spazio per la memorizzazione dei file, dispositivi di I/O • Il S.O. agisce come gestore di tali risorse. • Di fronte a richieste multiple e/o conflittuali di risorse, il S.O. decide come assegnarle agli specifici programmi ed utenti affinché il computer operi in modo equo ed efficiente 11
Breve storia di UNIX 12
Breve storia di UNIX • Linux è un S.O. che fa parte della famiglia dei S.O. UNIX 1965: 500 Kg, 4K words • La prima implementazione di un S.O. UNIX fu realizzata nel 1969: Ken Thompson ai Bell Laboratories, divisione di AT&T. • Fu scritto per il minicomputer Digital PDP-7 13
Linguaggio di programmazione C • Dennis Ritchie, collega di Thompson, cominciò a sviluppare il linguaggio C e nel 1973 il S.O. UNIX fu riscritto quasi completamente in linguaggio C • UNIX divenne uno dei primi sistemi operativi scritti in un linguaggio ad «alto livello» => quindi «facilmente» portabile su altre architetture hardware • Il linguaggio C nasce fin dall’inizio per scrivere sistemi operativi 14
Storia di UNIX • Dal 1969 al 1979, UNIX fu sviluppato attraverso varie “release” (rilasci) : • First edition, 1971 • Second edition, 1972 • Third edition, 1973 • Fourth edition, 1973 • Fifth edition, 1974: UNIX installato su più di 50 sistemi • Sixth edition, 1975: usato fuori da AT&T 15
BSD e System V • Fino a questo punto: UNIX è di proprietà di AT&T che non può venderlo in quando monopolista nel campo telefonia fissa. • Ma, dal 1974, AT&T concede l’uso di UNIX alle università USA… che ci mettono mano e contribuiscono allo sviluppo di UNIX. Lo possono fare perché AT&T fornisce, con la licenza, anche il codice sorgente di UNIX. • Seventh edition, 1979 • Da questo punto UNIX diverge in: BSD e System V 16
BSD • Thompson nel 1975/76 è professore a Berkeley, Università della California: insegna UNIX • Nasce la Berkeley Software Distribution (BSD) con molti miglioramenti, nuovi strumenti etc. • La prima distribuzione è 3BSD nel dicembre 1979 17
BSD e … Internet • 4.2BSD nel 1983, contiene una implementazione completa di TCP/IP • 4.3BSD nel 1986 • 4.4BSD nel 1993 • 4.2BSD viene distribuita in molte università nel mondo 18
System V • Nel frattempo: AT&T viene “spezzettata” dal governo USA nel 1982… AT&T può vendere licenze commerciali di UNIX : • Release System III, 1981 • System V, 1983 • System V Release 4, 1989 19
Microsoft (ed altri) e UNIX System III è stato utilizzato (su licenza commerciale) da aziende terze per creare altri S.O. proprietari derivati da UNIX: SunOS (di Sun Microsystems), Apple Macintosh, SCO XENIX (Microsoft) 20
Free Software Foundation • Nel 1984, Richard Stallman iniziò a lavorare su una versione “free” di UNIX (libera da diritti commerciali, patenti…) e nel 1985 fonda la Free Software Foundation (FSF), organizzazione no-profit. • Inizia il progetto GNU (GNU is not UNIX). Viene sviluppata (1989) la licenza GNU General Public License (GPL). Software licenziato con la GPL deve essere reso disponibile nel suo codice sorgente e deve essere liberamente distribuibile (open source) 21
Progetto GNU • Il Progetto GNU ha prodotto molti programmi «open source» usati ancora oggi (ma non un S.O. UNIX completo: mancava il «kernel») • Il progetto GNU ha prodotto: emacs, gcc (GNU C compiler), bash shell, glibc (the GNU C library) … 22
Architettura tipica del sistema operativo 23
Linus Torvalds • Nel 1991, Linus Torvalds è uno studente finlandese presso l’Università di Helsinki • Nel corso degli studi, era entrato in contatto con Minix, un S.O. Unix- like, sviluppato a scopo didattico dal prof. Andrew Tanenbaum (ma Minix non era molto efficiente in quanto era, per prima cosa, uno strumento didattico) • Torvalds iniziò a scrivere per hobby un S.O. per il suo PC basato su Intel 80386 24
Linux Kernel • Quindi, Torvalds decise di iniziare a scrivere il suo UNIX kernel (1991)… • Il 5 ottobre 1991 pubblicò su Usenet un messaggio, pubblicando la versione 0.02 del Kernel Linux (quasi subito con licenza GPL). Altri programmatori si unirono a Torvalds nello sviluppo del kernel Linux 25
https://groups.google.com/g/comp.os.minix/c/dlNtH7RRrGA/m/SwRavCzVE7gJ 26
OS Linux Applicazioni (web browser, email, editor, …) User space GNU C library (glibc), X11, gcc … Sistema operativo Kernel Linux kernel space hardware 27
Linux Kernel • 1991: avvio del progetto • Marzo 1994: Linux Kernel versione 1.0 • Marzo 1995: Linux Kernel 1.2 • Giugno 1996: Linux Kernel 2.0 • Gennaio 1999: Linux Kernel 2.2 • Gennaio 2001: Linux Kernel 2.4 • Dicembre 2003: linux Kernel 2.6 • … • Gennaio 2020: Linux Kernel 5.5 (https://www.kernel.org oppure github.com) • Marzo 2021: Linux Kernel 5.11 28
BSD – un altro UNIX «libero» • Nei primi anni 90, era disponibile un altro UNIX free per intel x86-32: il porting di BSD per x86-32, conosciuto come 386/BSD. Era basato sul source code di 4.3BSD (che non conteneva praticamente più codice di AT&T). • 386/BSD si divise in due progetti paralleli: NetBSD (portabilità) e FreeBSD (performance). • NetBSD 0.8, aprile 1993 • FreeBSD 1.0, dicembre 1993 • OpenBSD (security), 1996, fork di NetBSD • Nel 1992 AT&T iniziò una causa verso Berkeley… durata fino al 1994 • risultato: 4.4BSD-Lite, Release 2, giugno 1995 29
Linux ed altre architetture • All’inizio dell sviluppo di Linux, l’obiettivo principale era lo sviluppo di una implementazione efficiente per il solo processore Intel 80386 • Con il crescere della popolarità di Linux, fu portato su altre architetture quali: x86-64, Motorola/IBM PowerPC, Sun SPARC, MIPS, ARM, IBM zSeries, Intel IA-64 … 30
Cpu Intel 80386 (anni ‘80) • https://en.wikichip.org/wiki/intel/microarc hitectures/80386 • 1.5 µm process • 275,000 transistors • Clock: 33 MHz 31
Linux OS - distribuzioni • Per Linux OS si intende: kernel Linux più altro software (strumenti, librerie) che insieme formano un OS completo, pronto per l’uso => distribuzione (distribution) • Linux kernel + progetto GNU = GNU/Linux • Le prime distribuzioni apparvero nel 1992. La più vecchia ancora attiva è Slackware. Debian apparve nel 1993. Ubuntu (derivata da Debian) apparve nel 2004. 32
Standard linguaggio C • Linguaggio C: lo standard “di fatto” era il libro “The C Programming language” di Kernighan e Ritchie (1978). C++ iniziò nel 1985. • Necessità di standardizzare il linguaggio C: 1989, American National Standards Insitute (ANSI) C standard: definisce il linguaggio e la standard C library (funzioni stdio, stringhe, math, header files etc). Versione di C nota come C89 (descritta nel libro “The C Programming language” , seconda edizione). • Nel 1999 fu promulgato una versione aggiornata dello standard del linguaggio C: C99 • Nel 2011: C11 • Nel 2018: C18 33
POSIX • POSIX: Portable Operating System Interface • Gruppo di standard sviluppati da IEEE, per promuovere la portabilità di applicazioni a livello di codice sorgente. • POSIX.1 : divenne uno standard di IEEE nel 1988; basato sulle UNIX system calls e API della C standard library. Ma non richiede necessariamente UNIX come OS (quindi altri S.O. possono implementare questo standard). • POSIX.2: standardizza la shell ed altre utilities, inclusa l’interfaccia a riga di comando del compilatore C. 34
POSIX e Linux • Nel 2001: POSIX.1-2001, noto anche come Single UNIX Specification Version 3: SUSv3. Sono 3700 pagine di standard. • 2008: SUSv4 o POSIX.1-2008 • Linux OS punta a seguire gli standard UNIX, ma non lo segue completamente 35
Numeri di Linux Kernel • Linux 5.4 sources: • 66.031 files (git ls-files | wc -l) • 27.679.764 lines (git ls-files | xargs cat | wc -l) • 889.221.135 bytes (git ls-files | xargs cat | wc -c) Tratto da https://bootlin.com/doc/training/embedded-linux/embedded-linux-slides.pdf 36
As of kernel version 4.6 (in percentage of number of lines) • drivers/: 57.0% • kernel/: 1.2% • arch/: 16.3% • firmware/: 0.6% • fs/: 5.5% • lib/: 0.5% • sound/: 4.4% • mm/: 0.5% • scripts/: 0.4% • net/: 4.3% • crypto/: 0.4% • include/: 3.5% • security/: 0.3% • Documentation/: 2.8% • block/: 0.1% • tools/: 1.3% • ... 37
USER vs KERNEL • Kernel e Utente sono due termini che vengono spesso utilizzati nei sistemi operativi. • La loro definizione è piuttosto semplice: il kernel è la parte del sistema operativo in esecuzione con privilegi più alti mentre lo spazio utente di solito si riferisce ad applicazioni in esecuzione con privilegi bassi. • utente privilegiato: un utente autorizzato (e quindi affidabile) a svolgere funzioni rilevanti per la sicurezza che gli utenti ordinari non sono autorizzati a svolgere • il privilegio è definito come la delega dell'autorità per eseguire funzioni rilevanti per la sicurezza su un sistema informatico (esempi di privilegi in un S.O.? Installare un programma, creare un nuovo utente…) 38
USER vs KERNEL • Modalità utente e modalità kernel sono termini che possono fare riferimento in modo specifico alla modalità di esecuzione del processore. • Il codice che viene eseguito in modalità kernel può controllare completamente la CPU mentre il codice che viene eseguito in modalità utente presenta alcune limitazioni. 39
USER vs KERNEL • Lo spazio utente e lo spazio del kernel possono riferirsi specificamente alla protezione della memoria o agli spazi degli indirizzi virtuali associati al kernel o alle applicazioni dell'utente. • Semplificando grossolanamente, lo spazio del kernel è l'area di memoria riservata al kernel mentre lo spazio dell'utente è l'area di memoria riservata a un particolare processo dell'utente. • Lo spazio del kernel è protetto dall’accesso diretto da parte delle applicazioni utente 40
Architettura tipica del sistema operativo • Nell'architettura tipica del sistema operativo (vedere la figura seguente) il kernel del sistema operativo è responsabile dell'accesso e della condivisione dell'hardware in modo sicuro ed equo verso le applicazioni • Il kernel offre alle applicazioni una Application Programming Interface (API) che generalmente viene chiamata «interfaccia delle chiamate di sistema» o «system calls interface» • questa API è diversa dalle normali API di libreria perché rappresentano il limite in base al quale la modalità di esecuzione passa dalla modalità utente alla modalità kernel 41
Application 1 Application 2 Application 3 User space System Call Interface Kernel Kernel subsystems: process management, memory management, ... space Device drivers interrupts hardware 42
System call interface • Per garantire la compatibilità delle applicazioni, le chiamate di sistema vengono modificate raramente. Linux lo impone in particolare (diversamente dalle API del kernel che possono cambiare in base alle esigenze) • Il codice del kernel stesso può essere logicamente separato nel codice del kernel principale e nel codice dei driver di dispositivo. Il codice dei driver di dispositivo è responsabile dell'accesso a determinati dispositivi mentre il codice del kernel principale è generico. • Il kernel principale può essere ulteriormente suddiviso in più sottosistemi logici (ad es. Accesso ai file, rete, gestione dei processi, ecc.) 43
Linux Kernel https://bootlin.com/doc/training/embedded-linux/embedded-linux-slides.pdf 44
Puoi anche leggere