multithreading - procesos - threads sistemas operativos
cambio de contexto de hilo vs cambio de contexto de proceso (7)
En el Cambio de contexto de subprocesos, el espacio de la memoria virtual permanece igual mientras que no está en el caso del Conmutador de contexto de proceso. Además, el interruptor de contexto de proceso es más costoso que el interruptor de contexto de subproceso.
¿Alguien podría decirme qué se hace exactamente en ambas situaciones? ¿Cuál es el costo principal de cada uno de ellos?
En primer lugar, el sistema operativo trae hilo saliente en modo kernel si no está ya allí, porque el cambio de hilo solo se puede realizar entre hilos, que se ejecutan en modo kernel. Luego se invoca el planificador para tomar una decisión sobre el hilo al cual se realizará el cambio. Después de tomar una decisión, kernel guarda parte del contexto del hilo que se encuentra en la CPU (registros de la CPU) en el lugar dedicado en la memoria (con frecuencia en la parte superior de la pila del núcleo del hilo saliente). Luego kernel realiza el cambio de la pila del kernel del hilo saliente a la pila del kernel del hilo entrante. Después de eso, el kernel carga el contexto previamente almacenado de la secuencia entrante de la memoria en los registros de la CPU. Y finalmente devuelve el control al modo de usuario, pero en el modo de usuario del nuevo hilo. En el caso de que el sistema operativo haya determinado que el hilo entrante se ejecuta en el otro proceso, Kernel realiza un paso adicional: establece un nuevo espacio de direcciones virtuales activo.
El costo principal en ambos escenarios está relacionado con una contaminación de la memoria caché. En la mayoría de los casos, el conjunto de trabajo utilizado por el hilo de salida diferirá significativamente del conjunto de trabajo utilizado por el hilo entrante. Como resultado, el hilo entrante comenzará su vida con una avalancha de fallas en el caché, por lo que eliminará los datos viejos e inútiles de los cachés y cargará los nuevos datos de la memoria. Lo mismo es cierto para TLB. En el caso del restablecimiento del espacio de direcciones virtuales (los hilos se ejecutan en procesos diferentes), la penalización es aún peor, porque el restablecimiento del espacio de direcciones virtuales conduce a la descarga de TLB. La triste historia es que todo el TLB está enrojecido, incluso si el nuevo hilo necesita cargar solo algunas entradas nuevas. Como resultado, el nuevo subproceso comenzará su quantum de tiempo con fallas TLB y frecuentes caminatas de página. El costo directo del cambio de hilos tampoco es despreciable (desde ~ 250 y hasta ~ 1500-2000 ciclos) y depende de la complejidad de la CPU, los estados de ambos hilos y los conjuntos de registros que realmente usan.
PD: buena publicación sobre la sobrecarga del cambio de contexto: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
En resumen, el cambio de contexto del subproceso no asigna un nuevo conjunto de memoria y pid, sino que utiliza el mismo que el padre, ya que se ejecuta dentro del mismo proceso. Un proceso uno genera un nuevo proceso y, por lo tanto, asigna nuevas mem y pid.
Hay mucho más. Han escrito libros sobre eso.
En cuanto al costo, un proceso de contexto cambia >>>> el hilo ya que tiene que restablecer todos los contadores de pila, etc.
La conmutación del contexto del proceso implica cambiar el espacio de dirección de la memoria. Esto incluye direcciones de memoria, mapeos, tablas de páginas y recursos del núcleo, una operación relativamente costosa. En algunas arquitecturas, incluso significa enjuagar varios cachés de procesador que no se pueden compartir entre los espacios de direcciones. Por ejemplo, x86 tiene que limpiar el TLB y algunos procesadores ARM tienen que enjuagar la totalidad del caché L1.
La conmutación de subprocesos es el cambio de contexto de un subproceso a otro en el mismo proceso (cambiar de subproceso a subproceso en los procesos es solo cambio de proceso). El estado de conmutación del procesador (como el contador de programa y el contenido del registro) es generalmente muy eficiente.
La principal distinción entre un interruptor de hilo y un interruptor de proceso es que durante un cambio de hilo, el espacio de la memoria virtual permanece igual, mientras que no lo hace durante un cambio de proceso. Ambos tipos implican entregar control al kernel del sistema operativo para realizar el cambio de contexto. El proceso de conmutación dentro y fuera del núcleo del sistema operativo junto con el costo de cambiar los registros es el mayor costo fijo de realizar un cambio de contexto.
Un costo más difuso es que un cambio de contexto se confunde con los mecanismos de caché de los procesadores. Básicamente, cuando se cambia de contexto, todas las direcciones de memoria que el procesador "recuerda" en su memoria caché se vuelven inútiles. La gran diferencia aquí es que cuando se cambian los espacios de la memoria virtual, el buffer de traducción Lookaside Buffer (TLB) o equivalente del procesador se vacía haciendo que los accesos a la memoria sean mucho más caros por un tiempo. Esto no ocurre durante un cambio de hilo.
Suponiendo que la CPU que ejecuta el sistema operativo tiene algunos dispositivos de alta latencia adjuntos,
Tiene sentido ejecutar otro hilo del espacio de direcciones del proceso, mientras que el dispositivo de latencia alta responde de nuevo.
Pero, si el dispositivo de alta latencia responde más rápido que el tiempo necesario para configurar la tabla + traducción de memorias virtuales a físicas para un proceso NUEVO, entonces es cuestionable si un interruptor es esencial en absoluto.
Además, la memoria caché HOT (los datos necesarios para ejecutar el proceso / el hilo son alcanzables en menos tiempo) es una mejor opción.
- cambio de proceso: es una transición entre dos memoria residente del proceso en un entorno de multiprogramación;
- Cambio de contexto: es un contexto cambiante desde un programa en ejecución hasta una rutina de servicio de interrupción (ISR).