Ejemplo Creacin y mutacin de procesos PASO 1

  • Slides: 19
Download presentation
Ejemplo: Creación y mutación de procesos PASO 1: Mirar la presentación y entenderla PASO

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

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

¿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 2

Opción 1 # echo “simulacion 1 “ > simulador. out # simula f 1

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 3

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

Opción 2 O 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 4

Paso 1: Análisis del problema O Nuestro problema tiene 2 parámetros: O El fichero

Paso 1: Análisis del problema O Nuestro problema tiene 2 parámetros: O El fichero de entrada fijo para todas las simulaciones O 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 5

Paso 1: Análisis del problema O Para cada valor del parámetro (1. . 1000)

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 mensaje O “simulador” para ejecutar el simulador O Hemos de modificar el parámetro en cada iteración 6

Paso 2: Estructura problema 1. Inicialización 1. 2. Hemos de pensar si hay que

Paso 2: Estructura problema 1. Inicialización 1. 2. Hemos de pensar si hay que hacer algo antes del bucle Cuerpo del problema (bucle) De x=valor_inicial…X=valor_final echo “simulación x “ >> simulador. out simula f X >> simulador. out 3. Hemos de pensar si hay que hacer algo después del bucle 7

Paso 3: ¿Cómo se traduce esto? O Si nuestro programa se ejecuta como: O

Paso 3: ¿Cómo se traduce esto? O Si nuestro programa se ejecuta como: O Formato: sim. aut trace_file x_incial x_final O 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” 8

Paso 3: ¿Cómo se traduce esto? O ¿Qué hemos de plantearnos en el bucle?

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 caso ¿Qué quehacer En este 2, tiene uno para el cada echo yproceso otro paranuevo? hacer la simulación ¿Debe mutar o no? NO, pero hay que tener en cuenta que han de ser secuenciales dentro En este si, yadebe que hemos de usar dos binarios que ya existen, O caso ¿Quien iterar? De cada iteración y ENTRE ITERACIONES (por el mismo motivo) Es lo más. Osencillo al menos Dependiendo de quien itere (padre/hijos) se crean jerarquías distintas O ¿Los procesos que creamos se ejecutan de forma secuencia o concurrente ? Secuencial significa que hay queinicial), que uno termine En este el que padre (proceso más sencillo y nopara empezar O caso ¿Hay añadir algúnesperar otro es tipo de el otro. Concurrente significa quede se los ejecutan Aportaría nada que fuera alguno hijos “a la vez”. En este caso sincronización? han de ser secuenciales, ya que la salida va al mismo fichero y se Mezclarían los resultados 9

Paso 3: ¿Cómo se traduce esto? O ¿Hay que hacer algo después del bucle?

Paso 3: ¿Cómo se traduce esto? O ¿Hay que hacer algo después del bucle? O En este caso no. 10

Antes de empezar… O En este punto no hemos trabajado el tema de entrada/salida,

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 11

Como sería el código Podéis verlo completo y probarlo en: http: //docencia. ac. upc.

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 12

Antes del bucle O Hemos de “coger” los parámetros, están en argv y convertir

Antes del bucle O Hemos de “coger” los parámetros, están en argv y convertir formatos cuando sea necesario O 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]) 13

El bucle O IDEA (primero pensamos y luego pasamos a llamadas a sistema) for

El bucle O 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 } 14

ECHO: Creación y Mutación O Al crear un proceso (fork) ejecuta el mismo código

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) 15

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

Código char buff[64]; ret=fork(); // creación // condicional, sólo el hijo tiene ret==0 if (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); } 16

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

¿Que pasa al ejecutar? ret=fork(); if (ret==0){ }else (if (ret<0){ }else{ waitpid(1, NULL, 0); // bloqueado } PADRE ret=fork() el Hijo “aparece” aqui if (ret==0){ sprintf(buff, ”%d”, sim); execlp(“echo”, ”echo”, “simulacion”, buff, (char *)NULL); /// ejecucion echo…. FIN HIJO T i e m p o 17

Bucle (simplificado) for (sim=x_inicial; sim<x_final; sim++){ ret=fork(); if (ret==0){ execlp (“hecho”…. ); } waitpid(…)

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(…) } 18

Jerarquía de procesos Todos los procesos son hijos del proceso inicial, cada iteración son

Jerarquía de procesos Todos los procesos son hijos del proceso inicial, cada iteración son 2 procesos nuevos 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)) 19