stringtranslate.com

Afinidad del procesador

La afinidad del procesador , o fijación de CPU o "afinidad de caché", permite la vinculación y desvinculación de un proceso o un subproceso a una unidad central de procesamiento (CPU) o a un rango de CPU, de modo que el proceso o subproceso se ejecutará solo en la CPU o CPU designadas en lugar de en cualquier CPU. Esto puede verse como una modificación del algoritmo nativo de programación de cola central en un sistema operativo de multiprocesamiento simétrico . Cada elemento de 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 las demás.

La afinidad del procesador aprovecha el hecho de que los restos de un proceso que se ejecutó en un procesador determinado pueden permanecer en el estado de ese procesador (por ejemplo, datos en la memoria caché ) después de que otro proceso se haya ejecutado en ese procesador. La programación de un proceso que hace un uso intensivo de la CPU y que tiene pocas interrupciones para ejecutarse en el mismo procesador puede mejorar su rendimiento al reducir los eventos degradantes, como las fallas de caché , pero puede ralentizar los programas ordinarios porque tendrían que esperar a que esa CPU vuelva a estar disponible. [1] Un ejemplo práctico de afinidad del procesador es la ejecución de varias instancias de una aplicación sin subprocesos, como algún software de renderizado de gráficos. [ cita requerida ]

Las implementaciones de algoritmos de programación varían en cuanto a su afinidad con el procesador. En determinadas circunstancias, algunas implementaciones permitirán que una tarea cambie a otro procesador si esto genera una mayor eficiencia. Por ejemplo, cuando dos tareas que requieren un uso intensivo del procesador (A y B) tienen afinidad con un procesador mientras que otro procesador permanece sin uso, muchos programadores cambiarán la tarea B al segundo procesador para maximizar el uso del procesador. La tarea B adquirirá entonces afinidad con el segundo procesador, mientras que la tarea A seguirá teniendo afinidad con el procesador original. [ cita requerida ]

Uso

La afinidad del procesador puede reducir eficazmente los problemas de caché, pero no reduce el problema persistente de equilibrio de carga . [2] Observe también que la afinidad del procesador se vuelve más complicada en sistemas con arquitecturas no uniformes. Por ejemplo, un sistema con dos CPU de doble núcleo con hiperprocesamiento presenta un desafío para un algoritmo de programación.

Existe una afinidad total entre dos CPU virtuales implementadas en el mismo núcleo a través de hiperprocesamiento, una afinidad parcial entre dos núcleos en el mismo procesador físico (ya que los núcleos comparten parte de la memoria caché, pero no toda) y ninguna afinidad entre procesadores físicos separados. Como también se comparten otros recursos, la afinidad del procesador por sí sola no se puede utilizar como base para el despacho de la CPU. Si un proceso se ha ejecutado recientemente en una CPU virtual con hiperprocesamiento en un núcleo determinado, y esa CPU virtual está ocupada actualmente pero su CPU asociada no, la afinidad de la memoria caché sugeriría que el proceso debería enviarse a la CPU asociada inactiva. Sin embargo, las dos CPU virtuales compiten por esencialmente todos los recursos de computación, caché y memoria. En esta situación, normalmente sería más eficiente enviar el proceso a un núcleo o CPU diferente, si hay uno disponible. Esto podría generar una penalización cuando el proceso vuelva a llenar la memoria caché, pero el rendimiento general podría ser mayor ya que el proceso no tendría que competir por los recursos dentro de la CPU. [ cita requerida ]

Sistemas operativos específicos

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

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

En DragonFly BSD 1.9 (2007) y versiones posteriores, la llamada al sistema usched_set se puede utilizar para controlar la afinidad de un proceso. [5] [6] En NetBSD 5.0, FreeBSD 7.2, DragonFly BSD 4.7 y versiones posteriores se pueden utilizar pthread_setaffinity_np y pthread_getaffinity_np. [7] En NetBSD , la utilidad psrset [8] para establecer la afinidad de un hilo con un determinado conjunto de CPU. En FreeBSD , la utilidad cpuset [9] se utiliza para crear conjuntos de CPU y para asignar procesos a estos conjuntos. En DragonFly BSD 3.1 (2012) y versiones posteriores, la utilidad usched se puede utilizar para asignar procesos a un determinado conjunto de CPU. [10]

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

macOS expone una API de afinidad [13] que proporciona sugerencias al kernel sobre cómo programar subprocesos según conjuntos de afinidad.

En Solaris es posible controlar los enlaces de procesos y LWP al procesador mediante el programa pbind(1) [14] . Para controlar la afinidad mediante programación se puede utilizar el programa process_bind(2) [15] . Hay interfaces más genéricas disponibles, como pset_bind(2) [16] o lgrp_affinity_get(3LGRP) [17] que utilizan los conceptos de grupos de localidad y conjunto de procesadores.

En AIX es posible controlar los enlaces de procesos utilizando el comando bindprocessor [18] [19] y la API bindprocessor. [18] [20]

Véase también

Referencias

  1. ^ "Afinidad y enlace de procesadores". IBM . Consultado el 8 de junio de 2021 .
  2. ^ "Libro blanco: Afinidad de procesadores" - De tmurgent.com. Consultado el 6 de julio de 2007.
  3. ^ taskset(1)  –  Manual de usuario de Linux – Comandos de usuario
  4. ^ dplace.1 Archivado el 1 de julio de 2007 en Wayback Machine . De sgi.com . Consultado el 6 de julio de 2007.
  5. ^ "usched_set(2) — configuración del usched de un procedimiento". Manual de llamadas del sistema DragonFly . DragonFly BSD . Consultado el 28 de julio de 2019 .
  6. ^ "kern/kern_usched.c § sys_usched_set". Referencia cruzada BSD . DragonFly BSD . Consultado el 28 de julio de 2019 .
  7. ^ pthread_setaffinity_np(3) – Manual de funciones de bibliotecas de NetBSD , FreeBSD y DragonFly BSD
  8. ^ psrset(8)  –  Manual del administrador del sistema NetBSD
  9. ^ cpuset(1)  –  Manual de comandos generales de FreeBSD
  10. ^ "usched(8) — ejecuta un programa con un planificador de usuario y una máscara de CPU especificados". Manual del administrador del sistema DragonFly . DragonFly BSD . Consultado el 28 de julio de 2019 .
  11. ^ SetThreadAffinityMask - Biblioteca MSDN
  12. ^ SetProcessAffinityMask - Biblioteca MSDN
  13. ^ "Notas de la versión de la API de afinidad de subprocesos". Developer.apple.com .
  14. ^ pbind(1M) - Página del manual de Solaris
  15. ^ processor_bind(2) - Página del manual de Solaris
  16. ^ pset_bind(2) - Biblioteca de información de Oracle Solaris 11.1 - páginas del manual sección 2
  17. ^ lgrp_affinity_get(3LGRP) - Guía para desarrolladores sobre optimización de la ubicación de subprocesos y memoria
  18. ^ ab Umesh Prabhakar Gaikwad; Kailas S. Zadbuke (16 de noviembre de 2006). "Afinidad de procesadores en AIX". IBM .
  19. ^ "Comando bindprocessor". IBM .
  20. ^ "Subrutina bindprocessor". IBM .