Ejemplo: Creación y mutación de procesos

Download Report

Transcript 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
1
¿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 >> 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 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 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) 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 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 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?
O ¿Cuántos procesos hay que crear en cada
iteración?
¿Qué
tienepara
quehacer
hacer
En esteO caso
2, uno
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 esteO caso
si, yadebe
que hemos
¿Quien
iterar?de usar dos binarios que ya existen,
De cada iteración y ENTRE ITERACIONES (por el mismo motivo)
Es lo más Osencillo
al menosde quien itere (padre/hijos) se
Dependiendo
crean jerarquías distintas
O ¿Los procesos que creamos se ejecutan de forma
secuencia o concurrente ?
Secuencial
significa
hayalgún
que
esperar
que
uno
termine
En esteO caso
el que
padreque
(proceso
inicial),
más
sencillo
y nopara empezar
¿Hay
añadir
otroestipo
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?
O En este caso no.
10
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.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 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 (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 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 (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);
// bloqueado
// bloqueado
// bloqueado
}
PADRE
ret=fork()  el Hijo “aparece” aqui
if (ret==0){
sprintf(buff,”%d”,sim);
execlp(“echo”,”echo”, “simulacion”,
buff,(char *)NULL);
/// ejecucion echo
/// ejecucion echo
/// 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(…)
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 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