Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Il Fork e i Processi...?

    Mi Potreste spiegare unpaio di cose ???
    - Che cosa sono i processi
    - A che cosa servono i processi
    - Come si Usa il Fork
    - Esempio pratico del Fork
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Un processo è un programma (o, più spesso, parte di esso). Quando avii un programma, tu avii un processo. Quando, per esempio, chiedi di viasualizzare il contenuto della directory digitando ls (sotto Unix/Linux) tu avii un programma (un processo) chiamato ls.

    A cosa servono, a questo punto, mi sembra ovvio... se vuoi fare qualcosa devi avviare un processo.

    Come si usa il fork: fork() è una chiamata di sistema che non fa altro che duplicare il processo corrente. Prende l'intero codice in esecuzione e ne crea una copia, pari pari, assegnandogli un PID (Process IDentifier). Il processo che ha effettuato la chiamata a fork() si dice processo padre, mentre la copia creata si chiama processo figlio.

    Il padre conosce il PID del figlio, mentre il figlio vede il suo PID come 0. In questo modo si può discriminare fra processo padre e processo figlio, semplicemente controllandone il PID.

    La chiamata fork() restituisce il PID del processo: nel caso del padre restituisce il PID del figlio, nel caso del figlio restituisce 0.

    Come si usa fork():
    codice:
    pid_t pid; /* dichiaro una variabile che conterrà il pid del processo generato con fork() */
    ... // codice eseguito
    if (pid = fork()) { /* Qui viene eseguita la fork()!!!      */
                        /* quindi il processo viene duplicato!! */
    
       /* Se entro qui, significa che pid è diverso da 0 (in particolare > 0) */
       /* codice eseguito dal padre */
       printf("Ciao! Io sono il processo padre!\n")
    
    } else {
    
       /* Se entro qui, significa che pid è 0
          codice eseguito dal processo figlio */
       printf("ciao! Io sono il processo figlio!\n");
       exit(0); /* Voglio che il figlio a questo punto muoia!! */
    }
    
    /* Codice eseguito solamente dal processo padre */
    waitpid(0); /* Attendo che il figlio muoia! */
    printf("Ora il processo figlio è terminato!\n");
    Spero di essere stato sufficientemente chiaro. La gestione dei processi Unix/Linux all'inizio può sembrare oscura e complessa, ma alla fine risulta semplice ed intuitiva. Tutto si gioca sul "copia e incolla" del codice e sul discriminante PID.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ok... Mi sembra tutto chiaro...
    Ma perche' mi servirebbe copiare un processo ???
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non è questione di serve o non serve. I sistemi operativi Unix/Linux si comportano in questo modo. Prendono il processo attivo, lo copiano (non hanno altro modo per generare un processo figlio) e lo aggiungono alla tabella dei processi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Ok... Ma in parole semplici la copia del processo gli serve per....?
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Per avere qualcosa da eseguire.

    Osserva l'esempio che ti ho postato: quando viene eseguita la fork() tutto quel codice viene duplicato. Dopo la sua duplicazione, ci sono, quindi, effettivamente 2 processi in esecuzione con lo stesso identico codice. Ma c'è un ma: subito dopo la chiamata a fork() si testa la guardia dell'istruzione if. Qui avviene la discriminazione fra processo padre e processo figlio: i due prendono strade diverse e quindi eseguono (potenzialmente) codici diversi, operazioni diverse. Si ha così l'esecuzione di due processi distinti.

    Il figlio (il processo che viene generato) deve pur fare qualcosa. E per sapere cosa fare deve avere del codice da eseguire. Questo codice risiede già nel processo padre. Quando, poi, viene creato il figlio, questo possiede una copia del codice del padre, ma il primo eseguirà un ramo dell'if, mentre il secondo ne eseguirà un altro.

    Tutto qui.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Permettimi di aggiungere qualcosina...

    Un processo, appena viene creato, viene allocato alternatamente dal "processo" allocatore (ma e' piu' che altro una funzione) inserito dal kernel in memoria, cioe' alterna l'esecuzione del processo padre con quella del figlio (ma in realta' esegue alternatamente tutti i processi attivi, si veda l'output di ps -aux).

    Ogni processo ha un proprio stack, heap (spazio di memoria allocato da malloc()), code segment (che contiene il codice da eseguire), data segment (che contiene le variabili locali), ed essi sono ogni volta che il processo e' in esecuzione ricaricati in memoria.

    Ogni processo e' diviso in pagine, cioe' spazi di memoria , di dimensione fissa o variabile, a seconda del sistema operativo. Una pagina contiene solo un frammento del processo, e non e' necessario che, per essere eseguito, sia contenuto tutto in memoria (il processo), quindi una pagina puo' essere eseguita anche se gran parte del processo e' ancora scaricato. Una volta finita l'esecuzione la pagina puo' essere scaricata ed un'altra caricata in memoria (swapping).

    Un paio di pillole non guastano mai! Se pero' vuoi veramente informarti, ti dovresti leggere un libro sull'argomento :metallica

    Bye!
    ASM: mon amour!!

  8. #8
    Ok... Mi sembra tutto chiaro...
    Ma perche' mi servirebbe copiare un processo ???
    Ok... Ma in parole semplici la copia del processo gli serve per....?
    ... per creare un nuovo processo. Su UNIX e` l'unico modo per farlo. Su Windows c'e` CreateProcess.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da r0x
    ... per creare un nuovo processo. Su UNIX e` l'unico modo per farlo. Su Windows c'e` CreateProcess.
    Esattamente!!


    Anche se su Windows le cose sono un po' diverse, visto che ogni processo deve avere un thread (chiamato thread leggero) che fa tutto il lavoro...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.