[caracas-pm] pregunta sobre la librería Threads.pm

Luis E. Muñoz lem at itverx.com.ve
Fri Mar 5 18:54:33 PST 2010


On Fri, 2010-03-05 at 21:47 -0430, Jennifer Maldonado wrote:
> 
> Gracias lo tomaré encuenta :D . La pregunta surgió luego de ver que la
> autora de un modulo llamado forks dijo esto:
> [...]

Nota que forks _emula_ threads usando fork(). Fíjate también que habla
de COW (Copy On Write), que es una técnica que se usa para la copia de
procesos que ocurre al hacer la llamada fork() y que funciona como
explico más abajo.

En principio, el proceso padre se _copia_ a un proceso hijo. En
arquitecturas razonablemente modernas, la copia es muy rápida porque no
es una verdadera copia. El proceso hijo y el proceso padre quedan
compuestos con las mismas páginas de memoria, sólo que en el hijo las
páginas se marcan diciendo que son de sólo lectura.

Cuando el proceso hijo trata de modificar una de sus páginas, la
operación es interceptada por el sistema, que inmediatamente hace la
copia de sólo esa página, para luego dejar continuar al hijo. Esto
permite que sólo sea necesario copiar las pocas páginas que típicamente
se deben cambiar al crear un proceso hijo.

En su momento esto revolucionó el desempeño de los sistemas Unix (todos
los procesos nacen de una secuencia de llamadas fork() / exec()) porque
anteriormente, _todas_ las páginas del proceso se copiaban en la llamada
fork(), para luego ser descartadas con el exec().

Los threads tratan de ir más allá en cuando a desempeño, a costa de
sacrificar algunas cosas como el aislamiento. Son una abstracción
interesante, pero en la práctica introducen relaciones de dependencia
con librerías / versiones que debes tener muy presente.

Lo que sigue es trabajar en forma asíncrona. Esto es, emplear llamadas
como select() / poll() y variantes de otras funciones que no se bloquean
cuando esperan por algo, que permiten que tu programa se ponga a hacer
otra cosa mientras llega un insumo que necesita. Este patrón hace que la
concurrencia sea _explícita_, es decir, que tengas que manejarla tu. Hay
herramientas que te ayudan a construir código con este patrón (POE es un
ejemplo).

Hacer debugging de problemas de concurrencia no es ni sencillo ni
divertido, de modo que no uses threads a menos que estés totalmente
segura de que tienes que usar threads. Aun en ese caso, prueba con las
otras dos opciones antes :-)

Saludos

-lem



More information about the caracas-pm mailing list