Esta es una pregunta genérica que siempre me he preguntado.
En general, ¿es intensivo para una CPU crear subprocesos que realizan bucles "aunque no sean verdaderos ..." o similares?
Por ejemplo, supongamos que hago:
// pseudo-code
new Thread(function() {
while (!useHasDoneSomething) {
// do nothing...
}
alert("you did something!");
}
Entonces, es solo un fragmento de código que se ejecuta en un hilo que espera que algo suceda.
Por alguna razón, imagino que esto presionaría a la CPU. Después de todo, aunque es solo un pequeño bucle, está volviendo a ejecutar el bucle en el instante en que se realiza un ciclo. ¿No significa esto que está pasando por el ciclo muchas veces por milisegundo? ¿... por nanosegundo?
El sistema operativo "manejará" el programa y los hilos, ¿verdad? Pero eso sigue siendo una gran atención para ejecutar un bucle. Si la CPU no tiene nada más que hacer, ¿no se centraría en ese bucle y consumiría todo el tiempo de inactividad ?
¿Qué pasa si creo 1000 hilos que hacen el mismo bucle? ¿Cómo podría afectar eso el rendimiento / ciclos de CPU?
Además, ¿es así como los eventos funcionan internamente? Cuando está 'escuchando' un evento en Java, .NET, Javascript, etc. (como presionar un botón o cambiar el tamaño de una ventana), ¿se ha creado un hilo que repite?
fuente
Respuestas:
Si. El uso de este ciclo se llama espera ocupada y se llama así por una razón. Estos bucles ocupados comprueban la condición tan a menudo y tan rápido como el procesador puede gestionarla, con el resultado de que, si permanece en el bucle el tiempo suficiente, la carga del procesador aumenta de manera confiable al 100%.
Solo crea más trabajo para la CPU haciendo anotaciones.
No. Los bucles ocupados son una forma de sondeo y también muy ineficiente. Los sistemas operativos tienen otros mecanismos para detectar que ha ocurrido un evento (por ejemplo, una interrupción o una llamada específica) y tienen mecanismos para permitir que un hilo lo espere sin consumir tiempo de CPU. Estos mecanismos también se utilizarán para implementar los mecanismos de eventos de lenguajes como Java.
fuente
Tu instinto es correcto. Ocupado esperando así se describe como
En cambio, debe considerar una primitiva de control de concurrencia que permita que el hilo realmente quede inactivo hasta que tenga un trabajo útil que hacer, por ejemplo, un semáforo o una variable de condición :
fuente
if (!useHasDoneSomething)
una y otra vez, tan rápido como sea posible). Incluso si no le importa en su programa, desperdicia tiempo que otros programas podrían usar para ejecutarse. Pero incluso dentro de su programa, un camarero ocupado pierde tiempo que podría asignarse a algún subproceso de trabajo (en caso de que no haya suficientes núcleos disponibles para que todos los subprocesos se ejecuten simultáneamente).Los hilos deben esperar los eventos entrantes, no los cambios variables.
Los eventos entrantes son semáforos disponibles, colas de mensajes que no están vacías o transcurrido el tiempo:
Desde el punto de vista del subproceso, estas llamadas de función están bloqueando: el subproceso espera hasta que se produce el evento, dejando la carga de la CPU a otros subprocesos.
Desde el punto de vista del sistema, el hilo está marcado como 'Esperando evento' y no se programará mientras el evento no haya llegado.
Sobre los eventos de hardware, se manejan a través de interrupciones que son señales eléctricas a la CPU y que desencadenan la ejecución de ISR (rutinas de servicio de interrupción), cuya función es producir un evento de software en semáforos, colas de mensajes o tiempo.
fuente
La
//do nothing
parte interior mientras la condición en el escenario normal es ESPERAR en algún semáforo, o en otros términos SUEÑO. Duerme hasta que alguna interrupción te haya despertado. Y, por lo tanto, el subproceso va en "estado de suspensión" o simplemente digamos "estado de no ejecución". Solo los procesos que están en estado de ejecución consumen CPU. El proceso de estado de suspensión no consumirá CPU. Pueden estar consumiendo memoria, pero esa memoria será intercambiada internamente por el sistema de memoria virtual. Entonces, incluso si crea 1000 hilos de este tipo, no representarán una gran amenaza para su sistema.fuente