multithreading - subproceso - multi thread definicion
¿Las aplicaciones de un solo subproceso son una tecnología muerta? (13)
... ¿se degradará seriamente una aplicación que se ejecuta en todos los subprocesos por la forma en que los sistemas operativos modernos difunden su ejecución a través de los núcleos cuando la aplicación no proporciona ninguna orientación sobre cómo optimizar dicha división?
No, seguirá ejecutándose igual de bien que cuando se ejecuta en una CPU de un solo núcleo.
Acabo de comprar una computadora portátil nueva, inferior a US $ 1,000, una dirigida directamente al mercado de consumidores y no desarrolladores, y, mirando las especificaciones, me sorprendió descubrir que venía de serie con un procesador de doble núcleo.
Esto me llevó a la pregunta: con las máquinas multinúcleo convirtiéndose en la norma, ¿es correcto escribir una aplicación de un solo subproceso?
Exceptuando las aplicaciones triviales, que razonablemente se puede esperar que quepan completamente dentro de un único núcleo de un solo procesador del sistema más débil en el que se ejecutará, una aplicación que se ejecute en un único subproceso se verá seriamente degradada por la manera en que los sistemas operativos modernos difunden su ejecución. a través de los núcleos cuando la aplicación no proporciona ninguna orientación sobre cómo optimizar dicha división.
Como es habitual en la optimización del rendimiento; no puede hacer afirmaciones genéricas sobre si algo es lo suficientemente eficiente sobre aplicaciones arbitrarias. La pregunta es, ¿es lo suficientemente eficiente para la aplicación X?
Sin embargo, tal vez sea más conveniente continuar viendo los beneficios de la ley de Moore, que ya no hace que los procesadores sean más rápidos, sino que los hace más pequeños (y por lo tanto más núcleos en un chip) y las aplicaciones tendrán que convertirse en múltiples subprocesos.
Sin embargo, el costo de crear una aplicación de subprocesos múltiples (ingeniería, pruebas, soporte) sigue siendo significativo, por lo que no debería hacerlo a menos que necesite el rendimiento. Creo que dar un paso alcista son algunas formas más fáciles de hacer una programación multiproceso con algunas bibliotecas diferentes, así como cosas como programación funcional y compiladores optimizados, así que creo que esto será más fácil a medida que continuamos la transición a un mundo multi-core.
Definitivamente, la programación paralela avanzará mucho en el futuro ya que la CPU ya no será mucho más rápida, simplemente tendremos muchas de ellas. Tener núcleos duales o cuádruples es solo el comienzo, habrá sistemas con un número mucho mayor de procesadores en el futuro cercano (actualmente hay CPU con 256 núcleos, Windows 7 tendrá soporte para tales procesadores).
Sin embargo, creo que el paralelismo no es adecuado para resolver ningún problema y requiere un estilo diferente de programación. Con la tecnología actual, el multihilo agrega un nivel bastante alto de complejidad a una aplicación. Por lo tanto, paradigmas como la programación funcional y las bibliotecas / compiladores que respaldan la paralelización serán cada vez más importantes en el futuro.
David Callahan tenía un artículo interesante en la revista MSDN sobre el cambio en las consideraciones de diseño con respecto a la programación paralela: cambio de paradigma: consideraciones de diseño para la programación paralela
El hardware realmente no cambia el hecho de que cualquier tarea en una aplicación en particular va a bloquear o no bloquear, y eso es realmente lo que determinará si debe usar multihilo o no.
Sin embargo, los lenguajes de programación modernos están agregando nuevas características para que sea más fácil y más seguro para el programador implementar aplicaciones de subprocesos. Cocoa, por ejemplo, tiene NSOperationQueue que abstrae el modelo de subprocesos de trabajo, y hay más mejoras en el próximo lanzamiento de OS X. Además de facilitar la implementación de un modelo de subprocesamiento simple, NSOperationQueue también gestiona los subprocesos de manera que el número total de subprocesos es apropiado para la cantidad de procesadores y núcleos, por lo que si su aplicación utiliza muchos subprocesos, puede haber algunas ganancias de velocidad bastante significativas, sin demasiado trabajo adicional.
La programación para múltiples hilos es actualmente algo difícil, propensa a errores y difícil de probar (las pruebas de condiciones de carrera no son fáciles). Por lo tanto, debe reservarse para cuando las ventajas superan las desventajas.
Muchos programas se ejecutan lo suficientemente rápido para casi todos los propósitos, y no necesitan ninguna mejora en el rendimiento. Algunos tardan un tiempo, pero por razones que realmente no involucran a la CPU y no van a mejorarse mediante múltiples hilos. Para estos, usar más de un hilo los hace más difíciles de desarrollar sin ayudar al usuario final.
Mientras tanto, múltiples núcleos pueden ser útiles sin multihilo. La mayoría de los sistemas operativos tienen múltiples procesos en marcha (monitoreo, limpieza de fondo, virus, spyware, spambots, lo que sea) y permitir que estos se ejecuten en otro núcleo puede liberar uno para el código de usuario.
La respuesta a su pregunta es engañosa, porque nos pide que especulemos sobre el futuro desarrollo. La respuesta simple a tu pregunta es esta:
No, los hilos individuales son la base de múltiples hilos, no se puede tener uno sin el otro. Por lo tanto, la capacidad de las aplicaciones de un solo hilo siempre existirá, y sin duda se escribirán en los próximos años.
La respuesta compleja es la siguiente: la razón por la que las computadoras tienen procesadores de doble núcleo estándar es porque es el siguiente paso en el desarrollo del procesador. mientras que muchas aplicaciones no aprovecharán inmediatamente el doble núcleo, algunas lo harán. Como tal, una compañía como Intel debe acomodarse o ser aplastada por la competencia.
Más allá de esto, hay ventajas inmediatas. Mayor espacio de memoria direccionable. Los sistemas operativos mismos que ya están siendo optimizados para el dual también obtienen beneficios inmediatos.
Además: si tiene una biblioteca optimizada para los procesadores de doble núcleo, todos los desarrollos posteriores se beneficiarán. Un ejemplo son los algoritmos de búsqueda y clasificación (una opción nartural para "división del hilo" debido a la divisibilidad de los datos) que pueden optimizarse para el doble núcleo, y luego usarse perpectivamente con la ventaja.
Las aplicaciones de subprocesos múltiples son significativamente más difíciles de escribir y mantener. Creo que comenzarás a ver más aplicaciones que aprovechan el multi-threading gracias a los avances en ambos hardware, pero también a los avances en la tecnología.
Microsoft tiene un conjunto de extensiones que creo que se están agregando al tiempo de ejecución llamado ?? Parallels ?? Sé que llaman a la versión LINQ habilitada PLINQ. Básicamente, trata de eliminar una gran cantidad de plomería propensa a errores de algoritmos multihilo.
Sin embargo, solo el tiempo lo dice, y apostaría a que todavía hay muchas aplicaciones de subproceso único porque no usarán algoritmos que justifiquen el costo de rendimiento de los subprocesos.
No debe realizar múltiples subprocesos a menos que la aplicación necesite ser de subprocesos múltiples.
El hecho de que puedas multi-hilo no significa que debas hacerlo . Múltiples núcleos / procesadores en realidad no cambian este hecho.
Se anuncian varios núcleos para beneficiar a los usuarios, no al programador. Se le informará a un usuario que tener varios núcleos significa que puede ejecutar varias aplicaciones complejas al mismo tiempo, por ejemplo, actualizando una gran hoja de cálculo en Excel y viendo una presentación en Powerpoint, etc.
Obviamente, como desarrollador, PUEDE hacer un buen uso de los núcleos adicionales; la mayoría de los paquetes de edición de video se ejecutan mucho más rápido en máquinas multi-core.
Si está escribiendo una aplicación que se beneficiaría seriamente del uso de más núcleos, entonces bien puede valer la pena invertir el tiempo de desarrollo adicional, ya que la mayoría de las máquinas nuevas ahora tienen más de un núcleo, pero como siempre, piense en el ROI.
Como el subproceso siempre agrega complejidad adicional a las aplicaciones, creo que las aplicaciones de subproceso único siempre tendrán su lugar.
Ni siquiera cuando los procesadores de núcleo único están completamente obsoletos, la programación de un solo hilo se habrá ido.
Los núcleos duales, especialmente en el mercado de consumo, son excelentes para la multitarea. Si cada aplicación toma cada núcleo del procesador, posiblemente podamos encontrar los mismos problemas que tuvimos con los procesadores de núcleo único.
Yo digo que no se vuelvan locos y empiecen a mulitrear todo. Manténgalo en un hilo a menos que haya una buena razón que no sea así.
Seamos realistas, la mayoría de las aplicaciones están escritas para negocios, acceden a una base de datos y permiten ver, editar y anexar datos en ella. Entonces tal vez algunos informes de análisis de datos, etc.
Aparte de un subproceso de interfaz de usuario separado, si las consultas de la base de datos van a demorar un poco, hay muy pocas razones para enhebrarlo, ya que las ganancias serán fraccionales y el usuario final no advertirá en gran medida. Hay tal vez algunos casos en los que un bucle paralelo podría beneficiar a las aplicaciones.
Creo que el beneficio real de múltiples núcleos en este momento es múltiples aplicaciones que acceden a diferentes núcleos al mismo tiempo. Solo piense cuántos procesos Windows se ejecuta en segundo plano, estos se pueden ejecutar simultáneamente en cualquier número de núcleos.
Tal vez la pregunta debería ser reformulada para: "ejecutar un programa en un solo núcleo, una tecnología muerta". Eso lo haría mucho más general. Si observa los trabajadores web añadidos recientemente agregados a Firefox 3.5 y otros navegadores principales, entonces admiten varios núcleos, pero usan procesos y mensajes. Un enfoque mucho más sensato que enhebrar. Al final todo depende del problema en cuestión. El uso de núcleos múltiples realmente solo hace la diferencia si el problema en cuestión está vinculado a la CPU.
También me gustaría añadir que su aplicación podría no ser el único proceso en ejecución en la máquina ( sugerencia ).
Una buena forma de usar múltiples procesadores sin multihilo:
cat data.txt | sed ''s/,/ /g'' | awk ''{print $4}'' | gzip > foo.txt.gz
¿Responde eso a su pregunta sobre el doble núcleo meteorológico, lo que significa que todas las aplicaciones deben ser multiproceso? Lo anterior puede, en teoría, saturar 3 CPU. (excluyendo cat, solo usándolo porque eso hace que la línea sea más legible)