Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
UNIX
Unix consiste in due componenti principali: i programmi di sistema e il nucleo (kernel). La parte principale del sistema operativo si trovava per la maggioranza nel kernel, ma con il tempo si è provato a ridurre il kernel. Siccome è multi-programmato, la memoria non si gestiva caricando un processo per volta, ma caricandoli tutti. I sistemi operativi realizzano anche dei servizi di comunicazione tra i programmi di servizio, offrendo la possibilità che i programmi possano comunicare e sincronizzarsi tra loro. I processi intercambiano messaggi fra di loro quando hanno in comune un dispositivo. Questi interscambi avvenivano tramite i sistemi operativi, perché erano presenti più programmi. Per la comunicazione sono stati creati due sistemi: scambi di messaggi e memoria condivisa.Di memoria del SO viene copiato nell'area di memoria del processo B. È un'operazione che il S.O. mette a disposizione anche nei programmi dell'utente attraverso le system call. Non ci sono aree di memoria condivise tra i due processi.
Memoria condivisa -> Si realizza un'area di memoria comune (oltre a quella privata) ai processi (più programmi potrebbero avere un'area di memoria condivisa). Ogni processo capisce di avere un'area di memoria condivisa con gli altri, e può andare a leggere o scrivere il dato. Questa condivisione (per cui abbiamo una system call) può avere il problema che i processi devono sincronizzarsi tra loro per leggere e scrivere il dato. Se due processi modificano contemporaneamente il dato, non si ha la certezza del risultato. Devono mettersi d'accordo su chi scrive prima e chi scrive dopo (come con la system call "wait", che ti fa aspettare l'arrivo di un certo evento).
//Architetture
del SOApproccio a livelli (o strati), Il SO è composto da un certo numero di livelli (strati) ognuno costruito a partire dai livelli sottostanti. Il livello 0 è quello hardware, il più alto è l'interfaccia utente. In ogni livello sono usate le funzionalità dei livelli sottostanti. Esempio: Android, dove abbiamo il kernel di Linux, al livello superiore le librerie, al livello 2 l'application framework e al livello utente abbiamo le application. Struttura del sistema a microkernel, come l'approccio a stati ma la maggior parte delle funzioni sono state spostate fuori dal nucleo. Questo porta a una maggior efficienza. Struttura modulare di Solaris, non segue l'approccio a strati ma si basa sull'idea che il kernel possa interagire con tutti gli altri componenti del sistema. Chiunque può invocare il kernel. Ogni modulo può chiamare gli altri ma deve prima comunicare con il kernel, che fa da intermediario. Per loPer lo scambio dei dati si usa lo scambio di messaggi. La struttura a stella è un tipo di rete in cui un nodo centrale è connesso a tutti gli altri nodi.
Le macchine virtuali sono software che emulano operazioni di un computer in software anziché in hardware. Questo significa che possono essere installate su un hardware e consentono di eseguire operazioni diverse rispetto al sistema operativo principale, senza la necessità di conoscere i dettagli dell'hardware sottostante.
È possibile installare diverse macchine virtuali su un singolo hardware, consentendo di eseguire operazioni diverse rispetto ad altri software. Il processore e la memoria vengono virtualizzati e i programmi vengono mostrati all'utente in modo diverso rispetto alla loro reale esecuzione.
Questo concetto è stato implementato da IBM sui mainframe per soddisfare le esigenze di ogni utente che si collegava al computer centrale. Veniva installata una macchina virtuale con più sistemi operativi, consentendo a ciascun cliente di scegliere il sistema operativo desiderato e di eseguire le proprie applicazioni, con la macchina virtuale che impediva agli altri utenti di interferire con il proprio ambiente.
Vari SO diinteragire tra loro, quindi si dividevano le risorse. Oggi viene usata per installare più SO su un pc, e per fare questo bisogna:
- Partizionare il disco o usarne due diversi
- Usare una Virtual Machine, che viene eseguito come se fosse un programma che gira su Windows e non sull'hardware.
Java Virtual Machine
Il linguaggio Java si basa sulla JVM, perché essendo un linguaggio ideato per l'esecuzione di programmi sulla rete, deve adattarsi ai diversi computer che possono avere diversi SO. Un programma java scritto per un altro computer, quando arriva sul mio parla con la virtual machine, che lo riconosce e lo esegue. Mi arriva un codice intermedio che dialoga con la v.m. Se così non fosse, le app che scarichiamo dal web non potrebbero essere eseguite da tutti i computer.
Gestione dei processi di elaborazione
- Concetto di Processo
- Scheduling di Processi
- Operazioni su Processi
- Processi Cooperanti
- Concetto di Thread
- Modelli
- I thread in diversi SO
- L'esecuzione di programmi ha diversi nomi, all'inizio venivano chiamati job, poi processo o task.
- Il codice
- Il program counter, per conoscere a quale istruzione siamo arrivati
- Lo stack, struttura dati che contiene lo stato di un processo
- La sezione dati, la parte dei dati che vanno inseriti poi in RAM
- new, il processo viene creato, da questo stato il programma può transitare solo nello stato ready.
- ready, il processo non viene eseguito subito perché potrebbe esserci un altro programma in esecuzione. Dallo stato ready posso passare allo stato running.
- running,
La CPU legge ed esegue le istruzioni per un certo intervallo di tempo. Da questo stato posso passare a 2 stati:
- Terminated, il codice è terminato
- Waiting, si deve fare un'operazione di I/O o avviene un certo evento, da qui si passa nuovamente allo stato ready, per attendere la fine di altri processi in esecuzione
Ready, nel caso di un interrupt da running si passa a ready (finisce il quanto di tempo)
Ogni volta che un processo entra nello stato "new" si crea un PCB, Process Control Block (carta di identità) che vengono memorizzati in RAM, ognuno di questi contiene:
- Stato del processo
- Program counter
- Registri della CPU
- Info sullo scheduling della CPU
- Info di memory-management
- Info di accounting
- Stato dell'I/O
- ID del processo
- ID dell'utente
Nei sistemi multi-programmati deve avvenire una commutazione della CPU tra due processi, quando un processo, in esecuzione, viene interrotto bisogna salvare i dati che stava trattando.
E ripristinarli quando il processo torna inesecuzione. In Linux ogni pcb viene messo in una lista i cui elementi sono collegati sia con l'elemento successivo che con quello precedente, in più il puntatore all'elemento corrente. Questo avviene tramite una Lista Blinkata dei PCB, esposta solamente l'elemento corrente.
Nei sistemi multi-programmati vengono definite alcune code:
- Coda dei processi, l'insieme di tutti i processi nel sistema.
- Ready queue, l'insieme di tutti i processi in memoria centrale pronti per essere eseguiti.
- Coda del dispositivo, l'insieme dei processi in attesa di usare un dispositivo.
I processi passano da una coda all'altra mentre cambiano stato. Il nucleo dei SO, oltre a gestire il diagramma di stato gestisce anche le code.
Associato al diagramma dei processi abbiamo il diagramma di accodamento. La prima coda è la coda dei processi in attesa nello stato di ready ("ready queue"). In questa coda i
processi arrivano:- o perché vengono creati ("new")
- oppure provengono da altri stati
- viene eseguito, da cui si può essere necessario mandare il processo:
- All' i/o requesto nel time slice expired (tempo di esecuzione terminato eo quindi torna nella coda dei pronti)
- fork a child -> "crea un altro figlio, poi eseguilo e torna poio nella coda dei pronti"
- oppure è in attesa di un'interruzione.
- in terminazione
- a lungo termine: è un processo del s.o. che viene lanciato quando si attiva il nucleo, e seleziona i processi da inserire nella coda dei pronti. Avviene solo nel momento in cui noi lanciamo dei processi. Interviene ogni tanto.
- a breve termine: seleziona tra i processi pronti e secondo un suo algoritmo di scheduling, decide tra questi quale verrà eseguito.
inoutput un solo id di processo. Interviene continuamente.
a medio termine: nell'evoluzione dei s.o. si è scoperto che c'erano dei processi in stato di ready o di waiting, che occupavano una grande quantità di memoria senza essere eseguiti. Lo swapper quando si accorge che un processo tiene occupata un'area di memoria per lungo tempo, la copia sul disco (swap-out), liberando memoria RAM e riportarlo in memoria (swap-in) quando sarà possibile. Questo, ottimizza l'utilizzo della memoria
I processi possono essere classificati come:
- I/O bound, fa molte operazioni i/o e pochi calcoli
- CPU bound, fa poco i/o e molti calcoli
Context Switch
Operazioni di passaggio da un processo all'altro da parte della CPU
Il tempo impiegato nel context switch è un costo.
Creazione dei processi
La creazione di un processo avviene quando io lancio un programma. Quando ciò avviene, il s.o. nello specifico crea il processo (tipicamente si chiama
“init”). Il SO operativo crea i processi utente come processi figli, e a sua volta può creare altri processi figli.
I processi padri-figli possono:
- Condividere tutte le risorse
- Condividere una parte delle risorse del padre
- Non condividere risorse
- Essere eseguiti contemporaneamente
- Il padre rimane in attesa della terminazione del figlio
L’operazione di creazione è a cura del SO. In Unix (come negli altri SO) quando si crea un nuovo processo, il processo figlio viene creato come duplicato del processo padre e poi eventualmente differenziato. Questo viene fatto per evitare di calcolare tutto ciò che serve alla creazione.