# data[].attributes.body
Le periferiche sono componenti hardware input/output del pc, possono essere interne o esterne al case, può avere un proprio microprocessore, è collegata al pc con o senza fili ed è letta dal so attraverso un driver. Il funzionamento del gestore delle periferiche svolge 4 funzioni: quando la periferica viene collegata al pc, il so gli assegna una lettera (agli hardisk o ssd di solito l'so gli assegna la lettera C), ogni risorse è visibile nel pc, anche se a volte deve essere rimappagta tramite DOS), al primo collegamento i driver possono essere installati automaticamente oppure manualmente e per le periferiche con collegamento usb, i driver sono presenti in una memoria della periferica, cosa che fino a windows 98 non avveniva perchè i driver si installavano tramite CD/DVD.

Il gestore delle periferiche ha 2 funzioni: adatta la modalità d'uso della singola periferica e prende le instruzioni su come usare le periferiche tramite i driver.

# data[].attributes.body
Esistono diversi tipi di SO come open source, a pagamento, per lavoro, per gioco ecc...
I più comuni sono:
- Windows che ha diverse versione (windows 10 l'ultima) è uno dei sistemi operativi più usati al mondo, sia perché di solito è integrato all'acquisto del PC più comuni, sia perché è rapido, fluido e molto semplice da usare. E' utilizzato da persone comuni o da gamers
-Linux open source (la maggior parte delle versioni) è spesso utilizzato da programmatori informatici, hacker e specializzati nella materia ma è anche utilizzato da persone che cercano un sistema operativo veloce e semplice o personalizzabile anche se a volte (per determinate versioni) per compiere determinate azioni è necessario utilizzare la shell (chiamata "terminale" sia su linux che su OSX)
-OSX è il sistema operativo ideato dalla Apple, è semplice e molto veloce. E' utilizzato sopratutto da  grafici.
Esistono molti altri sistemi operativi anche per dispositivi mobili come Android (basato su linux, molto semplice da usare e personalizzabile al massimo), IOS (della Apple, è fluido, molto veloce ed è installato su dispositivi non potentissimi ma grazie ad esso rendono la macchina un mostro ma non sarà mai personalizzabile come android, anche se esistono procedure come il jailbreak che permette di avere un sistema più libero), windows phone (della Microsoft, poco utilizzato ma anche esso molto veloce) e molti altri...

# data[].attributes.body
Essa permette di eseguire programmi anche se non sono completamente caricati in memoria, essi però devono avere 1 cosa fondamentale: che in memoria deve esserci l'istruzione da eseguire e, cosa non fondamentale ma migliore, che devono esserci le istruzioni vicine.

La memoria virtuale viene creata tramite un mmu, un dispositivo hardware che utilizza il so per creare la memoria virtuale.

Essa può essere realizzata tramite 3 strumenti: paginazione, segmentazione e segmentazione paginata.

La paginazione: sia il programma che la memoria sono divise in pagine di dimensione fissa

la segmentazione: in programma è diviso in segmenti eterogenei

La segmentazione paginata: il programma è suddiviso in segmenti e ogni segmento è suddiviso in pagine.

# data[].attributes.body
Ogni programma viene diviso in blocchi di dimensione eguale detti pagine logiche. La memoria centrale viene divisa in pagine fisiche di dimensioni uguali alle pagine logiche.
E' sufficente caricare la prima pagina del programma in memoria centrale quindi in memoria è sufficiente avere una pagina libera e per migliorare l'efficienza si cerca di caricare un numero di pagine maggiore. Occore quindi sapere se occupa una pagina, la pagina occupata e la posizione sul disco della pagina logica.

# data[].attributes.body
Il SO gestisce dei processi ovvero qualsiasi attività svolta dal SO: prima vengono caricati i codici del programma e poi viene eseguito.
Inoltre il SO è anche responsabile della creazione o cancellazione dei processi, della sospensione o continuazione di un processo e della comunicazione e comunicazione tra processi.
I processi si possono trovare in diversi stati: in stato di READY (pronto, attende il permesso di esecuzione e poi viene caricato in memoria) o RUN (stato di esecuzione) o WAIT (attesa o bloccato) o STOP (quando il programma viene terminato).

# data[].attributes.body
I driver hanno 3 funzioni: è un processo di sistema che funge da interfaccia tra il dispositivo fisico e l'utente, funge da adattatore di dati dal formato virtuale usato dal programma della periferica e dalla periferica in se, ed esso, insieme al microprocessore hardware dell'interrupt e con il gestore dei processi, rende possibile la contemporaneità tra fase di esecuzione e fase di I/O di un processo.
In parole semplici un driver è un insieme di processi che aiutano il sistema operativo a leggere un dispositivo hardware e fa da interfaccia tra il dispositivo fisico e l'utente.

# data[].attributes.body
la memoria centrale è una stringa di celle che possono contenere dati, utilizzabile da tutti i processi di un elaboratore. Ne consegue che possono coesistere contemporaneamente più programmi con relativi dati. Da qui deriva la necessità di gestire la memoria in modo tale che ogni processo abbia a disposizione i propri dati. Per far ciò le istruzioni di accesso (acquisizione,rilascio,lettura,scrittura) devono far riferimento agli indirizzi di memoria in modo:
Simbolico - utilizzo di identificatori simbolici all'interno dei sorgenti(all'atto della compilazione verranno tradotti in indirizzi relativi)
Logico - riferimenti a posizioni di memoria relativi all'indirizzo di caricamento del processo ottenuto a run-time
Fisico - riferimento alla posizione fisica assoluta della stringa di memoria Hardware
Ogni processo ha a disposizione una parte di memoria per caricare istruzioni e dati con un proprio indirizzamento logico(indirizzo relativo), che viene rimappato sulla memoria fisica tramite il binding. Questo processo può avvenire in tre modi :
STATICAMENTE (il compilatore genera un indirizzo)
A tempo di compilazione - il compilatore genera un eseguibile con riferimenti fisici alla memoria (programmi particolari come parti del sistema operativo)
A tempo di caricamento - il compilatore genera un eseguibile con riferimenti logici dei quali viene effettuato il binding a run-time
DINAMICAMENTE(l'indirizzo non è generato dal compilatore, ma tornato dal sistema)
A tempo di esecuzione - un processo può essere spostato da una parte all'altra oppure può richiedere un area di memoria esterna run-time.
Ecco cosa fa l'so per gestire la memoria :
1-Controlla chi sta utilizzando la memoria e ne tiene conto
2-Decide quali attività eseguire quando la memoria si libera(Scheduling)
3-Carica in memoria un programma per eseguirlo
4-Evita che un programma non acceda ad una zona ad esso non autorizzata e fa il Binding tra memoria fisica e logica, In più alloca e dealloca spazi di memoria
Infine è necessario concludere dicendo, che la memoria centrale è la zona dove risiedono tutti i programmi caricati e in stato di run-time. Da questo si deduce che i programmi vengono caricati in memoria centrale (Random Access Memory), che è una memoria volatile, che si resetta ad ogni spegnimento del pc

# data[].attributes.body
L'allocazione del codice e dei dati può avvenire in varie tecniche :
CONTIGUA in un unico segmento (si esegue un programma per volta) oppure a partizioni multiple di lunghezza fissa (maggiore velocità, ma spreco di memoria e limiti nel caricamento programmi) o variabile.
NON CONTIGUA tramite paginazione (la memoria viene scaricata e caricata sull' HD), o segmentazione (codice e dati sono su due segmenti separati).Allocare file in modo contiguo, significa avere dei file posizionati in modo che siano tutti accodati,il che rende il processo di lettura molto più veloce; allocare in modo non contiguo invece, significa avere dei file che si possono trovare in zone diverse e distanti fra loro, il che rende la lettura più lenta.

# data[].attributes.body
L'Onion Skin è un modello strutturale composto da moduli (skin), ogni modulo è deputato a svolgere un determinato compito, tramite una serie di funzioni (primitive). I moduli dovranno essere  indipendenti e utilizzare solo le primitive per comunicare tra di loro. Le primitive dovranno restare immutate, in modo da permettere modifiche strutturali interne al modulo stesso, senza impattare sugli altri moduli. I moduli sono(dal più interno al più esterno): il nucleo(kernel), la gestione della memoria centrale, delle periferiche, il file system, l'interprete dei comandi(shell), e i programmi applicativi

# data[].attributes.body
Il file system si occupa della gestione delle informazioni, ha una struttura ad albero composta da file e directory amministrate dalla radice a cui si può accedere da root.
Esistono 2 grandi categorie di file system: per unità locali (ovvero quelle che organizzano i dati sul disco) e i file system distribuiti (che utilizzano la rete, servono per condividare tra più macchine dei file)
I file system hanno diverse funzioni tra cui dare la possibilità all'utente di gestire i file nella memoria di massa, dare la possibilità all'utente di accedere ai dati nel disco rigido velocemente in modo limitato (ovvero proteggendo dati o cryptando file o accedere da determinati utenti ecc...) o in modo illimitato (ovvero che i file possono essere eseguiti, modificati o letti da tutti senza metodi di protezione) e sempre in modo limitato o illimitato a seconda della scelta dell'utente i file system permettono di modificare file, crearne dei nuovi e organizzarli come più ci è comodo.

# data[].attributes.body
La segmentazione serve a suddividere la memoria in blocchi fissi o variabili in modo da risparmiare spazio sul disco e il tempo della gestione della memoria.
Ogni segmento contiene oltre ai file contenuti delle informazioni sulla posizione nel disco, sulla dimensione che occupa, da dove inizia e se è presente in memoria.

# data[].attributes.body
Il sistema operativo è un gruppo di programmi e software che gestiscono il funzionameno del pc, è costituito da una interfaccia grafica che cambia dal tipo di distribuzione e versione.
Il sistema operativo anche se noi non ce ne accorgiamo gestisce tutti i componenti hardware del pc come processore, hard disk ecc. , gestisce i processi, la memoria, le periferiche e i file, ci protegge da eventuali attacchi informatici con l'ausilio di altri particolari software e ci da anche la possibilità di impartire comandi alla "shell" in modo da comunicare direttamente con la macchina. Il SO risiede nell'hard disk.
Nel SO è presente il kernel che viene avviato all'avvio della macchina seguendo le istruzioni del bios durante una procedura chiamata Bootstrap. Il Kernel ha il compito di dare ai processi in esecuzione un accesso sicuro e controllato all' hardware del pc