2012-02-09 19 views
13

Ahora estoy estudiando el programador de Linux. En cuanto a la afinidad del núcleo de la CPU, me gustaría saber lo siguiente:¿Cómo se ancló cada proceso a un núcleo específico por planificador (Linux)

1) ¿Cómo se anclan cada proceso (hilo) a un núcleo?

hay una llamada al sistema sched_setaffinity para cambiar la afinidad central en la que se ejecuta un proceso. Pero internamente, cuando se genera un proceso (o un hilo), ¿cómo el programador de Linux predeterminado asigna el proceso (hilo) a un núcleo específico? Modifiqué la llamada al sistema sched_setaffinity para volcar información sobre la tarea que se está moviendo de un núcleo a otro.

printk(KERN_INFO "%d %d %ld %lu %s\n", current->pid, current->tgid, 
             current->state, current->cpus_allowed, 
             current->comm); 

Parece que no hay volcado de la información anterior en /var/log/messages. Entonces, el programador predeterminado fija cada proceso de una manera diferente, pero no puedo entender cómo.

2) ¿Es posible obtener ID de núcleo por PID u otra información?

Esto es lo que quiero implementar dentro del kernel de Linux. En task_struct, hay un miembro llamado cpus_allowed. Pero esta es una máscara para establecer la afinidad, no la identificación del núcleo. Deseo recuperar datos que identifiquen el núcleo en el que se está ejecutando el proceso especificado.

Gracias,

Respuesta

0

CPU afinidad núcleo es OS específico. El sistema operativo sabe cómo hacer esto, no es necesario. Podría encontrarse con todo tipo de problemas si especificara en qué núcleo ejecutar, algunos de los cuales podrían ralentizar el proceso.

En Linux Kernel, la estructura de datos asociada con los procesos task_struct contiene el campo de máscara de bit cpu_allowed. Esto contiene n bits uno para cada uno de los n procesadores en la máquina. Una máquina con cuatro núcleos físicos tendría cuatro bits. Si esos núcleos de CPU estuvieran habilitados para hyperthread, tendrían una máscara de bits de ocho bits. Si un bit determinado se establece para un proceso determinado, ese proceso puede ejecutarse en el núcleo asociado. Por lo tanto, si se permite que un proceso se ejecute en cualquier núcleo y se le permita migrar a través de procesadores según sea necesario, la máscara de bits sería completamente 1s. De hecho, este es el estado predeterminado para procesos bajo Linux. Por ejemplo,

PID 2441: PRIO 0, POLICY N: SCHED_NORMAL, NICE 0, AFFINITY 0x3 

el proceso 2441 tiene una afinidad de CPU de 0x3, lo que significa que se puede utilizar en Core0 y Core1.

Las aplicaciones también pueden especificar/establecer la afinidad utilizando la API de kernel sched_set_affinity() alterando la máscara de bits.

+0

Gracias por su respuesta. Pero esto es diferente de lo que quiero. Me preguntaba si mi descripción es engañosa ... En primer lugar, no uso la llamada al sistema 'sched_setaffinity' (no sched_set_affinity sino sched_setaffinity) porque no creo una aplicación que se ejecute en el espacio del usuario. – akry

+0

En segundo lugar, el campo 'cpus_allowed' (no cpu_allowed) no es información suficiente para identificar el núcleo de CPU en el que se está ejecutando el proceso. cpus_allowed se configura como 1 por defecto, de modo que es probable que el proceso mueva todos los núcleos disponibles. Si hay algún campo/método que indique la ubicación donde se está ejecutando el proceso, esto es lo que realmente quiero saber. – akry

+0

De todos modos, gracias por responder mi pregunta. – akry

4

Cada CPU tiene su propia secuencia de ejecución, AFAIK podemos averiguar la CPU actual de un proceso buscando a qué secuencia de ejecución pertenece. Dado task_struct *p, podemos obtener su runqueue por struct rq = task_rq(p), y struct rq tiene un campo llamado cpu, supongo que esta debería ser la respuesta.

No he intentado esto en la práctica, solo leo un código en línea, y no estoy muy seguro de si funcionará o no. Ojalá pudiera ayudarte.

+0

Gracias por su respuesta. Te lo haré saber después de probar este método. – akry

+1

Tenga en cuenta que esto es atrevido: la tarea podría migrarse de una secuencia de ejecución a otra debajo de usted. – caf

2

El campo 39 en /proc/pid/stat indica el núcleo/CPU actual del proceso.

ej .:

#cat /proc/6128/stat 
6128 (perl) S 3390 6128 3390 34821 6128 4202496 2317 268 0 0 1621 59 0 0 16 0 1 0 6860821 10387456 1946 18446744073709551615 1 1 0 0 0 0 0 128 0 18446744073709551615 0 0 17 8 0 0 0 

Proceso 6128 se está ejecutando en el núcleo 8.

2

Se puede determinar el ID de CPU en la que un hilo se ejecuta mediante el uso de su task_struct:

#include <linux/sched.h> 

task_struct *p; 
int cpu_id = task_cpu(p); 
Cuestiones relacionadas