Tengo esta declaración, que proviene de Java Concurrency In Practice de Goetz:
La sobrecarga de tiempo de ejecución de los subprocesos debido al cambio de contexto incluye guardar y restaurar el contexto de ejecución, la pérdida de localidad y el tiempo de CPU dedicado a programar subprocesos en lugar de ejecutarlos.
¿Qué se entiende por "pérdida de localidad"?
Cuando un subproceso funciona, a menudo lee datos de la memoria y del disco. Los datos a menudo se almacenan en ubicaciones contiguas o cercanas en la memoria/en el disco (por ejemplo, al iterar sobre una matriz o al leer los campos de un objeto). El hardware apuesta por eso cargando bloques de memoria en cachés rápidos para que el acceso a ubicaciones de memoria contiguas/cercanas sea más rápido.
Cuando tiene una gran cantidad de subprocesos y cambia entre ellos, esos cachés a menudo deben vaciarse y recargarse, lo que hace que el código de un subproceso lleve más tiempo que si se ejecutara todo a la vez, sin tener que cambiar a otros subprocesos. y vuelve más tarde.
Un poco como los humanos necesitamos algo de tiempo para volver a una tarea después de ser interrumpidos, encontrar dónde estábamos, qué estábamos haciendo, etc.
Solo para elaborar el punto de "cache miss" hecho por JB Nizet.
Como un subproceso se ejecuta en un núcleo, mantiene los datos usados recientemente en la memoria caché L1/L2 que son locales para el núcleo. Los procesadores modernos suelen leer datos de la memoria caché L1/L2 en aproximadamente 5-7 ns.
Cuando, después de una pausa (por ser interrumpido, puesto en cola de espera, etc.) un subproceso se ejecuta nuevamente, lo más probable es que se ejecute en un núcleo diferente. Esto significa que el caché L1/L2 de este nuevo núcleo no tiene datos relacionados con el trabajo que estaba haciendo el subproceso. Ahora necesita ir a la memoria principal (que tarda unos 100 ns) para cargar datos antes de proceder a trabajar.
Hay formas de mitigar este problema anclando subprocesos a un núcleo específico mediante el uso de una biblioteca de afinidad de subprocesos.