Si está pensando estrictamente en código multiproceso , entonces debe tener en cuenta algunas restricciones con las que se encontrará al utilizar diferentes tiempos de ejecución de lenguaje.
Tocaré algunos ejemplos a continuación, pero antes de hacerlo, considere lo siguiente:
- Paralelismo no es sinónimo de enhebrado. Subprocesar es solo una forma de lograr código que se ejecuta en paralelo.
- Muchos de los desafíos de rendimiento del código enhebrado no provienen de la existencia de hilos, sino de problemas para acceder a los datos compartidos entre los hilos. Busque bibliotecas en cada idioma diseñadas con paralelismo en mente.
- En general, al elegir entre idiomas, use el idioma con el que esté más familiarizado y comprenda su método preferido para lograr el paralelismo. Por ejemplo, en python, el multiprocesamiento y / o las rutinas se consideran formas apropiadas para lograr el paralelismo. Multithreading generalmente no lo es.
De acuerdo con esas cosas en mente, permítanme dar algunos ejemplos de problemas específicos de tiempo de ejecución con subprocesos:
- ¿Cuáles son las diversas aplicaciones de las computadoras en el campo del entretenimiento?
- ¿Cuáles son los principales problemas abiertos en la teoría de la complejidad computacional?
- ¿Cuáles son algunas cosas no técnicas que uno debe saber al comenzar a hacer un doctorado en bases de datos o sistemas distribuidos?
- ¿Cuál es el lenguaje de programación potente y fácil de hoy y de mañana?
- ¿Cuáles son los temas de investigación adecuados para un estudiante de licenciatura en computación en la nube?
- El Oracle Hotspot JVM es conocido por tener un buen soporte de subprocesos del sistema operativo y el JDK tiene buenas primitivas de concurrencia, así como un bloqueo de grano fino / bloqueo / seguridad de subprocesos en toda la biblioteca estándar. En general, escribir código enhebrado en la JVM es una práctica común y muy bien soportada, ya sea a través de Java u otro lenguaje JVM.
- Vale la pena señalar que la JVM tiene un recolector de basura que puede funcionar en paralelo a otros subprocesos (sin detenerlos). Este es un beneficio sobre otros tiempos de ejecución de recolección de basura.
- Se sabe que CPython tiene un bloqueo de intérprete global (http://wiki.python.org/moin/Glob…), que evita que el código Python puro se ejecute en múltiples núcleos al mismo tiempo. Dicho esto, si llama a una biblioteca nativa, ese código puede ejecutarse en paralelo a otro código de Python. Tenga en cuenta que otros tiempos de ejecución de Python, como Jython (JVM) e IronPython (.Net CLR), no tienen esta construcción y admiten subprocesos múltiples.
- De manera similar con Ruby: MRI tiene un GIL, pero MacRuby (tiempo de ejecución Obj-C) y JRuby (JVM) no.
- Los sistemas operativos POSIX exponen pthreads a los programadores C / C ++, que son hilos directamente del sistema operativo, pero tendrá que construir o traer (es decir, aumentar) su propia sincronización en torno a las estructuras de datos. Esto le brinda un control preciso sobre el rendimiento de su aplicación, pero deja mucho margen de error.
- Go es conocido por proporcionar una interfaz de subprocesamiento sólida con primitivas (canales) de mensajes de primera clase para la sincronización. Las propiedades de programación funcional de Go hacen que lograr un paralelismo seguro sea un poco más fácil.
Hay muchos otros lenguajes que tienen soporte completo para subprocesos (puede ir directamente a la implementación de subprocesos con la C correcta), pero no hay un tiempo de ejecución único que esté muy por encima de los demás. La mayoría de estos tiempos de ejecución utilizan subprocesos según lo dispuesto por el sistema operativo debajo de ellos.
Finalmente, preguntaste específicamente sobre ‘gastos generales’, pero no hay una única forma de definir los gastos generales:
Cada uno de estos lenguajes tiene una “sobrecarga” de ejecución diferente, ya sea memoria o huella de la CPU, pero esa variación existe independientemente del subproceso. En su mayor parte, debido a que la mayoría de los idiomas implementan hilos sobre pthreads, las huellas son las mismas.