Programmazione del Sistema Sistemi Operativi Mattia Natali
1
Programmazione del Sistema
Sistema operativo:
Funzioni:
Offrire un insieme di funzionalità già predisposte (servizi di sistema) che facilitano la vita del programmatore.
Le system call hanno numerose funzioni, esempio controllare risorse fisiche, gestione memoria, interfacciamento sistemi ecc.
Il sistema operativo possiamo vederlo come una libreria di funzioni per allocare memoria, per creare e gestire un processo, accedere alle varie periferiche in lettura e scrittura, utilizzare a rete, vengono utilizzate attraverso le chiamate di sistema (system call). Il system call è ripartito in gruppi (sottolibrerie) in base ai loro vari scopi.
Necessità di parallelismo:
Quasi mai avviene l’esecuzione di un solo programma.
Processo: è un programma in esecuzione equipaggiato di quanto serve per comunicare con l’esterno. Il processo è un’entità autonoma a prescindere di eventuali altri processi (a meno che debba interagire con essi).
Il sistema operativo virtualizza il sistema di calcolo per far sì che il processo abbia tutto quello che gli serve per l’esecuzione.
Il sistema operativo gestisce dei conflitti nell’uso temporaneo di risorse da parte di processi distinti.
Programmazione di Sistema:
Serve per creare, gestire, eliminare i processi. È una libreria abbastanza piccola con 4-‐5 funzioni principali.
Processo: è un programma in esecuzione.
Le parti di un programma sono 3:
Segmento codice: contiene l’eseguibile del programma.
Segmento dati: in cui ci sono le variabili del programma. Il segmento dati si divide in dati statici, stacke dinamici (raggiungibili per puntatore).
Segmento di Sistema: dati che servono al SO per gestire al meglio il processo.
Le funzioni per gestire un processo in modo elementare sono:
Generare un processo figlio.
Terminare un processo figlio.
Attendere la terminazione di un processo figlio.
Sostituire il codice di un processo in esecuzione.
Organigramma processi:
Tutti i processi derivano da un processo padre ultimo, i processi non possono venire “dal nulla”.
I processi figli possono generare altri figli.
È una relazione ad albero.
Le sincronizzazioni possono venire da padre e figlio.
Il processo iniziale è creato dal sistema operativo.
Programmazione del Sistema Sistemi Operativi Mattia Natali
2
Funzioni processi:
Funzione fork():
Crea un processo figlio che è una copia identica del padre, viene duplicato il segmento dati e il segmento di sistema.
Il valore restituito dalla fork() è l’unica differenza tra padre e figlio:
• Nel padre viene restituito il pid del processo figlio.
• Nel figlio viene restituito il valore 0.
• Restituisce -1 in caso di errore.
Prototipo: pid_t fork(void)
Dopo la biforcazione i processi vengono gestiti in maniera tale che si possono ignorare a vicenda (parallelismo puro).
Funzione exit():
Termina il processo corrente.
Prototipo: void exit(int)
• L’argomento int è il codice di terminazione, serve per sapere in che modo si sia concluso il processo.
In un programma C ci deve essere la funzione exit(), se non la mettiamo noi il sistema operativo la aggiunge automaticamente a fine programma.
Funzione getpid():
Consente ad un processo il valore del proprio pid.
Prototipo: pid_t getpid(void)
Funzione wait():
Sospende l’esecuzione del processo padre che la esegue ed attende la terminazione di un qualsiasi processo figlio.
Serve per sincronizzare i vari processi tra di loro.
Prototipo: pid_t wait(int *)
Se il figlio termina prima della richiesta wait, l’esecuzione della wait nel padre termina istantaneamente.
Il valore restituito è il pid del processo figlio terminato.
L’argomento è un puntatore ad intero, così è possibile realizzare una forma elementare di comunicazione tra processi: è il puntatore all’argomento passato nella funzione exit() del figlio. Ricorda: l’intero così ottenuto deve essere diviso per 256!
Funzione waitpid():
Sospende l’esecuzione del processo padre ed attende il processo figlio con un determinato pid.
Prototipo: pid_t waitpid(pid_t pid, int *status, int options)
Funzione exec():
Sostituisce il segmento codice e il segmento dati del processo corrente con il codice e i dati di un programma contenuto in un file eseguibile specificato. Il segmento di sistema non viene sostituito (file e socie rimangono aperti e disponibili).
Il processo rimane lo stesso e quindi mantiene lo stesso pid.
La funzione exec passa dei paramentri al programma che viene eseguito, tramite il meccanismo di passaggio dei parametri al main argc e argv.
Sintassi: int execl(char *path_programma, char *arg0, char *arg1, …,
char *argn)
• Path_programma: path completo del file eseguibile del nuovo programma da lanciare.
Programmazione del Sistema Sistemi Operativi Mattia Natali
3
• Arg0: deve essere il nome del programma.
• Argn: deve essere NULL.
• Valore restituito:
♦ 0: operazione eseguita correttamente.
♦ -1: se c’è stato un errore.
• Al momento dell’esecuzione del main del nuovo programma – void main (int argc, char *arv[]) – arg0, arg1 … vengono resi accessibili tramite l’array di puntatori argv.