Professional Documents
Culture Documents
T2-Procesos
ndice
1.2
1
17/2/17
Definicin
Tareas del sistema operativo
Concurrencia y paralelismo
Estados de los procesos
Propiedades de un proceso en Linux
CONCEPTOS
1.3
Concepto de proceso
1.4
2
17/2/17
1.5
1.6
3
17/2/17
1.7
Concurrencia
Tiempo
CPU0 Proc. 0
CPU1 Proc. 1
CPU2 Proc 2
CPU0 Proc. 0 Proc. 1 Proc. 2 Proc. 0 Proc. 1 Proc. 2 Proc. 0 Proc. 1 Proc. 2
Tiempo
1.8
4
17/2/17
Concurrencia
1.9
Estados de un proceso
1.10
5
17/2/17
Estados de un proceso
1.11
Seleccionado
Crear proceso Para ejecutar ZOMBIE
(fork)
Fin
E/S bloqueante BLOCKED E/S bloqueante
O evento recibido
(open/read/write)
O esperando un evento
(sigsuspend)
1.12
6
17/2/17
1.13
1.14
7
17/2/17
Credenciales
4 Cada proceso est asociado con un usuario (userID) y uno o ms
grupos (groupID). Estas credenciales determinan los derechos del
proceso a acceder a los recursos del sistema y ficheros.
1.15
-Creacin
-Mutacin (carga de un ejecutable nuevo)
-Finalizacin
-Espera
1.16
8
17/2/17
Servicios y funcionalidad
1.17
Creacin de procesos
Hijos de P0
P1 P4
P2 P3 Hijos de P1
1.18
9
17/2/17
Planificacin
El padre y el hijo se ejecutan concurrentemente (UNIX)
El padre espera hasta que el hijo termina (se sincroniza)
Espacio de direcciones (rango de memoria vlido)
El hijo es un duplicado del padre (UNIX), pero cada uno tiene su propia
memoria fsica. Adems, padre e hijo, en el momento de la creacin,
tienen el mismo contexto de ejecucin (los registros de la CPU valen
lo mismo)
El hijo ejecuta un cdigo diferente
UNIX
fork system call. Crea un nuevo proceso. El hijo es un clon del padre
exec system call. Reemplaza (muta) el espacio de direcciones del proceso
con un nuevo programa. El proceso es el mismo.
1.19
1.20
10
17/2/17
1.21
1.22
11
17/2/17
void exit(int);
pid_t waitpid(pid_t pid, int *status, int options);
1.23
1.24
12
17/2/17
EJEMPLOS GESTIN
PROCESOS
1.25
pid=fork();pid=fork();
pid=fork();
if (pid==0) execlp(p1,p1,
if (pid==0) (char *)null);
execlp(gedit,gedit,p1.c,(char *)null);
if (pid==0) execlp(gcc,gcc,-o,p1,p1.c,,(char *)null);
waitpid();waitpid();
waitpid();
1.26
13
17/2/17
Creacin procesos
Caso 1: queremos que hagan lneas de cdigo diferente
1. int ret=fork();
2. if (ret==0) {
3. // estas lneas solo las ejecuta el hijo, tenemos 2 procesos
4. }else if (ret<0){
5. // En este caso ha fallado el fork, solo hay 1 proceso
6. }else{
7. // estas lneas solo las ejecuta el padre, tenemos 2 procesos
8. }
9. // estas lneas las ejecutan los dos
Caso 2: queremos que hagan lo mismo
1. fork();
2. // Aqu, si no hay error, hay 2 procesos
1.27
Esquema Secuencial
Secuencial: Forzamos que el padre espere a que termine un hijo antes
de crear el siguiente.
1. #define num_procs 2 Proceso
2. int i,ret; inicial
3. for(i=0;i<num_procs;i++){ fork()
4. if ((ret=fork())<0) control_error(); waitpid() Hijo1
5. if (ret==0) { . .
6. // estas lneas solo las ejecuta el . .
7. // hijo . .
8. codigohijo(); fork()
9. exit(0); // waitpid() Hijo2
10. } . .
11. waitpid(-1,NULL,0); . .
12. } . .
fork()
waitpid() Hijo3
. .
.
.
1.28
14
17/2/17
Esquema Concurrente
Concurrente; Primero creamos todos los procesos, que se ejecutan
concurrentemente, y despus esperamos que acaben..
1. #define num_procs 2
2. int ret,i; Proceso
3. for(i=0;i<num_procs;i++){ inicial
4. if ((ret=fork())<0) control_error(); fork()
fork() Hijo1
5. if (ret==0) { . Hijo2
6. // estas lneas solo las ejecuta el fork()
waitpid() . .
7. // hijo . . Hijo3
8. codigohijo(); .
.
9. exit(0); // . .
.
10. } waitpid()
.
11. } waitpid()
12. while( waitpid(-1,NULL,0)>0);
1.29
1. int id;
2. char buffer[128];
3. id=fork();
4. sprintf(buffer,fork devuelve %d\n,id);
5. write(1,buffer,strlen(buffer));
1.30
15
17/2/17
...
fork();
fork();
fork();
...
for (i = 0; i < 10; i++)
fork();
1.31
int id1,ret;
char buffer[128];
id1 = getpid(); /* getpid devuelve el pid del proceso que la ejecuta */
ret = fork();
id1 = getpid();
srintf(buffer,Valor de id1: %d; valor de ret: %d, id1, ret);
write(1,buffer,strlen(buffer));
1.32
16
17/2/17
void hacerTarea()
{ char buffer[128];
sprintf(Mi PID es %d y el de mi padre %d\n, getpid(), getppid());
write(1,buffer,strlen(buffer));
exit(0); Ahora, probad a quitar esta instruccin,
} es muy diferente!!!
Padre
Padre
I=2
1.34
17
17/2/17
P1 P2 P3 PN
Modificad el cdigo anterior para que los cree segn este otro rbol de
procesos:
padre P1 P2 P3 PN
1.35
Ejemplo fork+exec
fork(); progA
execlp(/bin/progB,progB,(char *)0);
while(...)
main(...){
int A[100],B[100]; progB
...
for(i=0;i<10;i++) A[i]=A[i]+B[i];
...
P1 P2
fork();
main(...){ fork();
main(...){
int A[100],B[100]; int A[100],B[100];
...execlp(/bin/progB,..... ...execlp(/bin/progB,.....
while(...) A[i]=A[i]+B[i];
for(i=0;i<10;i++) while(...) A[i]=A[i]+B[i];
for(i=0;i<10;i++)
... ...
1.36
18
17/2/17
Ejemplo fork+exec
int pid; progA
pid=fork();
if (pid==0) execlp(/bin/progB,progB,(char *)0);
while(...)
main(...){
int A[100],B[100]; progB
...
for(i=0;i<10;i++) A[i]=A[i]+B[i];
...
P1 P2
int pid; main(...){
int pid;
pid=fork(); int A[100],B[100];
pid=fork();
...
if (pid==0) execlp(........); if (pid==0) execlp(.........);
for(i=0;i<10;i++) A[i]=A[i]+B[i];
while(...) while(...)
...
1.37
Ejemplo: exec
...
ret = fork();
if (ret == 0) {
execlp(/bin/ls, ls, -l, (char *)NULL);
}
// A partir de aqu, este cdigo slo lo ejecutara el padre
...
1.38
19
17/2/17
void main()
{ A
ret=fork(); (1) void main()
if (ret==0) execlp(a,a,NULL); {
exit(4); (2)
waitpid(-1,&exit_code,0); (3) }
}
Ejemplo: fork/exec/waitpid
// Usage: plauncher cmd [[cmd2] ... [cmdN]]
20
17/2/17
trataExitCode
#include <sys/wait.h>
if (WIFEXITED(exit_code)) {
statcode = WEXITSTATUS(exit_code);
sprintf(buffer,El proceso %d termina con exit code %d\n, pid,
statcode);
write(1,buffer,strlen(buffer));
}
else {
signcode = WTERMSIG(exit_code);
sprintf(buffer,El proceso %d termina por el signal %d\n, pid,
signcode);
write(1,buffer,strlen(buffer));
}
1.42
-Linux:Signals
COMUNICACIN ENTRE
PROCESOS
1.43
21
17/2/17
1.44
Signals Eventos enviados por otros procesos (del mismo usuario) o por
el kernel para indicar determinadas condiciones (Tema 2)
Pipes Dispositivo que permite comunicar dos procesos que se ejecutan
en la misma mquina. Los primeros datos que se envan son los primeros
que se reciben. La idea principal es conectar la salida de un programa con
la entrada de otro. Utilizado principalmente por la shel l(Tema 4)
FIFOS Funciona con pipes que tienen un nombre el sistema de ficheros.
Se ofrecen como pipes con nombre. (Tema 4)
Sockets Dispositivo que permite comunicar dos procesos a travs de la red
Message queues Sistema de comunicacin indirecta
Semaphores - Contadores que permiten controlar el acceso a recursos
compartidos. Se utilizan para prevenir el acceso de ms de un proceso a un
recurso compartido (por ejemplo memoria)
Shared memory Memoria accesible por ms de un proceso a la vez (Tema 3)
1.45
22
17/2/17
Signals: idea
Proceso A Proceso B
A enva signal a B
kernel
1.46
1.47
23
17/2/17
1.49
24
17/2/17
1.50
Para enviar:
int kill(int pid, int signum)
signumSIGUSR1, SIGUSR2,etc
tratamientostruct sigaction que describe qu hacer al recibir el
signal
tratamiento_antiguo struct sigaction que describe qu se
haca hasta ahora. Este parmetro puede ser NULL si no
interesa obtener el tratamiento antiguo
1.51
25
17/2/17
A enva un signal a B
1.52
26
17/2/17
1.54
Proceso A Proceso B
A enva signal a B= llamada a sistema
Kill(PID_B,signal)
1.55
27
17/2/17
Ignorarlo
IGNORARLO
trat.sa_handler=SIG_IGN;
Terminar
1.57
28
17/2/17
void f_sigint(int s)
{
char buffer[128];
sprintf(buffer,SIGINT RECIBIDO!\n);
exit(0);
}
Podis encontrar el cdigo completo en: signal_basico.c
1.58
Bloquear/desbloquear signals
1.59
29
17/2/17
Esperar un evento
1.60
Proceso A Proceso B
.. void funcion(int s)
Kill( pid, evento); {
.
}
int main()
{
sigaction(evento, &trat,NULL);
.
sigemptyset(&mask);
sigsuspend(&mask);
.
}
30
17/2/17
Proceso A Proceso B
.. void funcion(int s)
Kill( pid, evento); {
.
}
int main()
sigprocmask bloquea evento, {
as que si llega antes de que B sigemptyset(&mask);
llegue al sigsuspend no se le sigaddset(&mask,evento);
entrega sigprocmask(SET,&mask,NULL);
Cuand B est en el sigsuspend sigaction(evento, &trat,NULL);
l nico evento que le puede .
desbloquear es el que se usa sigfillset(&mask);
para la sincronizacin con A sigdelset(&mask,evento)
sigsuspend(&mask);
.
}
1.62
1.63
31
17/2/17
ret=rem_time;
si (num_secs==0) {
enviar_SIGALRM=OFF
}else{
enviar_SIGALRM=ON
rem_time=num_secs,
}
return ret;
1.64
32
17/2/17
1.66
trat.sa_flags=0;
trat.sa_handler = f_alarma; void f_alarma()
sigemptyset(&mask2); {
trat.sa_mask=mask2; }
sigaction(SIGALRM, &trat, NULL); void crea_ps()
{
sigfillset(&mask3); pid = fork();
sigdelset(&mask3,SIGALRM); if (pid == 0)
execlp(ps, ps,
for(i = 0; i < 10; i++) { (char *)NULL);
alarm(2); }
sigsuspend(&mask3);
crea_ps();
}
}
33
17/2/17
Opcin 2: bloqueo
void configurar_esperar_alarma() {
sigemptyset(&mask);
sigaddset(&mask, SIGALRM);
sigprocmask(SIG_BLOCK,&mask, NULL);
}
void esperar_alarma(){
sigfillset(&mask);
sigdelset(&mask,SIGALRM);
sigsuspend(&mask);
}
1.69
34
17/2/17
-Datos
-Estructuras de gestin
-Polticas de planificacin
-Mecanismos
GESTIN INTERNA DE
PROCESOS
1.70
Gestin interna
1.71
35
17/2/17
http://lxr.linux.no/#linux-old+v2.4.31/include/linux/sched.h#L283
1.72
1.73
36
17/2/17
Planificacin
El algoritmo que decide cuando un proceso debe dejar la CPU, quien entra
y durante cuanto tiempo, es lo que se conoce como Poltica de
planificacin (o scheduler)
La planificacin se ejecuta muchas veces (cada 10 ms, por ejemplo)
debe ser muy rpida
El criterio que decide cuando se evala si hay que cambiar el proceso que
est en la cpu (o no), que proceso ponemos, etc, se conoce como Poltica
de planificacin:
Peridicamente (10 ms.) en la interrupcin de reloj, para asegurar que
1.74
Planificacin
1.75
37
17/2/17
Planificador
1.76
Caracterizacin de procesos
1.77
38
17/2/17
1.78
Modo
usuario Ejecutando cdigo usuario Proceso A int reloj
Modo
usuario
Ejecutando cdigo usuario Proceso A
CPU
1.79
39
17/2/17
Objetivos/Mtricas de la planificacin
1.80
1.81
40
17/2/17
1.82
Rendimiento de la poltica
Si hay N procesos en la cola de ready, y el quantum es de
Q milisegundos, cada proceso recibe 1/n partes del tiempo
de CPU en bloques de Q milisegundos como mximo.
4 Ningn proceso espera ms de (N-1)Q milisegundos.
La poltica se comporta diferente en funcin del quantum
1.83
41
17/2/17
1.84
fork
Se busca un PCB libre y se reserva
Se inicializan los datos nuevos (PID, etc)
Se aplica la poltica de gestin de memoria (Tema 3)
P.ej.: reservar memoria y copiar contenido del espacio de direcciones
4
del padre al hijo
Se actualizan las estructuras de gestin de E/S (Tema 4 y 5)
En el caso de Round Robin: Se aade el proceso a la cola de ready
exec
Se substituye el espacio de direcciones por el cdigo/datos/pila del nuevo
ejecutable
Se inicializan los datos del PCB correspondientes : tabla de signals,
contexto, etc
Se actualizan el contexto actual del proceso: variables de entorno, argv,
registros, etc
1.85
42
17/2/17
exit
Se liberan todos los recursos del proceso: memoria, dispositivos en
uso, etc
En Linux: se guarda el estado de finalizacin en el PCB y se elimina de
la cola de ready (de forma que no podr ejecutar ms)
Se aplica la poltica de planificacin
waitpid
Se busca el proceso en la lista de PCBs para conseguir su estado de
finalizacin
Si el proceso que buscamos estaba zombie, el PCB se libera y se
devuelve el estado de finalizacin a su padre.
Si no estaba zombie, el proceso padre se elimina pasa de estado run a
bloqued hasta que el proceso hijo termine.
4 Se aplicara la poltica de planificacin
1.86
PROTECCIN Y SEGURIDAD
1.87
43
17/2/17
Proteccin y Seguridad
1.88
Proteccin UNIX
1.89
44
17/2/17
Seguridad
1.90
45