2009-11-16 9 views
14

Últimamente hemos estado hablando de hilos en mi clase de sistema operativo y se me ha ocurrido una pregunta.¿El hecho de que Go y Java no usen subprocesos de espacio de usuario significa que no se puede aprovechar el núcleo múltiple?

Dado que Go, (y Java) utiliza subprocesos de espacio de usuario en lugar de hilos de núcleo, eso no significa que no pueda aprovechar las ventajas de varios núcleos ya que el sistema operativo solo asigna tiempo de CPU al proceso y no hilos en sí?

This seems to confirm the fact that you can't

Wikipedia also seems to think so

+0

Bueno, confirma que si confía únicamente en subprocesos de espacio de usuario, no puede aprovechar el núcleo múltiple. Es solo que estaba seguro de haber leído que Go utilizaba hilos de espacio de usuario en alguna parte, lo cual es falso (ya que en la actualidad, las rutinas se implementan usando pthreads). ¡Me alegra oír que estaba equivocado! –

+0

StephenC, puede haber usado el término "hecho", pero está haciendo una pregunta, y ciertamente abierto a la posibilidad de que su presunción sea incorrecta. +1 para compensar la diferencia. – snarf

+0

solo para comentar lo que otros ya han dicho ... Java en Linux, por ejemplo: han pasado más de diez años desde que los hilos de Java se mapean a los hilos nativos de Linux. Al principio no solía ser así (lo recuerdo en estos días) pero, sí, han pasado más de 10 años de lo que ahora es. – SyntaxT3rr0r

Respuesta

17

¿Qué le hace pensar que Go usa subprocesos de espacio de usuario?

No es así. Utiliza subprocesos OS y puede aprovechar múltiples núcleos.

Es posible que le desconcierte el hecho de que, por defecto, Go usa solo 1 hilo para ejecutar su programa. Si inicia dos goroutines se ejecutan en un hilo. Pero si uno de los bloques de goroutine para I/O Go crea un segundo hilo y continúa ejecutando el otro goroutine en el nuevo hilo.

Si realmente desea desbloquear la potencia completa de varios núcleos, simplemente utilice la función GOMAXPROCS().

runtime.GOMAXPROCS(4); //somewhere in main

Ahora su programa sería utilizar 4 OS-hilos (en vez de 1) y sería capaz de hacer pleno uso de un ejemplo Sistema de 4 núcleos.

+0

Por alguna razón, pensé que lo leí en alguna parte ... –

+0

Y ahora parece que no puedo encontrar dónde, bueno, ¡adivina que estás en lo cierto! –

+0

Pero por lo demás, tenías razón. Si algo realmente depende de los hilos del espacio del usuario, no podrá usar los sistemas multi-core/multi-cpu totalmente – jitter

6

versiones más recientes de Java para utilizar hebras de SO, aunque no hay necesariamente una correlación de uno a uno con las hebras Java. Claramente, Java funciona muy bien en muchos hilos de hardware.

+0

¿Básicamente, la JVM crea hilos de kernel con lo que se supone que son hilos de usuario? –

+1

Básicamente, sí. –

0

Supongo que por "hilos de espacio de usuario" te refieres (por ejemplo) a los goroutines de Go.

Es cierto que el uso de goroutines para concurrencia es menos eficiente que el diseño (a mano y mediante cálculos científicos) de un algoritmo especial para asignar unidades de trabajo a los hilos del sistema operativo.

Sin embargo, cada programa Go está situado en un entorno y está diseñado para resolver un problema en particular. Se puede iniciar una nueva rutina para cada solicitud que el entorno realiza al programa Go. Si el entorno realiza solicitudes simultáneas al programa Go, un programa Go que utilice goroutines podría ejecutarse más rápido que un programa en serie, incluso si el programa Go usa solo 1 hilo del sistema operativo. La razón por la que los goroutines podrían procesar solicitudes con mayor velocidad (incluso cuando se usa solo 1 hilo del sistema operativo) es que el programa Go cambiará automáticamente de la rutina A a la rutina B cuando la parte del entorno que está asociada con A no puede momentáneamente responder.

Pero sí, es cierto que usar goroutines y asignarlos automáticamente a múltiples hilos del sistema operativo es menos eficiente que diseñar (a mano y mediante cálculos científicos) un algoritmo especial para asignar unidades de trabajo a los hilos del sistema operativo.

Cuestiones relacionadas