2011-05-24 8 views
6

a través de la discusión de otro problema, vea Debugging strange error that depends on the selected scheduler, me encontré con algunas preguntas sobre la programación de mis hilos. Estoy en Linux 2.6.x, ejecutando con derechos de root y usando pthreads para hacer cosas paralelas en una aplicación de tiempo crítico escrita en C/C++.Entender la programación de Linux cuando pthreads están involucrados

Voy a tratar de dar algunos cortos, se reducía, fragmentos de explicar mi pregunta:

En algún lugar principal que al principio sí:

struct sched_param sp; 
memset(&sp, 0, sizeof(sched_param)); 
sp.sched_priority = 99; 
sched_setscheduler(getpid(), SCHED_RR, &sp); 

entiendo que este es el código que cambia mi programa para usar el RR-Scheduler, ejecutándose a máx. prioridad.

Al iniciar un pthread, lo hago:

sched_param param; 
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); 
pthread_attr_getschedparam(&attr, &param); 
param.sched_priority = priority; 
pthread_attr_setschedpolicy(&attr, SCHED_RR); 
pthread_attr_setschedparam(&attr, &param); 

entiendo esto, ser el código que cambia el hilo que va a ser comenzó a RR-Scheduler, utilizando la prioridad dada en la 'prioridad'. ¿Va a funcionar de manera equivalente si main no cambia el programador?

Lo que no entiendo es, si es necesario llamar a ese código en main? (La función principal no hace más que comenzar todo y luego bloquear en la entrada del teclado.) Dónde puedo encontrar documentación precisa de cómo funciona esto. No creo que las páginas de manual hagan un buen trabajo explicando los antecedentes.

Gracias de antemano.

+0

Otra pregunta es, ¿qué sucede si los procesos multiproceso separados se ejecutan en paralelo? ¿Cómo se distribuirá el tiempo del procesador entre esos? – user761451

Respuesta

3

Linux de forma predeterminada, utiliza la implementación ntpl (Native POSIX Thread Library) que considera un subproceso como un proceso de peso liviano, por lo que el planificador planifica los subprocesos con otros procesos.

En FreeBSD, usted tiene la "original" pthread aplicación que le permite especificar hilos política de planificación, pero las discusiones no están programadas de proceso en forma predeterminada (a menos que el parámetro PTHREAD_SCOPE_SYSTEM está establecido)

Así, en su ejemplo, su thread está programado como un proceso estándar con una alta prioridad por lo que estará en competencia con todos los demás procesos con el mismo nivel de prioridad, su principal proceso también.

Si su material de tiempo crítico está en su hilo, evite dar una alta prioridad a su proceso principal, hará un proceso menos en competencia con sus cosas en tiempo real.

Encontré una comparación entre PThreads y NTPL here.

+0

Por lo tanto, no tiene ningún efecto que se pueda mencionar para cambiar la tarea principal al planificador RR en un sistema Linux, suponiendo que la tarea principal no hace nada útil, y es absolutamente suficiente cambiar solo los subprocesos. ¿Ni siquiera con respecto a ejecutar múltiples programas multiproceso? – user761451

+0

En una implementación NTPL, sí, su hilo se considera como cualquier otro proceso en el sistema, no hay herencia de prioridad disponible;) –

+1

'getconf GNU_LIBPTHREAD_VERSION' habla sobre la implementación del subprocesamiento. – user761451

0

La implementación NPTL es modelo 1: 1; un hilo en el espacio del usuario y un proceso en el espacio del kernel que se llama LWP. Un LWP programado por kernel tiene el alcance del contenido de PTHREAD_SCOPE_SYSTEM.

Cuestiones relacionadas