Download - Unix e GNU/Linux - lia.deis.unibo.itlia.deis.unibo.it/Courses/sola0607-info/esercizi/esercitazione1/esercitazione1(4x).pdf · Attualmente varie distribuzioni GNU/Linux (comunemente

Transcript

Prima Esercitazione

Fork

Stefano [email protected]

Eugenio [email protected]

Unix e GNU/LinuxUnix: sviluppato negli anni '60-'70 presso Bell Labs di AT&T,

attualmente sotto il controllo del consorzio The Open GroupUNIX certified: sistemi fully-compliant (IBM AIX, Solaris 10, ...)Unix-like: sistemi NON fully-compliant (GNU/Linux, BSD, ...)

GNU (GNU's Not Unix)progetto annunciato da Stallman '83; obiettivo la creazione di un sistema operativo free Unix-likeobiettivo raggiunto nel '92, con l'adozione del kernel Linux

Linuxprimo kernel rilasciato nel 1991 ad opera di Torvalds, successivamente, adozione di software dal progetto GNUattualmente kernel ufficiale Linux nome in codice Vanilla

Distribuzioni GNU/LinuxAttualmente varie distribuzioni GNU/Linux (comunemente distro):

personalizzazione del kernel vanillacollezione di pacchetti (applicativi) software: archivi compressi usati per automatizzare e semplificare l'installazione di applicazioni (compilazione dei sorgenti, impostazione delle variabili di ambiente, configurazione di permessi, ecc...)alcuni esempi: Redhat/Fedora, Slackware, Debian, Gentoo, Ubuntu, SUSE, ecc...

Gestori di pacchetti: sono pacchetti a loro voltadifferenti per famiglie di distribuzioni (RPM, APT, Portage, ecc...)operazioni di installazione, rimozione, aggiornamento di pacchetti softwaregestione dipendenze tra pacchetti

Ai fini del corso...Necessità di utilizzare un sistema operativo Unix-like; varie

possibilità:Installazione di una distribuzione Linux su una macchina fisica:

maggiore apprendimento ma complessità e problematiche maggiori (partizionamento del disco fisso, dual booting, ecc...)

Uso distribuzioni Linux Live CDnessuna installazione, ambiente di lavoro “stateless” e ripetibile, prestazioni penalizzate

Virtualizzazioneinstallazione ugualmente complessa ma priva di complicazioni per la macchina fisica, prestazioni ragionevoli

Virtualizzazione

HARDWARE

Host OS (e.g., Windows or GNU/LINUX)

Virtualization Software

Virtual Machine

Guest OS GNU/LINUX

Virtual Machine

Guest OS Windows

Virtual Machine

Guest OS GNU/LINUX

VMWareSoftware di virtualizzazione largamente diffuso

diversi prodotti, sia commerciali che gratuiti per piattaforme Windows e GNU/Linuxhttp://www.vmware.com/products/free_virtualization.html

VMWare Player: esecuzione di macchine virtuali esistentiVMWare Server: creazione e configurazione di nuove macchine virtualiVirtual Appliances Marketplace: repository di macchine virtuali “preconfezionate” (ad es., installazioni di base delle maggiori distro)VMWare Converter: creazione di macchine virtuali a partire da macchine fisiche (solo per piattaforma Windows) già esistenti

Shell - comandi di baseman <nome_comando>

manuale del comando e opzionicd <nome_directory>

Permette di spostarsi all’interno del file systemPosizioni relative:

• . (direttorio corrente) e .. (direttorio padre)

mkdir <nome_nuova_directory>Creazione di un nuovo direttorio

ls <parametri>Lista il contenuto del direttorio corrente

emacs (o vi) <nome_file>Programmi per l’editing; se il file non esiste, lo creano

Compilazione di un programmaComando gcc <file>

Compilatore C e C++Compila <file> producendo il file eseguibile a.out

Per dare un nome diverso al file prodotto opzione -o

Es: gcc file_exec.c -o f_exEsecuzione: ./f_ex <parametri>

Comandi fondamentali

•Raccoglimento dello stato di terminazione di un figlio (con eventuale attesa)•Restituisce il pid del figlio terminato e permette di capire il motivo della terminazione (Volontaria? Con quale stato? Involontaria? A causa di quale segnale?)

wait

•Terminazione di un processo•Si indica lo stato di terminazione; normalmente stato=0 se il processo termina correttamente, un valore diverso da 0 in caso di problemi

exit

•Generazione di un processo figlio, che condivide il codice col padre e possiede dati replicati•Restituisce il pid del figlio per il padre, 0 per il figlio o unnumero <0 in caso di errore

fork

Esempio 1 - fork e exitScrivere un programma in cui il processo padre procede alla istanziazione di un numero N di figliAttenzione all’indicazione di terminazione dei figli

Cosa succede se ci si dimentica di effettuare la exit()?

Esempio 1int main (int argc, char * argv[]){

int i,j,k,pid,status,childs;

char term;

childs=atoi(argv[1]);

term=argv[2][0];for(i=0;i<childs;i++) {

pid=fork();if(pid==0) {

if(term=='1') exit(0);

}else if(pid>0) { printf("%d)child

created(pid=%d)\n",getpid(),pid);

}else perror("fork error:");

}}

Assenza della exit()

1for(i=0;i<childs;i++) {pid=fork();if(pid==0) {

if(term=='1') exit(0);

}

2

for(i=0;i<childs;i++) {pid=fork();if(pid==0) {

if(term=='1') exit(0);

}

i=0

i=0i=1

3

for(i=0;i<childs;i++) {pid=fork();if(pid==0) {

if(term=='1') exit(0);

}

i=1

4

i=2for(i=0;i<childs;i++) {pid=fork();if(pid==0) {

if(term=='1') exit(0);

}

i=2

i=2

Esempio 2 - fork e waitScrivere un programma in cui il processo padre procede alla istanziazione di un numero N di figli. Ciascun figlio è incaricato di stampare a terminale 10 volte una lettera dell’alfabeto, ottenuta scostandosi dalla lettera ‘a’ un numero di lettere pari all’ordine di generazione del figlio stesso. Si richiede un output ordinato: prima dovranno essere stampate le 10 ‘a’, quindi le 10 ‘b’ …Problema di sincronizzazione tra il padre ed i figli

Quale grado di parallelismo?

Esempio 2for(i=0;i<CHILDS;i++)

{pid=fork();if(pid==0)

{c='a'+i;for(j=0;j<ITERATION;j++)

{printf("%c",c);fflush(0);for(k=0;k<ACTIVE_WAIT;k++); //Ciclo di attesa attiva

}printf(” \n");exit(0);}

else if(pid>0) {wait(&status);}

else perror("fork error:");}

Assenza della wait()

1

3 N2

acdamd…

Standard output

i=0 i=1 i=10

a b m

Esercizio 1 1/2Scrivere un comando che abbia la sintassi

hierarchy <flag> <#_cldr> <#_grandcldr>*

Numero di figli alprimo livello dellagerarchia

Flag per controllare il grado di concorrenza:‘1’ figli in ordine sequenzialealtrimenti figli in parallelo

Lista del numero di nipoti (grandchildren) corrispondenti a ciascun figlio

Esercizio 1 2/2In particolare

Il processo padre genera un numero di figli pari al valore indicato dall’argomento <#_cldr>Ciascun figlio genera un numero di figli (nipoti del processo padre) pari al valore corrispondente nella sequenza individuata dagli argomenti <#_grandcldr>*Il parallelismo è determinato dal flag

• Come fa il padre a gestirlo?

Father

417416 420i=0

i=1 i=2

./hierarchy 0 3 2 1 3

422

421 423i=0

i=1

i=2

418i=0419 424

i=0 i=1

Attenzione ai pid dei processi: con <flag>=0 non

abbiamo ordine di precedenza nelle

sequenze di generazione*

*N.B.: localmente ad ogni processo I figli verranno generati in ordine comunque

Father

419416 421i=0

i=1 i=2

./hierarchy 1 3 2 1 3

423

422 424i=0

i=1

i=2

420i=0417 418

i=0 i=1

Attenzione ai pid dei processi: con

<flag>=1 ciascun processo padre deve

attendere la terminazione

dell’ultimo figlio generato prima di

generarne altri