resueltos programacion paralelismo paralela multitarea lenguajes hilos entre ejercicios ejemplos diferencias concurrentes concurrente concurrencia java multithreading concurrency parallel-processing

java - programacion - paralelismo en go



¿Hay alguna diferencia entre concurrencia y paralelismo en java? (6)

He estado investigando en Google y no puedo entender las diferencias (si las hay) entre los programas concurrentes y paralelos en Java. Parte de la información que he analizado sugiere que no hay diferencias entre ambos. ¿¿Es este el caso??


De la page documentación de page :

En un proceso multiproceso en un único procesador , el procesador puede cambiar los recursos de ejecución entre subprocesos, lo que resulta en la ejecución simultánea .

En el mismo proceso multiproceso en un entorno multiprocesador de memoria compartida , cada subproceso del proceso puede ejecutarse en un procesador separado al mismo tiempo, lo que da como resultado una ejecución paralela .

Cuando el proceso tiene menos subprocesos o más que procesadores, el sistema de compatibilidad de subprocesos junto con el entorno operativo garantiza que cada subproceso se ejecute en un procesador diferente.

Java SE 7 mejoró aún más el procesamiento paralelo al agregar ForkJoinPool API.

Consulte las publicaciones a continuación para obtener más detalles:

Programación en paralelo con hilos en Java (específico de Java)

Concurrencia vs Paralelismo: ¿Cuál es la diferencia? (Lenguaje agnóstico)


Depende de quién lo defina. Las personas que crearon el código de llamada del lenguaje de programación Go son concurrentes si se divide en partes que podrían tratarse en paralelo, mientras que el paralelismo implica que esas piezas se están ejecutando al mismo tiempo.

Dado que estos son principios de programación, el lenguaje de programación no influye en cómo se definen. Sin embargo, Java 8 tendrá más características para habilitar la simultaneidad y el paralelismo sin estropear demasiado el código. Por ejemplo, código como este:

List<Integer> coolItemIds = new List<Integer>(); for(Item item : getItems()) { if(item.isCool()) { int itemId = item.getId(); coolItemIds.add(item); } }

... que no es concurrente y no es paralelo, podría escribirse así (mi sintaxis probablemente sea incorrecta, pero espero que entiendas la idea):

Iterable<Item> items = getItems(); Iterable<Item> coolItems = items.filter(item -> item.isCool()); Iterable<Integer> coolItemIds = coolItems.map(item -> item.getId());

El código anterior se escribe de manera concurrente : ninguno de los códigos indicados requiere que los artículos cool se filtren uno a la vez, o que solo se pueda llamar a getId() en un artículo a la vez, o incluso que los artículos al principio de la lista deben ser filtrados o mapeados antes de los artículos al final. Dependiendo de qué tipo de Iterable se devuelva de getItems() , las operaciones dadas pueden o no ejecutarse en paralelo , pero el código que ha escrito es concurrente .

También de interés:


No creo que los dos términos tengan significados distintos bien definidos. Ambos son términos de arte en lugar de términos técnicos.

Dicho esto, la forma en que los interpreto es que algo es concurrente si se puede hacer al mismo tiempo que otras cosas, y en paralelo si se puede hacer por varios hilos al mismo tiempo. Tomo este uso principalmente de la documentación de recolección de basura de JVM , que dice cosas como

El recopilador de barrido de marcas simultáneas , también conocido como recopilador concurrente o CMS, está dirigido a aplicaciones que son sensibles a las pausas de recolección de basura. Realiza la mayor actividad de recolección de basura al mismo tiempo , es decir, mientras los subprocesos de la aplicación se ejecutan

y

El recopilador de CMS ahora usa varios subprocesos para realizar la tarea de marcado simultáneo en paralelo en plataformas con múltiples procesadores.

Es cierto que este es un contexto muy específico, y probablemente no sea prudente generalizar a partir de él.


Si programa utilizando subprocesos (programación concurrente), no necesariamente se ejecutará como tal (ejecución paralela), ya que depende de si la máquina puede manejar varios subprocesos.

Aquí hay un ejemplo visual. Hilos en una máquina sin rosca:

-- -- -- / / >---- -- -- -- -- ---->>

Hilos en una máquina roscada:

------ / / >-------------->>

Los guiones representan código ejecutado. Como puede ver, ambos se separan y se ejecutan por separado, pero la máquina enhebrada puede ejecutar varias piezas separadas a la vez.

Consulte esto ¿Cuál es la diferencia entre la programación concurrente y la programación en paralelo?


Supongo que depende de tus definiciones, pero mi entendimiento es más o menos así:

  • Simultaneidad se refiere a cosas que suceden en algún orden no especificado. La multitarea, la ejecución de múltiples programas mediante el entrelazado de instrucciones a través del corte temporal, es una buena forma de pensar acerca de este sentido de concurrencia.
  • Paralelismo (o "verdadero" paralelismo) se refiere a cosas que suceden literalmente al mismo tiempo. Esto requiere soporte de hardware (coprocesadores, procesadores multi-core, máquinas en red, etc.). Todo paralelismo es concurrente, pero no toda la concurrencia es paralela.

Hasta donde yo sé, ninguno de los términos es específico de Java o tiene matices específicos de Java.


La paralelización (o paralelismo o cómputo paralelo) es una forma de cálculo en la que muchos cálculos se llevan a cabo simultáneamente. En esencia, si un problema intensivo de CPU se puede dividir en tareas más pequeñas e independientes, entonces esas tareas se pueden asignar a diferentes procesadores

La simultaneidad se trata más de la multitarea que está ejecutando muchas acciones, pero no es un problema necesario de la CPU.