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 |