Professional Documents
Culture Documents
Contenido................................................................................................................................................. i
Lista de figuras ........................................................................................................................................ ii
Objetivo.................................................................................................................................................. iii
Introduccin ............................................................................................................................................ 1
Historia .................................................................................................................................................... 2
Paradigmas de programacin concurrente ............................................................................................ 3
Espacio de direcciones global particionado (PGAS) ............................................................................ 3
Modelo actor....................................................................................................................................... 4
Comunicacin de procesos secuenciales (CSP)................................................................................... 4
Concurrente orientado a objetos ....................................................................................................... 5
Programacin de flujo de datos .......................................................................................................... 6
Multihilo .............................................................................................................................................. 6
Estudios de comparacin en modelos de programacin concurrentes ................................................. 8
Programacin concurrente en idiomas especficos ................................................................................ 9
Ada ...................................................................................................................................................... 9
Especificaciones de task y cuerpos de task. .................................................................................... 9
Fases de un task. ........................................................................................................................... 10
Erlang ................................................................................................................................................ 11
Procesos. ....................................................................................................................................... 11
Procesos concurrentes y paso de mensajes. ................................................................................ 12
Actores en Erlang. ......................................................................................................................... 13
Go (Golang) ....................................................................................................................................... 14
CSP: goroutines. ............................................................................................................................ 14
CSP: channels. ............................................................................................................................... 15
Java.................................................................................................................................................... 16
Estados de un hilo ......................................................................................................................... 17
Conclusin ............................................................................................................................................. 19
Bibliografa ............................................................................................................................................ 20
ii
Lista de figuras
Objetivo
Introduccin
Historia
Modelo actor
Modelo actor o Actor Model, los actores envan mensajes asincrnicos a otros actores (AGHA,
1986, pg. 8).
El modelo actor en ciencias de la computacin es un modelo matemtico de
computacin concurrente que trata a los "actores" como primitivas universales de la
computacin concurrente. En respuesta a un mensaje que recibe, un actor puede: tomar
decisiones locales, crear ms actores, enviar ms mensajes y determinar cmo responder al
siguiente mensaje recibido. Los actores pueden modificar su propio estado privado, pero solo
pueden afectarse mutuamente a travs de mensajes (evitando la necesidad de bloqueos).
El modelo actor se origin en 1973. Se ha utilizado tanto como un marco para una
comprensin terica de la computacin y como la base terica para varias implementaciones
prcticas de sistemas concurrentes.
Varios lenguajes de programacin diferentes emplean el modelo actor o alguna
variacin del mismo. Estos lenguajes incluyen a:
1) Limbo
2) RaftLib
3) Go
4) Crystal
5) Clojure's core.async
1) CAL
2) E (tambin orientado a objetos)
3) Joule (tambin programacin distribuida)
4) LabView (tambin asincrona)
5) Lustre (tambin asincrona)
6) Preesm (tambin asincrona)
7) Signal (tambin asincrona)
8) SISAL
Multihilo
1) Cilk
2) Cilk Plus
7
3) C#
4) Clojure
5) Fork - Lenguaje de programacin para el modelo PRAM.
6) Java
7) ParaSail
8) Rust
9) SequenceL
8
(NANZ, 2011) Present un estudio emprico para comparar la facilidad de uso (comprensin
del programa, depuracin y escritura) de dos enfoques de programacin de concurrencia
(SCOOP y Java de subprocesos mltiples). Usan autoestudio para evitar el sesgo de enseanza,
la autoevaluacin para verificar la equivalencia de los grupos evaluados y las tcnicas de
evaluacin estndar para evitar la subjetividad en la evaluacin de las respuestas. Llegan a la
conclusin de que SCOOP es de hecho ms fcil de usar que Java de subprocesos mltiples en
lo que respecta a la comprensin y depuracin de programas, y equivalente en lo que respecta
a la escritura de programas.
(Wyatt, Kavi, & Hufnagel, 1992) Presento una comparacin de 14 lenguajes concurrentes
orientados a objetos con respecto a comunicacin, sincronizacin, administracin de procesos,
herencia e intercambios de implementacin. Llegan a la conclusin de que ninguno de ellos
cumpli con los siete requisitos de Meyer para que un lenguaje est realmente orientado a
objetos, ya que restringen o no permiten la herencia. Los idiomas se seleccionaron segn la
disponibilidad del material publicado y los manuales detallados. No hay discusin sobre las
reas de aplicacin para las cuales los idiomas son ms adecuados.
9
Ada
El lenguaje que se convirti en Ada fue elegido en una competencia patrocinada a fines de la
dcada de 1970 por el Departamento de Defensa de los Estados Unidos (DoD); Ada pretendio
convertirse en el lenguaje en el que se escribe el nuevo software relacionado con la defensa.
Las primitivas de programacin concurrente se incluyeron en el lenguaje porque los
diversos documentos de requisitos del DoD ("Steelman" y sus informes predecesores)
enumeraron la programacin simultnea como esencial para la misin del lenguaje. Ada fue el
primer lenguaje destinado a la adopcin y uso generalizado en la industria para incluir un
conjunto completo de primitivas de programacin concurrente.
Un proceso en Ada se llama task cuya traduccin en espaol es tarea, cada tarea (task)
es en realidad un objeto de un tipo de tarea, un tipo de tarea es declarado por el programador;
el programador puede, en el caso lmite, simplemente declarar tareas individuales, un tipo para
cada uno de los cuales es implcitamente declarado por el compilador.
Especificaciones de task y cuerpos de task. Una unidad de tarea consiste en una
especificacin de tarea y un cuerpo de tarea, la cual se muestra en la figura 1.
Una especificacin de tarea que comienza con el tipo de tarea de palabras reservadas
declara un tipo de tarea. El valor de un objeto de un tipo de tarea designa una tarea que
tiene las entradas, si las hay, que se declaran en la especificacin de la tarea; estas
entradas tambin se llaman entradas de este objeto. La ejecucin de la tarea est definida
por el cuerpo de la tarea correspondiente. (hanna, 1983)
10
Fases de un task. Burns & Wellings (1997) Afirman que. La ejecucin de un objeto
de tarea tiene tres fases activas principales (pg. 65). Las cuales son:
La figura 2 muestra las transiciones entre estos estados durante la vida de la tarea. Se
dice que la tarea creada est en estado No activado (Unactivated). Luego, el tiempo de
ejecucin asocia un hilo de control a esta tarea. Si la elaboracin de la tarea falla, la tarea va
directamente al estado Terminado (Terminated); de lo contrario, la tarea alcanza el estado
ejecutable (Runnable) y ejecuta el cdigo de usuario de la tarea. Si este cdigo ejecuta alguna
operacin que bloquea la tarea (de acuerdo con la semntica de Ada: cita, operacin protegida
o declaracin de demora), alcanza el estado de Suspensin (Sleep) y luego vuelve al estado
Ejecutable (Runnable). Cuando la tarea ejecuta una alternativa de terminacin de Ada o finaliza
la ejecucin del cdigo de usuario de Ada, pasa al estado Terminado (Terminated).
Erlang
En 1986 Erlang fue diseado con el objetivo de mejorar el desarrollo de las aplicaciones de
telefona, tambin para programar sistemas concurrentes, en tiempo real y con tolerancia a
fallas distribuidas el cual fue desarrollado por Ericsson y de ah el nombre. Erlang es un
lenguaje de programacin funcional utilizado para crear sistemas de software en tiempo real
escalables de forma masiva con requisitos de alta disponibilidad (ARMSTRONG, 2003, pg.
477). El paralelismo se expresa utilizando el modelo Actor, donde los procesos se crean como
hilos de ejecucin independientes y luego se comunican a travs de mensajes (sin memoria
compartida). El lenguaje tiene un fuerte uso industrial en aplicaciones del mundo real.
Procesos. En Erlang, cada hilo de ejecucin se llama proceso. (Aparte: el trmino
"proceso" se usa generalmente cuando los hilos de ejecucin no comparten datos entre s y el
trmino "hilo" cuando comparten datos de alguna manera. Los hilos de ejecucin en Erlang no
comparten datos, por eso son llamados procesos).
El BIF (built in function - funcin incorporada) spawn (generar) de Erlang se usa para
crear un nuevo proceso, del siguiente modo: spawn(Module, Exported_Function, List of
Arguments).
En la figura 3 se muestra, la funcin say_something escribe su primer argumento el
nmero de veces especificado por el segundo argumento. La funcin start inicia dos procesos
de Erlang, uno que escribe "hello" tres veces y otro que escribe " goodbye" tres veces. Ambos
procesos usan la funcin say_something. Tener en cuenta que una funcin utilizada de esta
manera por spawn, para iniciar un proceso, debe exportarse desde el mdulo (es decir, en el -
export al inicio del mdulo).
12
En la figura 5 las lneas 1 y 2 definen el mdulo y las funciones exportadas. Las lneas
4 a 7 contienen la funcin de ejecucin, que inicia un proceso de contador y comienza a enviar
mensajes de incremento. El envo de estos mensajes ocurre en las lneas 15 a 18, usando el
operador de paso de mensajes (!).
Go (Golang)
CSP: channels. Los channels (canales) son una de las primitivas de sincronizacin en
Go, Si bien se pueden usar para sincronizar el acceso de la memoria, se utilizan mejor para
comunicar informacin entre goroutines. Un channel (canal), sirve como un conducto para
una corriente de informacin; los valores pueden pasarse a lo largo del canal, y luego leer hacia
abajo (Cox-Buday, 2017, pg. 64).
Un channel se crea con make (chan val-type). Los canales se tipan por los valores que
transmiten. Enva un valor a un canal usando la sintaxis del canal <-. Aqu enviamos "ping" al
canal de mensajes que hicimos anteriormente, desde un nuevo goroutine.
La sintaxis <-channel recibe un valor del canal. Aqu recibiremos el mensaje "ping" que
enviamos anteriormente e imprimirlo. Cuando ejecutamos el programa, el mensaje "ping" se
pasa con xito de una rutina a otra a travs de nuestro canal.
Por defecto, enva y recibe el bloqueo hasta que tanto el emisor como el receptor estn
listos. Esta propiedad nos permiti esperar al final de nuestro programa para el mensaje "ping"
sin tener que utilizar ninguna otra sincronizacin.
16
Java
Desde JDK 1.2 (8 de diciembre de 1998), Java ha incluido un conjunto estndar de clases de
coleccin, el marco de colecciones de Java.
El lenguaje de programacin Java y la mquina virtual Java (JVM) se han diseado para
admitir la programacin concurrente, y toda la ejecucin tiene lugar en el contexto de hilos
(threads). Se puede acceder a los objetos y recursos por muchos hilos separados; cada hilo tiene
su propia ruta de ejecucin, pero puede acceder potencialmente a cualquier objeto en el
programa. El programador debe garantizar que el acceso de lectura y escritura a los objetos
est coordinado (o "sincronizado") adecuadamente entre los hilos. La sincronizacin de
subprocesos garantiza que los objetos se modifiquen solo por un subproceso a la vez y que los
subprocesos no puedan acceder a los objetos parcialmente actualizados durante la modificacin
17
por otro subproceso. El lenguaje Java tiene construcciones integradas para soportar esta
coordinacin.
Estados de un hilo. Un hilo tiene su propio ciclo de vida, durante el cual puede
encontrarse en diferentes estados. Java controla el estado de los hilos mediante el llamado
planificador de hilos, que se encargar de gestionar qu hilo debe ejecutarse en cada momento
y en qu estado deben encontrarse el resto de hilos.
En la Figura 10 se aprecian los diferentes estados en los que puede encontrarse un hilo
(representados en un recuadro) y qu mtodos pueden llevar ese estado al hilo (representados
por flechas), dichos estados se describen a continuacin:
Conclusin
Bibliografa
Burns, A., & Wellings, A. (1997). Concurrency in Ada (2nd edition). Cambridge University Press.
AGHA, G. (1986). Actors: a model of concurrent computation in distributed systems. Cambridge, MA,
USA: MIT Press.
ARMSTRONG, J. (2003). Making reliable distributed systems in the presence of software errors.
Swedish Institute of Compuster Science.
Cox-Buday, K. (2017). Concurrency in Go. Gravenstein Highway North, Sebastopol, CA: OReilly
Media, Inc.
hanna, g. (1983). Ada '83 Language Reference Manual. The Pentagon, Washington, DC 20301-2081,
U.S.A.: Secretary of Defense, Research and Engineering.
HOARE, C. (1978). Communicating sequential processes. New York, NY, USA: ACM.
NANZ, S. (2011). Design of an Empirical Study for Comparing the Usability of Concurrent.
INTERNATIONAL SYMPOSIUM ON EMPIRICAL SOFTWARE ENGINEERING AND
MEASUREMENT.
Sun, D. N. (1995). The History of Java Technology. Retrieved 04 30, 2010, from
http://www.oracle.com:
http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html
William, W., & Edward, A. (2013). Lucid, the Dataflow Programming Language. Academia Press.
Wyatt, Kavi, & Hufnagel. (1992). Parallelism in Object-Oriented Languages: a survey. Los Alamitos,
CA, USA: IEEE Softw.
YELICK, K. (2007). Productivity and performance using partitioned global address space. New York,
NY, USA: ACM.