Ejemplo: Creación y mutación de procesos

19
Ejemplo: Creación y mutación de procesos PASO1: Mirar la presentación y entenderla PASO2: Mirar el programa PASO 3: PROBADLO!!! PASO 4: Intentad hacerlo vosotros 1

description

Ejemplo: Creación y mutación de procesos. PASO1: Mirar la presentación y entenderla PASO2: Mirar el programa PASO 3: PROBADLO!!! PASO 4: Intentad hacerlo vosotros. ¿Qué queremos hacer?. Tenemos un simulador de cache que recibe un fichero con una traza de entrada y unos parámetros - PowerPoint PPT Presentation

Transcript of Ejemplo: Creación y mutación de procesos

Page 1: Ejemplo: Creación y mutación de procesos

1

Ejemplo: Creación y mutación de procesosPASO1: Mirar la presentación y entenderlaPASO2: Mirar el programa PASO 3: PROBADLO!!!PASO 4: Intentad hacerlo vosotros

Page 2: Ejemplo: Creación y mutación de procesos

2

¿Qué queremos hacer?O Tenemos un simulador de cache que

recibe un fichero con una traza de entrada y unos parámetros

O Queremos hacer 1000 simulaciones, para una misma entrada, modificando un parámetro

O Guardamos la salida en un fichero para procesarlo luego

Page 3: Ejemplo: Creación y mutación de procesos

3

Opción 1# echo “simulacion 1 “ > simulador.out# simula f 1 >> simulador.out# echo “simulacion 2 “ > simulador.out# simula f 2 >> simulador.out# echo “simulacion 3 “ > simulador.out# simula f 3# ….# simula f 1000

Page 4: Ejemplo: Creación y mutación de procesos

4

Opción 2O Aplicamos lo que aprenderemos aquíO Cada línea de las que hemos puesto

en el ejemplo es un proceso nuevo que ejecuta un binario concreto con unos parámetros concretos

O Podemos automatizarlo muy fácilmente !!!

# simula.aut fichero valor_inicial valor_final > simula.out

Page 5: Ejemplo: Creación y mutación de procesos

5

Paso 1: Análisis del problema

O Nuestro problema tiene 2 parámetros:O El fichero de entrada fijo para todas

las simulacionesO Un rango de valores a simular: el

incremento entre un valor y otro asumiremos que será fijo, pero podría ser un tercer parámetro

O El nombre del binario no es un parámetro, asumimos que lo conocemos

Page 6: Ejemplo: Creación y mutación de procesos

6

Paso 1: Análisis del problema

O Para cada valor del parámetro (1..1000) hemos de hacer:

O Escribir un mensaje indicando que simulación vamos a hacer

O Ejecutar el simulador con los parámetros que toquen

O Lógicamente, esto es un bucle O “echo” para escribir el mensajeO “simulador” para ejecutar el simuladorO Hemos de modificar el parámetro en cada

iteración

Page 7: Ejemplo: Creación y mutación de procesos

7

Paso 2: Estructura problema

1. Inicialización 1. Hemos de pensar si hay que hacer

algo antes del bucle2. Cuerpo del problema (bucle)

3. Hemos de pensar si hay que hacer algo después del bucle

De x=valor_inicial…X=valor_final echo “simulación x “ >> simulador.out simula f X >> simulador.out

Page 8: Ejemplo: Creación y mutación de procesos

8

Paso 3: ¿Cómo se traduce esto?

O Si nuestro programa se ejecuta como:O Formato: sim.aut trace_file x_incial

x_finalO EJ: sim.aut f.traza 1 1000

O ¿Qué hay que hacer antes del bucle? ( a veces nada ) O Preparar los parámetros del bucle. Los

parámetros se reciben como “string”, y para usarlo en el bucle ha de ser “int”

Page 9: Ejemplo: Creación y mutación de procesos

9

Paso 3: ¿Cómo se traduce esto?

O ¿Qué hemos de plantearnos en el bucle?O ¿Cuántos procesos hay que crear en cada

iteración?O ¿Qué tiene que hacer cada proceso nuevo?

¿Debe mutar o no?O ¿Quien debe iterar?

O Dependiendo de quien itere (padre/hijos) se crean jerarquías distintas

O ¿Los procesos que creamos se ejecutan de forma secuencia o concurrente ?

O ¿Hay que añadir algún otro tipo de sincronización?

En este caso 2, uno para hacer el echo y otro para hacer la simulación

En este caso si, ya que hemos de usar dos binarios que ya existen,Es lo más sencillo al menos

En este caso el padre (proceso inicial), es más sencillo y no Aportaría nada que fuera alguno de los hijos

Secuencial significa que hay que esperar que uno termine para empezarel otro. Concurrente significa que se ejecutan “a la vez” . En este caso han de ser secuenciales, ya que la salida va al mismo fichero y seMezclarían los resultados

NO, pero hay que tener en cuenta que han de ser secuenciales dentro De cada iteración y ENTRE ITERACIONES (por el mismo motivo)

Page 10: Ejemplo: Creación y mutación de procesos

10

Paso 3: ¿Cómo se traduce esto?

O ¿Hay que hacer algo después del bucle?O En este caso no.

Page 11: Ejemplo: Creación y mutación de procesos

11

Antes de empezar…O En este punto no hemos trabajado el

tema de entrada/salida, así que la forma de gestionar el enviar los datos a un fichero lo haremos aprovechando lo que nos ofrece la shell, ejecutando el fichero de la siguiente forma:O sim.aut f.traza 1 1000 >> simula.out

Page 12: Ejemplo: Creación y mutación de procesos

12

Como sería el código

Podéis verlo completo y probarlo en:

http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/ejemplos/ejemplo_simulador.tar.gz

Page 13: Ejemplo: Creación y mutación de procesos

13

Antes del bucleO Hemos de “coger” los parámetros,

están en argv y convertir formatos cuando sea necesarioO argv[0] simula.aut (no lo

necesitamos)O argv[1] nombre del fichero con la

traza O argv[2]x_inicial (string int)

O x_inicial=atoi(argv[2])O argv[3]x_final (string int)

O x_final=atoi(argv[3])

Page 14: Ejemplo: Creación y mutación de procesos

14

El bucleO IDEA (primero pensamos y luego

pasamos a llamadas a sistema)

for (sim=x_inicial;sim<=x_final;sim++){// ECHO: Creamos proceso// ECHO: El nuevo proceso muta// ECHO: El padre espera que acabe // SIMULADOR: Creamos nuevo

proceso// SIMULADOR: El nuevo proceso

muta// SIMULADOR: Esperamos que

acabe}

Page 15: Ejemplo: Creación y mutación de procesos

15

ECHO: Creación y Mutación

O Al crear un proceso (fork) ejecuta el mismo código que su padre, si queremos que haga otra cosa hay que ponerlo explícitamente Añadir un condicional

O Si queremos que un proceso cambie su binario, hay que ponerlo explícitamente (execlp)

O CUIDADO: Los parámetros del execlp son todos STINGS !!!!!!

O Si queremos controlar el final del nuevo proceso hay que ponerlo explícitamente (waitpid)

Page 16: Ejemplo: Creación y mutación de procesos

16

Códigochar buff[64];ret=fork(); // creación// condicional, sólo el hijo tiene ret==0if (ret==0){ //Mutamos

sprintf(buff,”%d”,sim);execlp(“echo”,”echo”, “simulacion”, buff,(char

*)NULL);}else (if (ret<0){ // caso error control_error(“fallo fork”);}else{ // esperamos fin hijo

waitpid(-1,NULL,0);}

Page 17: Ejemplo: Creación y mutación de procesos

17

¿Que pasa al ejecutar?ret=fork();if (ret==0){ }else (if (ret<0){}else{ waitpid(-1,NULL,0); // bloqueado // bloqueado // bloqueado}

ret=fork() el Hijo “aparece” aquiif (ret==0){ sprintf(buff,”%d”,sim); execlp(“echo”,”echo”, “simulacion”, buff,(char *)NULL);/// ejecucion echo/// ejecucion echo/// ejecucion echo…. FIN

PADRE HIJO

Tiempo

Page 18: Ejemplo: Creación y mutación de procesos

18

Bucle (simplificado)for (sim=x_inicial;sim<x_final;sim++){

ret=fork();if (ret==0){

execlp (“hecho”….);}waitpid(…)ret=fork();if (ret==0){

execlp (“simulador”….);}waitpid(…)

}

Page 19: Ejemplo: Creación y mutación de procesos

19

Jerarquía de procesos

P.Inicial

Echo 0(sim=x_inicial)

Simulador 0 (sim=x_inicial)

Echo 1 (sim=x_iinicial+

1)

Simulador 1 (sim=x_inicial+1

)… Hino N

(sim=(x_final-1))

Todos los procesos son hijos del proceso inicial, cada iteración son 2 procesos nuevos