Puedo entender cómo se puede escribir un programa que usa múltiples procesos o hilos: fork() un nuevo proceso y usa IPC, o crea múltiples hilos y usa ese tipo de mecanismos de comunicación.¿Cómo controlar qué núcleo se ejecuta un proceso?
También entiendo el cambio de contexto. Es decir, con solo una vez la CPU, el sistema operativo programa el tiempo para cada proceso (y hay toneladas de algoritmos de programación por ahí) y de ese modo logramos ejecutar múltiples procesos simultáneamente.
Y ahora que tenemos procesadores multi-core (o computadoras multiprocesador), podríamos tener dos procesos ejecutándose simultáneamente en dos núcleos separados.
Mi pregunta es sobre el último escenario: ¿cómo controla el kernel en qué núcleo se ejecuta un proceso? ¿Qué llamadas al sistema (en Linux, o incluso en Windows) programan un proceso en un núcleo específico?
La razón por la que estoy preguntando: Estoy trabajando en un proyecto para la escuela donde vamos a explorar un tema reciente en informática, y elegí arquitecturas multi-core. Parece que hay mucho material sobre cómo programar en ese tipo de entorno (cómo observar el estancamiento o las condiciones de carrera) pero no mucho sobre el control de los núcleos individuales. Me encantaría poder escribir algunos programas de demostración y presentar algunas instrucciones de ensamblaje o código C para el efecto de "Ver, estoy ejecutando un bucle infinito en el segundo núcleo, mire el pico en la utilización de CPU para ese núcleo específico ".
¿Algún código de ejemplo? ¿O tutoriales?
editar: Para aclarar: muchas personas han dicho que este es el propósito del sistema operativo, y que uno debe dejar que el sistema operativo se encargue de esto. ¡Estoy completamente de acuerdo! Pero entonces lo que estoy preguntando (o tratando de entender) es qué hace realmente el sistema operativo para hacer esto. No es el algoritmo de programación, sino más "una vez que se elige un núcleo, ¿qué instrucciones se deben ejecutar para que ese núcleo comience a buscar las instrucciones?"
posible respuesta aquí: http://stackoverflow.com/questions/980999/what-does-multicore-assembly-language-look-like, una de las respuestas describe la interrupción del interprocesador de inicio, que se envía desde un núcleo de CPU al APIC del chipset, y se puede utilizar para inicializar otra CPU y ejecutar código en ese CPU en una dirección específica –
Ejemplo mínimo de iniciar SMP en nuestro propio sistema operativo: http://stackoverflow.com/a/33651438/895245 Jugar con esa + memoria de sincronización debería ser el camino. –