2015-03-06 16 views
5

Recentemente, ho letto nel libro "Advanced Linux Programming" (http://www.advancedlinuxprogramming.com/alp-folder/alp-ch04-threads.pdf, capitolo 4.5) che sui thread GNU/Linux POSIX sono implementati come processi e che esiste una sorta di "thread manager" che funziona un po 'di controllo.Implementazione thread GNU/Linux

Quando eseguo il seguente esempio da questo libro:

#include <stdio.h> 
#include <pthread.h> 

void* thread_func(void *arg) 
{ 
    fprintf(stderr, "thread: %d\n", (int)getpid()); 
    while(1); 
    return NULL; 
} 

int main() 
{ 
    fprintf(stderr, "main: %d\n", (int)getpid()); 

    pthread_t thread; 
    pthread_create(&thread, NULL, thread_func, NULL); 

    while(1); 
    return 0; 
} 

ho ricevuto lo stesso PID per il principale filo filo e bambino, mentre il libro dice che può essere diverso & che c'è un altro PID, che corrisponde al cosiddetto "thread manager". Ho cercato di trovare alcune informazioni su questo "thread manager", ma si sta dimostrando difficile.

UPD. Non ho dubbi sul comportamento del mio programma, ma c'è una certa confusione sul comportamento, spiegato nel libro - in particolare, in quali circostanze può essere vero?

+1

La pagina man di clone syscall può aiutare http://linux.die.net/man/2/clone – technosaurus

+2

* Advanced Linux Programming * è un libro molto buono, ma probabilmente precedente [ NPTL] (http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library) che è ciò che recenti [glibc] (https://www.gnu.org/software/libc/) ha/usa. –

+0

Con i libri sulla tecnologia, sappi sempre quando è stato pubblicato il libro, in questo caso "Prima edizione, giugno 2001". La dichiarazione è semplicemente obsoleta. –

risposta

0

Basta leggere le linee interessate dal libro e l'esempio condivisa da te, è chiaro che è legato alla specifica implementazione di POSIX threads on GNU/Linux

In GNU/Linux, threads are implemented as processes. 

Quindi, ogni volta che si chiama pthread_create per creare un nuovo thread , Linux crea un nuovo processo che esegue quel thread.

Quindi, nel codice di esempio, quando si esegue pthread_create(&thread, NULL, thread_func, NULL); l'implementazione crea un nuovo processo per eseguire questo thread appena creato. Questo processo avrà un PID diverso (che è ciò che visualizza la chiamata getpid()).

Quindi, ora avete già 2 processi, un processo principale che viene avviato quando si esegue il programma e questo nuovo processo creato dal sistema per supportare l'esecuzione del thread.

E la stessa implementazione sta anche creando un altro processo (che è interno alla sua implementazione), che viene definito thread di gestione.E questo viene creato quando invochi pthread_create

3

ho ricevuto lo stesso PID sia per thread principale e filo bambino

Questo è un comportamento normale e previsto. Questi thread creati coesistono nello stesso processo, pertanto getpid() restituisce l'ID per tale processo. Se si desidera distinguere i thread, utilizzare pthread_self() (compatibile POSIX, ma non univoco di sistema) o gettid() (specifico per Linux).

Internamente, tutti i processi e thread in Linux vengono gestite da oggetto universale chiamata compito (e definito da task_struct), e ogni compito ha la sua ID del proprio. Tuttavia, il primo compito è un processo di gestione chiamato quindi leader del gruppo di attività. E getpid() restituisce il PID di quello leader del gruppo di attività.

Quindi nel tuo caso, thread_func() filetto stampa PID del suo leader, main() attività e main() thread PID di stampa di se stesso.

Ti suggerisco di approfondire gli interni del kernel. Fornisce una visione più chiara di queste cose - prova ad esempio il libro di Robert Love "Linux Kernel Development". Alcune informazioni su thread/processi/ecc. può essere trovata qui: http://www.win.tue.nl/~aeb/linux/lk/lk-10.html

+0

la domanda è: perché da qualche altra parte (ad esempio, sul sistema, descritto nel libro) questo potrebbe non essere un comportamento normale e atteso? Dipende dalla particolare implementazione del kernel? – ars

+0

Non riuscivo a parlare per un libro, ma forse l'esempio era in esecuzione su una versione precedente del Kernel? Secondo 'clone()' threadgroup di pagina man è stato introdotto in Linux 2.4. – myaut

+3

@ars Il libro è datato al 2001, quindi sembra descrivere una vecchia implementazione di pthread su Linux, [LinuxThreads] (http://en.wikipedia.org/wiki/LinuxThreads) dove questo era il caso. – nos