Un ejemplo: UNIX

Anuncio
Marisa Gil
PROCESOS UNIX
Un ejemplo: 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
5
Marisa Gil
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()
6
Marisa Gil
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
7
Marisa Gil
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
8
Marisa Gil
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
9
Marisa Gil
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
10
Marisa Gil
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
11
Marisa Gil
PROCESOS EN UNIX
wait (&stat)
8 bits altos
wait (&stat)
8 bits bajos
TODO A CEROS
exit (res)
8 bits altos
wait (&stat)
8 bits bajos
TODO A CEROS
kill(nsignal,hijo)
Introducció als Sistemes Operatius
12
Marisa Gil
PROCESOS UNIX
Signals
Definición: mecanismo software para avisar a un proceso de la
aparición de eventos (acontecimientos) asíncronos.
• Similar a interrupciónes del hardware
- rompen momentáneamente la secuencia del programa
• Puede enviarlos el kernel u otros procesos
Programa
petición de
servicio
Llamadas al
sistema
aviso de
evento
signal (mecanismo
de upcall)
Sistema Operativo
Introducció als Sistemes Operatius
13
Marisa Gil
PROCESOS UNIX
Programar el tratamiento de avisos asíncronos que lleguen al
programa
#include <signal.h>
void (*signal(int sig, void (*function) (int))) (int);
• Se pueden programar todos los signals, excepto SIGKILL y SIGSTOP
• El parámetro function puede ser:
• el tratamiento por defecto (SIG_DFL)
• ignorarlo (SIG_IGN)
• una función del propio programa ejecutable
• Cada ejecución de un signal
• en System V, hace que se desprograme (libsys5)
• en BSD, mantiene la programación (libbsd o bsd_signal())
Como la función de tratamiento está incluída en el código, la llamada exec()
provoca la desprogramación de los signals.
Introducció als Sistemes Operatius
14
Marisa Gil
PROCESOS UNIX
Envío de avisos asíncronos entre procesos
#include <signal.h>
int kill(pid_t process,int signal );
process > 0: el signal especificado se envía al proceso con dicho id
process = 0: el signal se envía a todos los procesos del grupo
process=-1: el signal se envía a todos los procesos excepto los de sistema (superuser)
process<-1: el signal se envía a todos los procesos con id de grupo igual en valor
absoluto
Introducció als Sistemes Operatius
15
Marisa Gil
PROCESOS EN UNIX
Etapas en la creación de procesos
PREPARAR HERENCIA:
el hijo quede conectado
creación pipes
programación signals
pid = fork();
seguridad: es un pto seguro
para el padre
para el hijo
switch(pid) {
case -1: /* error */
case 0: /* código del hijo */
PREPARAR ENTORNO DE TRABAJO:
redireccionar canales virtuales
dejar listo lo que
se tenga que encontrar
el nuevo programa
trabajo ejecutado por hijo
exec.....
algoritmo en
el mismo cód.
default: /* código del padre */
trabajo ejecutado por padre
}
Introducció als Sistemes Operatius
16
Marisa Gil
UNIX SIGNALS
Acciones por defecto
• Hay cuatro posibles acciones por defecto que lleva a cabo el kernel cuando no especifica nada el proceso:
- abort: genera un core dump y termina el proceso.
- exit: termina el proceso sin generar core dump.
- stop: suspende el proceso.
- continue: si el proceso estaba suspendido, lo reanuda.
• Para que cualquier acción se lleve a cabo, el proceso tiene que estar en ejecución.
Introducció als Sistemes Operatius
17
Marisa Gil
UNIX SIGNALS
Tratamiento de los signals
• Los signals asíncronos pueden llegar después de cualquier instrucción.
• Si el signal llega en medio de una llamada al sistema:
• Generalmente el sistema aborta la llamada y vuelve con error (EINTR)
• 4.2BSD recomienza automáticamente algunas llamadas al sistema.
Introducció als Sistemes Operatius
18
Marisa Gil
UNIX SIGNALS
A tener en cuenta ...
• El comportamiento de los signals y el tratamiento interno del sistema puede variar
entre versiones.
• System V original define 15 signals, 4BSD y SVR4 definen 31. Algunos UNIX
comerciales definen más.
• El número correspondiente a cada signal también puede cambiar: por ejemplo,
SIGSTOP es el 17 en 4.3BSD, y el 23 en SVR4.
Introducció als Sistemes Operatius
19
Descargar