Está en la página 1de 23

“AÑO DE LA UNIVERSALIZACIÓN DE LA SALUD”

DOCENTE:

TEMA: PROGRAMACIÓN CONCURRENTE

INTEGRANTES:

1.

2.

3.

CARRERA: COMPUTACIÓN E INFORMÁTICA

CURSO:

MAZAMARI – 2020

1
DEDICATORIA

Primeramente, a Dios por su inmenzo amor y misericordia por permitirme


seguir con mi formacion profesional a base de estudio y esfuerzo hasta lograr
mi objetivo y a mis padres que con su apoyo incondicional me han enseñado
que nunca se debe dejar de luchar por lo que se desea alcanzar.

2
INTRODUCCION

Presentamos a buestra consideracion el trabajo de investigacion titulado:


programa concurrente fueron los propios Sistemas Operativos de
multiprogramación en los que un solo procesador de gran capacidad debía
repartir su tiempo entre muchos usuarios. Para cada usuario, la sensación era
que el procesador estaba dedicado para él. Durante la década de los sesenta y
setenta esto fue así. La programación de sistemas con capacidades de
concurrencia se hacía a bajo nivel, en ensamblador, pues aparte de no
disponer de lenguajes de alto nivel con capacidades de concurrencia, se
primaba la supuesta eficiencia del código escrito directamente en ensamblador.
La aparición en 1972 del lenguaje de alto nivel Concurrent Pascal Brinch
Hansen, 1975, desarrollado por Brinch Hansen, se encargó de romper este
mito y abrir la puerta a otros lenguajes de alto nivel que incorporaban
concurrencia. Desde entonces la programación concurrente ha ido ganando
interés y actualmente se utiliza muy a menudo en la implementación de
numerosos sistemas. Tres grandes hitos se nos antojan importantes para que
la programación concurrente actualmente sea tan importante:
- La aparición del concepto de thread o hilo que hace que los programas
puedan ejecutarse con mayor velocidad comparados con aquellos que
utilizan el concepto de proceso.
- La aparición más reciente de lenguajes como Java, lenguaje orientado a
objetos de propósito general que da soporte directamente a la
programación concurrente mediante la inclusión de primitivas específica.
- La aparición de Internet que es un campo abonado para el desarrollo y
la utilización de programas concurrentes. Cualquier programa de Internet
en el que podamos pensar tales como un navegador, un chat, etc. están
programados usando técnicas de programación concurrente.

En lo que resta de capítulo introduciremos el concepto de programación


concurrente, los beneficios que reporta, el hardware en el que puede
ejecutarse, la forma de especificarlo en un lenguaje y las características,
problemas y propiedades de corrección de un programa concurrente.

3
INDICE

Caratula I
Dedicatoria II
Introducción III
Índice IV
CAPÍTULO I
Marco teórico

1.1 definición 05
1.2 multitarea, multiprogramación, multiprocesos 05
1.3 multitareas 06
1.4 multitarea nula 06
1.5 multitarea cooperativa 07
1.6 multitarea referente 07
1.7 multitarea real 08

CAPITULO II
PROGRAMACIÓN

2.1 definición 09
2.2 principios de concurrencia 09
2.3 varias aplicaciones 10
2.4 aplicaciones estructuradas 10
2.5 estructura del sistema operativo 11
2.6 labores del sistema operativo 11
2.7 comunicación y sincronización de procesos 12
2.8 cooperación entre procesos 12
2.9 posibilidad de interacción de procesos 12
2.10 comunicación y sincronización de proceso 13
2.11 necesidad de sincronización de los procesos 13
2.12 gestión de procesos 13
2.13 exclusión mutua 14
2.14 soluciones software para la exclusión mutua 14
2.15 algoritmo de dekker 14

CAPITULO III
COMPONENTES
3.1 programación estructurada 17
3.2 concurrencia y paralelismo 18

Conclusión 21

Bibliografía 22

Anexo 23

4
CAPÍTULO I
MARCO TEÓRICO

1.1 DEFINICIÓN
La programación concurrente es la simultaneidad en la ejecución de
múltiples tareas interactivas. Estas tareas pueden ser un conjunto de
procesos o hilos de ejecución creados por un único programa. Las tareas
se pueden ejecutar en un sola UCP multiprogramación, en varios
procesadores o en una red de computadores distribuidos. La programación
concurrente está relacionada con la programación paralela, pero enfatiza
más la interacción entre tareas. Así, la correcta secuencia de interacciones
o comunicaciones entre los procesos y los nodos los procesos coordinados
de recursos que se comparten por tareas son las claves de esta disciplina.

1.2 MULTITAREA, MULTIPROGRAMACIÓN, MULTIPROCESOS


La programación concurrente tiene capacidad para realizar varias tareas al
mismo tiempo o muchas tareas en una sola PC con un procesador o varios.

5
1.3 MULTITAREAS
Es la capacidad de un sistema operativo para ejecutar varios procesos al
mismo tiempo corriendo sobre un procesador. Con los sistemas operativos
DOS esto era incapaz de realizarse.
Existen varios tipos de multitareas y son:
Multitarea Nula
Multitarea Cooperativa
Multitarea Preferente
Multitarea Real

1.4 MULTITAREA NULA


ES aquel sistema operativo que carece de multitarea. Aun así, puede
simularla implementándola en un espacio de usuario Justamente la familia
DOS son ejemplos de sistemas operativos de multitarea nula.

6
1.5 MULTITAREA COOPERATIVA
Tipo de multitarea en donde los procesos de usuario son quienes ceden la
CPU al sistema operativo a intervalos regulares.
Es sumamente problemático porque si por algún motivo el proceso de
usuario es interrumpido, no cede la CPU al sistema operativo que lo ejecuta
y, por lo tanto, quedará trabado bloqueado.
Los sistemas operativos Windows antes de la versión 1995 implementaban
este tipo de multitarea.

1.6 MULTITAREA PREFERENTE


Multitarea en donde el SO se encarga de administrar uno o más
procesadores, repartiendo el tiempo de uso del mismo entre los distintos
procesos que esperan utilizarlo tareas en ejecución.
En el caso de un solo procesador, cada proceso o tarea lo utiliza en
períodos cortísimos de tiempo, lo que, en la práctica, da la sensación de
que estuviesen ejecutándose al mismo tiempo.
Los sistemas operativos que utilizan este tipo de multitareas son los UNIX y
sus clones Linux, etc, Windows NT, etc.

7
1.7 MULTITAREA REAL
Multitarea en donde el SO ejecuta los procesos realmente al mismo tiempo
haciendo uso de múltiples procesadores más de dos.
La ejecución realmente se realiza en distintos procesadores para cada
proceso o tarea. Obviamente en el caso de que los procesos o tareas sean
más que la cantidad de procesadores, éstos comienzan a ejecutarse en
procesadores en uso en la forma de multitareas preferente. Todos los
sistemas operativos modernos soportan esta capacidad.

8
CAPÍTULO II
MULTIPROGRAMACIÓN

2.1 DEFINICIÓN
Es la técnica que permite que dos o más programas ocupen la misma
unidad de memoria principal y que sean ejecutados al mismo tiempo.

La multiprogramación se refiere a dos o más programas corriendo o


procesándose al mismo tiempo; La multiprogramación se controla a través
del sistema operativo, el cual observa los programas y los vigila hasta que
estén concluidos.

El número de programas que pueden multiprogramarse en forma efectiva,


depende de una combinación de la cantidad de memoria, de la velocidad
de la CPU y del número y velocidad de los recursos periféricos que tenga
conectados, así como de la eficiencia del SISTEMA OPERATIVO.

2.2 PRINCIPIOS DE CONCURRENCIA


En un sistema multiprogramado con un único procesador, los procesos se
intercalan en el tiempo aparentando una ejecución simultánea. Aunque no
se logra un procesamiento paralelo y produce una sobrecarga en los
intercambios de procesos, la ejecución intercalada produce beneficios en la
eficiencia del procesamiento y en la estructuración de los programas.

9
La concurrencia es el punto clave en los conceptos de multitarea,
multiprogramación y multiproceso, la concurrencia comprende un gran
número de cuestiones de diseño incluyendo la comunicación entre
procesos, la compartición y competencia por los recursos, la sincronización
de la ejecución de varios procesos y la asignación del procesador a los
procesos, la concurrencia puede presentarse en tres contextos diferentes:

Varias aplicaciones:
Aplicaciones estructuradas:
Estructura del sistema operativo:

2.3 VARIAS APLICACIONES


En este caso el tiempo de procesador de una máquina es compartido
dinámicamente entre varios trabajos o aplicaciones activas.

2.4 APLICACIONES ESTRUCTURADAS


Como consecuencia del diseño modular de una aplicación y la división de la
misma en tareas explícitas estas pueden ser ejecutadas de forma
concurrente.
En programación, un lenguaje estructurado es aquel que soporta la división
en bloques (procedimientos y funciones) que pueden o no comunicarse
entre sí.
Por ejemplo, los archivos batch es contrario a inestructurado, de poco uso,
que no tiene ninguna estructura, es simplemente un bloque.

10
2.5 ESTRUCTURA DEL SISTEMA OPERATIVO
Como resultado de las aplicaciones estructurada que se aplica en el diseño
del propio SO, de forma que este se implemente como un conjunto de
procesos.

2.6 LABORES DEL SISTEMA OPERATIVO


Son Elementos de gestión y diseño que surgen por causa de la
concurrencia:

1. El sistema operativo debe seguir a los distintos procesos activos.

2. El sistema operativo debe asignar y retirar los distintos recursos a


cada proceso activo, entre estos se incluyen:

- Tiempo de procesador
- Memoria
- Archivos
- Dispositivos de E/S

3. El sistema operativo debe proteger los datos y los recursos físicos de


cada proceso contra injerencias no intencionadas de otros procesos.

4. Los resultados de un proceso deben ser independientes de la


velocidad a la que se realiza la ejecución de otros procesos
concurrentes.

11
2.7 COMUNICACIÓN Y SINCRONIZACIÓN DE PROCESOS
Puede verse la concurrencia de procesos como una ejecución simultánea
de varios procesos. Si tenemos un multiprocesador la concurrencia parece
clara, en un momento dado cada procesador ejecuta un proceso. Se puede
ampliar el concepto de concurrencia si entendemos por procesado
concurrente del sistema en conjunto, varios procesos se vean en un estado
intermedio entre su estado inicial y final. Esta última definición incluye los
sistemas multiprogramados de un único procesador que estudiamos en los
temas anteriores.

2.8 COOPERACIÓN ENTRE PROCESOS


La velocidad de un proceso depende de la frecuencia de la interrupción
asociada a cada uno de ellos que un proceso se ejecuta asíncronamente
con respecto a otro, es decir, sus ejecuciones son independientes. Sin
embargo, hay ciertos instantes en lo que los procesos deben sincronizar sus
actividades. Son estos puntos a partir de los cuales un proceso no puede
progresar hasta que otro haya completado algún tipo de actividad.

2.9 POSIBILIDAD DE INTERACCIÓN DE PROCESOS


Las posibilidades de interacción de los procesos pueden clasificarse en
función del nivel de conocimiento que cada proceso requiere la existencia
de los demás. Un proceso no tiene en absoluto conocimiento de la
existencia de los demás Que los procesos tengan un conocimiento indirecto
de los otros procesos. Tiene lugar cuando los procesos tienen conocimiento
directo unos de otros por haber sido diseñados para trabajar conjuntamente
la alguna actividad

12
2.10 COMUNICACIÓN Y SINCRONIZACIÓN DE PROCESO
Necesidad de exclusión mutua. Es decir, los procesos deberán acceder de
forma exclusiva a ciertos recursos o zonas de memoria considerados como
críticos.

Interbloqueos: tienen lugar cuando ninguno de los procesos en competencia


puede continuar su ejecución normal por carecer de alguno de los recursos
que necesita.

ejecución incompleta: este problema tiene lugar cuando la ejecución de un


proceso queda siempre pospuesta a favor de algún otro de los procesos en
competencia.

2.11 NECESIDAD DE SINCRONIZACIÓN DE LOS PROCESOS:


región critica y exclusión mutua La sincronización entre procesos puede
definirse como la necesidad que tienen algunos procesos de bloquearse en
determinadas circunstancias y ser despertados cuando ocurren ciertos
eventos. Un caso típico que muestra la necesidad de sincronización entre
procesos es cuando un proceso inicia una lectura y va a utilizar en la
siguiente instrucción la información leída. En este caso el proceso debe
esperar a que se termine la operación de Entrada/Salida para continuar.

2.12 GESTIÓN DE PROCESOS

13
2.13 EXCLUSIÓN MUTUA
La exclusión mutua la podríamos definir como una operación de control que
permite la coordinación de procesos concurrentes (Comunicación requerida
entre dos o más procesos, y que tiene la capacidad de prohibir a los demás
procesos realizar una acción cuando un proceso haya obtenido el permiso.

2.14 SOLUCIONES SOFTWARE PARA LA EXCLUSION MUTUA


Soluciones por Software. Una manera es dejar la responsabilidad a los
procesos que deseen ejecutar concurrentemente, de esta manera los
procesos deben coordinarse unos con otros para cumplir la exclusión mutua
sin ayuda alguna, aunque estas soluciones son propensas a errores y a una
fuerte carga de proceso Algunos ejemplos de estas son: Algoritmo de
Dekker y Algoritmo de Peterson.

Algoritmo de Dekker
Algoritmo de Peterson
Semáforos
Monitores
Paso de Mensajes
Soluciones Hardware para la exclusión mutua

2.14.1 ALGORITMO DE DEKKER


es un algoritmo de programación concurrente para exclusión mutua, que
permite a dos procesos o hilos de ejecución compartir un recurso sin
conflictos. Fue uno de los primeros algoritmos de exclusión mutua
inventados, implementado por Edsger Diikstra.

Si ambos procesos intentan acceder a la sección crítica


simultáneamente, el algoritmo elige un proceso según una variable
turno. Si el otro proceso está ejecutando en su sección crítica, deberá
esperar su finalización.

14
Existen cinco versiones del algoritmo Dekker, teniendo ciertos fallos los
primeros cuatro. La versión 5 es la que trabaja más eficientemente,
siendo una combinación de la 1 y la 4.
Versión 1: Alternancia estricta. Garantiza la exclusión mutua, pero su
desventaja es que acopla los procesos fuertemente, esto significa que
los procesos lentos atrasan a los procesos rápidos.

Versión 2: Problema interbloqueo. No existe la alternancia, aunque


ambos procesos caen a un mismo estado y nunca salen de ahí.

Versión 3: Colisión región crítica no garantiza la exclusión mutua. Este


algoritmo no evita que dos procesos puedan acceder al mismo tiempo a
la región critica.

Versión 4: Postergación indefinida. Aunque los procesos no están en


interbloqueo, un proceso o varios se quedan esperando a que suceda un
evento que tal vez nunca suceda.

15
2.14.2 ALGORITMO DE PETERSON
Peterson desarrolló el primer algoritmo 1981 para dos procesos que fue
una simplificación del algoritmo de Dekker para dos procesos.
Posteriormente este algoritmo fue generalizado para que funcione para
N procesos. En el algoritmo para N procesos las variables c[i] además
de valer "verdadero" y "falso", pueden valer "en sección critica" y turno
desde 1 hasta N.

El procedimiento es una generalización de este .c[i], que es un array y


turno, que solo puede valer 1o 2.

Este algoritmo garantiza la exclusión mutua debido al uso de una


variable compartida, turno, que se chequea cada vez. Algoritmo de
Peterson

Inicialmente, c[0]=c[1]= falso, y el valor de turno no tiene relevancia


(pero de be ser 0 o 1). Para entrar en la sección crítica, el proceso Pi
primero asigna el valor verdadero a c[i] y luego afirma que es el turno del
otro proceso para entrar si así lo desea (turno = j). Si ambos procesos
tratan de entrar a la vez, se asignará turno como i y j aproximadamente
al mismo tiempo. Sólo una de estas asignaciones durará; la otra ocurrirá,
pero será reemplazada de inmediato. El valor eventual de turno decide a
cuál de los dos procesos se le permitirá entrar primero en su sección
crítica.

16
CAPÍTULO III
COMPONENTES

3.1 PROGRAMACIÓN ESTRUCTURADA


Comencemos con lo sencillo, expliquemos que es la programación
estructurada. Verás, la programación estructurada no es más que un
paradigma de programación. Estoy prácticamente seguro que la gran
mayoría de nosotros comenzamos a programar bajo este paradigma, pero
¿De qué se trata? En términos simples la programación estructurada tiene
como objetivo mejorar el desarrollo de software recurriendo a únicamente
subrutinas y tres estructuras básicas: Secuencial, Selectiva e Iterativa.

En términos de programación una estructura selectiva hace referencia a


condicionales, por ejemplo, un if, else, else if o swith. Para una estructura
iterativa estaremos hablando de ciclos, por ejemplo, for, foreach, while o do
while. Lo que nos interesa para este post es la estructura secuencial. En
programación, una estructura secuencial no es más que la ejecución, en
secuencia, de múltiples tareas. Estas tareas serán ejecutadas una tras otra,
todas en un orden previamente definido. ☝ Una tarea no podrá ejecutarse
antes de otra si en el programa no fue indicado de esa manera.
EJEMPLO:

En este ejemplo podemos decir que tenemos cuatro tareas, una por cada
línea de código. El orden de ejecución es descendente. El programa no

17
puede imprimir en consola el nombre del usuario sin antes haberlo pedido.
De igual forma, el programa no puede despedirse sin antes haber dado la
bienvenida. Podemos concluir que este programa es secuencial, ya que
cada tarea se ejecuta una tras otra, en un orden.

3.2 CONCURRENCIA Y PARALELISMO


Ahora hablemos de la concurrencia y el paralelismo, conceptos que en
muchas ocasiones se confunden y se puede llegar a pensar que se tratan
de lo mismo, cuando en realidad no es así, veamos.

La concurrencia es, en esencia, el poder realizar múltiples cosas en el


mismo tiempo, pero, no específicamente en paralelo Una de las formas más
sencillas de comprender la concurrencia es imaginar a una persona la cual
trabaja en múltiples tareas al mismo tiempo, y que rápidamente cambia de
una tarea a otra. Por ejemplo, imaginemos a una persona la cual se
encuentra programando, realizando cálculos en Excel y contestando
correos electrónicos, todo esto al mismo tiempo. Dedica un par de
segundos a cada tarea, y rápidamente, con un ágil cmd + shift cambia de
tarea.

Concluimos que la persona trabaja de forma concurrente. Las tareas que


realiza no necesariamente deben seguir un orden, quizás, después de
contestar un correo regresa con los cálculos en excel, le dedica un par de
segundo, regresa a responder otro correo y finaliza con la codificación del
programa, u, otro escenario pudiera ser que después finalizar ciertos
cálculos, la persona continua codeando un par de segundos para después
responder un par de correos y regresar con los cálculos.

18
En este caso nuestro programa realiza tres tareas al mismo tiempo. A cada
tarea le tomó un máximo de dos segundos ser completada, como se
ejecutan de forma concurrente al mismo tiempo al programa le toma dos
segundos finalizar su ejecución. Por otro lado, si ejecutamos el mismo
código, pero ahora de forma secuencial, al programa le tomaría seis
segundos finalizar. El tiempo es sin duda considerable.

Bien, ya tenemos claro que es la estructura secuencial y que es la


concurrencia, ahora. El paralelismo es el poder de ejecutar dos o más
acciones de forma simultánea, en lugar de concurrentemente. Si
recordamos, en nuestro ejemplo anterior, el desarrollador realiza tres tareas
al mismo tiempo, realizaba cálculos programaba y contestaba correos, sin
embargo, ninguna de estas tareas se realizaba de forma simultánea.
En nuestro ejemplo, si queremos que las tareas se realicen de forma
paralela tendríamos que tener a tres personas trabajando, vaya, una
persona por cada tarea, una persona encargada de los cálculos, otra de la
codificación y otra respondiendo correos, tres personas trabajando
simultáneamente.

19
Técnicamente hablando, para llevar a cabo un verdadero paralelismo es
necesario que nuestra computadora posea múltiples procesadores, con
esto, cada tarea será ejecutada en un procesador diferente, de forma
simultánea, de forma paralela.

Para crear paralelismo con Python será necesario utilizar el módulo


processing.

La principal diferencia entre concurrencia y paralelismo recae en la forma en


que se realizan las tareas. Cuando se ejecutan tareas de forma concurrente a
estas se les asigna un x periodo de tiempo antes de cambiar de tarea, será en
ese periodo en el cual se inicie, continúe, o se complete la tarea, por otro lado,

20
si ejecutamos tareas en paralelo, las tareas se realizarán de forma simultánea,
comenzarán y finalizarán sin interrupciones.

Si deseamos implementar concurrencia en nuestros programas una muy buena


idea será utilzar Threads, por otro lado, si deseamos implementar paralelismos
optaremos por procesos.

CONCLUSIÓN

- En conclusión y en términos simples, la programación


concurrente no es más que la forma en la cual podemos
resolver ciertas problemáticas de forma concurrente, es decir,
ejecutando múltiples tareas a la misma vez y no de forma
secuencial.

- En un programa concurrente las tareas pueden continuar sin


la necesidad que otras comiencen o finalicen.

- Si bien es cierto que la programación concurrente acarrea


ciertos problemas, principalmente al momento de compartir
información entre tareas, también es cierto que, si se
implementa de forma correcta, podremos, en casos puntuales,
mejorar significativamente el performance de nuestras
aplicaciones.

21
BIBLIOGRAFÍA

- Herlihy, Maurice y Shavit, Nir. The art of multiprocessor programming.


Elsevier : Morgan Kaufmann Honduras 2009

- LEA, Douglas. Programación concurrente en Java. Addison-Wesley,


México, 2000.

- MARTLEY, S. Concurrent programming: the Java programming


language. Oxford Univ Press, New York, 2015

- FLANAGAN, David. JAVA en pocas palabras. McGraw Hill

- ANDREW, Gregory R. Concurrent programming: principles and practice.


Benjamin/Cummings Pub, USA, 2011

- OAKS, Scott y WONG, Henry. Java Threads. 3rd. ed. 2004.

22
ANEXOS

23

También podría gustarte