Terza Esercitazione. Unix - Esercizio 1. Unix System Call Exec Java Introduzione Thread



Похожие документы
Java Virtual Machine

Multithreading in Java. Fondamenti di Sistemi Informativi

Java threads (2) Programmazione Concorrente

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Esercizio sulla gestione di file in Unix

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Un esercizio d esame. Flavio De Paoli

Esercizi sugli Oggetti Monitor

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica


GESTIONE DEI PROCESSI

Il descrittore di processo (PCB)

Programmazione concorrente in Java. Dr. Paolo Casoto, Ph.D

Esercizi della lezione 5 di Java

Esercizi sul Monitor in Java

Le system call: fork(), wait(), exit()

Elementi di Architettura e Sistemi Operativi

Sistemi Operativi (modulo di Informatica II) I processi

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Modello dei processi. Riedizione delle slide della Prof. Di Stefano

Parola chiave extends

Sincronizzazione e comunicazione tra processi in Unix. usati per trasferire ad un processo l indicazione che un determinato evento si è verificato.

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

Gestione dei thread in Java LSO 2008

Processi e thread. Dipartimento di Informatica Università di Verona, Italy. Sommario

System call per la gestione di processi

Sistemi Operativi Esercizi Sincronizzazione

Esercitazione 2: Java Thread. Java Thread. Java Thread. Un thread:

T 1. Per un processo con più thread di controllo, lo stato di avanzamento della computazione di ogni thread è dato da:

Programmazione multiprocesso

Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Lezione 10: Librerie e compilazione separata

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

Programmazione a Oggetti Lezione 10. Ereditarieta


Esercitazioni 7 e 8. Bounded Buffer con sincronizzazione Java (1)

Gestione delle Eccezioni

Funzioni. Il modello console. Interfaccia in modalità console

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

Il costrutto monitor [Hoare 74]

2. I THREAD. 2.1 Introduzione

progam ponteasensounicoalaternato ; type dir = ( nord, sud );

Il problema del produttore e del consumatore. Cooperazione tra processi

Programmazione concorrente in Java

Corso di Sistemi Operativi Ingegneria Elettronica e Informatica prof. Rocco Aversa. Raccolta prove scritte. Prova scritta

10 - Programmare con gli Array

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

Concetto di Funzione e Procedura METODI in Java

Programmare in Java. Olga Scotti

I THREAD O PROCESSI LEGGERI Generalità

Le variabili. Olga Scotti

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI

Synchronized (ancora)

Arduino: Programmazione

CAP. 6: Nucleo del sistema operativo (La gestione dei processi)

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Test di unità con JUnit4

Gestione dei processi

Introduzione ai Metodi Formali

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Appunti di Informatica 1

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti

Con il pulsante Start si introducono palline che rimbalzano in un area di disegno fino a che non è terminato il loro ciclo di vita (1000 movimenti).

Le command line di Java

13. Chain of Responsibility

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Introduzione alla programmazione in C

Inter Process Communication. Laboratorio Software C. Brandolese

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Architetture Applicative

Capitolo 3 -- Silberschatz

1 Processo, risorsa, richiesta, assegnazione 2 Concorrenza 3 Grafo di Holt 4 Thread 5 Sincronizzazione tra processi

ASPETTI GENERALI DI LINUX. Parte 2 Struttura interna del sistema LINUX

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Il costrutto monitor [Hoare 74]

Funzioni in C. Violetta Lonati

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

Esercizio Sincronizzazione Thread

Tale attività non è descritta in questa dispensa

Realizzazione di una classe con un associazione

Транскрипт:

Terza Esercitazione Unix System Call Exec Java Introduzione Thread Stefano Monti smonti@deis.unibo.it Unix - Esercizio 1 Scrivere un programma C con la seguente interfaccia:./compilaedesegui <file1.c> <file2.c>... <filen.c> dove file1.c,..., filen.c sono file sorgenti C. Il processo padre deve generare 2*N processi (figli e/o nipoti), 2 per ciascun sorgente; per ogni file, uno dei processi figli/nipoti si incaricherà di compilare il file, un altro processo figlio/nipote (DISTINTO dal precedente) di metterne in esecuzione l'eseguibile risultante. Si generino i processi figli sequenzializzando il meno possibile le operazioni di compilazione ed esecuzione.

Vincoli di sincronizzazione I processi compilatori possono essere messi in esecuzione in maniera concorrente, ma... La compilazione deve avvenire prima dell'esecuzione --> il processo che esegue deve sincronizzarsi col processo che compila con le primitive di sincronizzazione finora viste il processo esecutore ATTENDE il termine dell'esecuzione del processo compilatore --> relazione di gerarchia Schema di generazione P E1... Ei..../file1./filei C1 Ci./file1 gcc file1.c -o file1./filei gcc filei.c -o filei : FORK : EXEC

for ( i=1; i<argc;i++){ pid = fork(); if (pid == 0){ /* figlio i-esimo*/ pid = fork(); if (pid == 0){ /* nipote i-esimo : compilazione*/ printf("nipote: compilazione %s\n",argv[i]); execl("/usr/bin/gcc", "gcc", argv[i], "-o", executablename, (char *)0); perror("errore in execl\n"); exit(1); else if (pid > 0){ /* figlio i-esimo : esecuzione*/ printf("figlio: esecuzione %s\n",executablename); wait(&status); //attesa terminazione nipote execl(executablename, executablename, (char *)0); perror("errore in execl\n"); exit(1); else{ perror("errore in fork\n"); exit(1); exit(0); else if (pid > 0){ /* padre */ printf("padre...\n"); else {perror("errore in fork\n"); exit(1); for ( i=1; i<argc;i++){ wait(&status); quali processi eseguono questa porzione di codice? a cosa serve? perché è al di fuori del ciclo for di generazione? Estensione Come fa un esecutore a sapere se il processo compilatore ha compilato correttamente? In particolare, come può l'esecutore venire a conoscenza di eventuali errori di compilazione? Interazione tra processi: modello ad ambiente locale: scambio di messaggi; primitive UNIX (non ancora viste) modello ad ambiente globale: cooperazione tramite accesso a variabili condivise tra processi (possibile in Java, non possibile in Unix)

Java - Modello ad ambiente globale Codice Var locali metodi (Stack1) T1 int x 3 obj o1 obj o2 Var Static Heap T2 int x 192 obj o1 obj o2 Var locali metodi (Stack2) PC1 PC2 Thread 1 Thread 2 Accesso esclusivo Il modificatore synchronized permette di rendere esclusivo l accesso di un thread ad un metodo In assenza di synchronized accessi contemporanei da parte di più thread potrebbero portare l oggetto condiviso in uno stato inconsistente

Esercizio 1 Due persone possono prelevare soldi da uno stesso conto Le operazioni di prelievo possono essere autorizzate solo finchè il saldo del conto è positivo Purtoppo i ritardi del terminale di accesso impongono che gli utenti attendano 3 secondi tra il test sulla condizione e l aggiornamento del saldo Esercizio 1 Il saldo iniziale è pari a 10000 Le due persone tentano continuamente di prelevare 3000 Suggerimenti: Si includa nel main() una verifica del saldo del conto ogni 2 secondi Si modelli il conto come classe autonoma e l operazione di prelievo come un suo singolo metodo Si noti cosa succede se si permette un accesso simultaneo al conto da parte delle due persone

Classe TestMonitor public static void main(string[] args){ SimpleBankAccount b=new SimpleBankAccount(10000); Persona p1=new Persona(b); Persona p2=new Persona(b); p1.start();p2.start(); for(int i=0;i<100;i++){ System.out.println("Current Balance +b.getbalance()); try{thread.sleep(2000); catch(interruptedexception e){ Classe Persona public class Persona extends Thread{ public SimpleBankAccount b; public Persona(SimpleBankAccount b) {this.b=b; public void run(){ for (int x=0;x<3;x++){ b.withdraw(3000);

Classe SimpleBankAccount public class SimpleBankAccount { private int balance; public SimpleBankAccount(int initial) {balance=initial; synchronized public void withdraw(int amount){ if(balance-amount>0){ try{thread.sleep(3000); //Per evidenziare l interferenza catch(interruptedexception e){ balance-=amount; public int getbalance(){return balance; Sospensione di un thread sleep(long millisec) sospende momentaneamente il thread corrente per il numero di millisecondi specificati si tratta di un metodo statico, quindi va invocato sulla classe Thread può sollevare una InterruptedException che deve essere intercettata

Sincronizzazione wait()- il thread che la invoca si blocca in attesa che un altro thread invochi notify() o notifyall() per quell oggetto deve essere in possesso del lock sull oggetto al momento della invocazione rilascia il lock Sincronizzazione notify() - il thread che la invoca risveglia uno dei thread in attesa, scelto arbitrariamente notifyall() - il thread che la invoca risveglia tutti i thread in attesa: essi competeranno per l accesso all oggetto notifyall() è preferibile (e può essere necessaria) se più thread possono essere in attesa

Esercizio 2 Un padre decide di aprire un conto corrente per i suoi due figli Il primo figlio tenta di prelevare 100 1000 volte, il secondo 200 1000 volte Tali prelievi sono permessi solo se consentono di mantenere il saldo maggiore o uguale a 0 Il padre aggiunge 200 se il conto ha saldo minore o uguale a 0 per 1500 volte Suggerimenti: Esercizio 2 Si stampi il saldo del conto ogni volta che lo si modifica Si modellino il padre, i figli e il conto come classi separate Si verifichi: Cosa accade se si utilizza notify() anziché notifyall() Cosa accade se si utilizza notify() e si cambia l ordine di attivazione dei thread