Esercitazioni ambienti di sistemi operativi
Java
Java è un linguaggio di programmazione general-purpose, concorrente, basato su classi e orientato agli oggetti. Il compilatore converte il codice sorgente Java in un codice intermedio detto bytecode. È tipizzato staticamente (bisogna dichiarare il tipo di una variabile).
Python
Python è un linguaggio interpretato general-purpose. L’interprete converte il codice sorgente Python in codice macchina riga per riga. I tipi dei dati sono dinamici, non è necessario dichiararli.
Definizione di programma e processo
Un programma è un’entità passiva, come il contenuto di un file memorizzato sul disco. Il processo può essere definito come un programma in esecuzione:
- Esegue le proprie istruzioni in modo sequenziale.
- È un’entità attiva, con un program counter che specifica l’attività attuale (ovvero, quale sia la prossima istruzione da eseguire) ed un insieme di risorse associate.
Thread
Detto lightweight process, è un flusso sequenziale di esecuzione di istruzioni all’interno di un programma/processo. In un programma si possono far partire più thread che sono eseguiti concorrentemente. Tutti i thread eseguono all’interno del contesto di esecuzione di un solo processo, ovvero condividono le stesse variabili del programma.
Ciclo di vita di un Thread Java
- New: subito dopo l’istruzione new le variabili sono state allocate e inizializzate; il thread è in attesa di passare nello stato Runnable.
- Runnable: il thread è in esecuzione o in coda di attesa per ottenere l’utilizzo della CPU.
- Not Runnable: il thread non può essere messo in esecuzione dallo scheduler. Entra in questo stato quando è in attesa di operazioni di I/O, oppure dopo l’invocazione del metodo sleep(), o del metodo wait(), che verrà discusso in seguito.
- Dead: al termine dell’esecuzione del suo metodo run().
Thread in Java
Tutti i programmi Java comprendono almeno un thread. Anche un programma costituito solo dal metodo main viene eseguito come un singolo thread. Java fornisce strumenti che consentono di creare e manipolare thread aggiuntivi nel programma.
La Java Virtual Machine (JVM) è in grado di eseguire una molteplicità di thread su una singola CPU. Lo scheduler della JVM sceglie il thread in stato Runnable con priorità più alta; se più thread in attesa di eseguire hanno uguale priorità, la scelta dello scheduler avviene con una modalità ciclica (round-robin).
Il thread messo in esecuzione dallo scheduler viene interrotto se e solo se:
- Il metodo run termina l’esecuzione.
- Il thread esegue yield(), indicando allo scheduler che il thread corrente è disposto a fornire l'uso corrente di un processore (metodo statico).
- Un thread con priorità più alta diventa Runnable.
- Il quanto di tempo assegnato si è esaurito.
Implementazione di thread in Java
Esistono due modi per implementare thread in Java:
- Definire una sottoclasse della classe Thread (più facile da usare in applicazioni semplici, ma limitato).
- Definire una classe che implementa l’interfaccia Runnable.
Thread come sottoclasse di Thread
- Si definisce una nuova classe che estende la classe Thread e che ridefinisce il metodo run() della classe Thread.
- Si crea un’istanza della sottoclasse tramite new.
- Si chiama il metodo start() sull’istanza creata. Questo determina l’invocazione del metodo run() dell’oggetto.
N.B.: L’invocazione diretta del metodo run() non crea un nuovo thread.
Thread come implementazione di Runnable
- Si definisce una nuova classe che implementa l’interfaccia Runnable e che implementa il metodo run() dell’interfaccia Runnable.
- Si crea un’istanza della classe tramite new.
- Si crea un’istanza della classe Thread, passando al suo costruttore un riferimento all’istanza della nuova classe definita.
- Si chiama il metodo start() sull’istanza della classe Thread creata, determinando l’invocazione del metodo run() dell’oggetto Runnable associato.
Classe Thread
Costruttori
- Thread(): crea un nuovo oggetto Thread.
- Thread(String name): crea un nuovo oggetto Thread con nome name.
- Thread(Runnable target): crea un nuovo oggetto Thread a partire dall’oggetto target.
- Thread(Runnable target, String name): crea un nuovo oggetto Thread con nome name a partire dall’oggetto target.
-
Sistemi operativi - Appunti
-
Sistemi operativi - Appunti
-
Appunti di Sistemi operativi
-
Appunti Sistemi Operativi - Seminari sistemi UAV , sistemi operativi NuttX-ROS