Unix e GNU/Linux -...
Embed Size (px)
Transcript of Unix e GNU/Linux -...

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