Estoy tratando de entender cómo funciona el syscall de linux sched_setaffinity(). Este es un seguimiento de mi pregunta here.¿Cómo funciona sched_setaffinity()?
Tengo this guide, que explica cómo usar el syscall y tiene un ejemplo bastante prolijo (¡trabajando!).
Así que descargué el Linux 2.6.27.19 kernel sources.
Hice un 'grep' para las líneas que contienen ese syscall, y obtuve 91 resultados. No es prometedor
En última instancia, estoy tratando de entender cómo el núcleo es capaz de establecer el puntero de instrucción para un núcleo específico (o procesador.)
estoy familiarizado con los programas de la forma de un solo núcleo de un solo hilos trabajo. Uno podría emitir una instrucción 'jmp foo', y esto básicamente establece la dirección IP a la dirección de memoria de la etiqueta 'foo'. Pero cuando uno tiene múltiples núcleos, uno tiene que decir "buscar la siguiente instrucción en la dirección de la memoria foo, y establecer el puntero de instrucción para número de núcleo 2 para comenzar la ejecución allí".
Donde, en el código de ensamblaje, estamos especificando qué núcleo realiza esa operación?
Volver al código del kernel: ¿qué es importante aquí? El archivo 'kernel/sched.c' tiene una función llamada sched_setaffinity(), pero devuelve el tipo "long", que es inconsistente con su manual page. Entonces, ¿qué es importante aquí? ¿Cuál de estos módulos muestra las instrucciones de montaje emitidas? ¿Qué módulo está leyendo la 'task_struct', mirando al miembro 'cpus_allowed' y luego convirtiéndolo en una instrucción? (También he hojeado la fuente glibc, pero creo que solo hace una llamada al código kernel para realizar esta tarea).
Ignorar este comentario – kumar
<< En cada interrupción del reloj (~ 1000 por segundo), el planificador ejecuta en cada CPU y elige un proceso para funcionar. Tengo una pregunta aquí: Scheduler es una pieza de código que se ejecuta en el kernel. Un fragmento de código siempre se ejecuta en Single CPU en cualquier instante. ¿Correcto? Entonces, ¿ese programador malo (invocado por el controlador de interrupción del temporizador) cambia entre la CPU ... Entonces, eso significa que si tengo más CPUs es más programador de ejecución general en TODAS las CPU ... aquí se confunde un poco. –
kumar
Las diferentes CPU ejecutan diferentes copias del planificador. La interrupción del temporizador se genera en cada CPU individualmente. Entonces, si tiene 4 CPU, tiene 4 programadores. En realidad, el código del programador es el mismo, pero los datos son diferentes. – osgx