Libertonia
Portada · Todo · Software Libre · Desarrolladores · Comunidad · Internet · Tecnología · Meta · Diarios
Hilos en Linux

Kernel
Por jcantero
departamento ovillos , Sección Desarrolladores
Puesto a las Mon Sep 23rd, 2002 at 07:34:48 PM CET
La programación multihilo es una técnica alternativa de programación concurrente que se apoya en que nuestro sistema operativo nos proporcione hilos (threads). En ocasiones se ha acusado a Linux de tener un soporte de hilos más bien mediocre, pero la cosa promete cambiar con NPTL, la Native POSIX Threading Library o biblioteca nativa de hilos POSIX. Aquí tenéis el documento de diseño de NPTL en PDF. En KernelTrap tenéis el anuncio y lo más interesante de la discusión en la lista de correo del kernel.

 


En un S.O. multihilo nuestros programas pueden tener varios "hilos de ejecución", es decir, estar realizando (aparentemente) varias tareas a la vez. El programador escribe partes de su programa que se ejecutan en paralelo, y a estas partes las denominamos hilos. Pero a diferencia de escribir varios programas (procesos) que se ejecuten a la vez colaborativamente, los hilos comparten la memoria (es decir, acceden a las mismas variables globales o dinámicas), por lo que no necesitan de costosos mecanismos de comunicación entre procesos para sincronizarse. Tampoco necesitan guardar gran parte de su contexto para preservar las variables, por lo que la penalización por cambio de contexto es menor.

Dentro de las técnicas para proporcional hilos al programador hay dos técnicas: los hilos en el espacio del kernel y los hilos en el espacio de usuario.

Los hilos del kernel son llamados a veces "procesos ligeros", porque pueden verse como una versión simplificada de los procesos. Es el kernel el que se encarga de darles soporte y de planificarlos. De hecho, la implementación actual de Linux de los hilos, LinuxThreads incluye a los hilos en la cola de planificación de procesos, como si fueran un proceso más.

En os hilos a nivel de usuario, en cambio, es una biblioteca la encargada de realizar la multiprogramación por hilos. Esta biblioteca se enlaza con el programa principal, y ella es la que se encarga de proporcionar el soporte a una concurrencia (por supuesto, simulada) mediante un planificador interno. Esta técnica tiene algunas ventajas, especialmente máquinas multiprocesador -la planificación de hilos en procesadores diferentes acarrea penalizaciones por el hecho de no poder utilizar los datos de la memoria memoria caché de cada procesador- y también algunas desventajas. En linux podemos utilizar GNU pthreads como biblioteca de hilos a nivel de usuario.

En Unix los hilos suelen seguir la especificación POSIX, llamados comunmente POSIX Threads. La opinión de los algunos kernel hackers respecto a ellos ha sido muy explícita en el pasado:

"posix threads is a braindamaged pile of crap". (Alan Cox)
"although a lot of the POSIX threads are reasonable, things like requiring uid/gid updates to be instantly effective across all threads in the process are just insane". (Stephen Tweedie)
"Note that the reason the kernel is not POSIX-compliant is:
- the POSIX standard is technically stupid. It's much better to use a cleaner fundamental threading model and build on top of that.
- things like the above are just so much better and more easily done in user space anyway."
(Linus Torvalds)
(obtenido de la edición de 30 marzo del 2000 de LWN).

Sin embargo, debido a su amplia utilización, se deseaba tener unos threads compatibles con POSIX disponibles a nivel de kernel a través de la glibc, y este es el hueco que viene a cubrir NPTL. La utilización de hilos permitirá por ejemplo mejorar el rendimiento de Apache (que aprovecha las características multihilo a partir de la versión 2.0) o de las aplicaciones Java, que suelen utilizar masivamente los hilos.

De hecho, gracias al nuevo parche O(1) de Ingo Molnar, el rendimiento en la creación y destrucción de hilos ha crecido espectacularmente. Según pruebas, se han llegado lanzar 100.000 hilos en 2 segundos, en vez de los 15 segundos que costaba antes (que es lo que se destaca en Slashdot de esta noticia). La ventaja del parche O(1) es que no hace falta recorrer una y otra vez la lista de procesos para decidir cual proceso (o hilo) debe entrar a ejecutarse, y cualquier mejora en un punto tan crítico como es el planificador tiene un impacto significativo. Quiero decir que una cosa son los parches de aumento de rendimiento del kernel, y otro el asunto de los nuevos hilos POSIX, y en la nota de Slashdot se han mezclado en cierta forma ambas cosas.

Espero no haber sido demasiado denso con las explicaciones, pero si queréis información más profunda y detallada, aquí dejo algunos enlaces más:

< FAQ ver0.1 (2 comments) | Parcheando el núcleo (1 comments) >
Enlaces Relacionados
· Slashdot
· NPTL
· documento de diseño de NPTL
· KernelTrap
· anuncio
· LinuxThreads
· GNU pthreads
· edición de 30 marzo del 2000 de LWN
· Ingo Molnar
· se destaca en Slashdot
· Linux Threads FAQ
· Programming POSIX Threads
· POSIX Threads explained
· More on Kernel
· Also by jcantero

Menu
· crear cuenta
· FAQ
· búsqueda
· Fuentes de Noticias

Login
Nueva cuenta
Usuario:
Contraseña:

Ver: Modo: Orden:
Hilos en Linux | 16 comentarios (16 temáticos, editoriales, 0 ocultos)
Aclaración (3.00 / 2) (#4)
por r00z a las Mon Sep 23rd, 2002 at 10:10:09 PM CET
(Información Usuario) http://r00z.ath.cx/

...the latest Linux development kernel is now able to start and stop over 100,000 threads in parallel in only 2 seconds (about 14 minutes 58 seconds faster than with earlier Linux kernels)!

La diferencia entre arrancar 100.000 hilos no es de 15 segundos sino de casi 15 minutos.

Tan mal diseñado estaba hasta ahora que han conseguido un incremento de velocidad de más del 450% o es que se lo han currado mucho?



Rendimiento del planificador (4.00 / 2) (#11)
por jcantero (jcantero@agujero-negro.escomposlinux.org) a las Tue Sep 24th, 2002 at 10:17:35 AM CET
(Información Usuario) http://www.escomposlinux.org/jcantero/

Es que, como su nombre indica, el nuevo planificador -funcion scheduler() que se ejecuta al terminar el quantum o bloquearse el proceso en marcha- es de orden O(1), mientras que otras soluciones pueden ser de orden lineal (proporcional al número de procesos presentes en la cola de procesos) o, logaritmico. Sean procesos o hilos, la diferencia tiene que ser significativa, especialmente a medida que n es grande (y en este caso n es 100.000).

¡Ah! y gracias por la aclaración. :)

--
"Papá, ¡Internet es más que una red pornográfica global!" -- Lisa Simpson
[ Padre ]


 
Comparativa (3.00 / 1) (#16)
por jcantero (jcantero@agujero-negro.escomposlinux.org) a las Wed Sep 25th, 2002 at 07:15:49 PM CET
(Información Usuario) http://www.escomposlinux.org/jcantero/

En KernelTrap publican la comparativa de Ulrich Drepper entre LinuxThreads, los NGPT (New Generation POSIX Threads) de IBM, y los nuevos NPTL. Gráficas 1 y 2 en PDF. Las pruebas son de creación y destrucción de hilos, y usan un kernel 2.5.37. Los resultados indican que NGPT duplica en velocidad de creación y destrucción de hilos a LinuxThreads, pero se ve cuadruplicado por NPTL.

Las comparativas son odiosas. }:-)

--
"Papá, ¡Internet es más que una red pornográfica global!" -- Lisa Simpson


Como debería ser siempre (none / 0) (#17)
por davinci (davinci at ecol org) a las Thu Sep 26th, 2002 at 10:10:48 AM CET
(Información Usuario)

Unas pruebas de rendimiento diseñadas para hacer frente a las situaciones más adversas posibles. En este caso concreto, pruebas que deberían favorecer las implementaciones N:M (la de IBM).

Y pese a todo, la "pulida" es total.

Impresionante 8)


¡Es la guerrrrrrra!
[ Padre ]


 
Híbridos (2.66 / 3) (#5)
por ochoto (ochoto_@_diariolinux.com) a las Mon Sep 23rd, 2002 at 11:27:37 PM CET
(Información Usuario) http://diariolinux.com

Como siempre que se dice que hay dos metodos para hacer algo, también existe al menos una técnica mixta (corolario de ochoto ;)

Otra técnica posible es implementar varios hilos en espacio de usuario por cada hilo en espacio del núcleo (M:N). Esta variante la han desechado por que es bastante más complicada de implementar, sobre todo si se quiere hacer transparente al programador.

El único problema que le veo al módelo elegido para Linux (hilos en espacio de kernel) es que un proceso con muchos hilos tendrá más probabilidades de ser planificado para ejecutarse con lo que sería posible realizar un thread bomb.




Solaris vs Windows ;) (3.00 / 2) (#6)
por Anónimo a las Tue Sep 24th, 2002 at 01:55:19 AM CET

El modelo M:N es que se usa en solaris y creo que en Mach tambien, mientras que windows usa el modelo 1:N. AFAIK, la planificacion de hilos usando un modelo M:N es mucho mas "equitativa" y evita thread bombing, cosa que no se puede evitar a priori con el modelo 1:N (se podrian poner limites al usuario y demas, pero bueno...). Ademas siempre he oido que una de las razones de la escalabilidad de solaris es precisamente la forma que tiene de tratar los hilos y precisamente, cuando se empezo a desarrollar la nueva capa de hilos de Linux, que pense que era la que estaban escribiendo gente de IBM e intel (Next Generation Linux Threads), vi que iban a optar por un modelo mixto, al igual que Solaris. Parece ser que no va a ser asi, en fin, ya veremos que pasa.

[ Padre ]


 
M:N (2.00 / 2) (#14)
por davinci (davinci at ecol org) a las Wed Sep 25th, 2002 at 02:55:08 PM CET
(Información Usuario)

¿No es éste el modelo que adopta también FreeBSD 5.0 (actualmente versión current; pronto pasará a stable)?.


¡Es la guerrrrrrra!
[ Padre ]


 
Los hilos de linux y alguna cosilla mas (2.50 / 2) (#8)
por Anónimo a las Tue Sep 24th, 2002 at 02:22:50 AM CET

[Que feo quedo antes, se me paso poner el Plain Text ]

> El programador escribe partes de su programa
> que se ejecutan en paralelo, y ...

Es en paralelo o de forma concurrente? Cual es la diferencia entre estos dos terminos? Yo creo que el termino correcto sereia concurrencia


> Esta técnica tiene algunas ventajas,
> especialmente máquinas multiprocesador

Esta frase, sacada de la parte de los hilos en espacio de usuario no la entiendo bien. Si el kernel no ve los distintos hilos, no puede planificarlos, asi que no puedes tener dos hilos de la misma tarea ejecutandose de forma concurrente, lo que no es deseable, asi que no veo la ventaja. Si te refieres al hecho de que la mobilidad de los hilos de un micro a otro traiga como consecuencia un incremento de los fallos de cache, creo que pare esto habia una caracteristica llamada CPU affinity que nos permitia evitar precisamente una alta movilidad en la planificacion de los hilos. El problema es que esta caracteristica no esta disponible en el kernel de linux de serie, sino como parche.
Eso si, una de las ventajas mas importantes que tiene es la portabilidad.



Re: los hilos de Linux y algunas cosillas más (3.00 / 1) (#10)
por jcantero (jcantero@agujero-negro.escomposlinux.org) a las Tue Sep 24th, 2002 at 10:13:02 AM CET
(Información Usuario) http://www.escomposlinux.org/jcantero/

Es en paralelo o de forma concurrente? Cual es la diferencia entre estos dos terminos? Yo creo que el termino correcto sereia concurrencia
Depende de si la máquina tiene una arquitectura paralela o no. De todas formas, el término "correcto" es concurrencia, pero decir que un par de procesos se ejecutan en paralelo es bastante típico, y no suele dar muchos quebraderos de cabeza en cuanto a la interpretación. Llámalo abuso de la terminología, si quieres.

Si te refieres al hecho de que la mobilidad de los hilos de un micro a otro traiga como consecuencia un incremento de los fallos de cache, creo que pare esto habia una caracteristica llamada CPU affinity
Sí, me refiero al llamado problema de la coherencia de la caché. Existen unas cuantas técnicas de multiprocesadores: los protocolos snoopy (MESI,MOSI,MOESI) y los de directorio. Esencialmente el problema surge de mantener la coherencia de un dato en las cachés de los distintos procesadores del sistema. Si no tienes una solución hardware, la penalización es excesiva porque significa renunciar a la caché del procesador para todos los datos compartidos. Con una solución hardware el rendimiento mejora, pero sigue teniendo cierta penalización.

--
"Papá, ¡Internet es más que una red pornográfica global!" -- Lisa Simpson
[ Padre ]


 
Hilos contra procesos (2.50 / 2) (#9)
por DopeRider a las Tue Sep 24th, 2002 at 03:03:47 AM CET
(Información Usuario)

En el debate en Slashdot, por cierto uno de los más divertidos que he leído nunca, salía el viejo tema: ¿es realmente necesario un buen sistema de hilos?. Los procesos en Linux se dice que son mucho menos costosos que por ejemplo en Windows.

No tengo experiencia directa. Lo único que sé es que mis colegas que pasaron de Delphi a Kylix han notado una mejora en el rendimiento de los programas de red (donde mayormente han aplicado los hilos). En Windows los mismos componentes usan hilos, mientras que en Linux usan procesos (compartiendo la imagen de memoria, pero procesos al fin).



hilos vs procesos (3.00 / 2) (#12)
por Anónimo a las Tue Sep 24th, 2002 at 05:23:43 PM CET

La creacion de procesos en linux es realmente menos costosa que en windows. AFAIK, la implementacion de windows del "fork" es, por decirlo asi, muy didactica, y por tanto es algo mas lenta que la de linux. Cuando creas un proceso tienes que crear una nueva entrada en la tabla de procesos, copias la memoria del parde al hijo, duplicas los descriptores que habia en uso hasta ese momento y algunas cosillas mas. Windows digamos que lo hace asi, tal y como se explica en los libros de SO. Otros SO usan una cosa que se llama copy-on-write, que justamente evita la duplicacio y creacion de nuevas variables cuando creas un nuevo proceso. Solo se duplican las variables cuando la variable del padre cambia, mientras tanto no. Aun a pesar de este tipo de optimizaciones, la creacion de un hilo es entre 10 y 100 veces mas rapida que la de un proceso, y ademas simplifica mucho el tema de la comparticion de datos, aunque quizas es mas complejo de depurar.

> , mientras que en Linux usan procesos
> (compartiendo la imagen de memoria, pero
> procesos al fin).

Que yo sepa, los procesos no comparte la imagen en memoria, son los hilos lo que comparte el mismo espacio de direccionamiento virtual, tal y como dice la noticia.



[ Padre ]


Me refería a la librería de Kylix (2.50 / 2) (#13)
por DopeRider a las Tue Sep 24th, 2002 at 06:18:00 PM CET
(Información Usuario)

Que yo sepa, los procesos no comparte la imagen en memoria

Me refería a la librería de Kylix. La implementación de TThread está hecha así en Linux. Compartir la memoria es una opción del fork.

[ Padre ]


 
Sobre los threads (2.00 / 2) (#1)
por Draco a las Mon Sep 23rd, 2002 at 05:18:24 PM CET
(Información Usuario)

Nunca he tenido demasiado claro el tema de los threads así que tengo algunas dudas y puntualizaciones que igual me podéis resolver o corregir/confirmar.

Lo primero de todo es las clases de Threads que hay. Has dicho que había Threads de Kernel y Threads de usuario e identificas LWN con Kernel threads. Yo tenía entendido que todos los LWN son Kernel threads, pero no al revés. De hecho un SO puede tener Kernel threads pero no darle LWN accesibles al programador ¿me equivoco?

las aplicaciones Java, que suelen utilizar masivamente los hilos.

¿Cómo maneja Java(mejor dicho el intérprete de Java) sus Threads? ¿Los mapea con procesos o threads? Yo pensaba que los representaba internamente, y que al virtualizar una máquina de pila los cambios de contexto eran muy rápidos(sólo hay que cambiar unos cuantos punterillos). Tengo más pero me las guardo. Ya tiraré de Google y biblioteca.
There are two major products to come out of Berkeley: LSD & BSD Unix. I don't believe this to be a coincidence.


LWP no LWN (1.00 / 2) (#2)
por Draco a las Mon Sep 23rd, 2002 at 06:00:58 PM CET
(Información Usuario)

Light Weight Processes no Linux Weekly News. Se me fue la cabeza...
There are two major products to come out of Berkeley: LSD & BSD Unix. I don't believe this to be a coincidence.
[ Padre ]


Hilos del kernel (4.00 / 1) (#3)
por jcantero (jcantero@agujero-negro.escomposlinux.org) a las Mon Sep 23rd, 2002 at 06:28:19 PM CET
(Información Usuario) http://www.escomposlinux.org/jcantero/

Intentaré responder en la medida de mis conocimientos (que por otro lado tampoco son tan extensos como a mí me gustaría).

En el artículo hablo de hilos en el espacio del kernel. Estos son hilos en el API del mismo, es decir, de cara al programador. Es distinto que el kernel soporte internamente múltiples hilos, tendencia que Linux por ejemplo tiene desde la versión 2.2. (kmod, por ejemplo, es un hilo que carga los módulos bajo demanda, tareá que antiguamente realizaba kerneld, un demonio en el espacio de usuario).

Lo uno no quita lo otro. Puedes tener un kernel absolutamente monolítico que soporte hilos (en el espacio del kernel), o puedes tener un kernel programado con hilos que externamente no ofrezca hilos. De hecho, que se hable de hilos en el kernel y no de procesos es porque al fin y al cabo todos las líneas de ejecución que haya en el kernel comparten los datos (la cola de procesos, el buffer caché, etc) y parece entonces más correcto hablar de "hilos". Pero también aparecen al hacer un ps ax. Los reconocerás por aparecer su nombre entre corchetes.

En cuanto al uso de hilos en Java no puedo hablar mucho, excepto un detalle: era una de los FUD de Sun en su época. Solaris tiene los dos tipos de hilos: los llamados procesos ligeros o hilos en espacio del kernel y los llamados hilos propiamente dichos (en espacio de usuario). Y además, el soporte debía ser bastante rápido -al menos en máquinas Sparc-. Sun preconizaba que su plataforma Solaris era mucho más adecuada que Linux para ejecutar Java, precisamente por su soporte de hilos. También me suena haber leído algo relativo a los problemas del porting de blackdown y el tema del soporte de hilos en Linux.

--
"Papá, ¡Internet es más que una red pornográfica global!" -- Lisa Simpson
[ Padre ]


Hilos en Java (3.50 / 2) (#15)
por Tomby (tomby@QuItAeStOtomby.tkNoSpAm) a las Wed Sep 25th, 2002 at 03:55:28 PM CET
(Información Usuario) http://www.tomby.tk/

Respecto a los hilos en Java me gustaría dar unos detalles.

En versiones anteriores a la 1.3 la JVM implementaba su propia librería de threads, llamada green threads. A partir de la versión 1.3 y posteriores la HotSpot JVM utiliza los threads nativos de Linux.

Mas info aquí.

Saludos!

[ Padre ]


 
Hilos en Linux | 16 comentarios (16 temáticos, editoriales, 0 ocultos)
Ver: Modo: Orden:

ecol Logo Powered by Scoop
Todas las Marcas Registradas y copyrights de esta página son propiedad de sus respectivos dueños.
Los comentarios son propiedad del que los escribe.
Los iconos de las noticias y el logotipo son propiedad de Javier Malonda.
El Resto © 2002 Escomposlinux.org y aledaños.

Puedes sindicar los contenidos de libertonia en formato RSS 1.0 y RDF 0.9. También se puede sindicar la cola de envíos pendientes de moderación.

El proyecto escomposlinux.org está dedicado a la memoria de tas

crear cuenta | faq | búsqueda