Creazione processi mediante fork()

di il
9 risposte

Creazione processi mediante fork()

Se mandiamo in esecuzione il seguente programma, quanti processi vengo generati durante i 30 secondi dell’istruzione sleep(30) e perchè?


int main(void){
   
    pid_t pid0, pid1, pid2, pid3, pid4, pid5;
    pid_t pid6, pid7, pid8, pid9;

    pid0 =fork();
    pid1=fork();
    pid2=fork();
    pid3=fork();
    pid4=fork();
    pid5=fork();
    pid6=fork();
    pid7=fork();

    if (pid0>0) { 
         pid8 = fork();
    }

    pid9 = fork();

    sleep(30);
    exit(0);
}
Vi ringrazio anticipatamente per l'aiuto

9 Risposte

  • Re: Creazione processi mediante fork()

    Ciao

    quindi la fork crea una copia di tutti i registri della CPU compreso il file pointer, crea una copia del data e heap (anche con i valori contenuti all'interno delle variabili non ci avrei creduto finché non l'ho provato) del code credo di no ma sarebbe tutto da verificare.

    La cosa importante è che crea una copia del file pointer, allora il primo processo ancora unico farà la prima fork da cui nascerà un figlio, sia il padre che il figlio si troveranno un'altra fork e così via, la terza forck sarà fatta da 2^2 processi e in fine avremo 2^3 processi.

    quindi
    pid7=fork();
    che è l'ottava ci saranno 2^8 processi

    poi
        if (pid0>0) {
             pid8 = fork();
        }
    fa eseguire la fork solo ai figli della prima fork
    che sono 2^8-1, dopo di che risultano 2*(2^8-1) processi.

    con l'ultima fork tutti questi si sdoppiano infine avremo 2^10-4 processi
    1020 processi.

    Per lo sleep non saprei dirti dipende, in che contesto è stato pensato questo programma, a vedere così mi sembra a puro scopo didattico perché in futuro (non poi così prossimo per te) vedrai le shared memory per interagire tra processi e scambiarsi valori.

    PS. Niente di più facile che abbia sbagliato qualcosa quindi se trovate errori correggete pure.

    Ciao
  • Re: Creazione processi mediante fork()

    Ok.... e se invece la situazione è questa???
    
    int main(void){
    
        int pid_t pid0, pid1, pid2, pid3, pid4, pid5;
        int pid_t pid6, pid7, pid8, pid9;
        pid0 = fork();
        pid1 = fork();
        
        if (pid0==0) { pid2 = fork();}
    
        pid3= fork();
        pid4= fork();
        pid5= fork();
        pid6= fork();
        pid7= fork();
        pid8= fork();
        pid9= fork();
    
        sleep(30);
        exit(0);
    }
    
  • Re: Creazione processi mediante fork()

    Ciao

    Non sono qui per farti gli esercizi! Almeno prova, poi posti quello che hai fatto e io ti aiuto!!!
  • Re: Creazione processi mediante fork()

    Scusami, ma volevo semplicemente una mano, dato che gli appunti della prof fanno letteralmente SCHIFO......

    Cmq dalla spegazione che mi hai fornito prima, provo a risolvere quest'ultimo esercizio.

    Vengono creati 2^2 processi, dopo di che if(pid==0 ) {pid2=fork();} fa eseguire la fork ai figli della prima fork e quindi avremo 2^2-1 processi, e quindi risultano 2*(2^2-1)processi

    Non ho capito come funzionano le ultime 7 fork............

    grazie per la pazienza...
  • Re: Creazione processi mediante fork()

    Ciao

    scusa me, ti avevo scambiato per un approfittatore !

    Perfetto fino a

    james25 ha scritto:


    Vengono creati 2^2 processi, dopo di che if(pid==0 ) {pid2=fork();} fa eseguire la fork ai figli della prima fork e quindi avremo 2^2-1 processi, e quindi risultano 2*(2^2-1)processi
    Poi continui nel solito modo:
    D: quanti sono i processi che fanno la seguente operazione?
    pid3= fork();
    R: 2*(2^2-1) (tutti i precedenti)

    D: quindi quanti ne usciranno in totale??
    R: 2*2*(2^2-1) (i precedenti per 2)

    ripeti questo ragionamento per le successive fork!

    Se ti serve il risultato per confrontarlo con il tuo chiedimi pure!

    Ciao
  • Re: Creazione processi mediante fork()

    Tranquillo non c'è problema...

    Per quanto riguarda i processi.... secondo me avremo 2^10-1 prcessi..... Giusto?
  • Re: Creazione processi mediante fork()

    Cmq l'ultima fork del primo esercizio che fa lo sdoppiamento e alla fine ci da come risultato 2^10-4 non tanto l'ho capita...

    Scusami se ti sto stressando.... mi sto studiando questo esame da solo senza libro e gli appunti non sono per niente chiari.... quindi immagina un po in che situazione mi trovo....

    Grazie per la pazienza
  • Re: Creazione processi mediante fork()

    Nessun problema. Ti spiego subito.

    deriva da 2*2*(2^8-1) perché ci sono 2*(2^8-1) che si sdoppiano quindi alla fine ci sono 2*2*(2^8-1) processi

    svolgendo i calcoli:
    2^2*(2^8-1) = 2^10-4
  • Re: Creazione processi mediante fork()

    Ok perfetto ho capito...

    Ora è tutto chiaro. Grazie mille sei stato molto gentile

    Ciaooo
Devi accedere o registrarti per scrivere nel forum
9 risposte