Indipendentemente dal sistema operativo, la creazione di un processo segue uno schema logico ben preciso:
- Richiesta di creazione: fatta da un altro processo (padre) o dal sistema.
- Creazione del PCB: assegnazione PID e inizializzazione dello stato.
- Allocazione risorse: memoria (codice, dati, stack, heap), file e dispositivi.
- Caricamento del programma: il codice eseguibile viene caricato in memoria.
- Inserimento nello scheduler: stato = Ready, il processo attende la CPU.
Le differenze tra sistemi operativi riguardano come questi passi vengono realizzati.
METODO UNIX/LINUX
Nei sistemi Unix/Linux la creazione avviene in due fasi separate:
fork() → crea il processo
exec() → carica il programma
Duplicazione del processo
La system call fork() crea un nuovo processo figlio copiando il processo padre.
Caratteristiche:
- il figlio è una copia quasi identica del padre;
- ha PID diverso;
- esegue la stessa istruzione successiva a
fork(); - usa Copy-on-Write: la memoria non viene copiata subito, la copia avviene solo se uno dei due processi modifica una pagina.
- Valore di ritorno: padre → PID del figlio, figlio → 0
fork()= “clona me stesso”
Sostituzione del programma
Dopo fork(), il figlio di solito chiama exec().
Effetto:
- il programma in memoria viene completamente sostituito;
- il PID resta lo stesso;
- il nuovo programma parte dall’inizio;
- file aperti restano aperti (se non diversamente specificato).
exec()= “cancella quello che sono e diventa un altro programma”
METODO WINDOWS
Nei sistemi Windows la creazione avviene in un solo passo.
spawn() → crea il processo con il nuovo programma
Creazione del processo
Windows usa una system call concettualmente equivalente a spawn (in pratica CreateProcess()).
Caratteristiche:
- non esiste duplicazione del processo chiamante;
- il nuovo processo viene creato direttamente con: nuovo PCB, nuova memoria, nuovo programma caricato subito;
- nessuna esecuzione condivisa di codice iniziale.
spawn()= “crea un nuovo processo già pronto con quel programma”