1
Introducción
Procesos
Visión abstracta
Esbozo de implementación
Threads (Procesos ligeros)
Comunicación entre procesos
Condición de carrera
Exclusión mutua y región crítica
Implementación de la exclusión mutua
Paso de mensajes
Planificación de procesos
Criterios
Políticas
Sistemas multiprocesador
2
INTRODUCCIÓN
Interesa tener máquinas que ejecuten varios procesos al mismo tiempo
(Gp:) 18
(Gp:) T1
(Gp:) T2
(Gp:) T3
(Gp:) t
Aprovechar tiempos muertos E/S
Soluciones elegantes concurrentes
Más rapidez con más de una CPU
(Gp:) T1
(Gp:) T2
(Gp:) T3
(Gp:) t
(Gp:) 13
(Gp:) CPU1
(Gp:) CPU2
Con multiprocesadores también interesa multiplexar las CPU's
pseudoparalelismo
3
PROCESOS (Visión abstracta: Recordar sus llamadas)
Dos relaciones típicas entre proceso Padre y proceso Hijo:
(Gp:) Procesos independientes: La "shell" crea un proceso para ejecutar un programa de usuario "ls"
(Gp:) ls.exe
(Gp:) shell
(Gp:) P
(Gp:) Debe cargarse el ejecutable en memoria
(Gp:) ls
(Gp:) Dotarle de registros, pila, etc.
(Gp:) H
El código ya está en memoria
(Gp:) Procesos cooperantes: Un servidor Web crea un proceso para atender una petición de un cliente
(Gp:) web
(Gp:) P
(Gp:) Dotarle de registros, pila, etc.
(Gp:) H
Parecido a Threads
¿fork + exec?
¿fork?
4
PROCESOS (Visión abstracta: Recordar sus llamadas)
Proceso de arranque y grupos de procesos
(Gp:) P1
(Gp:) P2
(Gp:) P3
(Gp:) P4
(Gp:) P5
(Gp:) P6
(Gp:) P7
init
(Gp:) id:rlevel:action:process
(Gp:) /etc/inittab
(Gp:) xinetd
(Gp:) /etc/rc5.d
(Gp:) /etc/rc.d/rc 5
(Gp:) login
(Gp:) login
(Gp:) login as:
Password:
(Gp:) bash
(Gp:) pcarazo:……..:/bin/bash
(Gp:) /etc/passwd
PC1>
(Gp:) grupo de procesos
(Gp:) Red
(Gp:) putty
(Gp:) ?
(Gp:) gdm
(Gp:) 0 Halt
1 Monousuario
2 MultiSinRed
3 MultiConRed
5 X11
6 Reboot
(Gp:) rlevel
5
PROCESOS (Visión abstracta: Recordar sus llamadas)
6
Esbozo de implementación
(Gp:) ¿Cómo es el ciclo de vida de un proceso?
(Gp:) CPU
(Gp:) Creación
(Gp:) P1
(Gp:) P2
P3
(Gp:) P1
(Gp:) P2
(Gp:) P3
(Gp:) P2
(Gp:) P3
P4
(Gp:) Expulsión
(Gp:) P3
(Gp:) P4
(Gp:) P3
(Gp:) P1
(Gp:) P4
(Gp:) P3
(Gp:) P1
(Gp:) Terminación
(Gp:) P1
(Gp:) P2
(Gp:) P4
¿Estados de un proceso?
(Gp:) EnEjecución
Preparado
EnEspera o Bloqueado
(Gp:) Activo
(Gp:) Ejecu.
(Gp:) Prep.
(Gp:) Espera
7
Diagrama de transición de estados de un Proceso
(Gp:) Preparado
(Gp:) EnEjecución
(Gp:) EnEspera
(Gp:) forkh
(Gp:) forkp
(Gp:) exit
(Gp:) exit
(Gp:) exit
(Gp:) wait
wait
wait
sleep
sleep
F.R.
F.R.
F.R.
F.R.
(Gp:) ¿forkp?
(Gp:) ¿forkh?
8
(Gp:) El contexto de un proceso está distribuido en varias zonas
(Gp:) CPU
(Gp:) MP
(Gp:) MSec
(Gp:) S.O.
Esbozo de implementación en términos más informáticos
(Gp:) Contexto de memoria (Código y Datos) MP/MSec
(Gp:) Bloque de control (descriptor) del Proceso MP (S.O.)
(Gp:) Contexto del procesador Reg/MP/MSec
(Gp:) Ejecutándose
(Gp:) Bloqueado
(Gp:) pila
9
Esbozo de implementación ( ¿Cuántos procesos? )
¿#Procesos ilimitado o un máximo predeterminado?
maxProcesos: constant:=100;
type idProceso is NATURAL range 0..maxProcesos;
Reservado
(Gp:) procesos : array[1..maxProcesos] of descriptorProceso;
(Gp:) 1
(Gp:) 2
(Gp:) 3
(Gp:) 4
(Gp:) 97
(Gp:) 98
(Gp:) 99
(Gp:) 100
(Gp:) 50
(Gp:) type descriptorProceso is
record
pid: ———-;
—————
end record;
(Gp:) 584
ejecutandose : idProceso;
¿Correcto?
10
Esbozo de implementación ( ¿Cómo dar los PID's? )
type descriptorProceso is
record
pid: idProceso;
—————
end record;
(Gp:) 1
(Gp:) 2
(Gp:) 3
(Gp:) 4
(Gp:) 97
(Gp:) 98
(Gp:) 99
(Gp:) 100
(Gp:) 50
(Gp:) 1..100
¿Problemas?
99 procesos en el sistema
Hago ps y veo un proceso mío (57)
Me dispongo a kill -9 57
Mi proceso termina antes del kill y se crea otro proceso con el código 57
¡ Mato a otro proceso !
(Gp:) Mejor espaciar más los códigos
(Gp:) pid: NATURAL;
(Gp:) 1..65535…
(Gp:) Algo más complejo
dar PID's
(Gp:) 0 ? Descriptor libre
¿ejecutandose?
11
Esbozo de implementación ( ¿Estados y su gestión? )
type unEstado is (ejecutandose, preparado,
espLapso, espFinHijo, zombie);
12
Esbozo de implementación ( ¿Estados y su gestión? )
type unEstado is (ejecutandose, preparado,
espLapso, espFinHijo, zombie);
(Gp:) type descriptorProceso is
record
pid: NATURAL;
estado: unEstado;
end record;
(Gp:) 1
(Gp:) 2
(Gp:) 3
(Gp:) 4
(Gp:) 97
(Gp:) 98
(Gp:) 99
(Gp:) 100
(Gp:) 50
CPU queda libre. ¿A qué Pi se la doy?
Recorro procesos buscando uno que esté preparado
Lento e injusto
Si decido elegir al Pi que lleva más tiempo preparado, lo mejor cola FIFO
(Gp:) type unaCola is record
primero: idProceso := 0;
ultimo: idProceso:= 0;
end record;
(Gp:) preparados: unaCola;
(Gp:) sig: IdProceso;
(Gp:) ejecutandose: idProceso;
Página siguiente |