Descargar la presentación
La descarga está en progreso. Por favor, espere
1
Concurrencia.
2
Importancia de la Concurrencia.
Para capturar la estructura lógica de algunos problemas. Para cooperar entre varias máquinas físicas. Para incrementar el desempeno corriendo más de un procesador simultáneamente. Muchos programas, particularmente servidores y aplicaciones gráficas, deben mantener el hilo de varias tareas independientes al mismo tiempo. Por tanto, usualmente la forma más natural de estructurar estos programas es a través de hilos separados de control; de allí que el uso de la concurrencia sea indispensable. Algunos programas son concurrentes por necesidad. Un sistema operativo puede ser interrumpido por un artefacto externo en casi todo momento. Por tanto, se necesita de un contexto que represente lo que se estaba haciendo antes de la interrupción, para reanudar las tareas luego de que se atienda la misma. Cada procesador tiene su hilo de control, que debe interactuar con los de los otros procesadores en aras de culminar la tarea general.
3
Precedentes de la Concurrencia.
La concurrencia no es una nueva idea. Los primeros desarrollos teóricos surgen en la década de los 60'. Algol-68 incluye algunas características de la programación concurrente. La concurrencia surge por la necesidad de evitar que el procesador se mantuviera ocioso. El interés por la concurrencia comienza cuando se comenzaron a producir multiprocesadores a bajo costo, lo que permitía físicamente ejecutar distintas tareas de forma simultánea. El procesamiento lineal deja al procesador ocioso durante mucho tiempo. Por ejemplo, cuando las tareas de entrada-salida son muy grandes en comparación con las de cómputo, el procesador pierde mucho tiempo esperando por datos que introduce el usuario, mientras que trabajando con concurrencia, se deja la tarea de lectura en espera (mientras se termina de introducir los datos) y continúa con otra tarea que tenga pendiente. Para leer o escribir registros, el programa que está corriendo cede el control a sistema operativo, quien envía el comando al aparato externo de comenzar la operación requerida, y entonces transfiere el control inmediatamente a otro programa.
4
Los Programas Multihilos.
La concurrencia permite conservar la estructura lógica de este tipo de programas. La semántica de la simulación de eventos discretos requieren que los eventos ocurran atómicamente en puntos fijos de tiempo. Los programas multihilos han surgido en los últimos anos con la creación de aplicaciones Web, ya que éstas requieren esta estructura lógica. La Entrada-Salida interactiva es un caso en el que es pertinente la concurrencia, ya que la misma interrumpe la ejecución del programa que está corriendo. Los juegos de video, por ejemplo, debemos manejar los movimientos de mouse y golpes de tecla para actualizar continuamente la imagen en la pantalla. En las simulaciones de eventos discretos se usa la concurrencia para representar las entidades activas de algún sistema del mundo real. En navegadores como Netscape o Internet Explorer hay muchos hilos corriendo simultáneamente, donde cada uno de ellos se debe comunicar con un servidor remoto muchas veces antes de completar su tarea.
5
Arquitectura de los Multiprocesadores.
Las computadoras que trabajan con concurrencia se dividen en dos grandes grupos: Multicomputadores. Multiprocesadores. No resulta lo mismo hablar de un multicomputador que de una simple colección de computadores. Los multiprocesadores pueden ser simétricos (si comparten poca memoria) o de arquitectura de memoria distribuida (si comparten mucha). Los multicomputadores son aquellos que se comunican entre sí a través del envío de mensajes, mientras que los multiprocesadores comparten espacios de memoria unos con otros. La diferencia entre los multicomputadores y una colección de computadores en una red está en que los primeros están más estrechamente emparejados entre sí, y por tanto las interconexiones físicas son más cortas. Además, todos los entes de un multicomputador comparten un mismo sistema operativo. Los multiprocesadores simétricos se llaman así porque la memoria que comparten está se encuentra equidistante de todos los procesadores; esta arquitectura se utiliza en multiprocesadores que comparten poca memoria. En la arquitectura de memoria distribuida, cada banco de memoria está físicamente adyacente a un procesador en particular. Cada procesador puede acceder a la memoria de otro, pero la memoria local es mucho más rápida.
6
Fundamentos de la Programación Concurrente.
Los conceptos Concurrencia y Corrutina no significan lo mismo. El término Paralelismo caracteriza los programas concurrentes cuya ejecución ocurre en más de un contexto a la vez. Los hilos (threads) de un programa dado son implementados en el tope de uno o más procesos proveídos por el sistema operativo. Cuando hablamos de corrutinas, nos referimos a varias rutinas que están corriendo al mismo tiempo; sin embargo, dichas rutinas no están activas simultáneamente, es decir, cuando una está activa, la(s) otra(s) está(n) inactivas. Por esta razón el concepto de corrutina no es equivalente al de concurrencia.
7
Fundamentos de la Programación Concurrente.
En cualquier modelo de programación concurrente es necesario considerar dos conceptos: Comunicación. Los mecanismos de comunicación en lenguajes imperativos está basado en compartimiento de memoria y pase de mensajes. Sincronización. Generalmente va implícita en el pase de mensajes. La comunicación en la concurrencia se refiere a cualquier mecanismo que permita que un hilo de ejecución pueda obtener información de otro. En el modelo de programación con memoria compartida, algunas o todas las variables del programa están accesible para múltiples threads. Para que un par de threads se comuniquen, uno de ellos escribe un valor en la variable, y el otro simplemente la lee. En el modelo de programación con pase de mensajes, un thread debe ejecutar una operación explícita de envío para transmitir data a otro. La sincronización se refiere a cualquier mecanismo que permita que el programador controle el orden en que las operaciones ocurran en distintos threads. En los modelos de pase de mensajes, la sincronización va implícita: un mensaje debe ser enviado antes de ser recibida. Para sincronizar en un modelo de memoria compartida, se debe especificar que una variable no puede ser leída antes de que sea escrita por el otro thread.
8
Lenguajes y Librerías. La concurrencia puede ser proveída al programador de tres formas: En forma de lenguajes explícitamente concurrentes. Extensiones de lenguajes secuenciales. Paquetes de librerías fuera del lenguaje. Actualmente, las últimas dos alternativas son las más frecuentes en los programas concurrentes.
9
Creación de Hilos. Una implementación del lenguaje que provea un número fijo de hilos es muy restrictiva. La mayoría de los sistemas concurrentes permiten que el programador cree hilos a tiempo de corrida. Los detalles de sintaxis y semántica varían mucho entre lenguajes. Hay seis opciones para la sintaxis de la creación de hilos. Co-begin. Parallel-loops (ciclos paralelos). Launch-at-elaboration. Fork(con “join” opcional). Implicit receipt. Early Reply. Algol-68 usa co-begin. Occam usa tanto co-begin como parallel loops. HPF usa sólo parallel loops, Ada usa launch-at-elaboration y fork. Modula3 y Java usan fork/join. Los sistemas RPC emplean implicit receipt. La corutina detach de Simula puede considerarse como una forma de early-reply.
10
Implementación de los Hilos.
Hay dos formas de concebir la implementación de los threads: Usar un proceso del S.O. para cada thread. Colocar todos los threads de un programa en el tope de un solo proceso. Comunmente, los lenguajes adoptan una posición intermedia: corren un gran número de hilos de ejecución en el tope de unos pocos procesos. El problema de emplear un proceso para cada thread está en que resulta muy costoso en muchos sistemas operativos. Esta implementación es aceptable para computadores personales con procesos poco costosos. Con la otra forma de tratar la implementación de los threads hay dos problemas: Imposibilita la ejecución paralela en un multiprocesador. Si el thread que esté corriendo hace una llamada a sistema y se bloquea, entonces los demás threads no pueden correr porque el proceso es suspendido por el S.O.
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.