Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Documenti analoghi
Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

System call per la gestione di processi

System call per la gestione di processi

LABORATORIO DI SISTEMI OPERATIVI

Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria Elettronica. SISTEMI OPERATIVI A.A. 2004/2005 Docente: Giorgio Giacinto

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

Addendum alle chiamate di sistema per la gestione processi. E Mumolo

System Call EXEC EXEC P P. fork exec(new_prog) fork. sono_il_padre = fork(); if (!sono_il_padre) {

Pag. 1. modello di esecuzione parallela

eseguire comandi dati dall'utente, utilizzando una macchina reale, di livello inferiore,

Controllo dei Processi 1

La creazione di un nuovo processo in UNIX

Il processo figlio : utilizza lo stesso codice che sta eseguendo il padre ;

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

System Calls per la Gestione dei Processi

Laboratorio di Sistemi Operativi

I Processi nel SO UNIX

I Processi nel Sistema Operativo Unix. Gerarchie di processi Unix. Stati di un processo Unix. Stati di un processo Unix.

I Processi nel SO UNIX

I Processi nel Sistema Operativo Unix

SISTEMI&OPERATIVI& AA&2013&0&2014& Processi( in(linux( Giorgio&Giacinto&2013& Sistemi&Opera?vi&

In generale può essere utile che i due processi eseguano del codice diverso

Corso di Programmazione Concorrente Processi. Valter Crescenzi

Esercizio sulla gestione di processi in Unix!

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

Processi Concetti di base. Esecuzione parallela e sequenziale Il concetto di processo Gestione dei processi

" &$ () " ) ) $ ' () *) " ) $

Riepilogo sulla Concorrenza

Sistemi Operativi Teledidattico

Corso di Sistemi Operativi A.A CHIAMATE DI SISTEMA PER IL CONTROLLO DEI PROCESSI. Fabio Buttussi

Sistemi Operativi. Marzo-Giugno 2011 matricole congrue 0 mod 3. Controllo dei processi - I

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 matricole congrue 0 mod 3

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Processi in Linux. Stru/ura file eseguibili

Signalling (IPC) Signalling (segnalazione)

Programmazione di sistema e gestione dei processi in C

I Processi nel SO UNIX

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

Il comando make. Per produrre un eseguibile da un programma C sono necessari tre passi compiuti dai seguenti moduli:

1. PARALLELISMO E PROCESSI. 1.1 La necessità del parallelismo

Seconda Esercitazione. Gestione di processi in Unix Primitive Fork, Wait, Exec

LINUX: struttura generale

Programmazione multiprocesso

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

La Programmazione di Rete e di Sistema (iii) La programmazione di sistema. Il sistema operativo. La programmazione di sistema

Processi: Exit, Wait, Exec

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Gestione dei processi

Sistemi Operativi 1. Lezione III: Concetti fondamentali. Mattia Monga. 7 marzo 2008

Sistemi Operativi 1. Mattia Monga. 7 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia

La famiglia di system call exec. Modulo 6. Laboratorio di Sistemi Operativi I Anno Accademico

Sistemi Operativi 1. Mattia Monga. a.a. 2018/19. Dip. di Informatica Università degli Studi di Milano, Italia

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

il tipo di parallelismo dipende dal grado di cooperazione

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

Corso di Laboratorio di Sistemi Operativi A.A

Sistemi Operativi T. Esercizi

Richiami sui Concetti Fondamentali dei Processi

Controllo dei Processi. M. R. Guarracino - Primitive di Controllo dei Processi

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

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Lezione 21. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill!

CREAZIONE PROCESSI IN UNIX 20

Corso di laurea in ingegneria informatica Esame di sistemi operativi 21 gennaio 2009 SOLUZIONI

Î Modello ad Ambiente Locale P1 P1. File System P2 P2 P3 P3. Processi in UNIX. Modello di Processo in UNIX

Concetto di Processo Scheduling dei Processi Operazioni sui Processi Processi cooperanti Comunicazione tra processi

Processi in UNIX. Spazio di sistema (residente) Tabella dei. file APERTI OPEN FILE. Tabella dei codici

ACSO Programmazione di Sistema e Concorrente

Fondamenti di Informatica T-1 modulo 2

Politecnico di Milano - Dipartimento di Elettronica, informazione e Bioingegneria Prof. Mauro Negri

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

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

Gestione dei processi

Corso di Informatica Modulo T3 1-Nucleo e processi

SC che operano su processi. Fork, exec, etc...

Fondamenti di Informatica T-1 modulo 2

Il sistema operativo LINUX Semafori. Semaforo. Sommario. Sommario. Uso delle pipe. Gestione di semafori tramite pipe. Sistemi operativi Modulo II

Sistemi di Calcolo - Secondo modulo (SC2) Programmazione dei Sistemi di Calcolo Multi-Nodo

SISTEMI OPERATIVI e LABORATORIO DI SISTEMI OPERATIVI (A.A ) - 19 MARZO 2003

Informatica 1, Sez. di Cremona

Threads: 1. Concetti di base 2. Threads in sistemi operativi attuali (NT/UNIX)

Processi in Unix. Capitolo 8 -- Stevens

LABORATORIO DI SISTEMI OPERATIVI

Politecnico di Milano - Dipartimento di Elettronica e informazione Prof. Mauro Negri

SISTEMI OPERATIVI e LABORATORIO DI SISTEMI OPERATIVI (A.A ) 30 MARZO 2007

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Sistemi operativi Modulo II I semafori 2 Select

Principles of Concurrent Programming

Sistemi Operativi (M. Cesati)

Progetto II: Il linguaggio C e le chiamate di sistema sui processi

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 matricole congrue 0 mod 3

INTERPROCESS COMMUNICATION 27

Gestione dei processi. Marco Bonola Lezione tratta da

Transcript:

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2017-18 Pietro Frasca Lezione 6 Martedì 24-10-2017 1

Sostituzione del codice Tipicamente, dopo una fork(), uno dei due processi, padre o figlio, utilizza la chiamata di sistema exec() per sostituire lo spazio di memoria del processo con un nuovo programma. La famiglia di funzioni exec() sostituisce l immagine del processo in corso con una nuova immagine di processo. La nuova immagine deve essere creata da un normale file eseguibile. Nel caso di successo, la exec() non ritorna alcun valore perché l'immagine del processo chiamante è sostituita dalla immagine del nuovo processo. La exec permette a un processo di eseguire un diverso programma. I tre segmenti codice, dati e stack del processo che esegue la exec() sono sostituiti con i segmenti del nuovo programma ma senza che sia creato un nuovo processo. Quindi, dopo la fork() nel sistema è presente un processo in più, mentre dopo la exec() il numero di processi non cambia ma il codice del processo chiamante la exec() è sostituito. Tuttavia, molti campi del PCB del processo originale restano invariati, come ad esempio il PID e il PPID. 2

Inoltre, eventuali risorse allocate o file aperti nel processo chiamante la exec() restano accessibili al nuovo processo. La exec() è una famiglia di funzioni. Ha varie firme, tra le quali, due molto usate sono la execl() e la execv(). execl(char *path,char *arg1,char *arg2, char *argn,(char *)0) execv(char *path,char *argv[]) Alla execl() è possibile passare un numero variabile di parametri. L ultimo parametro è il carattere nullo, che indica la fine della lista di parametri. Il primo parametro path della funzione è il nome del file da eseguire. Arg 1, arg 2 arg N sono i parametri da passare al programma specificato con il parametro path. 3

Esempio execl #include <stdio.h> #include <stdlib.h> main(){ *)0); } pid_t pid; int stato; pid=fork(); printf("pid=%d \n",getpid()); if (pid==0) { //figlio execl("./nuovo", "Saluti", " dal processo"," padre",(char printf( exec fallita ); exit(1); } else if (pid > 0){ } else printf("sono il padre con pid=%d",getpid()); pid=wait(&stato); printf ("Errore fork"); 4

File nuovo.c #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]){ } int i; printf("processo chiamato da execl con PID = %d e PPID = %d \n",getpid(),getppid()); for (i=0;i<argc;i++) printf ("%s ",argv[i]); // visualizza i parametri d ingresso printf("\n"); 5

Terminazione di processi Un processo termina la sua esecuzione quando esegue la sua ultima istruzione oppure esegue la chiamata exit(). #include <stdlib.h> void exit (int stato); Tutte le risorse del processo tra cui la memoria allocata, i file aperti, e buffer di I/O sono deallocati dal sistema operativo. Il parametro stato consente al processo figlio che chiama la exit di comunicare al processo padre, un valore di tipo intero che ne indica lo stato di uscita. Per rilevare la notifica del processo figlio, il padre deve sincronizzarsi con il processo figlio e attendere la sua terminazione. 6

Per sincronizzarsi il padre può utilizzare le chiamate wait o waitpid. #include <unistd.h> pid_t wait(int *stato); pid_t waitpid(pid_t pid, int *stato, int opzioni); La wait() ritorna il PID di un qualsiasi figlio che è terminato, mentre waitpid() permette, tramite il primo parametro pid di specificare il particolare figlio da attendere. L argomento stato, in entrambe le funzioni, è un riferimento ad una variabile che conterrà lo stato del processo figlio quando termina. Più precisamente, nel caso di terminazione volontaria, la variabile stato conterrà nel suo byte più significativo il valore che il processo figlio ha passato al parametro stato chiamando exit(), mentre conterrà il numero del segnale che ha causato la terminazione nel caso di terminazione forzata. 7

Il significato del valore stato passato nella funzione exit è stabilito dal programmatore. Il terzo parametro opzioni in waitpid() stabilisce se il processo chiamante deve attendere la terminazione del figlio o invece deve continuare l esecuzione. Se il valore di opzioni è zero il processo chiamante si blocca, altrimenti il processo chiamante continua la sua esecuzione. Quindi, la waitpid() può avere sia un funzionamento bloccante che non bloccate. La wait(), invece, è solo bloccante e ritorna il pid del processo figlio che ha risvegliato il padre. Quando un processo termina, le sue risorse sono deallocate dal sistema operativo. Tuttavia, il suo PCB nella tabella dei processi deve rimanere fino a quando il processo padre chiama la wait(), in quanto il PCB contiene lo stato di uscita del processo. Un processo che è terminato, senza che il suo genitore non abbia ancora rilevato il suo stato di uscita con la wait(), entra in uno stato detto zombie. 8

Una volta che il padre chiama la wait(), l identificatore di processo del processo zombie e il suo PCB sono cancellati. Nei sistemi Linux e Unix se un genitore è terminato senza chiamare la wait(), i suoi processi figli orfani sono adottati dal processo init il quale è il capostipite della gerarchia dei processi nei sistemi UNIX e Linux. 9

main(){ pid_t pid; int stato; pid=fork(); if (pid==0){ // codice del figlio printf( sono il figlio pid: %d \n,getpid()); sleep(10); // sospensione per 10 secondi exit(2);//valore che il padre leggerà in stato } else if (pid > 0){ //codice del padre pid=wait(&stato); printf( processo figlio pid: %d terminato\n, pid); if (stato<256) printf( terminaz. forzata: segnale n = %d, stato); else printf( terminaz. volontaria stato: %d \n, stato>>8); } else printf( fork fallita ); } Appunti di Sistemi Operativi, 2016-2017 - Pietro Frasca 10