2011-01-31 13 views
17

Tengo experiencia en programación multiproceso en Java y C#, y estoy empezando a aprender a hacerlo en C en Linux. Yo "crecí" en el sentido de la programación en Linux, así que entiendo que es la filosofía de la memoria, el manejo del proceso, etc. a un alto nivel.¿Cómo funciona pthread?

Mi pregunta no es cómo hacer el enhebrado. Me gustaría saber cómo pthread en realidad lo hace. ¿Tenedor un proceso y manejar su comunicación entre procesos de alguna manera? ¿O simplemente administra el espacio de direcciones? Quiero detalles esenciales :) Google solo ha producido preguntas sobre "cómo hacerlo", no "cómo funciona".

Respuesta

9

En Linux, tanto fork() y ptrheads utilizan la misma llamada al sistema clone(), lo que crea un nuevo proceso. La diferencia entre ellos es simplemente los parámetros que envían al clone(), al crear un nuevo hilo, simplemente hace que ambos procesos usen las mismas asignaciones de memoria.

Recuerde, en Linux (y otros Unixes modernos), las asignaciones de memoria, las pilas, el estado del procesador, los PID y otros son características ortogonales de un proceso; para que pueda crear un nuevo proceso con solo un nuevo estado de pila y proceso (compartiendo todo lo demás) y llamarlo un hilo.

+2

Hay otra cosa que un hilo no puede compartir: el valor 'TID'. – caf

4

Here es la fuente de pthread.c. Esto puede ayudarte a responder tu pregunta.

+0

Esta es la implementación de Windows de pthread, no la implementación de Linux. – Victor

12

Los detalles son probablemente demasiado compleja para conseguir realmente en (sin publicar un enlace al código fuente de glibc), pero te pueden dar mejores cosas para buscar:

  1. Pthread utiliza sys_clone() para crear nuevos hilos, que el kernel ve como una nueva tarea que comparte muchas estructuras de datos con otros hilos.

  2. Para hacer la sincronización, pthread se basa en gran medida en futexes en el kernel.

+0

+1: simplemente agregando que 'fork()' usa el mismo syscall pero la nueva tarea comparte menos estructuras con el padre. – Javier