Articulo de referencia

Afinidad del procesador

En informática , la afinidad de procesador , también llamada fijación de CPU o afinidad de caché , permite vincular y desvincular un proceso o un hilo a una unidad central de pr...

En informática , la afinidad de procesador , también llamada fijación de CPU o afinidad de caché , permite vincular y desvincular un proceso o un hilo a una unidad central de procesamiento (CPU) o a un rango de CPUs, de modo que el proceso o hilo se ejecute solo en la CPU o CPUs designadas en lugar de en cualquier CPU. [ 1 ] Esto puede verse como una modificación del algoritmo nativo de planificación de cola central en un sistema operativo multiprocesador simétrico . Cada elemento en la cola tiene una etiqueta que indica su procesador kin . En el momento de la asignación de recursos, cada tarea se asigna a su procesador kin con preferencia a los demás.

Las implementaciones de algoritmos de planificación varían en cuanto a su adhesión a la afinidad de procesador. En ciertas circunstancias, algunas implementaciones permiten que una tarea cambie a otro procesador si esto resulta en una mayor eficiencia. Por ejemplo, cuando dos tareas que consumen muchos recursos del procesador (A y B) tienen afinidad con un procesador mientras que otro permanece sin usar, muchos planificadores transferirán la tarea B al segundo procesador para maximizar su uso. La tarea B adquirirá entonces afinidad con el segundo procesador, mientras que la tarea A seguirá teniendo afinidad con el procesador original. [ 2 ]

En la mayoría de los sistemas operativos, el conjunto de procesadores en los que se permite (o prefiere) que se ejecute un proceso o hilo se expresa como una máscara de afinidad , que es una máscara de bits que corresponde a los núcleos del sistema. [ 3 ]

Objetivo

Existen varias razones para utilizar la afinidad del procesador.

Localidad de la caché y la memoria

La ejecución de un hilo puede ser interrumpida por el planificador del sistema operativo para liberar espacio para otros programas o hilos durante una interrupción. Si el hilo se envía posteriormente al procesador en el que se estaba ejecutando previamente, puede haber datos restantes en la caché de la CPU que se pueden reutilizar, lo que permite reducir los fallos de caché . [ 4 ] Establecer la afinidad del procesador aseguraría que el hilo siempre se ejecute en el mismo procesador o procesadores, pero al mismo tiempo lo obligaría a esperar a que el procesador o procesadores estén disponibles nuevamente. Esta característica es especialmente útil para procesos intensivos en CPU con pocas interrupciones. Hacer lo mismo con un programa ordinario podría ralentizarlo, ya que tienden a ser interrumpidos con mayor frecuencia y terminan esperando más. [ 5 ] Un ejemplo práctico de afinidad del procesador es la ejecución de múltiples instancias de una aplicación de un solo hilo, como algunos programas de renderizado de gráficos. [ 6 ]

En las CPU con multihilo simultáneo (SMT, también conocido informalmente como hyper-threading , una marca registrada genérica de Intel), los dos o más "hilos" (procesadores lógicos, "núcleos virtuales") de un núcleo físico comparten las cachés L1 y L2. En lo que respecta a la afinidad para fines de localidad, son idénticas. [ 7 ]

En los sistemas de acceso a memoria no uniforme (NUMA) existe un problema similar, con la diferencia de que la latencia no proviene de fallos de caché L1/L2, sino de fallos de caché L3 y del acceso a memoria entre nodos. Restringir todos los hilos de un programa al mismo nodo NUMA (o al menos al mismo socket de CPU) garantizaría que puedan compartir sus cachés L3. Puede ser necesaria una configuración adicional para asegurar que la memoria se asigne desde el nodo NUMA local. [ 8 ] [ 9 ]

División de recursos

La afinidad del procesador también impone una división estática de los recursos de procesamiento. Como resultado, se puede usar para limitar la cantidad de núcleos de CPU utilizados por un proceso que consume muchos recursos de CPU, dejando otros núcleos disponibles para que los usen otros programas. Esto, por supuesto, no es óptimo, ya que dejaría recursos completamente sin usar cuando no se ejecutan otros programas, además de permitir que otros programas compitan con el programa que consume muchos recursos de CPU por los recursos en los pocos núcleos que se le permite usar. Los métodos más avanzados para dividir los recursos incluyen la configuración de prioridades de CPU, las cuotas de utilización de CPU y los límites de porcentaje de utilización estrictos. [ 10 ] [ 7 ]

Nuevamente, en las CPU con SMT, los planificadores que no son compatibles con SMT podrían cometer el error de programar trabajo en un núcleo no ocupado con un compañero ocupado cuando hay núcleos físicos no ocupados presentes. Esto causaría una competencia innecesaria por los recursos entre los dos hilos. Como resultado, los programas multihilo que consumen muchos recursos de la CPU a menudo asignan manualmente la afinidad de sus hilos para asegurarse de que no terminen compitiendo por el mismo núcleo físico. [ 11 ] [ 12 ]

Sistemas operativos específicos

Similar a Unix

En Linux , la afinidad de CPU de un proceso se puede modificar con el programa taskset(1) [ 13 ] y la llamada al sistema sched_setaffinity(2). [ 14 ] La afinidad de un hilo se puede modificar con una de las funciones de la biblioteca: pthread_setaffinity_np(3) o pthread_attr_setaffinity_np(3).

En los sistemas SGI , dplace vincula un proceso a un conjunto de CPU. [ 15 ]

En NetBSD 5.0, FreeBSD 7.2, DragonFly BSD 4.7 y versiones posteriores se puede usar pthread_setaffinity_npy pthread_getaffinity_np. [ 16 ] En NetBSD , la utilidad psrset [ 17 ] se utiliza para establecer la afinidad de un hilo a un conjunto de CPU determinado. En FreeBSD , la utilidad cpuset [ 18 ] se utiliza para crear conjuntos de CPU y asignar procesos a estos conjuntos.

En DragonFly BSD 1.9 (2007) y versiones posteriores, usched_setse puede usar una llamada al sistema para controlar la afinidad de un proceso. [ 19 ] [ 20 ] En DragonFly BSD 3.1 (2012) y versiones posteriores, se puede usar la utilidad usched para asignar procesos a un conjunto de CPU determinado. [ 21 ]

En Solaris es posible controlar las vinculaciones de procesos y LWP al procesador mediante el programa pbind(1) [ 22 ] . Para controlar la afinidad mediante programación, se puede utilizar processor_bind(2) [ 23 ] . Existen interfaces más genéricas disponibles, como pset_bind(2) [ 24 ] o lgrp_affinity_get(3LGRP) [ 25 ] , que utilizan conceptos de conjuntos de procesadores y grupos de localidad.

En AIX es posible controlar las vinculaciones de procesos mediante el comando bindprocessor [ 26 ] [ 27 ] y la API bindprocessor(). [ 26 ] [ 28 ] El planificador de AIX es compatible con SMT y puede cambiar los estados SMT de los núcleos POWER7/8/9 de 1 a 8 hilos para maximizar el rendimiento. [ 29 ]

macOS

macOS no ofrece una API que gestione el conjunto de procesadores en los que se permite ejecutar un proceso, tarea o hilo. En su lugar, ofrece la API Thread Affinity, que indica al kernel qué hilos deben programarse para compartir la misma caché L2, es decir, ejecutarse en el mismo núcleo físico de la CPU. [ 30 ] El kernel XNU traduce internamente cada etiqueta de afinidad a un conjunto de núcleos lógicos permitidos que corresponden a un núcleo físico. Cuando se establece una etiqueta, crea un espacio de nombres Thread Affinity si no existe ninguno. A continuación, se vincula al núcleo con el menor número de etiquetas ya vinculadas. En la versión 8792 de XNU, las etiquetas no migran entre núcleos; por lo tanto, siempre que no haya más etiquetas que núcleos físicos, cada etiqueta corresponderá a un único núcleo físico. Los espacios de nombres, así como las etiquetas, se heredan entre procesos padre e hijo. [ 31 ]

La API no está disponible en arm64 (Apple Silicon), donde ml_get_max_affinity_setsestá codificada para devolver 0. [ 32 ]

Windows NT

En Windows NT y sus sucesores, las afinidades de CPU de subprocesos y procesos se pueden configurar por separado mediante las llamadas a la API SetThreadAffinityMask [ 33 ] y SetProcessAffinityMask [ 34 ] o a través de la interfaz del Administrador de tareas (solo para la afinidad de procesos). [ 35 ]

La asignación forzada de cada hilo OpenMP a núcleos lógicos distintos en Windows se puede lograr mediante el siguiente código C , con el encabezado <Windows.h> :

#include <Windows.h> #include <omp.h>// Establecer la afinidad de subprocesos de OpenMP void setThreadAffinity ( void ) { #pragma omp parallel default(shared) { DWORD_PTR mask = ( DWORD_PTR ) 1 << omp_get_thread_num (); SetThreadAffinityMask ( GetCurrentThread (), mask ); } }

Véase también

Referencias

  1. Vaswani, Raj (1991). "Las implicaciones de la afinidad de caché en la planificación del procesador para multiprocesadores de memoria compartida multiprogramados". Actas del 13.º Simposio ACM sobre Principios de Sistemas Operativos (SOSP '91) . ACM. págs. 26–40 . doi : 10.1145/121132.121140 . 
  2. Squillante, Mark S. (1993). "Uso de información de afinidad de caché de procesador en la planificación de multiprocesadores de memoria compartida". IEEE Transactions on Parallel and Distributed Systems . 4 (2): 131– 143. doi : 10.1109/71.207589 .
  3. "Función SetThreadAffinityMask (winbase.h) - Aplicaciones Win32" . learn.microsoft.com . 27 de enero de 2022. Consultado el 7 de abril de 2023 .
  4. Torrellas, Josep (1995). "Evaluación del rendimiento de la planificación de afinidad de caché en multiprocesadores de memoria compartida". Journal of Parallel and Distributed Computing . 24 (2): 139– 151. doi : 10.1006/jpdc.1995.1014 .
  5. "Afinidad y vinculación del procesador" . IBM . Consultado el 8 de junio de 2021 .
  6. Mazouz, Abdelhafid (2011). "Evaluación y análisis del rendimiento de las estrategias de fijación de hilos en plataformas multinúcleo" (PDF) . Actas de la Conferencia Internacional de Computación y Simulación de Alto Rendimiento de 2011 (HPCS '11) . págs. 273–279 . doi : 10.1109/HPCSim.2011.5999834 . 
  7. 1 2 "Libro Blanco - Afinidad de Procesadores" - De tmurgent.com . Consultado el 6 de julio de 2007.
  8. "Capítulo 27. Configuración de políticas de afinidad de CPU y NUMA mediante systemd" . Documentación de Red Hat . Consultado el 27 de mayo de 2026 .
  9. Blagodurov, Sergey (2011). Un caso para la gestión de contención con reconocimiento NUMA en sistemas multinúcleo (PDF) . Actas de la Conferencia Técnica Anual USENIX 2011. Asociación USENIX .
  10. "Capítulo 24. Uso de cgroups-v2 para controlar la distribución del tiempo de CPU para aplicaciones | Administración, supervisión y actualización del kernel | Red Hat Enterprise Linux | 8 | Documentación de Red Hat" . docs.redhat.com .
  11. "Interfaz de afinidad de subprocesos" . Intel . Consultado el 27 de mayo de 2026 .
  12. Zhuravlev, Sergey (2010). "Planificación con conciencia de contención en sistemas multinúcleo". ACM Transactions on Computer Systems . 28 (4): 8:1–8:45. doi : 10.1145/1880018.1880019 .
  13. Manual de usuario de Linux – Comandos de usuario de Manned.orgtaskset(1)  
  14. "sched_setaffinity(2) — Página del manual de Linux" . man7.org . Consultado el 27 de mayo de 2026 .
  15. dplace.1 Archivado el 1 de julio de 2007 en Wayback Machine - Desde sgi.com . Consultado el 6 de julio de 2007.
  16. pthread_setaffinity_np(3) –Manual de funciones de la biblioteca BSD de NetBSD , FreeBSD y DragonFly
  17. Manual del administrador del sistema NetBSDpsrset(8)  
  18. Manual de comandos generales de FreeBSDcpuset(1)  
  19. " — configuración del usched de un proc" . Manual de llamadas al sistema de DragonFly . DragonFly BSD . Consultado el 28 de julio de 2019 .usched_set(2)
  20. " " . Referencia cruzada de BSD . DragonFly BSD . Consultado el 28-07-2019 .kern/kern_usched.c § sys_usched_set
  21. " — ejecutar un programa con un planificador de espacio de usuario y cpumask especificados" . Manual del administrador del sistema DragonFly . DragonFly BSD . Consultado el 28-07-2019 .usched(8)
  22. pbind(1M) - Página man de Solaris
  23. processor_bind(2) - Página man de Solaris
  24. pset_bind(2) - Biblioteca de información de Oracle Solaris 11.1 - sección 2 de las páginas man
  25. lgrp_affinity_get(3LGRP) - Guía del desarrollador para la optimización de la ubicación de memoria e hilos
  26. 1 2 Umesh Prabhakar Gaikwad; Kailas S. Zadbuke (16 de noviembre de 2006). "Afinidad del procesador en AIX" . IBM .
  27. "Comando bindprocessor" . IBM .
  28. "Subrutina bindprocessor" . IBM .
  29. "POWER CPU Memory Affinity 3 - Planificación de procesos para SMT y procesadores virtuales" . www.ibm.com . 13 de junio de 2023.
  30. "Notas de la versión de la API de afinidad de subprocesos" . Developer.apple.com .
  31. "xnu/osfmk/kern/affinity.c en e3723e1f17661b24996789d8afc084c0c3303b26 · apple-oss-distributions/xnu" . GitHub .
  32. Código fuente de XNU: xnu/osfmk/arm/cpu_affinity.h
  33. SetThreadAffinityMask - Biblioteca MSDN
  34. SetProcessAffinityMask - Biblioteca MSDN
  35. "Grupos de procesadores" . Microsoft Learn . Microsoft . Consultado el 27 de mayo de 2026 .
  • Artículo de MSDN sobre la función SetThreadAffinityMask
  • Taskset, una herramienta para configurar la máscara de afinidad en Linux
  • CPU Balancer, una utilidad gratuita de código abierto que distribuye uniformemente los procesos de Windows XP entre los procesadores lógicos mediante la máscara de afinidad.