Está en la página 1de 31

UT 1: Programación multiproceso

Programación de Servicios y Procesos


DAM2
Contenidos y objetivos
Contenidos Objetivos

● Procesos. Estados de un proceso ● Conocer las características de un


y gestión de procesos en linux proceso y su ejecución por el
● Creación de procesos en java sistema operativo
● Programación concurrente ● Conocer las características y
● Programación paralela y diferencias de la programación
distribuida concurrente, paralela y distribuida
● Crear procesos en Linux y utilizar
clases java para crear procesos.
● Desarrollar programas que
ejecuten tareas en paralelo
Introducción

Proceso: cuando un programa se carga en la memoria para su ejecución se convierte en


proceso.

Sistema operativo multitarea o multiproceso: capaz de ejecutar más de un proceso a la vez.

¿Cómo? Pues con varias CPUs o repartiendo tiempo de proceso de una única CPU.

Programación multiproceso: tiene en cuenta la posibilidad de que múltiples procesos puedan


estar ejecutándose simultáneamente sobre el mismo código de programa. División de un
proceso en varios subprocesos.
Procesos y sistema operativo
Sistema operativo ejecuta los programas y maneja los procesos. Reparte los tiempos de CPU
que asigna a los distintos procesos.

BCP: Bloque de control de proceso. Almacena información acerca de un proceso:

● Id del proceso ● Información de gestión de memoria


● Estado del proceso ● Información contable - tiempo CPU
● Contador de asignado y consumido
programa ● Información de estado E/S
● Registros de CPU (dispositivos, ficheros, …)
● información de
planificación de
CPU ( prioridad)
Procesos y sistema operativo
Linux: comando ps ( ps -AF)

Información asociada a los procesos en ejecución:

● PID: identificador del proceso ● C: porcentaje de recursos de CPU


● TTY: terminal ● STIME: hora inicio proceso
● TIME: tiempo de ejecución asociado ● SZ: tamaño virtual de la imagen del
● CMD: nombre del proceso proceso
● UID: usuario
● PPID: PID del proceso padre
Procesos y sistema operativo
Procesos y sistema operativo
Windows:

Comando tasklist desde consola de ejecución de comandos: Muestra lista de los procesos
que se están ejecutando.
Procesos y sistema operativo
CRTL + Alt + Supr - Administrador de tareas
Estados de un proceso
● En ejecución: ejecutándose actualmente
● Bloqueado: no se está ejecutando porque está esperando que ocurra un evento externo
(Ej: espera la finalización de una operación E/S).
● Listo: parado temporalmente y listo para ejecutarse cuando el sistema operativo le
asigne tiempo de CPU

Transiciones
En ejecución

Bloqueado Listo
Procesos padres, hijos, pipe,
sincronización
Desde un proceso padre se pueden generar procesos hijos, independientes, que en realidad
son otro comando del sistema operativo. Por ejemplo, podríamos generar un programa desde
el cual llamamos a una instrucción del sistema operativo que se ejecuta por su lado.

Para comunicar procesos se utilizan los llamados “pipe” (tubería). Es un falso fichero que sirve
para conectar dos procesos.

Un proceso padre quiere enviar datos a un proceso hijo, puede escribirlos en un pipe como si
este fuera un fichero de salida. El proceso hijo leerá los datos como si se tratase de un fichero
de entrada. También se puede dar estas comunicaciones entre procesos que no estén
emparentados.

Se usan señales para comunicar procesos de manera que se puedan sincronizar. Por ejemplo
cuando no se quiere que un proceso haga una acción hasta que otro haya terminado, el
primero esperará una señal que le enviará el segundo cuando termine.
Procesos con java

Paquete java.lang - Clase ProcessBuilder

● Cada instancia de ProcessBuilder gestiona una colección de atributos del proceso


● Método start() crea una instancia de Process con estos atributos y puede ser invocados
varias veces para generar subprocesos.

ProcessBuilder pb = new ProcesBuilder(“CMD”, “/C”, “DIR”);


Process p = pb.start();
Procesos con java
Métodos clase Process

Métodos Misión

InputStream Devuelve el flujo de entrada conectado a la salida normal del subproceso. Para leer la salida del
getInputStream() proceso hijo.

int waitFor() Provoca que el proceso actual espera hasta que el subproceso representado por el objeto Procces
finalice. Devuelve 0 si ha finalizado correctamente.

InputStream getErrorStream() Devuelve el flujo de entrada conectado a la salida del error del subproceso.

OutputStream Devuelve el flujo de salida conectado a la entrada normal del subproceso. Para poder enviar datos al
getOutputStream() subproceso hijo.

void destroy() Elimina el subproceso

int exitValue() Devuelve el valor de salida del subproceso

boolean isAlive() Comprueba si el subproceso sigue vivo


Procesos con java
Métodos clase ProcessBuilder

Métodos Misión

ProcessBuilder command Define el programa a ejecutar y los argumentos


(String argumentos …)

List<String> command() Devuelve los argumentos del objeto

Map<String, String> Devuelve en una estructura Map las variables de entorno del objeto
environment()

ProccessBuilder Redirige la salida de error a un fichero


redirectError(File file)

ProcessBuilder Establece la salida estándar a un fichero


redirectOutput(File file)

File directory() Devuelve el directorio de trabajo del objeto

ProcessBuilder directory(File Establece directorio de trabajo


directorio))

Proccess start() Inicia un nuevo proceso utilizando los atributos de ProccessBuilder


Procesos con java

● Ejemplos 1, 2 y 3
● Actividad 1.1
○ Crea un programa Java llamado LeerNombre.java que reciba desde los argumentos de main()
un nombre y lo visualice en pantalla. Utiliza System.exit(0) para una finalización correcta del
programa y System.exit(-1) para el caso en el que no se hayan introducido los argumentos
correctos en main(). Posteriormente haz un programa similar a Ejemplo3.java para ejecutar
Leernombre.java. Utiliza el método waitFor() para comprobar el valor de salida del proceso que
se ejecuta. Prueba la ejecución del programa pasando un parámetro y sin pasarlo. ¿Qué
devuelve waitFor() en cada caso?
Procesos con java

● Control de errores - no existe el comando - Ejemplo 2b


● Actividad 1.2
○ Partiendo del Ejemplo3.java, muestra los errores que se producen al ejecutar un programa Java
que no exista
Procesos con java

● Ejemplos 4 y 5: Envío de datos al stream de entrada


● Actividad 1.3
○ Escribe un programa Java que lea dos números desde la entrada estándar y visualice su suma.
Controlar que lo introducido por teclado sean dos números. Haz otro programa Java para
ejecutar el anterior, enviándole los datos necesarios por un stream.
Procesos con Java

● Ejemplo 6: entorno y argumentos


● Ejemplos 7 y 8: redirigiendo entrada y salida
● Actividad 1.4:
○ Modifica el Ejemplo5 para que la salida del proceso y la salida del error se almacenen en un
fichero de texto, y la entrada la recoja desde otro fichero.
Programación concurrente

● Concurrencia: “Acaecimiento o concurso de varios sucesos en un mismo tiempo”


● Procesos concurrentes: existencia simultánea de varios procesos en ejecución
● Programa: conjunto de instrucciones - pasivo - tiene que ejecutarse
● Un programa al ponerse en ejecución puede dar lugar a más de un proceso.
○ Ej: Navegador: proceso de gestión del interfaz de usuario y proceso de gestión de comunicación
para descarga de las páginas web
○ Ej: Programa que es ejecutado por varios usuarios a la vez, se puede instanciar.
● Concurrente vs paralela.
○ Concurrente: Solapamiento o intercalado en la ejecución de instrucciones
○ Paralela: ejecución simultánea de instrucciones ( posible con multiprocesador)
Características programación
concurrente
● Beneficios
○ Mejor aprovechamiento de la CPU
○ Velocidad de ejecución
○ Solución a problemas de naturaleza concurrente
■ Ejemplos: servidor web, aplicaciones que generan procesos que se ejecutan
desatendidos, SGBD, …
● Concurrencia y hardware
○ Monoprocesador: tiempo compartido
○ Multiprocesador: Permite concurrencia real
■ Fuertemente acoplados: comparte memoria, y resto de recursos
■ Débilmente acoplados: los procesadores tienen memorias y recursos locales y no los
comparten
Programas concurrentes

Programa concurrente: conjunto de acciones que pueden ser ejecutadas simultáneamente

La primera instrucción
x := x + 1;
debe ejecutarse antes
y := x + 1;
que la segunda

x := 1;
El orden no interviene en
y := 1;
el resultado final
z := 1;
Programas concurrentes: condiciones
de Berstein
Lectura Escritura
I1: x := y+1; I1 y x L(I1)={y} E(I1)={x}
I2: y := x+2; L(I2)={x} E(I2)={y}
I3: z:= a+b I2 x y L(I3)={a,b} E(I3)={z}

I3 a, b z

Se podrán ejecutar
concurrentemente Conjunto I1 e I2 - no posible concurrencia
instrucciones que cumplan las
siguientes condiciones: Conjunto I1 e I3 - posible concurrencia
L(Ii) ∩ E(Ij) = ∅
E(Ii) ∩ L(Ij) = ∅ Conjunto I2 e I3 - posible concurrencia
E(Ii) ∩ E(Ij) = ∅
Programación concurrente
Problemas inherentes

● Exclusión mútua. Intento de dos procesos de acceder a una variable/recurso para


actualizarlo. Necesaria la implementación de exclusión mutua de procesos respecto a
variables compartidas.
○ Uso de la denominada región crítica, a la que sólo un proceso puede acceder para actualizar.
○ Problemas de espera, inanición, …
● Condición de sincronización: problemas de que un proceso necesite de acciones de
otro para poder continuar. La programación concurrente proporciona mecanismos para
bloquear procesos en espera de eventos que desbloqueen su ejecución.

Herramientas: región crítica, semáforos, región crítica condicional, buzones, sucesos,


monitores y sincronización renez-vous
Programación concurrente en Java

● Java puede arrancar varios hilos de ejecución desde un proceso


● Hilo: secuencia de control dentro de un proceso que ejecuta sus instrucciones de forma
independiente
● Diferencias procesos e hilos
○ Hilos comparten espacio de memoria del proceso
○ Más fácil manejar los estados de un hilo que de un proceso
○ Más eficiente en tiempo la creación y fin de la ejecución de un hilo
○ En la comunicación entre procesos interviene el sistema operativo (llegando al núcleo), mientras
que en los hilos es gestionada por la JVM.
Programación concurrente con java

● Java tiene dos modos diferentes de generar un hilo


○ Clase que herede de la clase Thread y sobrecargando el método run()
○ Clase que implemente la interface Runnable, y declarando el método run().

● Ejemplo 9 - Uso de herencia de Thread


● Actividad 1.5
○ Haz uso de Runnable para replicar el ejemplo anterior sin usar la herencia de la clase Thread en
la clase que contiene el hilo.
Programación paralela
Diseñada para ejecutarse en un sistema multiprocesador. Permite que procesos trabajen
simultáneamente para resolver un problema.

El problema a resolver se divide en partes independientes de tal forma que cada elemento
pueda ejecutar la parte de programa que le corresponda a la vez que los demás.

Los procesos se deberán comunicar para compartir información. Estratégias:

● Memoria compartida - sistemas de memoria compartida o multiprocesador


● Paso de mensajes - sistemas de memoria distribuida o multicomputadores
○ Arquitecturas distribuidas de procesamiento paralelo

Usado tradicionalmente en centros de supercomputadores para resolver problemas de


elevado coste computacional.

Actualmente también en arquitecturas de de procesadores con varios núcleos. Llamado


también multiprocesamiento a nivel de chip (CMP2)
Programación paralela

Ventajas Inconvenientes

● Proporciona ejecución simultánea de ● Compiladores y entornos de


tareas desarrollo más difíciles de desarrollar
● Disminuye tiempo total de ejecución ● Codificación más complicada
● Ayuda a la resolución de problemas ● Consumo más elevado de los
complejos y grandes dimensiones elementos que forman el sistema
● Utilización de recursos no locales ● Mayor complejidad en el acceso a los
● Disminución de costes datos
● La comunicación y la sincronización
entre las diferentes subtareas
Programación distribuida
Sistema distribuido: aquel en el que los componentes hardware o software, localizados en
computadores unidos mediante una red (LAN o WAN), comunican y coordinan sus acciones
mediante el paso de mensajes.

A tener en cuenta:

● Concurrencia: ejecución de programas concurrentes


● Inexistencia de reloj global: los programas no se sincronizan usando el reloj de cada
host, pues pueden no estar sincronizados. Necesitan el paso de mensajes.
● Fallos independientes: cada componente del sistema puede fallar independientemente,
permitiendo que el resto continúen su ejecución

Arquitectura típica y por todos conocida: cliente - servidor

Proyecto AVIDA
Programación distribuida

Modelos de programación para la comunicación entre procesos:

● Sockets: puntos externos para la comunicación entre procesos. Muy bajo nivel -
normalmente se recubren con una capa que facilita la comunicación de mensajes.
● Llamada de procedimientos remotos o RPC: Permite a un programa cliente llamar a un
procedimiento de otro programa en un servidor. El programa del servidor define su
interfaz.
● Invocación remota de objetos: modelo basado en objetos, y la invocación de métodos
remoto (RMI). Un objeto que vive en un proceso puede invocar métodos de un objeto
que reside en otro proceso. Java dispone de modelo de objetos RMI
● Protocolo SOAP (XML)
● Servicios REST (JSON)
● …
Programación distribuida

Ventajas Inconvenientes

● Se pueden compartir recursos y datos ● Aumento de la complejidad


● Capacidad de crecimiento incremental ● Problemas con las redes de
● Mayor flexibilidad al poderse distribuir comunicación: pérdida de mensajes,
la carga de trabajo entre diferentes saturación de tráfico
ordenadores ● Problemas de seguridad - ataques de
● Alta disponibilidad denegación de servicio
● Soporte de aplicaciones
inherentemente distribuidas
● Carácter abierto y heterogéneo
Resumen
● Programación concurrente: tenemos varios elementos de proceso (hilos, procesos) que
trabajan de forma conjunta en la resolución de un problema.
● Programación paralela: programación concurrente cuando se utiliza para acelerar la
resolución de problemas haciendo que los procesos se ejecuten en paralelo
● Programación distribuida: programación paralela cuando los sistemas están
distribuidos a través de una red - se usa el paso de mensajes
Extra

Uso de la herramienta PVM (Paralel Virtual Machine) - herramientas software que permiten
emular un marco de computación concurrente, distribuido y de propósito general.

Permite conectar ordenadores de distintos sistemas operativos (unix, linux, windows) para
ser usados como un único gran ordenador paralelo de alto rendimiento.

También podría gustarte