Il sistema operativo (SO) è un software fondamentale per il funzionamento del computer, in quanto gestisce e coordina tutte le risorse disponibili, sia hardware che software. Esso si occupa di gestire la memoria, il processore, i dispositivi di input e output, la connessione di rete e molte altre risorse necessarie per far funzionare il computer.
Inoltre, il SO permette di condividere le risorse tra i vari programmi che vogliono accedervi contemporaneamente, senza che questi se ne accorgano. Ad esempio, se due programmi vogliono accedere in contemporanea al disco rigido, sarà il sistema operativo a fare da mediatore tra i due, garantendo che entrambi possano accedere alle risorse richieste senza problemi di conflitto.
L'interfaccia utente è un'altra importante funzione del SO, in quanto permette di creare programmi uniformi e semplici da capire per gli utenti. Il sistema operativo si occupa di stampare a schermo le finestre, i pulsanti e altri elementi grafici in modo che tutte le applicazioni siano esteticamente simili e facili da utilizzare. Ogni SO moderno ha due interfacce utente: una non grafica, detta anche terminale, e una grafica, tipicamente associata allo stile di Windows o Mac OS. L'interfaccia terminale è utilizzata principalmente dagli utenti avanzati e dagli amministratori di sistema per eseguire comandi e configurare il sistema, mentre l'interfaccia grafica è quella maggiormente utilizzata dagli utenti comuni per interagire con il computer attraverso finestre, icone e menu.
L'architettura della CPU è un aspetto importante da considerare quando si parla di sistemi operativi. I SO sono infatti predisposti per funzionare su determinate tipologie di CPU, come ad esempio le architetture RISC o CISC, a 32 o 64 bit. In alcuni casi, lo stesso SO viene ricompilato per funzionare su architetture diverse, ma questo comporta un lavoro di sviluppo e di testing aggiuntivo.
Un esempio di sistema operativo che funziona su architetture diverse è Linux, che supporta un'ampia gamma di CPU, tra cui quelle basate su architettura ARM, utilizzate ad esempio in dispositivi come il Raspberry Pi.
Le API (Application Programming Interface) sono un'altra importante caratteristica dei sistemi operativi. Esse sono dei punti di accesso che consentono ai programmi di utilizzare le funzionalità del SO, come ad esempio la gestione della memoria, la gestione dei file, la rete e molte altre.
Le API sono fondamentali per lo sviluppo di software, in quanto consentono ai programmatori di utilizzare le funzionalità del SO senza dover conoscere i dettagli di implementazione. Ad esempio, in Java, la funzione System.out.println() utilizza un'API del SO per stampare il testo sullo schermo.
Tuttavia, è importante notare che le API possono essere diverse a seconda del sistema operativo utilizzato. Ciò significa che un programma compilato per funzionare su un determinato sistema operativo potrebbe non funzionare su un altro sistema operativo, a meno che non venga opportunamente ricompilato e adattato alle API del nuovo sistema operativo.
Il cmd (Command Prompt) è un prompt dei comandi simile a DOS, presente nei sistemi operativi Windows. Esso consente di eseguire comandi di base, come ad esempio la gestione dei file, la modifica delle impostazioni di rete e altre funzioni di base.
Il concetto di shell è nato invece con Linux, dove è stata sviluppata una shell testuale (la bash) in grado di fornire un'interfaccia utente avanzata per l'esecuzione di comandi. Successivamente, sono state sviluppate anche delle varianti grafiche della shell, come ad esempio la GUI di GNOME o KDE. In seguito all'introduzione di Linux nei server, Microsoft ha iniziato a perdere clienti a causa della mancanza di un'interfaccia di comando avanzata. Per risolvere questo problema, Microsoft ha introdotto il PowerShell, una shell avanzata con funzionalità aggiuntive rispetto al Command Prompt di Windows.
Il PowerShell consente di eseguire comandi avanzati, come ad esempio lo spegnimento di un computer remoto o la gestione delle ventole. Inoltre, il PowerShell consente di utilizzare comandi basati su oggetti, in modo da semplificare la gestione delle risorse del sistema.
Vediamo ora i processi sono un concetto fondamentale dei sistemi operativi. Essi sono presenti dal 1995 e rappresentano un programma in esecuzione all'interno del sistema operativo. Ogni processo funziona all'interno di un'area di memoria delimitata, in modo da garantire la sicurezza del sistema e proteggere i dati. Ogni processo è identificato da un numero intero detto PID (Process ID).
Se si avvia più volte lo stesso programma, verranno creati più processi aventi lo stesso nome ma con PID diverso. Inoltre, ogni processo può avere una priorità, che determina l'ordine in cui viene eseguito in caso di mancanza di risorse del sistema. La priorità può essere controllata tramite la gestione attività del sistema operativo.
Inoltre, ogni processo può essere composto da più task, ovvero elementi dello stesso processo che sono contemporaneamente in esecuzione e che possono comunicare tra loro. Ad esempio, il processo di un programma di videoscrittura come Word può avere un task che si occupa di leggere la tastiera, uno che si occupa di scrivere a video il testo e uno che esegue il controllo ortografico.
Recentemente, la gestione dei processi è stata migliorata per rendere il sistema più stabile. Ad esempio, Google Chrome ha iniziato a creare più processi e pochi task, per separare le varie schede del browser e garantire maggiore stabilità del sistema. Questa tecnica è stata poi adottata anche da altri browser e applicazioni.
I drivers (o moduli in Linux) sono aggiunte al Kernel che permettono di comunicare con dispositivi hardware, come ad esempio una stampante, una scheda audio o un joystick. I drivers sono molto delicati, perché possono accedere ad aree del computer con cui si possono creare problemi. Per questo motivo, è importante utilizzare solo driver che siano stati testati e che siano compatibili con il sistema operativo in uso.
USER SPACE (software) --> Kernel Space (drivers) --> Hardware
La variabile Path rappresenta un'altra importante elemento di configurazione del sistema operativo. Essa è una stringa che contiene tutti i percorsi in cui cercare il programma da eseguire quando viene specificato solo il nome. Questo consente di eseguire i programmi in modo rapido e semplice, senza dover specificare ogni volta il percorso completo del programma.
La variabile Path può essere modificata dalle impostazioni del sistema, accedendo alle proprietà di sistema e alle variabili d'ambiente. In questo modo è possibile aggiungere nuovi percorsi di ricerca per i programmi o modificare quelli esistenti.
Kernel: Esso si frappone tra il software e l'hardware del sistema, e permette ai vari programmi di accedere alle risorse del sistema, come la memoria, il processore e le periferiche. I software creati con java e dalle persone comuni che devono passare per il kernel. Scrivere software per il Kernel è molto complicato (driver) e si rischia di fare danni (Inoltre è meglio evitare di installarli perché possono contenere virus…). Sequenza di avvio del PC:
Il programma base della scheda madre (BIOS, Basic Input/Output System) viene letto ed eseguito. Nei pc più recenti non hanno più il BIOS, ma una tecnologia più avanzata (UEFI, Unified Extensible Firmware Interface), che permette anche di effettuare diagnostiche ed altre operazioni senza accedere al sistema operativo. Si può inoltre avere sullo stesso pc due sistemi operativi e poi scegliere quali usare.
Il Bios va a cercare nei dispositivi il Master Boot Record (se ce ne sono più di uno si può selezionare quello principale da Bios, si usa per craccare password con Pendrive)
Nel Master Boot Record viene letto un piccolo programma, il Boot Loader
Il Boot Loader va a leggere da una partizione il kernel del SO e lo carica in memoria
Il SO carica l’interfaccia grafica
Errore di Windows, riprovare a riavviare il pc senno è rotto definitivamente. Forse si è rotto qualche file, oppure l'hardware...
Esecuzione applicazioni: ogni applicazione può essere eseguita in due contesti:
Kernel Space: accesso diretto alle risorse hardware (memoria, periferiche, ecc). Um errore in Kernel Space può causare danni irreversibili al sistema, per cui questo spazio viene utilizzato solo per programmi che richiedono un accesso diretto alle risorse.
User Space: l’accesso alle risorse avviene tramite il Kernel Blue Screen of Death: messaggio dato da Windows quando qualcosa in esecuzione in Kernel Space genera un errore. I kernel di Linux vengono aggiornati settimanalmente e se c'è un errore in genere si riprova con i file vecchi.
Tipi di Kernel: ma cosa deve stare dentro allo user space e cosa dentro al kernel space?
Micro Kernel: il Kernel è quanto più piccolo possibile, ma può essere espanso con l’aggiunta di altro codice. Ha il problema che devo creare tanti punti di accesso al mio sistema, e tanti elementi prodotti da altri dovranno poter accedere ad elementi delicati del Kernel.
Kernel Monolitico: il Kernel contiene quante più cose possibile, in genere non si possono aggiungere driver. Inoltre se uno di questi elementi si rompe, tutto il Kernel si rompe. Ha il vantaggio che quasi tutte le periferiche funzionano senza componenti aggiuntivi ed è più sicuro.
Attualmente in genere sono un mix dei due
Monolith-, Micro- and a "hybrid" kernel, a draft of new version, Data 17 luglio 2008, Fonte http://en.wikipedia.org/wiki/Image:OS-structure.svg, Autore Golftheman.
Servizi e Demoni: sono dei programmi che vengono eseguiti automaticamente senza alcuna interazione con l’utente (servizi è il nome Windows, demoni in Unix). In Windows, i servizi sono eseguiti dal programma “svchost.exe” che può contenere più servizi al suo interno (con lo stesso PID). In Unix vengono eseguiti come normali programmi.
Impostazioni programmi: Le impostazioni dei programmi vengono conservate in piccoli file di testo in quasi tutti i sistemi operativi. Solo Windows raccoglie tutte le impostazioni in un unico file chiamato Registro di Sistema, che contiene le impostazioni comuni a tutti gli utenti (Local Machine) e quelle legate al singolo utente. Le impostazioni dell'utente corrente sono copiate al login in un ramo dell'albero chiamato Current User. Il Registro di Sistema di Windows può essere un problema se si corrompe o si danneggia, poiché tutte le informazioni sono salvate in un unico file. Per questo motivo, Windows ha implementato i punti di ripristino, che consentono di ripristinare il Registro di Sistema a uno stato precedente. In Unix, le impostazioni dei programmi sono salvate in file separati, quindi se uno di questi file viene danneggiato, il resto del sistema funziona normalmente.
La gestione delle risorse è un aspetto fondamentale del sistema operativo, che si occupa di allocare e gestire le risorse hardware del sistema, come la memoria, la CPU e le periferiche.
Per quanto riguarda la memoria, il sistema operativo tiene traccia delle aree di memoria utilizzate dai vari programmi, in modo da evitare che un processo in ambiente User Mode vada a scrivere sopra ad aree di memoria utilizzate da altri programmi.
Inoltre, quando la memoria RAM del calcolatore non è sufficiente, si utilizza la memoria virtuale, che permette di estendere la capacità della RAM utilizzando dispositivi di memorizzazione, come ad esempio un disco rigido o un SSD. Il sistema operativo non espone direttamente la RAM alle applicazioni, ma una memoria virtuale i cui elementi sono associati alla RAM o al disco rigido. In questo modo, quando la RAM non è più sufficiente, il sistema operativo sposta lo spazio occupato da un processo non attivo sul disco, liberando spazio in RAM per l'utilizzo da parte di altri processi.
Nel mondo Unix, si creano una o più partizioni dedicate sul disco (swap) per gestire la memoria virtuale, mentre nel mondo Windows si creano uno o più file su disco (ad esempio sul disco C:). Tuttavia, nel caso di Windows, i file di swap tendono a deframmentarsi, il che può rallentare il sistema e richiedere più tempo per l'accesso alla memoria virtuale.
Gestione File System: le applicazioni non sanno come è strutturato un file system, si occupa di tutto il SO: basta dargli alcuni comandi essenziali (crea file, cancella file…) ed il SO scriverà le informazioni corrette nella tabella del file system. Unix e Windows gestiscono il file system in modo diverso:
Windows, deriva da DOS, associa una lettera ad ogni partizione, e crea un albero per ogni partizione. Le cartelle sono separate usando il simbolo “\”
Unix ha un unico albero, ed ogni partizione può essere collegata (montata) in un punto diverso dell’albero. Le cartelle sono separate usando il simbolo “/”. Anche per percorsi web, perché sono stati sviluppati con sistemi Unix
Il buffer è un'area di memoria temporanea utilizzata per migliorare la velocità di lettura e scrittura dei dati su un dispositivo di archiviazione, come un disco rigido o un dispositivo USB. Invece di scrivere direttamente sul dispositivo di archiviazione, il file viene scritto nella memoria RAM, dove può essere rapidamente accessibile e modificato. Successivamente, un programma a parte si occupa di spostare effettivamente i dati dal buffer al dispositivo di archiviazione.
Tuttavia, se il buffer non viene gestito correttamente, può causare problemi:
Il buffer overflow si verifica quando un programma che sta scrivendo i dati nel buffer viola i limiti del buffer stesso e invade uno spazio di memoria adiacente. Questo può causare seri problemi di sicurezza, poiché gli hacker possono sfruttare questa vulnerabilità per iniettare codice dannoso nel programma principale.
Il buffer underrun si verifica quando la velocità di riempimento del buffer è inferiore alla velocità con cui viene svuotato, il che può causare problemi durante la masterizzazione di un CD o DVD, ad esempio.
Il buffer viene utilizzato anche nel contesto della stampa, dove viene chiamato spooler di stampa. Il spooler di stampa funziona in modo simile al buffer, consentendo di inviare più lavori di stampa alla stampante senza dover attendere che uno sia completato prima di inviarne un altro. I lavori di stampa vengono inseriti in una coda (spool) che li invia alla stampante quando è pronta per riceverli.
Windows: monolitico e in realtà è caduto in disuso. Attualmente per essere precisi, tutti i sistemi operativi moderni di Microsoft sono figli di Windows NT, nato per i server, con grafica 3d. Usa un micro kernel (anche se nella versione NT è reclamizzato come ibrido, ma è più marketing che sostanza). Fino alla versione Windows 7 era solo per processori x86, mentre Windows 8 supporta anche processori ARM e 64bit(Windows 8 RT). Il nuovo Kernel è per processori ARM risk per tablet. Creò confusione nell'eseguire i programmi che ora è sparita.
Unix: molto vecchio (1970) e ancora in uso perché ha prodotto due gruppi importanti: Linux e OS X. Usa un Kernel Monolitico.
Mac OS X: figlio di Unix ed è compatibile con esso quasi totalmente. Fino al 2005 solo per CPU PowerPC (RISC della IBM), ma dal 2006 con un annuncio a sorpresa di Steve Jobs la produzione è passata alle CPU Intel (quindi CISC). Dal 2020 si è tornato indietro usando processori prodotti da Apple stessa. Ha kernel monolitico.
Linux: sviluppato da Linus Torvald nel 1991, ispirandosi ad Unix. Può essere eseguito sostanzialmente su ogni piattaforma esistente (cellulari, pc intel, pc arm...). Il codice sorgente è disponibile e modificabile, correggere errori rapidamente. Recentemente un università americana è stata esclusa dal modificare il kernel perché avevano sviluppato un programma per controllare la qualità e cercare errori.
Distribuzione Linux: sistema operativo composto da una serie di programmi che si basano sul kernel Linux. In genere la distribuzione è accompagnata da un sistema di gestione di pacchetti utile per installare/ disinstallare/ aggiornare i programmi (pacchetti). Gli aggiornamenti sono giornalieri e di piccole dimensioni.
Android: basato su Linux, i programmi sono quasi tutti sviluppati in Java. Sviluppare app è gratis
iOS: basato su Unix, i programmi sono quasi tutti sviluppati in C++. Sviluppare app costa circa 100 euro all'anno di licenza.
Windows mobile: era un sistema operativo sviluppato da Microsoft per dispositivi mobili, come smartphone e tablet. Lanciato per la prima volta nel 2000, Windows Mobile è stato il predecessore di Windows Phone e di Windows 10 Mobile, che sono stati poi sostituiti da Windows 10. Windows Mobile utilizzava un kernel monolitico e supportava i processori x86, ARM e MIPS. Tuttavia, Windows Mobile non ha avuto molto successo a causa della forte concorrenza con iOS di Apple e Android di Google. Nel 2007, con il lancio dell'iPhone di Apple, il mercato dei dispositivi mobili è cambiato radicalmente e Microsoft ha faticato a tenere il passo con i nuovi concorrenti.
Infine esistono i terminali, gli emulatori e la virtualizzazione sono tre strategie diverse per utilizzare software basato su un sistema operativo differente da quello utilizzato dal computer.
Il terminale è un software che permette di accedere a un sistema operativo remoto tramite una connessione di rete. In ambiente Windows, si utilizza lo standard RDP (Remote Desktop Protocol) per accedere a un computer remoto. Questo metodo richiede una connessione di rete affidabile e può essere utilizzato per eseguire programmi e accedere a file su un altro computer.
Gli emulatori sono programmi che traducono i dati in tempo reale e permettono di eseguire programmi compilati per un sistema operativo all'interno di un altro sistema operativo, purché l'architettura del calcolatore sia la stessa. Gli emulatori sono utili per eseguire programmi che non sono disponibili per il sistema operativo corrente, come videogiochi nati per Windows. Gli emulatori più noti sono Wine, Cygwin, LDPlayer e gli emulatori di PlayStation e Xbox.
La virtualizzazione, invece, permette di eseguire un sistema operativo all'interno di un altro sistema operativo, creando una macchina virtuale. La macchina virtuale simula un computer a tutti gli effetti e permette di eseguire programmi e accedere a file come se si fosse su una macchina fisica. I sistemi di virtualizzazione più comuni sono Xen, VmWare, VirtualBox, HyperV e Parallels. La virtualizzazione è utile per eseguire più sistemi operativi su uno stesso computer e per testare software in un ambiente isolato.
Java è un sistema di virtualizzazione che permette di eseguire il software Java su vari sistemi operativi. Il codice Java viene compilato in bytecode, che può essere eseguito sulla Java Virtual Machine (JVM) su diversi sistemi operativi. Ciò significa che il software Java può essere eseguito su diversi sistemi operativi senza dover essere riscritto per ogni piattaforma.