9 de diciembre de 2004

Threads

Hace unas semanas dimos en clase hilos POSIX. Por supuesto, POSIX es el "estándar", asi que todo el mundo usa POSIX:

int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);

Asi es la cosa en el mundo Unix. Esta tambien fork(), y clone() (este último solo en linux), pero es interesante observar con que elegancia se solucionan los problemas en sistemas operativos bien hechos, como Plan9. En Unix el mundo de los "threads" vino despues de ser diseñado, y como tantas otras cosas de unix, no está integrado de una forma precisamente "elegante". En Plan9 no existen threads: Simplemente hay procesos y punto. Lo que hay son múltiples métodos para decidir como se comparten los recursos, pudiendo crearse nuevos procesos que funcionen como threads, o no, o ir más allá de lo que Unix puede hacer permitiendo a los procesos tener su propio espacio de nombres (*). En Unix se tiene la dualidad fork()/pthread_*(), y pthread_*() palidece y se convierte en una una API horriblemente compleja y bastante windosera en su diseño. rfork() de Plan9 es muy superior, en mi opinión:

int rfork(int flags)

donde "flags" es un argumento donde se espefifican que recursos no se deben compartir. La página man de rfork está disponible online. Solo con comparar esta API con la API de pthread_*()...

(*)DISCLAIMER: Si, se que Linux SI soporta espacios de nombre por cada proceso, o al menos algo parecido. Es otra de las "sorpresas escondidas" de 2.6, y el artífice es Alexander Viro, quien sino. Aunque mucho me temo que todo esto está aun años luz de Plan9 :( . Otra de las "sorpresas" de 2.6, relacionada con este tema, es mount --move, que permite "mover" puntos de montaje de un lado a otro)

No hay comentarios:

Publicar un comentario en la entrada