Para suponer una mejora de la velocidad debido a cualquier forma de computación múltiple, debe suponer que se están ejecutando múltiples tareas basadas en CPU simultáneamente en múltiples recursos informáticos (generalmente núcleos de procesador) o que no todas las tareas se basan en el uso concurrente de el mismo recurso, es decir, algunas tareas pueden depender de un subcomponente del sistema (almacenamiento en disco, por ejemplo) mientras que algunas tareas dependen de otro (recibir comunicación desde un dispositivo periférico) y otras pueden requerir el uso de núcleos de procesador.
El primer escenario a menudo se denomina programación "paralela". El segundo escenario se denomina a menudo programación "concurrente" o "asincrónica", aunque en ocasiones también se utiliza "concurrente" para referirse al caso de permitir que un sistema operativo intercale la ejecución de múltiples tareas, independientemente de si dicha ejecución debe tomar lugar en serie o si se pueden utilizar varios recursos para lograr la ejecución en paralelo. En este último caso, "concurrente" generalmente se refiere a la forma en que la ejecución está escrita en el programa, más que desde la perspectiva de la simultaneidad real de la ejecución de la tarea.
Es muy fácil hablar de todo esto con supuestos tácitos. Por ejemplo, algunos se apresuran a hacer una afirmación como "La E / S asíncrona será más rápida que la E / S de subprocesos múltiples". Esta afirmación es dudosa por varias razones. En primer lugar, podría darse el caso de que algún marco de E / S asíncrono determinado se implemente precisamente con subprocesos múltiples, en cuyo caso son uno en el mismo y no tiene sentido decir que un concepto "es más rápido" que el otro. .
En segundo lugar, incluso en el caso de que exista una implementación de un solo subproceso de un marco asincrónico (como un bucle de eventos de un solo subproceso), aún debe hacer una suposición sobre lo que está haciendo ese bucle. Por ejemplo, una cosa tonta que puede hacer con un bucle de eventos de un solo subproceso es solicitar que complete de forma asincrónica dos tareas diferentes puramente vinculadas a la CPU. Si hiciera esto en una máquina con solo un núcleo de procesador único idealizado (ignorando las optimizaciones de hardware modernas), entonces realizar esta tarea "asincrónicamente" no funcionaría realmente de manera diferente a realizarla con dos subprocesos administrados de forma independiente, o con solo un proceso solitario: - la diferencia puede deberse al cambio de contexto de subprocesos oa las optimizaciones de la programación del sistema operativo, pero si ambas tareas van a la CPU, sería similar en cualquier caso.
Es útil imaginar muchos de los casos de esquina inusuales o estúpidos con los que podría encontrarse.
"Asincrónico" no tiene que ser simultáneo, por ejemplo, como se indicó anteriormente: usted ejecuta "asincrónicamente" dos tareas vinculadas a la CPU en una máquina con exactamente un núcleo de procesador.
La ejecución de subprocesos múltiples no tiene por qué ser simultánea: genera dos subprocesos en una máquina con un solo núcleo de procesador, o solicita a dos subprocesos que adquieran cualquier otro tipo de recurso escaso (imagine, por ejemplo, una base de datos de red que solo puede establecer uno conexión a la vez). La ejecución de los subprocesos puede estar intercalada, sin embargo, el programador del sistema operativo lo considera oportuno, pero su tiempo de ejecución total no se puede reducir (y se incrementará a partir del cambio de contexto del subproceso) en un solo núcleo (o más generalmente, si genera más subprocesos de los que hay) núcleos para ejecutarlos, o tener más subprocesos que piden un recurso de los que el recurso puede sostener). Lo mismo ocurre con el multiproceso.
Por lo tanto, ni la E / S asíncrona ni los subprocesos múltiples tienen que ofrecer una ganancia de rendimiento en términos de tiempo de ejecución. Incluso pueden ralentizar las cosas.
Sin embargo, si define un caso de uso específico, como un programa específico que hace una llamada a la red para recuperar datos de un recurso conectado a la red, como una base de datos remota, y también realiza algunos cálculos locales vinculados a la CPU, entonces puede comenzar a razonar sobre las diferencias de rendimiento entre los dos métodos dada una suposición particular sobre el hardware.
Las preguntas para hacer: ¿Cuántos pasos computacionales necesito realizar y cuántos sistemas independientes de recursos hay para realizarlos? ¿Hay subconjuntos de los pasos computacionales que requieran el uso de subcomponentes del sistema independientes y puedan beneficiarse de hacerlo simultáneamente? ¿Cuántos núcleos de procesador tengo y cuál es la sobrecarga de usar varios procesadores o subprocesos para completar tareas en núcleos separados?
Si sus tareas dependen en gran medida de subsistemas independientes, entonces una solución asincrónica podría ser buena. Si la cantidad de subprocesos necesarios para manejarlo fuera grande, de modo que el cambio de contexto no fuera trivial para el sistema operativo, entonces una solución asíncrona de un solo subproceso podría ser mejor.
Siempre que las tareas estén vinculadas por el mismo recurso (por ejemplo, múltiples necesidades para acceder simultáneamente a la misma red o recurso local), entonces el subproceso múltiple probablemente introducirá una sobrecarga insatisfactoria, y mientras que la asincronía de un solo subproceso puede introducir menos sobrecarga, en tal recurso- situación limitada tampoco puede producir una aceleración. En tal caso, la única opción (si desea una aceleración) es hacer disponibles múltiples copias de ese recurso (por ejemplo, múltiples núcleos de procesador si el recurso escaso es la CPU; una mejor base de datos que admita más conexiones simultáneas si el recurso escaso es una base de datos con conexión limitada, etc.).
Otra forma de decirlo es: permitir que el sistema operativo intercale el uso de un solo recurso para dos tareas no puede ser más rápido que simplemente dejar que una tarea use el recurso mientras la otra espera, y luego dejar que la segunda tarea termine en serie. Además, el costo del programador de entrelazar significa que en cualquier situación real crea realmente una desaceleración. No importa si el uso intercalado se produce en la CPU, un recurso de red, un recurso de memoria, un dispositivo periférico o cualquier otro recurso del sistema.