Sistemi Operativi. Esercitazione 2 Compilazione, Makefile e Processi



Похожие документы
Gestione dei processi

Programmazione multiprocesso

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

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

Corso di Laboratorio di Sistemi Operativi

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

Introduzione a GCC: GNU Compiler Collection

Controllo di processi

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

Processi UNIX. I Processi nel SO UNIX. Gerarchie di processi UNIX. Modello di processo in UNIX

Processi e Sincronizzazione. Laboratorio Software C. Brandolese M. Grotto

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Processi in Linux. Igino Corona 20 Ottobre 2009

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Lezione 10: Librerie e compilazione separata

ZZZ01 Esercizi Vari. Esercizi per preparazione alla prova pratica di laboratorio


Makefile. Un target in generale e' un file. Usando.PHONY: target specifichiamo a make che il target non e' un file

CREAZIONE PROCESSI IN UNIX 20

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

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

POSIX - Gestione dei Segnali. E.Mumolo, DEEI mumolo@units.it

Compilatori GNU in Linux: gcc e g++

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

IPC System V. Code di messaggi

Corso di Programmazione Concorrente Processi. Valter Crescenzi

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

NOZIONI BASE PER ESERCITAZIONI

System call per la gestione di processi

Il comando Make: : uno strumento per la compilazione ed esecuzione di software applicativo. A. Murli - Cacolo Scientifico a.a.

Corso di Laurea in Matematica. Seminario C/C++ Lorenzo Dusty Costa. Università degli Studi di Milano Dipartimento di Matematica

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Capitolo 3 -- Silberschatz

Funzioni. Il modello console. Interfaccia in modalità console

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

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

INTRODUZIONE, LINGUAGGIO, HANDS ON. Giuseppe Cirillo

CLUSTER COKA. Macchine e Risorse

GDB. The GNU Debugger

Il compilatore Dev-C++

Concetto di processo. Processi. Immagine in memoria di un processo. Stati di un processo. Un SO esegue una varietà di attività:

Gestione dei processi

LABORATORIO DI SISTEMI OPERATIVI

Esercizio sulla gestione di file in Unix

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

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

I Metacaratteri della Shell Unix

Programmazione di Sistema 3

Il sistema operativo UNIX/Linux. Gli script di shell

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

Introduzione all uso di Eclipse

Fondamenti di Informatica T-1 CdS Ingegneria Informatica a.a. 2011/2012. Introduzione a Visual Studio 2005/2008/2010

Elementi di Architettura e Sistemi Operativi

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

Funzioni in C. Violetta Lonati

Il Software. Il software del PC. Il BIOS

Sistemi Operativi STRUTTURA DEI SISTEMI OPERATIVI 3.1. Sistemi Operativi. D. Talia - UNICAL

Mini Guida per Apple XCode. Maurizio Martinelli

VARIABILI LOCALI E GLOBALI (ESTERNE)

IL LINGUAGGIO C NOSTRO APPROCCIO AL C. Sempre con esempi che illustrano le caratteristiche del linguaggio. SCRIVERE ED ESEGUIRE IL PRIMO PROGRAMMA C

I TUTOR. Massimiliano Cattafi Ilaria Laurenti

Richiamo compilatore FORTRAN 77

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

Corso di Informatica

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino

Definizione Parte del software che gestisce I programmi applicativi L interfaccia tra il calcolatore e i programmi applicativi Le funzionalità di base

Comandi filtro: sed. Se non si specificano azioni, sed stampa sullo standard output le linee in input, lasciandole inalterate.

Header. Unità 9. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi


I SISTEMI OPERATIVI (1)

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

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

Dipartimento di Sistemi e Informatica Università degli Studi di Firenze. Dev-C++ Ing. Michele Banci 27/03/2007 1

Programmazione di sistema in Linux: System Call per il controllo processi. E. Mumolo, DIA

Introduzione a Dev-C++

Introduzione al Linguaggio C

DevC++ vers Manuale d uso

Транскрипт:

Sistemi Operativi Esercitazione 2 Compilazione, Makefile e Processi

Percorso Compilazione programmi in c Makefiles Processi definizione gestione creazione

Compilazione di programmi in C

Compilazione e Linking Codice sorgente Librerie (file oggetto) COMPILATORE LINKER File oggetto Eseguibile

Compilatore e linker gcc Open-Source GNU project http://www.gnu.org Compilatore e linker gcc Supporta C e C++ Comando generico gcc <opzioni> <argomenti> Opzioni: elenco di flag che controllano il compilatore e il linker; Argomenti: elenco di file che gcc legge e trasforma in maniera dipendente dalle opzioni

Opzioni gcc (1) Opzioni più comuni -c file -o file -g -Wall Esegue la compilazione non il linker Specifica il nome di output; in genere indica il nome dell eseguibile finale (linkando) Indica a gcc di non ottimizzare il codice e di inserire informazioni extra per poter effettuare il debugging (i.e., vedere gdb) Stampa warning per tutti i possibili errori nel codice

Opzioni gcc (2) -Idir -lm -Ldir Specifica ulteriori direttori in cui cercare gli header file Specifica utilizzo libreria matematica Specifica direttori per ricercare librerie preesistenti

Processo di creazione dell'eseguibile Il compilatore prende in ingresso i file sorgenti e fornisce in uscita i file oggetto (object files -.o files) gcc -c main.c -c(compile) con l'opzione -c vengono creati solo I file oggetto e non l'eseguibile Il linker prende in ingresso i file oggetto e crea l'eseguibile gcc main.o -o nome_eseguibile Compilazione e linking in una sola istruzione gcc main.c -o nome_eseguibile

Makefiles

Cos'è un Makefile? I Makefies sono dei file che permettono, insieme al comando make di compilare e gestire i propri progetti (Programmi scritti in C) man make Sono utili per compilare i file.c soprattutto nel caso si abbiano tanti file da compilare con tanti headers da includere

Come sono organizzati? La versione base di un Makefile è composta da: target: dipendenze [tab] comando unix Esempio Makefile: all: target Shell : make all gcc Wall main.c o mywc comando unix di compilazione

Usare le dipendenze A volte può essere utile usare target differenti Example: compile: echo compiling my application gcc -Wall main.c -o mywc install : compile esegue prima il target compile e poi il target install echo copying executable in the deploy directory... clean : echo clean object files...

Esercizio 1 Creare un make che permetta di: creare l'eseguibile del sorgente mysource.c creare una directory install e copiarne l'eseguibile creato prima cancellare la directory install

Usare le variabili Le variabili sono utili per cambiare compilatore o le opzioni di compilazione. Example CC=gcc dichiarazione e inizializzazione variabili CFLAGS=-Wall ONAME=myWC compile: echo compiling my application $(CC) $(CFLAGS) main.c -o $(ONAME) uso delle variabili...

Comando make Lanciando make da shell: Cercherà un file di nome makefile nella directory corrente, e lo eseguirà. Se si hanno diversi, si può usare l'opzione -f per speificare il nome del makefile : make -f MyMakefile

Processi

Cos'è un processo É un istanza di un programma in memoria! Ogni programma che viene eseguito crea un processo. Un programma può essere un comando unix, uno script di shell, o qualsiasi eseguibile

Attributi di un processo PID (Process-Id) Il PID è usato dal Kernel per identificare il processo Simile all'utilizzo dell'inode per l'identficazione dei file PPID (Parent Process Id) Il processo che crea un'altro processo si chiama Padre (o Parent), il processo creato si chiama Figlio (o child) Il PID del processo Parent è chiamato PPID TTY Il terminale al quale il processo è associato Ci sono processi, chiamati Daemons, che non appartengono a nessun terminale UID L'ID dell'utente al quale appartiene il processo File Descriptors I Descrittori dei file collegati al processo (nput, output e descrittori di errore)

Come creare un processo(fork) System call fork() usata per creare un processo (un nuovo flusso di esecuzione) Non riceve argomenti e ritorna: 0 al processo Figlio (Child Process) PID del figlio al processo Padre (Parent process) -1 in caso di errore

Fork system call Process Fork() execution flow 1 Parallel execution Child Process execution flow 2 parent Process execution flow 1 exit(0) exit(0) Quale processo termina prima?

Fork: esempio 1 Creazione di un figlio #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid; fprintf(stdout, "Parent: my PID is %d: my parent is process %d\n", getpid(), getppid()); pid = fork(); if (pid == 0){ // Child fprintf(stdout, "ID Returned to Child: %d\n", pid); } else { //Parent fprintf(stdout, "ID Returned to Parent: %d\n", pid); } } exit (0);

Esercizio 2 Scrivere un programma in C che permette di creare due processi figli

Esercizio 3 Scrivere un programma in C per creare N processi figli

Fork: esempio 2 Spazio di indirizzamento dei processi /* * Illustrates the use of separate process address spaces * with common inital values */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int x, y; x = 4; if (fork()) { // parent!= 0 y = 5; x = 15; sleep (5); } else { // child y= -5; } // recall 0 in C is FALSE fprintf(stdout, " x = %d y = %d process %d, PPID %d\n", x, y, getpid(), getppid()); exit(0); }

sleep unsigned sleep(unsigned seconds); Sospende l'esecuzione di un processo per un determinato tempo Il processo potrebbe essere sospeso più a lungo, a causa della schedulazione delle altre attività del sistema Valori di ritorno 0 tempo scaduto Unslept il tempo che resta da dormire se viene ricevuto un segnale

Sleep: esempio #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid1; pid_t pid2; fprintf(stdout, "Parent: my PID is %d: my parent is process %d\n", getpid(), getppid()); pid1 = fork(); if (pid1 == 0){ // Child1 fprintf(stdout, "ID Returned to First Child: %d\n", pid1); sleep(5); fprintf(stdout, "First Child end!"); } } else { //Parent fprintf(stdout, "First Child ID Returned to Parent : %d\n", pid1); pid2 = fork(); if (pid2 == 0){ // Child2 fprintf(stdout, "ID Returned to Second Child: %d\n", pid2); } else { //Parent fprintf(stdout, "Second Child ID Returned to Parent : %d\n", pid2); fprintf(stdout, "Second Child end!\n"); } } exit (0);

Esercizio 4 Qual'è l'ordine in cui compaiono i messaggi di output del programma precedente?

Gestione Processi (1) Un processo può essere esguito in due modi Foreground Di default ogni processo gira in foreground Prende gli input da tastiera e manda gli output a video Mentre un programma sta girando in foreground, non possiamo eseguire nessun altro processo Esempio foreground : $ ls Background Il vantaggio è che in questo caso si possono lanciare altri processi Non bisogna aspettare che termini I processi si lanciano in background usanto il carattere & sul terminale esempio: $ ls &

Gestione Processi(2) Lista dei processi in esecuzione comando ps $ps -f UID PID PPID C STIME TTY TIME CMD.................. UID User ID that this process belongs to (the person running it). PID Process ID. PPID Parent process ID (the ID of the process that started it). C CPU utilization of process. STIME Process start time. TTY Terminal type associated with the process TIME CPU time taken by the process. CMD The command that started this process.

Gestione processi(3) ps options -a Shows information about all users -x Shows information about processes without terminals. -u Shows additional information like -f option. -e Display extended information. Stopping processes CTRL + C keystroke this works when process is running in foreground mode. If a process is running in background kill command kill -9 PID use ps command to get the process PID you need to kill

Sincronizzazione dei Processi

System call wait pid_t wait(int *status) Blocca il processo che la chiama finchè non termina uno dei suoi figli oppure se riceve un segnale Può essere usata per rilasciare delle risorse allocate per un figlio Se non si chiama la wait il figlio che termina diventa Zombie

Zombie vs Orphan Un processo zombie (o defunct) è un processo che ha completato la sua esecuzione ha ancora una entry nella process table il Parent è ancora vivo Il processo Orphan è un processo ancora in esecuzione il cui Parent è terminato. Questi processi non sono Zombie ma vengono adottati dal processo init (ID=1)

System call wait: esempio int main(int argc, char *argv[]) { pid_t pid; int status; fprintf(stdout, "Parent: my PID is %d: my parent is process %d\n", getpid(), getppid()); pid = fork(); if (pid == 0){ // Child int s; fprintf(stdout, "Child: my PID is %d: my parent is process %d - Please enter a number(0-255)\n", getpid(), getppid()); scanf("%d",&s); fprintf(stdout, "Child %d - my exit status will be %d\n",getpid(),s%256); exit (s); } } else { //Parent wait(&status); fprintf(stdout, "Parent %d - my child status is %d\n",getpid(),status>>8); exit (0); } C P P Sync Point P

Esercizio 5 Scrivere un programma in C che può creare un Zombie

Esercizio 6 Scrivere un programma in C che può creare un Orphan

System call waitpid pid_t waitpid(pid_t pid, int *status, int options) Aspetta un figlio specifico definito dal pid