1 / 19

Ejemplo: Creación y mutación de procesos

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

mills
Télécharger la présentation

Ejemplo: Creación y mutación de procesos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. ¿Qué queremos hacer? • Tenemos un simulador de cache que recibe un fichero con una traza de entrada y unos parámetros • Queremos hacer 1000 simulaciones, para una misma entrada, modificando un parámetro • Guardamos la salida en un fichero para procesarlo luego

  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

  4. Opción 2 • Aplicamos lo que aprenderemos aquí • 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 • Podemos automatizarlo muy fácilmente !!! # simula.aut fichero valor_inicialvalor_final > simula.out

  5. Paso 1: Análisis del problema • Nuestro problema tiene 2 parámetros: • El fichero de entrada  fijo para todas las simulaciones • 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 • El nombre del binario no es un parámetro, asumimos que lo conocemos

  6. Paso 1: Análisis del problema • Para cada valor del parámetro (1..1000) hemos de hacer: • Escribir un mensaje indicando que simulación vamos a hacer • Ejecutar el simulador con los parámetros que toquen • Lógicamente, esto es un bucle • “echo” para escribir el mensaje • “simulador” para ejecutar el simulador • Hemos de modificar el parámetro en cada iteración

  7. Paso 2: Estructura problema • Inicialización • Hemos de pensar si hay que hacer algo antes del bucle • Cuerpo del problema (bucle) • 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

  8. Paso 3: ¿Cómo se traduce esto? • Si nuestro programa se ejecuta como: • Formato: sim.auttrace_filex_incialx_final • EJ: sim.autf.traza 1 1000 • ¿Qué hay que hacer antes del bucle? ( a veces nada ) • Preparar los parámetros del bucle. Los parámetros se reciben como “string”, y para usarlo en el bucle ha de ser “int”

  9. Paso 3: ¿Cómo se traduce esto? • ¿Qué hemos de plantearnos en el bucle? • ¿Cuántos procesos hay que crear en cada iteración? • ¿Qué tiene que hacer cada proceso nuevo? ¿Debe mutar o no? • ¿Quien debe iterar? • Dependiendo de quien itere (padre/hijos) se crean jerarquías distintas • ¿Los procesos que creamos se ejecutan de forma secuencia o concurrente ? • ¿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 NO, pero hay que tener en cuenta que han de ser secuenciales dentro De cada iteración y ENTRE ITERACIONES (por el mismo motivo) En este caso si, ya que hemos de usar dos binarios que ya existen, Es lo más sencillo al menos Secuencial significa que hay que esperar que uno termine para empezar el 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 se Mezclarían los resultados En este caso el padre (proceso inicial), es más sencillo y no Aportaría nada que fuera alguno de los hijos

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

  11. Antes de empezar… • 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: • sim.autf.traza 1 1000 >> simula.out

  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

  13. Antes del bucle • Hemos de “coger” los parámetros, están en argv y convertir formatos cuando sea necesario • argv[0] simula.aut (no lo necesitamos) • argv[1] nombre del fichero con la traza • argv[2]x_inicial (string  int) • x_inicial=atoi(argv[2]) • argv[3]x_final (string  int) • x_final=atoi(argv[3])

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

  15. ECHO: Creación y Mutación • 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 • Si queremos que un proceso cambie su binario, hay que ponerlo explícitamente (execlp) • CUIDADO: Los parámetros del execlp son todos STINGS !!!!!! • Si queremos controlar el final del nuevo proceso  hay que ponerlo explícitamente (waitpid)

  16. Código charbuff[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); }

  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” aqui if(ret==0){ sprintf(buff,”%d”,sim); execlp(“echo”,”echo”, “simulacion”, buff,(char *)NULL); /// ejecucion echo /// ejecucionecho /// ejecucionecho…. FIN T iempo PADRE HIJO

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

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

More Related