View Single Post
Old 17-06-2004, 14:37   #18
Ed_Bunker
Senior Member
 
L'Avatar di Ed_Bunker
 
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9447
Quote:
Originariamente inviato da ilsensine
Una fork è implementata in maniera molto veloce, però ci sono un paio di cose che devi considerare:

- Normalmente dopo la syscall fork, il controllo passa al processo figlio. Non puoi però fare assunzioni su questo, in quanto potrebbe benissimo variare da kernel a kernel.

- La fork è veloce perché è efficientemente implementata tramite la tecnica COW; la semplice latenza della chiamata fork però non è il solo overhead che devi considerare, ma anche la tecnica COW che viene utilizzata. Ti spiego in due parole di cosa si tratta:
COW -- copy-on-write
Per rendere meno pesante per il sistema il fork di un processo, le pagine di memoria inizialmente _non_ sono duplicate: ne viene conservata una sola copia, però nello stato di sola lettura. Quando uno dei due processi tenta di scrivere su una pagina di memoria, essendo questa in sola lettura il kernel genera una eccezione di accesso, e solo allora duplica fisicamente la pagina interessata (e solo quella pagina).
La tecnica COW consente quindi di effettuare fork molto veloci, e di risparmiare molto sulla memoria utilizzata (le pagine che vengono solo lette, come librerie ecc., non verranno mai duplicate!), al prezzo però di qualche minor page fault in più.

Ciò detto, non so se nel tuo caso la fork introduca un overhead accettabile o meno: a meno che non stai facendo una applicazione veramente time-critical, non noterai il suo impatto. Sicuramente se fai dell'I/O su file, il costo della fork è assolutamente trascurabile.
L'efficienza non e' un problema basilare nel caso di una situazione come la mia. Della tecnica COW avevo gia' letto. Era nell'ambiro di S.O.... non ricordo bene... Mi sembra che figlio e padre condividano dati fintanto che uno dei due non faccia un tentativo di aggiornamento/scrittura su essi. No ?!? Comunque, a parte questo, il fatto e':

ad ogni richiesta "devo" misurare il tempo di esecuzione della fork() ed in base a cio' decidere ?!? In tal caso la mia domanda e':
cosa ci guadagno in termini di efficienza visto che oramai una fork() e' stata eseguita e, quindi, l'eventualita' che l'operazione richiesta possa essere svolta in meno tempo di quello necessario per la fork() e' svanita ?!?
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C.
Ed_Bunker è offline   Rispondi citando il messaggio o parte di esso