Unix e GNU/Linux Eugenio Magistretti emagistretti@deis.unibo.it Prima Esercitazione Fork Stefano Monti smonti@deis.unibo.it Unix: sviluppato negli anni '60-'70 presso Bell Labs di AT&T, attualmente sotto il controllo del consorzio The Open Group UNIX 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-like obiettivo raggiunto nel '92, con l'adozione del kernel Linux Linux primo kernel rilasciato nel 1991 ad opera di Torvalds, successivamente, adozione di software dal progetto GNU attualmente kernel ufficiale Linux nome in codice Vanilla Distribuzioni GNU/Linux Attualmente varie distribuzioni GNU/Linux (comunemente distro): personalizzazione del kernel vanilla collezione 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 volta differenti per famiglie di distribuzioni (RPM, APT, Portage, ecc...) operazioni di installazione, rimozione, aggiornamento di pacchetti software gestione 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 CD nessuna installazione, ambiente di lavoro stateless e ripetibile, prestazioni penalizzate Virtualizzazione installazione ugualmente complessa ma priva di complicazioni per la macchina fisica, prestazioni ragionevoli
Virtualizzazione VMWare GNU/LINUX Windows Virtualization Software Host OS (e.g., Windows or GNU/LINUX) HARDWARE GNU/LINUX Software di virtualizzazione largamente diffuso diversi prodotti, sia commerciali che gratuiti per piattaforme Windows e GNU/Linux http://www.vmware.com/products/free_virtualization.html VMWare Player: esecuzione di macchine virtuali esistenti VMWare Server: creazione e configurazione di nuove macchine virtuali Virtual 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 base man <nome_comando> manuale del comando e opzioni cd <nome_directory> Permette di spostarsi all interno del file system Posizioni 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 programma Comando 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_ex Esecuzione:./f_ex <parametri>
Comandi fondamentali Esempio 1 - fork e exit fork exit wait 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 un numero <0 in caso di errore 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 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?) Scrivere un programma in cui il processo padre procede alla istanziazione di un numero N di figli Attenzione all indicazione di terminazione dei figli Cosa succede se ci si dimentica di effettuare la exit()? Esempio 1 Assenza della exit() int main (int argc, char * argv[]) int i,j,k,pid,status,childs; char term; childs=atoi(argv[1]); 1 for(;i<childs;i++) if(pid==0) term=argv[2][0]; for(;i<childs;i++) if(pid==0) else if(pid>0) created(pid=%d)\n", getpid(),pid); else perror("fork error:"); printf("%d)child for(;i<childs;i++) if(pid==0) 2 4 for(;i<childs;i++) if(pid==0) 3 for(;i<childs;i++) if(pid==0)
Esempio 2 - fork e wait Scrivere 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 2 for(;i<childs;i++) 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"); else if(pid>0) wait(&status); else perror("fork error:"); Assenza della wait() i=1 2 1 i=10 3 N Esercizio 1 1/2 Scrivere un comando che abbia la sintassi hierarchy <flag> <#_cldr> <#_grandcldr>* a b m acdamd Standard output Flag per controllare il grado di concorrenza: 1 figli in ordine sequenziale altrimenti figli in parallelo Numero di figli al primo livello della gerarchia Lista del numero di nipoti (grandchildren) corrispondenti a ciascun figlio
Esercizio 1 2/2 In 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? 416 i=1 419 424./hierarchy 0 3 2 1 3 Father 417 418 Attenzione ai pid dei processi: con <flag>=0 non abbiamo ordine di precedenza nelle sequenze di generazione* 420 i=1 422 421 423 *N.B.: localmente ad ogni processo I figli verranno generati in ordine comunque 416./hierarchy 1 3 2 1 3 Father 419 Attenzione ai pid dei processi: con <flag>=1 ciascun processo padre deve attendere la terminazione dell ultimo figlio generato prima di generarne altri 421 i=1 417 418 420 i=1 423 422 424