planificamiento de hilos en linux

Iniciado por asmnb, 30 Octubre 2012, 20:24 PM

0 Miembros y 1 Visitante están viendo este tema.

asmnb

estoi investigando sobre procesos en linux, quisiera saber si alguno lo sabe ya. como hace linux para planificar por ejemplo un proceso que tiene 3 hilos. no se si es el foro que va del tema pero es sobre programar en c me imagino.
hasta donde yo se para planificar procesos lo hace el kernel de linux pero los hilos estuve viendo que lo debe hacer el programador manualmente o usar una biblioteca.
eso significa que el kernel no es el que planifica los hilos de unproceso sino es como que el kernel ve al proceso como un hilo solo. si alguno sabe como se hace el planificamiento o planificacion de hilos en linux me gustaria saberlo,desde ya gracias

0xDani

Se suele usar la libreria pthread.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Weyler

Yo me acuerdo de lo que he programado procesos en linux en c, que la diferencia entre un proceso y un hilo esque estos ultimos comparten la memoria, si te sirve de ayuda.

Foxy Rider

Cita de: asmnb en 30 Octubre 2012, 20:24 PM
estoi investigando sobre procesos en linux, quisiera saber si alguno lo sabe ya. como hace linux para planificar por ejemplo un proceso que tiene 3 hilos. no se si es el foro que va del tema pero es sobre programar en c me imagino.

Si tenés que trabajar con hilos, tenés el estándar POSIX para hilos, pthread (la lista de funciones acá)
Aunque ojo, también tenés librerías que funcionan en linux, windows y demás y que apuntan a simplificar el uso de hilos; aunque claro, por lo bajo usan pthread.

Citarhasta donde yo se para planificar procesos lo hace el kernel de linux pero los hilos estuve viendo que lo debe hacer el programador manualmente o usar una biblioteca.

El kernel "planifica" (este es un término técnico, attenti ... tiene que ver con el subsistema de scheduling o planificación; cosa sobre la que deberías leer un poco para entender las diferencias de performance entre una cosa y otra) tanto hilos como procesos.
La diferencia radica en cómo los planifica; y esto depende del algoritmo que use (por que hay un *montón* de algoritmos de scheduling incluso para un mismo kernel), pero del vamos podemos decir que el context switch entre  hilos es más rápido.

Citareso significa que el kernel no es el que planifica los hilos de unproceso sino es como que el kernel ve al proceso como un hilo solo. si alguno sabe como se hace el planificamiento o planificacion de hilos en linux me gustaria saberlo,desde ya gracias

Así es, un proceso arranca siempre con un hilo "main"; después quien programa puede crear más según vea necesario.
Las diferencias entre programar hilos o procesos van mucho más allá que el planificador, hay múltiples diferencias prácticas (por ejemplo, en programación multiproceso no compartís espacio de memorias, por o que tenés que usar mecanismos de IPC para pasar datos de un proceso a otro ... comparado con los hilos que sí comparten espacio de memoria por pertenecer al mismo proceso)

También tenés que pensar un poco más en la integridad de datos cuando entrás al mundo del paralelismo/concurrencia.

Acá hay una intro a los hilos en linux → http://www.thegeekstuff.com/2012/03/linux-threads-intro/

Saludos.

P.S → Igual mucho no entendí la duda ... si pateaba para programación concurrente, paralela, una vista general de ambas, nosé.

asmnb

#4
me gustaron mucho sus respuestas especialmente la última ;-)
en verdad estoy interesado en los dos aspectos, primero a nivel planificación del SO. esa era mi pregunta principal.

digamos, entiendo que un algoritmo como el round robin puede usarse desde el modulo planificador del kernel a los procesos en modo usuario (sin detallar si un proceso en modo user tiene una imagen a nivel kernel). osea les asigna un cuantum a cada uno. ahora supongamos que uno de entre varios procesos de user tiene 5 hilos. bien yo preguntaba como se planifican esos 5 hilos dentro del proceso. osea quién los planifica en primer lugar, el kernel o lo debe hacer el programador manualmente usando funciones del sistema (por ejemplo wait, wake, etc)

mi pregunta es específica sobre como se realiza la planificación de los hilos dentro de un proceso. (suponiendo que tiene por ejemplo 3 o más hilos)

cómo hace el cambio de contexto de un hilo a otro, cómo se reparten los tiempos de ejecución (imagino que entre esos 5 hilos deben repartirse el cuantum asignado al proceso, y su planificación no puede salirse de ese tiempo), quién y cómo lo hace, esa es mi duda.

siempre hablando de procesos y hilos a nivel usuario no a nivel kernel.

espero sus respuestas.


Foxy Rider

Citardigamos, entiendo que un algoritmo como el round robin puede usarse desde el modulo planificador del kernel a los procesos en modo usuario (sin detallar si un proceso en modo user tiene una imagen a nivel kernel). osea les asigna un cuantum a cada uno. ahora supongamos que uno de entre varios procesos de user tiene 5 hilos. bien yo preguntaba como se planifican esos 5 hilos dentro del proceso. osea quién los planifica en primer lugar, el kernel o lo debe hacer el programador manualmente usando funciones del sistema (por ejemplo wait, wake, etc)

Te diría que vuelvas un poco atrás en tu lectura de sistemas; por que noto que hay conceptos que necesitás entender antes de leer lo que estás leyendo ahora.
Lo que subrayé es lo que me hizo notar eso ... lo de process wait y wake "son estados" y no funciones (okno, wait si es una funcion ... y wake no es un estado en sí)

Fijate que el scheduler es una parte elemental del kernel y por ende el kernel es SIEMPRE el que planifica y no el programador de aplicaciones en modo usuario  (que puede agregar información para cambiar el comportamiento del scheduler si quiere y el algoritmo lo permite ... pero siempre planifica el scheduler y no el programador)

Citar
mi pregunta es específica sobre como se realiza la planificación de los hilos dentro de un proceso. (suponiendo que tiene por ejemplo 3 o más hilos)

cómo hace el cambio de contexto de un hilo a otro, cómo se reparten los tiempos de ejecución (imagino que entre esos 5 hilos deben repartirse el cuantum asignado al proceso, y su planificación no puede salirse de ese tiempo), quién y cómo lo hace, esa es mi duda.


Tendrías que leer el código fuente para tener lo específico de todo el proceso, pero la información "de alto nivel" la tenés detallada en este artículo de Wikipedia (e importantísimo: sus referencias)

http://en.wikipedia.org/wiki/Completely_Fair_Scheduler

Saludos.

asmnb

claro te cuento que lo de las funciones te lo dije porque leí que a nivel programación multihilo, la planificación, así como la creación, destrucción, etc lo hace el programador. ya sea mediante una librería o mediante su programación particular.
por eso mencioné algunas funciones como esas, porque me imagino que si quiero poner un hilo a dormir y que me libere la cpu debería usar algo como 'wait'

bien, yo entiendo que por ejemplo el kernel mediante el scheduler por ejemplo use round robin para los procesos, digamos.... pero en cuanto a los hilos de un proceso cómo los planifica? osea espera a que duerma uno para proseguir con otro, o espera señales del programa (programación, ejemplo 'wait'), o el kernel interviene directamente con los hilos y los planifica por ejemplo usando algun algoritmo de prioridades.

Eso es lo que quiero saber, porque si es así que el kernel lo hace, entonces lo que yo leí que el programador debía encargarse de todo está mal, y lo leí en varios lugares. por ejemplo usando una libreria.

aparte si el kernel interviene tiene que poder reconocer que es un hilo y que es un proceso, y saber cuantos hilos hay en un proceso determinado, para poder planificarlos. algo como una lista de subprocesos, no lo se. pero yo leí que el kernel ve a un proceso en modo user como si fuera un sólo hilo, así tenga 5 o más.


son controversias que nunca me terminan de aclarar la situación. tan sólo estoy interesado en saber quien lo hace y medianamente como lo hace. porque me imagino que si es el kernel como te dije antes, entonces debería poder reconocer cuantos hilos hay en un proceso, pero como te dije, he leído que no se da cuenta de la cantidad de hilos que tiene un proceso. por eso  estaba casi convencido de que lo hacía el programador.

pero entonces surge un inconveniente, quién provoca el context switch y cómo?
porque el programador pueda usar alguna función del sistema para provocar un switch, también puede poner a dormir un hilo para poder continuar con otro por ejemplo, ese tipo de cosas son mis dudas.

lo de la biblioteca que se encarga de todo te juro que lo leí no lo estoy inventando, se dice que la librería hace todo, crea, destruye, planifica, etc
pero eso no aclara nada porque lo que quisiera saber en ese caso es como hace el kernel para hacer el switch en base a la librería y como sincronizarse en si con la librería (yo asumiía que mediante systemcalls) pero cómo el kernel reconoce los hilos de un proceso? yo leí que no notaba más de un hilo

Foxy Rider

#7
Citarpor eso mencioné algunas funciones como esas, porque me imagino que si quiero poner un hilo a dormir y que me libere la cpu debería usar algo como 'wait'

No, los procesos tienen diferentes flags de estado  ... en el caso de linux no podés "dormir" un hilo con una función equivalente al SuspendThread() de Windows, pero sí podés usar algo como un mutex para "esperar" (que es la manera que se recomienda en windows de todas maneras)

Citarbien, yo entiendo que por ejemplo el kernel mediante el scheduler por ejemplo use round robin para los procesos, digamos.... pero en cuanto a los hilos de un proceso cómo los planifica? osea espera a que duerma uno para proseguir con otro, o espera señales del programa (programación, ejemplo 'wait'), o el kernel interviene directamente con los hilos y los planifica por ejemplo usando algun algoritmo de prioridades.

Linux usa el Completely Fair Scheduler.
Lo de arriba debería responder lo otro.

CitarEso es lo que quiero saber, porque si es así que el kernel lo hace, entonces lo que yo leí que el programador debía encargarse de todo está mal, y lo leí en varios lugares. por ejemplo usando una libreria.

Citame el texto y lo vemos, quizá está mal o quizá no ... pero no, si bien parecería que es "teóricamente posible" no estoy al tanto de un sistema operativo que permita cambiar el scheduler programáticamente desde modo usuario. Si se puede instruir al algoritmo de scheduling (repito: si lo permite, por que cada kernel es un mundo) podés dar "hints" sobre prioridad, affinity, etc ... pero eso es algo MUY diferente a "el kernel lo hace [...] yo leí que el programador debía encargarse  [...] por ejemplo usando una libreria"

Citarson controversias que nunca me terminan de aclarar la situación. tan sólo estoy interesado en saber quien lo hace y medianamente como lo hace. porque me imagino que si es el kernel como te dije antes, entonces debería poder reconocer cuantos hilos hay en un proceso, pero como te dije, he leído que no se da cuenta de la cantidad de hilos que tiene un proceso. por eso  estaba casi convencido de que lo hacía el programador.

quien lo hace → El scheduler es el que planifica procesos u hilos
medianamente como lo hace →  http://en.wikipedia.org/wiki/Completely_Fair_Scheduler#Algorithm
he leído que no se da cuenta de la cantidad de hilos que tiene un proceso →

Código (bash) [Seleccionar]
cat /proc/`pgrep clementine`/status | grep Threads
ps -eLo pid,cmd,nlwp | grep clementine



Nah, no son controversias ... es que hablar de scheduling es hablar de teoría de sistemas operativos, después de las especificidades de cada sistema y sus algoritmos.
Ponele que en linux un proceso es un conjunto de hilos (o un hilo solo) que comparten espacio de memorias ... linux no diferencia entre procesos e hilos, sino que planifica tareas (tasks) y a esas las maneja según el tiempo de ejecución.

Citaraparte si el kernel interviene tiene que poder reconocer que es un hilo y que es un proceso, y saber cuantos hilos hay en un proceso determinado, para poder planificarlos. algo como una lista de subprocesos, no lo se. pero yo leí que el kernel ve a un proceso en modo user como si fuera un sólo hilo, así tenga 5 o más.

Pensá en términos de código ... hay mil maneras de resolver un problema, no? planificar tareas es lo mismo, hay mil maneras de planificarlas y depende del kernel (libres tenés Linux, IllumOS, FreeBSD, OpenBSD, NetBSD, DragonflyBSD, Minix, Match de HURD, el de HaikuOS, etc ... entendés por que soy insistente con que primero pienses de manera más genérica? )

La explicación está en el link de Wikipedia.


Citarpero entonces surge un inconveniente, quién provoca el context switch y cómo?
porque el programador pueda usar alguna función del sistema para provocar un switch, también puede poner a dormir un hilo para poder continuar con otro por ejemplo, ese tipo de cosas son mis dudas.

Ver
1) http://www.informit.com/articles/article.aspx?p=101760&seqNum=3
2) Primera respuesta sobre mutexes

Citarlo de la biblioteca que se encarga de todo te juro que lo leí no lo estoy inventando, se dice que la librería hace todo, crea, destruye, planifica, etc

Waaait, lo de crear y destruir hilos (que en el fondo son tareas) es válido ... planificar no, creo que habrás leído de CPU affinity? http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html

Eso no es planificar ... es un tema semántico nomás

Citarpero eso no aclara nada porque lo que quisiera saber en ese caso es como hace el kernel para hacer el switch en base a la librería y como sincronizarse en si con la librería (yo asumiía que mediante systemcalls) pero cómo el kernel reconoce los hilos de un proceso? yo leí que no notaba más de un hilo

Ya creo que está contestado arriba ...

Saludos.