0% encontró este documento útil (0 votos)
83 vistas45 páginas

Procesos y Programación Concurrente en Sistemas

Este documento presenta información sobre procesos en sistemas operativos, programación concurrente y programación paralela. Se divide en tres secciones principales: la primera sección cubre conceptos básicos de procesos como estados, creación y comunicación entre procesos en C/C++ y Java. La segunda sección trata sobre programación concurrente, incluyendo problemas y programación concurrente en Java. La tercera sección cubre temas de programación paralela y distribuida.

Cargado por

Rocio Gomez Caro
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)
83 vistas45 páginas

Procesos y Programación Concurrente en Sistemas

Este documento presenta información sobre procesos en sistemas operativos, programación concurrente y programación paralela. Se divide en tres secciones principales: la primera sección cubre conceptos básicos de procesos como estados, creación y comunicación entre procesos en C/C++ y Java. La segunda sección trata sobre programación concurrente, incluyendo problemas y programación concurrente en Java. La tercera sección cubre temas de programación paralela y distribuida.

Cargado por

Rocio Gomez Caro
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

Contenidos del tema

1. Procesos en el Sistema Operativo 2. Programación concurrente

▪ 1.1 Introducción ▪ 2.1 Programa-Proceso

▪ 1.2 Estados de un proceso ▪ 2.2 Características

▪ 1.3 Control de procesos en Linux ▪ 2.3 Programas concurrentes

▪ 1.4 Creación de procesos en C/C++ ▪ 2.4 Problemas de la programación concurrente

▪ 1.5 Comunicación entre procesos en C/C++ ▪ 2.5 Programación concurrente en Java

▪ 1.6 Sincronización entre procesos en C/C++ 3. Programación paralela y distribuida


▪ 1.7 Creación de procesos en Java ▪ 3.1 Programación paralela

▪ 3.2 Programación distribuida

▪ 3.3 Framework de programación distribuida: PVM 2


Contenidos de la sección

1. Procesos en el Sistema Operativo

▪ 1.1 Introducción

▪ 1.2 Estados de un proceso

▪ 1.3 Control de procesos en Linux

▪ 1.4 Creación de procesos en C/C++

▪ 1.5 Comunicación entre procesos en C/C++

▪ 1.6 Sincronización entre procesos en C/C++

▪ 1.7 Creación de procesos en Java

3
1.1 Introducción

Sistema operativo multiproceso


▪ Un sistema operativo multiproceso puede ejecutar más de un proceso a la vez

▪ El usuario tiene la sensación de que cada proceso es el único en ejecución (sensación falsa)

▪ Los recursos (tiempo de CPU y la RAM) se reparten entre los procesos

▪ Diversos procesos pueden estar ejecutándose sobre el mismo código o programa

▪ Una aplicación puede realizar tareas simultáneas

4
1.1 Introducción

Algunas definiciones
▪ Proceso: programa en ejecución *nextPCB
▪ Contenido
Registros de CPU
▪ Código ejecutable del programa

▪ Datos, pila, contador de programa (PC)


PC (Program counter)
▪ Descriptor de un proceso (PCB - Process Control Block)
Administración memoria
▪ Estructura que almacena datos del proceso
Administración E/S
▪ Se define en el momento de creación del proceso
PCB – Process Control Block
▪ Cada proceso tiene un PCB único

▪ Se destruye cuando finaliza el proceso


5
1.1 Introducción

Obteniendo información sobre los procesos


▪ En linux:

▪ El comando ps proporciona información sobre los procesos

▪ Para mostrar más información podemos usar ps –f o ps -Af

6
1.1 Introducción

Obteniendo información sobre los procesos


▪ En Windows:

▪ Podemos usar el comando tasklist o el administrador de tareas

7
1.2 Estados de un proceso

Esquema de los estados de un proceso


▪ Estados de ejecución de un proceso (simplificado)
Zombie
dispatched

exit()
fork() Idle Ready Running
(Creado) (Listo) (Ejecución)
timeout

wake up blocked
(desbloquear) Wait (Read, Write, etc.)
(Espera) 8
1.3 Control de procesos en Linux

Funciones para gestionar procesos en Linux


▪ Linux ofrece las siguientes funciones para gestionar procesos:

▪ system()

▪ Incluida en stdlib.h (funciona en cualquier sistema operativo con un compilador C/C++)

▪ Permite la ejecución de comandos del sistema operativo

▪ execl()

▪ Permite la ejecución de comandos del sistema con privilegios de administrador

▪ fork()

▪ Se utiliza para crear procesos 9


1.4 Creación de procesos en C/C++

¿Cómo crear un nuevo proceso?


▪ La función fork() permite crear procesos desde C/C++

▪ El nuevo proceso (hijo) es una copia exacta del proceso que ejecuta la llamada fork()

▪ El proceso recibe una copia idéntica de las variables del padre (¡pero no son punteros!)

▪ El proceso hijo tiene su propio PID, su espacio de memoria y un PCB independiente

▪ Valor devuelto por fork():

▪ -1 si se produce un error

▪ 0 si no hay error y nos encontramos en el proceso hijo

▪ El PID asociado al hijo si no se produce ningún error y nos encontramos en el proceso padre 10
1.4 Creación de procesos en C/C++

¿Cómo crear un nuevo proceso?

proceso
hijo

fork()

proceso fork = tenedor


padre
11
1.5 Comunicación entre procesos en C/C++

Si son independientes, ¿cómo los comunicamos entre sí?


▪ Existen diversos mecanismos: pipes, colas de mensajes, semáforos y segmentos de memoria

▪ En este tema usaremos el mecanismo más sencillo, las tuberías (pipe)

▪ Una tubería actúa como un fichero compartido que permite intercambiar información

▪ Permite intercambiar información entre uno o más procesos

▪ Si el pipe está vacío, un proceso se bloquea hasta que tenga datos que pueda consumir

12
1.5 Comunicación entre procesos en C/C++

Si son independientes, ¿cómo los comunicamos entre sí?


▪ Funciones importantes para gestionar tuberías:

▪ pipe(int fd[2]): crea la tubería (recibe dos descriptores, uno para lectura y el otro para escritura)

▪ write(int fd, void *buf, int count): graba del buffer buf en el descriptor indicado N bytes

▪ read(int fd, void *buf, int count): lee del descriptor indicado N bytes y lo guarda en el buffer buf

▪ open(const char *fichero, int modo): abre el fichero indicado en la cadena fichero

▪ close(): para cerrar el fichero

13
1.5 Comunicación entre procesos en C/C++

Funcionamiento de las tuberías


▪ Pasos a seguir

▪ Creación de la tubería

▪ Creación del proceso hijo (comparte la tubería con el padre)

▪ Se establece la comunicación (unidireccional, pero hay un truco)

14
1.5 Comunicación entre procesos en C/C++

Funcionamiento de las tuberías

proceso proceso
padre hijo
escribe
fd[0] fd[1] fd[0] fd[1]

lee lee escribe


tubería

Las tuberías tienen un único sentido 15


1.6 Sincronización de procesos en C/C++

Si son independientes, ¿cómo los comunicamos entre sí?


▪ Para que los procesos interactúen entre sí necesitan sincronizarse

▪ Es decir, tienen que operar de forma coordinada

▪ La mejor forma de coordinarlos es usando señales

▪ La función signal() especifica la acción a realizar cuando un proceso recibe una señal

16
1.6 Sincronización de procesos en C/C++

Algunas funciones útiles


▪ signal(): permite capturar una señal recibida en un proceso

▪ kill(): envía una señal a un proceso, especificando el PID y la señal a enviar

▪ pause(): hace que un proceso se bloquee a la espera de una señal

▪ sleep(): suspende el proceso una cantidad de segundos o hasta que se reciba una señal

17
1.6 Sincronización de procesos en C/C++

Analicemos ahora algunos ejemplos


▪ Estos ejemplos deben ser utilizados en una máquina Linux

▪ Requisitos

▪ Tener instalado el compilador GCC: sudo apt-get install gcc

▪ Compilación de los ejemplos

▪ gcc –o [Link] ejemplo.c

▪ Ejecución de los ejemplos

▪ chmod u+x [Link]


18
1.7 Creación de procesos en Java

¿Cómo crear un proceso en Java?


▪ Clase ProcessBuilder

▪ Cada instancia gestiona una serie de atributos del proceso

▪ El método start() crea una nueva instancia de tipo Process con dichos atributos

▪ El proceso puede ser invocado varias veces para crear nuevos subprocesos

▪ El proceso creado redirige su terminal a la del proceso padre

▪ Métodos de la clase Process: enlace

▪ Métodos de la clase ProcessBuilder: enlace


19
Contenidos de la sección

2. Programación concurrente

▪ 2.1 Programa-Proceso

▪ 2.2 Características

▪ 2.3 Programas concurrentes

▪ 2.4 Problemas de la programación concurrente

▪ 2.5 Programación concurrente en Java

20
2.1 Programa-Proceso

¿Qué es la programación concurrente?


▪ La concurrencia permite que varios sucesos ocurran en el mismo tiempo

▪ Esta característica es posible gracias a la existencia de múltiples unidades de proceso

▪ En cada unidad de proceso se puede ejecutar un hilo al mismo tiempo

▪ Un programa es un conjunto de instrucciones

▪ Las instrucciones de un programa se aplican a unos datos de entrada para obtener resultados

▪ Un programa en ejecución puede dar lugar a más de un proceso

21
2.1 Programa-Proceso

¿Qué es la programación concurrente?


▪ Dos procesos serán concurrentes cuando sus instrucciones se intercalan

▪ No confundir con la programación paralela

▪ Dicho esto, podemos considerar que un proceso es:

▪ Toda actividad asíncrona que puede ser asignada a un procesador

22
2.1 Programa-Proceso

¿Qué es la programación concurrente?


▪ Ejemplo de un programa que produce más de un proceso

P1 P2 P3

Sistema Operativo

programa 23
2.1 Programa-Proceso

¿Qué es la programación concurrente?


▪ Cuando varios procesos se ejecutan de forma concurrente pueden colaborar o competir

▪ Colaborar: los procesos colaboran entre sí para lograr un fin común

▪ Competir: los procesos compiten por los recursos del sistema

▪ Debido a esta naturaleza el Sistema Operativo incorpora los siguientes mecanismos:

▪ Mecanismos de comunicación: permiten la comunicación entre los procesos

▪ Mecanismos de sincronización: permiten sincronizar los procesos y el acceso a los recursos

▪ Los programas concurrentes tienen un flujo parcial (comportamiento indeterminista)


24
2.2 Características

Beneficios de la programación concurrente


▪ Mejor aprovechamiento de la CPU

▪ Incremento de la velocidad de ejecución

▪ Solución de problemas cuya naturaleza es concurrente:

▪ Sistemas de control

▪ Tecnologías web

▪ Aplicaciones con GUI

▪ Simulación

▪ Sistemas Gestores de Bases de Datos 25


2.2 Características

Concurrencia en Sistemas monoprocesador y multiprocesador

P1 P1

P2 P2

P3 P3

Tiempo de CPU Tiempo de CPU

Sistemas monoprocesador Sistemas multiprocesador 26


2.3 Programa concurrente

Ejecución simultánea
▪ Conjunto de acciones que pueden ser ejecutadas de forma simultánea

x=x+1; El orden de ejecución importa


y=x+1;

x=1;
y=1; El orden de ejecución no importa
z=1;

27
2.3 Programa concurrente

Condiciones de Bernstein
▪ Estas condiciones permiten que dos conjuntos de instrucciones se ejecuten a la vez

▪ Para esto hay que formar dos conjuntos de instrucciones:

▪ Instrucciones de lectura: formado por instrucciones que tienen variables que son leídas en ejecución

▪ Instrucciones de escritura: formado por instrucciones que tienen variables que son escritas en ejecución

▪ Ejemplo:

x=y+1; Instrucción 1
y=x+2; Instrucción 2
z=a+b; Instrucción 3 28
2.3 Programa concurrente

Condiciones de Bernstein (ejemplo)


▪ Conjuntos de lectura y escritura

Lectura (L) Escritura (E)


Instrucción 1 I1 y x x=y+1;
Instrucción 2 I2 x y y=x+2;
Instrucción 3 I3 a,b z z=a+b;
L(I1)={y} E(I1)={x}
L(I2)={x} E(I2)={y}
L(I3)={a,b} E(I3)={z}

29
2.3 Programa concurrente

Condiciones de Bernstein (ejemplo)


▪ Para que dos conjuntos se puedan ejecutar tienen que cumplir 3 condiciones

▪ La intersección de las variables de lectura de un conjunto i y las de escritura de un conjunto j debe ser vacía

𝐿 𝐼𝑖 ∩ 𝐸 𝐼𝑖 = ∅
▪ La intersección de las variables de escritura de un conjunto i y las de lectura de un conjunto j debe ser vacía

𝐸 𝐼𝑖 ∩ 𝐿 𝐼𝑖 = ∅
▪ La intersección de las variables de escritura de un conjunto i y las de escritura de un conjunto j debe ser vacía

𝐸 𝐼𝑖 ∩ 𝐸 𝐼𝑖 = ∅

30
2.3 Programa concurrente

Condiciones de Bernstein (ejemplo)


▪ Para que dos conjuntos se puedan ejecutar tienen que cumplir 3 condiciones

Conjunto I1 e I2 Conjunto I2 e I3 Conjunto I1 e I3


𝐿 𝐼1 ∩ 𝐸 𝐼2 ≠ ∅ 𝐿 𝐼2 ∩ 𝐸 𝐼3 = ∅ 𝐿 𝐼1 ∩ 𝐸 𝐼3 = ∅
𝐸 𝐼1 ∩ 𝐿 𝐼2 ≠ ∅ 𝐸 𝐼2 ∩ 𝐿 𝐼3 = ∅ 𝐸 𝐼1 ∩ 𝐿 𝐼3 = ∅
𝐸 𝐼1 ∩ 𝐸 𝐼2 = ∅ 𝐸 𝐼2 ∩ 𝐸 𝐼3 = ∅ 𝐸 𝐼1 ∩ 𝐸 𝐼3 = ∅

31
2.3 Programa concurrente

Condiciones de Bernstein (ejemplo)


▪ Para que dos conjuntos se puedan ejecutar tienen que cumplir 3 condiciones

Conjunto I1 e I2 Conjunto I2 e I3 Conjunto I1 e I3


𝐿 𝐼1 ∩ 𝐸 𝐼2 ≠ ∅ 𝐿 𝐼2 ∩ 𝐸 𝐼3 = ∅ 𝐿 𝐼1 ∩ 𝐸 𝐼3 = ∅
𝐸 𝐼1 ∩ 𝐿 𝐼2 ≠ ∅ 𝐸 𝐼2 ∩ 𝐿 𝐼3 = ∅ 𝐸 𝐼1 ∩ 𝐿 𝐼3 = ∅
𝐸 𝐼1 ∩ 𝐸 𝐼2 = ∅ 𝐸 𝐼2 ∩ 𝐸 𝐼3 = ∅ 𝐸 𝐼1 ∩ 𝐸 𝐼3 = ∅

x=y+1;
▪ Las instrucciones I1 e I2 no se pueden ejecutar concurrentemente y=x+2;
z=a+b;
32
2.4 Problemas de la programación concurrente

Problemas que podemos encontrarnos


▪ Exclusión mutua

▪ Ocurre cuando varios procesos acceden a la misma variable a modificarla (Ejemplo: BBDD)

▪ Uno actualiza a la vez que otro podría estar leyendo

▪ La variable se protege creando una sección crítica

▪ Condición de sincronización

▪ Necesidad de coordinar las actividades de dos procesos

▪ Puede suceder que un proceso P1 necesite que P2 finalice para poder ejecutarse
33
2.5 Programación concurrente en Java

Programación concurrente en Java: Hilos


▪ En Java podemos crear varios hilos de ejecución dentro de un mismo proceso

▪ Los hilos comparten el contexto de ejecución del proceso (datos compartidos)

▪ Los hilos son llamados procesos ligeros

▪ Se tarda menos tiempo en crear un hilo que un proceso

▪ La comunicación entre procesos requiere el núcleo del SO, en los hilos no hace falta

▪ Generalmente, los hilos cooperan para resolver un problema

34
2.5 Programación concurrente en Java

Programación concurrente en Java: Hilos


▪ Existen dos formas:

▪ Crear una clase que herede de la clase Thread y sobrecargar el método run()

▪ Implementar la interfaz Runnable y declarar el método run()

▪ Este método se usa cuando una clase ya hereda de otra (herencia múltiple en Java)

35
Contenidos de la sección

3. Programación paralela y distribuida

▪ 3.1 Programación paralela

▪ 3.2 Programación distribuida

▪ 3.3 Framework de programación distribuida: PVM

36
3.1 Programación paralela

Descripción
▪ Un programa paralelo está pensado para ejecutarse en un sistema multiprocesador

▪ Varias CPU pueden trabajar a la vez para resolver el problema

▪ El problema se divide en partes

▪ Más información: video

37
3.1 Programación paralela

Ventajas e inconvenientes
▪ Ventajas

▪ Ejecución simultánea

▪ Disminuye el tiempo de ejecución

▪ Abordaje y resolución de problemas complejos

38
3.1 Programación paralela

Ventajas e inconvenientes
▪ Inconvenientes

▪ Los compiladores y entornos son más complejos

▪ Los programas son más difíciles de escribir

▪ Mayor consumo de energía

▪ Mayor complejidad en el acceso a los datos

▪ Comunicación y sincronización más compleja

39
3.2 Programación distribuida

Descripción
▪ Los componentes hardware o software están distribuidos

▪ El ejemplo más conocido es Internet (cloud computing)

▪ Los componentes se interconectan mediante una red

▪ Consecuencias:

▪ Concurrencia

▪ Inexistencia de un reloj global

▪ Fallos independientes (Sería como un RAID a nivel de programa)


40
3.2 Programación distribuida

Modelos de programación para la comunicación en entornos distribuidos


▪ Sockets

▪ Llamada a procedimientos remotos (RPC)

▪ Invocación remota de objetos (RMI)

41
3.2 Programación distribuida

Ventajas e inconvenientes
▪ Ventajas

▪ Se pueden compartir recursos y datos

▪ Capacidad de crecimiento incremental

▪ Mayor flexibilidad

▪ Alta disponibilidad

▪ Carácter abierto y heterogéneo

42
3.2 Programación distribuida

Ventajas e inconvenientes
▪ Inconvenientes

▪ Aumento de complejidad

▪ Problemas con las redes de comunicación (pérdida de mensajes, saturación…)

▪ Problemas de seguridad (DDoS)

43
3.3 Framework de programación distribuida: PVM

PVM (Paralel Virtual Machine)


▪ Permiten crear un marco de computación concurrente, distribuido y de propósito general

▪ Más información: enlace

▪ AVISO: El video tiene audio a un volumen muy estridente

44
Créditos de las imágenes y figuras

Cliparts e iconos
▪ Obtenidos mediante la herramienta web IconFinder (según sus disposiciones):
▪ Diapositiva 1
▪ Según la plataforma IconFinder, dicho material puede usarse libremente (free comercial use)
▪ A fecha de edición de este material, todos los cliparts son free for comercial use (sin restricciones)

Diagramas, gráficas e imágenes


▪ Se han desarrollado en PowerPoint y se han incrustado en esta presentación
▪ Todos estos materiales se han desarrollado por el autor
▪ Para el resto de recursos se han especificado sus fabricantes, propietarios o enlaces
▪ Si no se especifica copyright con la imagen, entonces es de desarrollo propio o CC0
45

También podría gustarte