0% encontró este documento útil (0 votos)
35 vistas7 páginas

RVB TSP1

Este documento presenta una práctica sobre programación concurrente. Introduce conceptos como hilos, programación secuencial vs concurrente, y sincronización. El objetivo es entender la programación concurrente mediante la implementación de código multihilo, evaluar diferencias con programación secuencial, e identificar código para sincronizar acceso a objetos. Se incluyen ejemplos de código secuencial, concurrente, y con sincronización para ilustrar los conceptos.

Cargado por

Bruno Ramirez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
35 vistas7 páginas

RVB TSP1

Este documento presenta una práctica sobre programación concurrente. Introduce conceptos como hilos, programación secuencial vs concurrente, y sincronización. El objetivo es entender la programación concurrente mediante la implementación de código multihilo, evaluar diferencias con programación secuencial, e identificar código para sincronizar acceso a objetos. Se incluyen ejemplos de código secuencial, concurrente, y con sincronización para ilustrar los conceptos.

Cargado por

Bruno Ramirez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Universidad Nacional Autónoma de

México
Facultad de Ingeniería
División de Ingeniería Mecánica e Industrial
Laboratorio de Cómputo de Ingeniería Mecatrónica
Temas Selectos de Programación I (1964)
Profesor: Ing. Emiliano Nava Morales
Semestre 2024-1

Práctica No. 1
Nombre de la práctica
___ PROGRAMACIÓN CONCURRENTE __

Nombre del Estudiante:


__ Ramírez Vázquez Bruno__
Objetivos
OBJETIVO GENERAL: Entender el concepto de programación concurrente y ser capaz de
estructurar el código para su implementación

OBJETIVOS ESPECÍFICOS:
•Realizar un código que considere la implementación de hilos.
• Evaluar las diferencias de código de programas secuenciales en comparación con programas
distribuidos.
• Identificar el código para sincronizar el acceso de hilos a objetos en un programa.

Introducción

La programación multihilo (también conocida como programación concurrente o programación


paralela) es una técnica de programación en la que un programa se divide en múltiples hilos de
ejecución que pueden ejecutarse de manera independiente y concurrente. Cada hilo es una
secuencia de instrucciones que puede ejecutarse en paralelo con otros hilos, lo que permite que
un programa realice varias tareas al mismo tiempo.

En un entorno de programación multihilo, los hilos comparten el mismo espacio de memoria y


recursos del sistema, lo que facilita la comunicación y la colaboración entre ellos. Sin embargo,
esta compartición de recursos también puede dar lugar a problemas de concurrencia, como las
condiciones de carrera y la competencia por los recursos compartidos, que deben gestionarse
cuidadosamente para garantizar la integridad de los datos y el comportamiento correcto del
programa.

La programación multihilo se utiliza en una variedad de aplicaciones para mejorar el rendimiento y


la capacidad de respuesta de los programas. Algunos ejemplos incluyen aplicaciones de software
que aprovechan múltiples núcleos de CPU para acelerar el procesamiento, aplicaciones de usuario
que deben realizar múltiples tareas simultáneamente (como aplicaciones web o videojuegos) y
aplicaciones que requieren una gestión eficiente de la concurrencia, como servidores.

Los lenguajes de programación modernos proporcionan bibliotecas y herramientas para facilitar la


programación multihilo, como hilos o threads. Estos hilos permiten a los desarrolladores crear
aplicaciones que aprovechan la capacidad de procesamiento paralelo de los sistemas informáticos
modernos.
Programación secuencial Programación concurrente
Ejecución de tareas Una tarea a la vez Múltiples tareas simultaneas
Hilos de ejecución Un solo hilo Múltiples hilos
Rendimiento Aprovecha un núcleo Aprovecha varios núcleos
Responsividad Menos receptiva Más receptiva
Concurrencia No hay concurrencia Concurrencia controlada
Comunicación entre tareas Limitada o compleja Facilitada
Recursos compartidos Menos problemas Posibles condiciones de carrera
Complejidad Menos compleja Más compleja
Ejemplos comunes Aplicaciones lineales Servidores, aplicaciones
multitareas
Ejemplos de lenguajes C/C++, C#, Python Java, Python
Desarrollo

ACTIVIDAD 1. IMPLEMENTACIÓN DE HILOS

Escribir el código que involucre un algoritmo de ejecución prolongada, con la intención de que un
programa principal quede congelado mientras se ejecuta dicho algoritmo (programación
secuencial). Una vez hecho lo anterior, realizar un código para enviar la ejecución del algoritmo a
un hilo (subproceso) y discutir las diferencias que existe entre cada uno de los códigos generados
(programación concurrente).

EJEMPLO DE PROGRAMACION SECUENCIAL

EJEMPLO DE PROGRAMA CONCURRENTE


Diferencias clave:

 En el ejemplo secuencial, el algoritmo se ejecuta en el hilo principal, lo que significa que el


programa queda congelado hasta que el algoritmo termine de ejecutarse.
 En el ejemplo concurrente, el algoritmo se ejecuta en un hilo separado, lo que permite
que el programa principal continúe ejecutándose mientras el hilo del algoritmo sigue su
curso.

ACTIVIDAD 2. EVALUACIÓN DE TIEMPOS DE EJECUCIÓN

Modifique el código de la actividad anterior de tal manera que se ejecute N veces el algoritmo de manera
secuencial y concurrente, posteriormente repita para 2N veces, también para 3N, 4N y 5N. Genere una
comparativa respecto al código empleado y con base en la linealidad o no linealidad esperada por la
respuesta del mismo.
La respuesta se espera que sea no lineal, ya que la ejecución
concurrente permite aprovechar múltiples núcleos de CPU y, por lo
tanto, debería ser más rápida que la ejecución secuencial a medida
que aumenta el número de repeticiones. Sin embargo, ten en
cuenta que la velocidad de respuesta real puede variar según el
hardware y otros factores del sistema.

ACTIVIDAD 3. SINCRONIZACIÓN DE HILOS

Haga una modificación del algoritmo que se ha estado usando para que escriba un dato en un
archivo determinado, genere el código para enviar el algoritmo a los hilos necesarios y generar un
error de acceso al archivo (debido a que otro hilo lo esté usando). Posteriormente genere el
código de un mecanismo para sincronizar el acceso de los hilos al archivo y determine si esta
acción elimina el error de accesibilidad.

EJEMPLO DE ENTRADA A ARCHIVO NO SINCRONIZADO


Este codigo podría generar un error de acceso al archivo porque varios hilos intentan
escribir en el archivo al mismo tiempo sin ningún control.

EJEMPLO DE ARCHIVO CON ENTRADAS SINCRONIZADAS

En esta versión, hemos agregado un cerrojo (lock) que se utiliza para sincronizar el acceso al
archivo. Esto debería eliminar los errores de acceso al archivo que podrían ocurrir en la versión sin
sincronización. El bloque with lock asegura que solo un hilo pueda acceder al archivo a la vez.
Conclusiones.

Durante gran parte de mi instancia programando en la carrera, era común que si una función o
tarea específica llegaba a fallar, resultaba en que todo el programa no se podía seguir ejecutando.
Conociendo ahorra este tipo de programación resulta bastante útil ante estos casos y me hace
darme cuenta que la gran mayoría de tecnología actual (celulares, computadoras, servidores)
utilizan este tipo de código.

También se notó que al utilizar varios núcleos la programación multihilo es mucho más rápida que
la secuencial, esto se nota con mayor claridad cuando el número de repeticiones, de tareas o de
usuarios es demasiado grande, por lo que ya no resulta tan factible seguir usando la técnica
secuencial.

Para evitar fallos con grandes tareas simultáneamente y no se induzca al caos, se procura que
dichas tareas se sincronicen.

Bibliografía

• BELL, Douglas y PARR, Mike. C# para estudiantes. México, Pearson, 2010.

• BRINCH, Hansen. The origin of concurrent programming. New York, Springer, 2002.

• RAYNAL, Michel. Concurrent Programming: Algorithms, Principles, and Foundations. New York,
Springer, 2013.

• LAAKMANN MCDOWELL, Gayle. Cracking the Coding Interview: 189 Programming Questions and
Solutions. Palo Alto, CA., CareerCup, 2016.

También podría gustarte