|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5749
|
[C Unix]: Fork(), Pid e chiamate
Sto cercando di capire, senza successo purtroppo, come funziona la creazione dei processi figli a partire da un processo padre.
Esempio preso da una slide Codice:
#include <stdio.h>
#include <sys/types.h>
void main()
{ pid_t pid;
printf (“Prima della fork: PID = %d\n”, getpid());
pid = fork();
if (pid==0) /* PROCESSO FIGLIO*/
{printf (“FIGLIO: PID = %d\n”, getpid());
exit(0);
}
else /* PROCESSO PADRE */
{printf (“PADRE: PID = %d\n”, getpid());
printf (“PADRE: PID DEL FIGLIO = %d\n”, pid);
exit(0);
}
}
La fork crea comunque il processo? Come si stabilisce chi parte per primo dopo la fork? E in base a che criterio parte prima uno o l'altro? pid: come cambia il suo valore? Perchè a un certo punto ho il valore del padre, poi diventa zero e poi diventa quello del figlio? Il valore zero è solo temporaneo?
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
i moderni sistemi di derivazione Unix in genere sono concorrenti, quindi idealmente i due processi ripartono tutti e due contemporaneamente; o addirittura possono partire effettivamente in contemporanea se vengono schedulati su due core differenti.
Quote:
Quote:
1) lo zero non é un vero PID, é solo un valore restituito dalla fork al processo figlio per fargli capire che lui é il processo figlio (al padre invece viene ritornato il PID del figlio); 2) quando viene creato un processo figlio questo gira concorrentemente col padre e i due usano in concorrenza gli stessi standard stream; ció non é sbagliato perché le scritture sui file descriptors sono atomiche per piccole quantitá di dati (vedi la documentazione della syscall write), ma significa che i due processi fanno output sullo stesso terminale. PS: non mi andava di leggere il codice |
||
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
Semplificando il processo, il sistema operativo copia la "memoria" del padre sulla "memoria" del figlio. Da quel momento ogni processi ha una sua evoluzione e può ovviamente avere valori differenti per la stessa variabile, a te sembra che le variabili cambino valore, in realtà sono variabili diverse perché appartengono a processi diversi. Ho semplificato pesantemente il tutto, se stai seguendo un corso otterrai sicuramente informazioni più dettagliate in futuro. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12966
|
Premesso che il codice che eseguono i due processi parte da dopo la chiamata fork (so che a qualcuno può sembrare banale, ma comincia a non esserlo più se vi chiedete quanti processi vengono creati in un ciclo for con 2 fork), cmq è lo scheduler del sistema operativo che si occupa di scegliere quale processo porre in stato di esecuzione.
In genere cmq il sistema è basato su code di priorità. Ogni processo parte con una priorità k e si pone nella sua coda k, lo scheduler tipicamente sceglierà il primo elemento nella coda k più alta. La priorità è dinamica quindi può cambiare durante il corso dell'esecuzione di un programma. In ogni caso si segue a parità di priorità un'approccio di tipo round robin per quanti di tempo, ovvero lo scheduler assegna ai vari processi in coda un quanto di tempo a turno. |
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
Quote:
|
||
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Dai una googlata riguardo il Process Control Block che quasi tutti lo ignorano ma è un componente fondamentale e ti fa capire alla perfezione come funziona il meccanismo di schedulazione che, in una CPU monocore, in generale nell'immediato avvia un processo a caso. Ossia quando chiami fork() non si sa mai a priori chi va in esecuzione, a meno di una specifica del SO.
Non dimentichiamo le differenze tra processi e thread che a mio avviso rimangono fondamentali e su cui spesso si fa confusione. Ultima modifica di _Claudio : 25-03-2009 alle 22:04. |
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12966
|
Quote:
Quote:
|
||
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
Quote:
Comunque anche nel "corso di OS" (le virgolette non sono state messe a caso |
||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Quote:
La fork() sdoppia il PCB e assieme ad esso anche il valore del PC, quindi a meno che la fork non sia inserita in un ciclo... Per quanto riguarda lo scheduling adottato da Linux basta andare a pagina 731 del Silberschatz... |
|
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
![]() Quote:
|
||
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Errore mio... ho interpretato male in effetti.
Quote:
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Il ramo 2.5 era dedicato all'innovazione quando ancora il ramo 2.4 era utilizzato in produzione. Con il ramo 2.6 il modello di sviluppo che prevedeva un ramo "stabile" ed un ramo di "sviluppo" è stato abbandonato; direi che il libro è veramente molto datato.
Inoltre, con la versione 2.6.23 il process scheduler ha subito un cambiamento radicale (introduzione del CFS in luogo del O(1)). |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Quote:
Poi io sono ancora di più datato essendo un Winaro e usando linux sporadicamente e con la molletta al naso |
|
|
|
|
|
| Tutti gli articoli | Tutte le news | Tutti i download |
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:50.





















