Gestión de procesos en UNIX

Anuncio
FIB Tardor 02
PROCESOS UNIX
Gestión de procesos en UNIX
• Cada proceso sólo puede tener un flujo: el concepto “proceso” engloba todo
• Dos llamadas implicadas en la creación de procesos
• crear proceso
• cargar programa
• La relación de procesos es jerárquica: hijos, padres, abuelos...
• El mecanismo de signals permite que el proceso sea avisado de acontecimientos
• A través del sistema de ficheros, los procesos pueden pasarse datos
Introducció als Sistemes Operatius
Marisa Gil
1
FIB Tardor 02
PROCESOS UNIX
Creación de procesos
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
MEMORIA
IPC
PCB
fork();
sentencia a;
sentencia b;
.........
MEMORIA
PCB
id:098
IPC
xxxx
yyyyy
fork();
sentencia a;
sentencia b;
.........
id:098
PCB
xxxx
yyyyy
id:103
IPC
fork();
sentencia a;
sentencia b;
.........
xxxx
yyyyy
Antes del fork()
Introducció als Sistemes Operatius
Después del fork()
Marisa Gil
2
FIB Tardor 02
PROCESOS UNIX
Cambio de imagen del proceso que se está ejecutando
#include <unistd.h>
int execl(const char *path,const char *arg0,...,const char *argn,
char * /*NULL*/);
int execv(const char *path, char *const argv[]);
int execle(const char *path,char *const arg0[],...,const char *argn,
char * /*NULL*/,char *const envp[]);
int execve(const char *path, char *const argv[],char *const envp[]);
int execlp(const char *file,const char *arg0,...,const char *argn,
char * /*NULL*/);
Introducció als Sistemes Operatius
Marisa Gil
3
FIB Tardor 02
PROCESOS UNIX
Sincronización padre-hijo
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *stat_loc);
#include <stdlib.h>
void exit(int status);
#include <unistd.h>
void _exit(int status);
Introducció als Sistemes Operatius
Marisa Gil
4
FIB Tardor 02
PROCESOS EN UNIX
Extraído de Amir Afzal: “Introducción a UNIX. Un enfoque práctico”. Prentice Hall
PCB de
proceso del
sistema
crear un nuevo proceso (hijo)
añadir proceso hijo a la tabla de procesos
call fork
almacenar la dirección de retorno
del padre en el PCB del padre
fork
enviar el código 0 al proceso hijo
devolver el ID del proceso hijo al padre
devolver control al proceso padre
padre
Introducció als Sistemes Operatius
LLAMADA fork()
Marisa Gil
hijo
5
FIB Tardor 02
PROCESOS EN UNIX
PCB de
proceso del
sistema
cambiar el estado del proceso
padre a esperar (bloqueado)
fork
fork
dar el control al proceso hijo
call wait
el padre va a estar bloqueado
hasta que el hijo finalice
padre
Introducció als Sistemes Operatius
LLAMADA wait()
Marisa Gil
hijo
6
FIB Tardor 02
PROCESOS EN UNIX
cambiar el estado del proceso
hijo a ejecutando
PCB de
proceso del
sistema
fork
fork
carga el nuevo programa ejecutable
en memoria
call exec
comienza la ejecución del nuevo programa
padre
Introducció als Sistemes Operatius
LLAMADA exec()
Marisa Gil
nuevo
programa
hijo
7
FIB Tardor 02
PROCESOS EN UNIX
PCB de
proceso del
sistema
cambia el estado del padre a preparado
PCB de
proceso del
sistema
pasar al padre el valor del hijo
fork
fork
wait
avisar al padre de que el
hijo ha muerto (signal)
el padre se despierta
el padre continua su programa
call exit
padre
Introducció als Sistemes Operatius
LLAMADA exit()
Marisa Gil
hijo
8
FIB Tardor 02
PROCESOS EN UNIX
Esquemas de creación de procesos
pid = fork();
switch(pid) {
case 0: /* código del hijo */
seguir código
exit(resultado)/ break;
execlp(“proghijo”, hijo,0);
case -1: /* error */
default: /* código del padre */
seguir código
wait(&resultado)/ break;
execlp(“progpadre”, padre,0);
}
Introducció als Sistemes Operatius
Marisa Gil
9
FIB Tardor 02
EJEMPLOS
#include "error.h"
main()
{
int contador=0,r, status;
char c,s[100];
switch (fork()) {
case -1: error("fork",SISTEMA);
case 0: while ((r=read(0, &c,sizeof(char)))>0)
if (c==’a’) contador++;
if (r<0) error("read",SISTEMA);
sprintf(s,"Soy %d: contador=%d\n",getpid(),contador);
exit(0);
default: /* codigo del padre */
wait(&status);
}
}
Introducció als Sistemes Operatius
Marisa Gil
10
FIB Tardor 02
PROCESOS EN UNIX
Comunicación padre hijo en la finalización
• La información que se pasan a través de las llamadas wait() y exit() es un
acuerdo entre el padre y el hijo:
• Totalmente arbitrario
• transparente al sistema operativo y a las librerías
• Por convenio e inteligibilidad de los programas, en las utilidades y programas de
uso general se establece que:
• Devolver un 0 es una finalización correcta
• Devolver un valor diferente de 0 es una finalización errónea
Introducció als Sistemes Operatius
Marisa Gil
11
FIB Tardor 02
PROCESOS EN UNIX
wait (&stat)
8 bits altos
8 bits bajos
wait (&stat)
TODO A CEROS
exit (res)
8 bits altos
wait (&stat)
8 bits bajos
TODO A CEROS
número de excepción
Introducció als Sistemes Operatius
Marisa Gil
12
Descargar