UNIVERIDAD TECNOLOGICA DE SANTIAGO,
UTESA
SISTEMA CORPORATIVO
FACULTAD DE INGENIERIA Y ARQUITECTURA
CARRERA DE INGENIERIA EN COMPUTACION
INF-025-002 ALGORITMOS PARALELOS
PRESENTADO A:
Ivan Mendoza
PRESENTADO POR:
Eimy Guzman 2-19-1143
Santiago, República Dominicana
30 de mayo del 2025
LINK EJERCICIO: https://github.com/EimyGZM/IMC_APP.git
1. Algoritmos
Un algoritmo es una secuencia finita de pasos bien definidos que resuelven un problema
específico. Los algoritmos se pueden clasificar en diferentes tipos, como de búsqueda,
ordenación, optimización, etc. Los algoritmos eficientes son cruciales para el rendimiento de las
aplicaciones, especialmente en contextos de gran volumen de datos o cuando se requiere
procesamiento en tiempo real.
2. Paralelo
El término paralelo se refiere a la capacidad de realizar múltiples tareas o procesos
simultáneamente, aprovechando múltiples unidades de procesamiento (CPU o núcleos de CPU).
Es común en sistemas que necesitan realizar cálculos complejos o procesamiento de grandes
volúmenes de datos de manera eficiente.
3. Algoritmos Paralelos
Los algoritmos paralelos son aquellos diseñados para ser ejecutados de manera simultánea en
múltiples núcleos de procesamiento o máquinas. Estos algoritmos se descomponen en subtareas
que pueden ejecutarse de forma independiente, aprovechando la arquitectura de paralelismo de
las computadoras modernas.
Ejemplos de algoritmos paralelos:
• Algoritmos de búsqueda paralela (por ejemplo, búsqueda en profundidad o amplitud en
grafos).
• Algoritmos de ordenación paralela (como la ordenación de burbuja paralela o quicksort
paralelo).
• Redes neuronales paralelizadas en el entrenamiento de modelos de aprendizaje
profundo.
4. Programación Paralela
La programación paralela es un paradigma de programación que permite ejecutar múltiples
tareas al mismo tiempo. Esto es útil para mejorar el rendimiento y la eficiencia de los programas
al aprovechar múltiples núcleos de procesadores o incluso máquinas distribuidas. Los sistemas
que implementan programación paralela permiten dividir una tarea en subprocesos que pueden
ejecutarse simultáneamente.
Objetivos de la programación paralela:
• Aumentar la velocidad de ejecución.
• Mejorar el rendimiento de aplicaciones con grandes volúmenes de datos.
• Utilizar eficientemente la capacidad de múltiples procesadores o núcleos.
Herramientas:
• OpenMP, MPI, CUDA (en sistemas distribuidos o GPU).
• C# (TPL, Parallel.For), Java (Fork/Join Framework).
5. Programación Concurrente
La programación concurrente es un enfoque de programación en el que varios procesos o hilos
(threads) pueden progresar de manera independiente, pero no necesariamente al mismo tiempo.
La programación concurrente se enfoca en permitir que múltiples tareas o procesos se gestionen
de forma eficiente, coordinando su ejecución sin bloqueo de recursos.
Diferencia con la paralela:
• La concurrencia se refiere a la gestión de múltiples tareas que pueden o no ejecutarse al
mismo tiempo.
• El paralelismo se refiere a la ejecución simultánea real de tareas.
Ejemplos:
• Hilos en un programa.
• Manejo de eventos en sistemas que no requieren ejecución simultánea.
6. Paralelismo
El paralelismo es un tipo de ejecución donde las tareas o procesos se realizan simultáneamente,
aprovechando múltiples procesadores, núcleos o incluso máquinas en una red. El objetivo es
dividir un problema en partes que puedan ejecutarse de manera simultánea para mejorar el
rendimiento y la eficiencia.
Tipos de paralelismo:
• Paralelismo de datos: Se divide un conjunto de datos y se procesan en paralelo.
• Paralelismo de tareas: Se dividen las tareas en subtareas que pueden ejecutarse
simultáneamente.
7. Hilos (Threads)
Los hilos son las unidades más pequeñas de procesamiento que pueden ser gestionadas por un
sistema operativo. En programación paralela, los hilos permiten ejecutar múltiples tareas al
mismo tiempo dentro de un solo proceso, facilitando así el uso eficiente de los recursos del
sistema.
• Hilos múltiples permiten que el CPU ejecute más de una tarea al mismo tiempo dentro
de un solo proceso.
• La gestión de hilos implica sincronización (para evitar condiciones de carrera) y
coordinación entre hilos (para asegurar que no haya conflictos en el acceso a recursos
compartidos).
8. Lenguajes o Frameworks que usan Paralelismo o Programación Concurrente
Algunos lenguajes y frameworks permiten la programación paralela y concurrente de manera
sencilla y eficiente:
• C++:
o Utiliza bibliotecas como OpenMP y Pthreads para facilitar la programación
paralela. Task Parallel Library (TPL), Parallel.For, async/await., Threading
Building Blocks (TBB), std::thread (C++11 en adelante).
• Java:
o Ofrece soporte nativo para hilos y concurrencia a través del
paquete java.util.concurrent. Concurrency API, Fork/Join Framework,
Streams (paralelismo de datos).
• Python:
o Usa bibliotecas como threading, multiprocessing, asyncio (para programación
asíncrona) para manejar tareas concurrentes.
• C++:
o La Biblioteca de Patrones de Paralelismo (PPL) permite implementar algoritmos
paralelos fácilmente, Task Parallel Library (TPL), Parallel.For, async/await.
• Go:
o Goroutines (modelado ligero de hilos).
• JavaScript (Node.js):
o Event Loop + Worker Threads (para tareas computacionales intensivas).
9. Programación Reactiva (Concepto, Lenguajes o Frameworks)
La programación reactiva es un paradigma que se basa en la propagación de cambios y
eventos, es decir, en la gestión de flujos de datos y la respuesta a eventos en tiempo real. Este
enfoque es muy útil en aplicaciones de tiempo real, como interfaces de usuario interactivas,
juegos y sistemas que manejan grandes cantidades de datos que cambian continuamente.
• Características:
o Se basa en flujos de datos y eventos.
o Se utiliza para manejar asynchronous data streams.
o Permite una programación más declarativa y menos imperativa.
Lenguajes y frameworks:
• RxJava (Java), RxJS (JavaScript), Reactor (Java), Akka Streams (Scala).
• C# tiene Reactive Extensions (Rx.NET).
10. MVVM (Modelo-Vista-ViewModel)
MVVM es un patrón arquitectónico usado principalmente en aplicaciones de interfaces gráficas
de usuario (GUIs), especialmente en tecnologías como WPF (Windows Presentation Foundation)
o Xamarin. MVVM separa la lógica de la aplicación de la UI.
• Modelo (Model): Contiene los datos y la lógica de negocio.
• Vista (View): Presenta la UI, pero no contiene lógica de negocio.
• Vista-Modelo (ViewModel): Actúa como intermediario entre la Vista y el Modelo,
proporcionando datos de una forma que la Vista pueda manejar.
Ventajas:
• Separación clara de responsabilidades.
• Facilita la prueba unitaria, ya que la lógica de negocio está separada de la UI.
11. SOLID
SOLID es un acrónimo que representa un conjunto de principios de diseño orientado a objetos
para mejorar la calidad del código y su mantenibilidad:
• S: Single Responsibility Principle (Principio de Responsabilidad Única).
• O: Open/Closed Principle (Principio de Abierto/Cerrado).
• L: Liskov Substitution Principle (Principio de Sustitución de Liskov).
• I: Interface Segregation Principle (Principio de Segregación de Interfaces).
• D: Dependency Inversion Principle (Principio de Inversión de Dependencias).
Estos principios ayudan a crear software más comprensible, flexible y mantenible.
12. Arquitectura Hexagonal
La arquitectura hexagonal, también conocida como Ports and Adapters, es un patrón
arquitectónico que promueve la separación entre el núcleo del negocio y las interacciones
externas (como bases de datos o interfaces). Esto permite una mayor flexibilidad y facilita las
pruebas unitarias al desacoplar las dependencias externas del código central.En resumen, estos
conceptos son fundamentales para entender cómo se desarrollan sistemas eficientes y escalables
en el ámbito del software moderno.
• Componentes:
o Centro: Lógica de negocio de la aplicación.
o Puertos: Interfaces a través de las cuales la lógica de negocio interactúa con el
mundo exterior.
o Adaptadores: Implementaciones de los puertos que interactúan con sistemas
externos (bases de datos, API, etc.).
Ventajas:
• Fomenta una fuerte separación de preocupaciones.
• Facilita el reemplazo de dependencias externas sin afectar la lógica central de la
aplicación.