Gestión de Procesos1 Horas 1INTRODUCCIÓN4 2PROCESOS Y THREADS10 3GESTIÓN DE MEMORIA8 4ENTRADA / SALIDA2 5SISTEMA DE FICHEROS6 sisOpeTemarioCurso: 14/15.

Slides:



Advertisements
Presentaciones similares
GESTION DE PROCESOS.
Advertisements

DATSI, FI, UPM José M. Peña Programación en C DATSI, FI, UPM José M. Peña Programación en C.
Tabla de Contenido Concurrencia.
TEMA 1 Introducción a la Programación Concurrente
Sistemas Operativos Administración del procesador.
Planificación de Monoprocesadores
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Funciones Útiles fork() Sistemas Operativos.
Planificador de Procesos
ARISO 2 Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)
T5-multithreading SO-Grado Q1.
ADA: lenguaje de programación concurrente
PROGRAMACIÓN PARALELA Tema 5: Análisis de algoritmos paralelos
Administración de procesos y del procesador.
Sistemas en estratos. Descripción: se organiza en una jerarquía de estratos, estando construido cada uno de ellos sobre el otro que tiene menor jerarquía.
Sistemas Operativos Unidad II Procesos.
Base de la biblioteca de threads a nivel usuario del proyecto SODIUM.
S.O.I Temario Curso: 04/05 Horas INTRODUCCIÓN 4 PROCESOS Y THREADS 8
proPar Curso 13/14 4 2, 3, 2 2, 2 5 Computadores Paralelos
Capítulo 2 Procesos y Threads 2.1 Procesos 2.2 Threads
Comunicación entre procesos en Linux
Tareas en Linux · TASK_RUNNING (0): Indica que el proceso en cuestión se está ejecutando o listo para ejecutarse. En este segundo caso, el proceso dispone.
Concurrencia en JAVA JAVA es un lenguaje que tiene soporte de concurrencia, mediante Threads. Un thread es un proceso “liviano” (lightweight process) que.
Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Tipos definidos por el usuario –Parámetros array ilimitados.
Comunicación y sincronización entre procesos
SISTEMAS OPERATIVOS UNIDAD 1..
IMPLEMENTACIÓN DEL ALGORITMO DE PRIORIDADES DUALES EN RT-LINUX
Administración de procesos y del procesador.
Técnicas Digitales III Ejemplo de multiprocesamiento - Semáforo Universidad Tecnológica Nacional Facultad Regional San Nicolás.
¿Qué es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No.
Programación I Teoría VI: Recursividad
Multiprogramación Procesos Cecilia Hernández
Administración del Procesador
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
HILOS Y COMUNICACIÓN ENTRE PROCESOS
PONNHI PONNHI Una Nueva Arquitectura Microkernel Pthreads en Espacio de Usuario José Manuel Rodríguez García Juan A. Rico Gallego Jesús M. Álvarez Llorente.
Semana 5 Subprogramas..
Sistemas Operativos Procesos.
1 Concurrencia Procesos y Programas. 2 Establecer Comunicación entre procesos (memoria común)
Comunicación y sincronización entre procesos Realizado por Kepa Bengoetxea Kortazar
Ing Florencia Ferrigno Tecnicas Digitales 3
Unidad III Administración de procesos
Hilos - Lightweight process - Procesos ligeros
Introducción al Minikernel
Planificación de procesos
Profesor: Rodrigo Sanhueza Figueroa
Capítulo 6: Planificación del CPU – Parte a
Asignación de Espacio No Contiguo
Pablo Abrile1 Threads Lenguajes de Programación I.
Hebras Cecilia Hernández. Qué es un proceso? Consiste Espacio de direccionamiento Código a ejecutar Datos estáticos y dinámicos Pila o stack CPU: PC,
Concepto de proceso Sebastián Sánchez Prieto. Procesos 2  S2P, OGP & IGT Definición de proceso Un proceso es un programa en ejecución Componentes:
Planificación de Procesos
Gestión de procesos Sistemas Operativos Edwin Morales
Gestión de Procesos.
1 Descripción y control de procesos Capítulo 3. 2 Requerimientos de un SO relacionados con procesos Ejecutar concurrentemente múltiples procesos para.
Planificación. Visión General El planificador del SO se construye a partir de un mecanismo para la conmutación de contexto y una política que determina.
Administrador de procesos
CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO
Sistemas Distribuidos
Sistemas Operativos Unidad III Procesos.
Unidad 2 – Gestión de Procesos
Hilos Capítulo 5 Silberschatz Galvin. Copyright © 2006, Intel Corporation. All rights reserved. Intel and the Intel logo are trademarks or registered.
LSI. Freddy Veloz Sistemas Operativos
UTFSM - Sistemas Operativos
PLANIFICACION DEL PROCESADOR
TEMA: PROCESOS y PLANIFICACIÓN
Sesión 8 Procesos.
Desarrollador Profesional de Juegos Programación III Unidad II Hilos de ejecución Threads.
Planificación de uso del procesador Rina Arauz. Planificación de CPU 2 UNAN-Leon La ejecución de un trabajo se compone de secuencias de procesador y de.
Capítulo 2 Procesos y Threads 2.1 Procesos 2.2 Threads
Planificación de CPU Conceptos Básicos Criterios de Planificación Algoritmos de Planificación Planificación con Múltiples Procesadores Planificación Real-Time.
Transcripción de la presentación:

Gestión de Procesos1 Horas 1INTRODUCCIÓN4 2PROCESOS Y THREADS10 3GESTIÓN DE MEMORIA8 4ENTRADA / SALIDA2 5SISTEMA DE FICHEROS6 sisOpeTemarioCurso: 14/15

Gestión de Procesos2 sisOpe2. Procesos y ThreadsCurso: 14/15 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

Gestión de Procesos3 INTRODUCCIÓN Interesa tener máquinas que ejecuten varios procesos al mismo tiempo 18 T1T1 T2T2 T3T3 t Aprovechar tiempos muertos E/S Soluciones elegantes concurrentes Más rapidez con más de una CPU T1T1 T2T2 T3T3 t 13 CPU1 CPU2 Con multiprocesadores también interesa multiplexar las CPU’s pseudoparalelismo

Gestión de Procesos4 PROCESOS (Visión abstracta: Recordar sus llamadas) Dos relaciones típicas entre proceso Padre y proceso Hijo: 1.Procesos independientes: La “shell” crea un proceso para ejecutar un programa de usuario “ls” ls.exe shell P a.Debe cargarse el ejecutable en memoria ls b.Dotarle de registros, pila, etc. H a.El código ya está en memoria 2.Procesos cooperantes: Un servidor Web crea un proceso para atender una petición de un cliente web P b.Dotarle de registros, pila, etc. H Parecido a Threads ¿fork + exec? ¿fork?

Gestión de Procesos5 PROCESOS (Visión abstracta: Recordar sus llamadas) Proceso de arranque y grupos de procesos P1 P2P3 P4 P5 P6 P7 init id:rlevel:action:process /etc/inittab xinetd /etc/rc5.d /etc/rc.d/rc 5 login login as: Password: bash pcarazo: :/bin/bash /etc/passwd PC1> grupo de procesos Red putty ? gdm 0 Halt 1 Monousuario 2 MultiSinRed 3 MultiConRed 5 X11 6 Reboot rlevel

Gestión de Procesos6 PROCESOS (Visión abstracta: Recordar sus llamadas)

Gestión de Procesos7 Esbozo de implementación ¿Cómo es el ciclo de vida de un proceso? CPU Creación P1 P2 P3 P1 ¿P1.read(disco, )?¿P2.sleep(5 )? P2 P3 P2 P3 P4 ¿P3 mucha CPU? Expulsión P3 P4 P3 ¿P1 fin E/S? P1 ¿P4 read(cinta, ) P4 P3 P1 ¿P3 termina? Terminación P1 P2P4 ¿Estados de un proceso? EnEjecución Preparado EnEspera o Bloqueado Activo Ejecu. Prep.Espera

Gestión de Procesos8 Diagrama de transición de estados de un Proceso PreparadoEnEjecuciónEnEspera fork h fork p exit wait sleep F.R. ¿fork p ? ¿fork h ?

Gestión de Procesos9 El contexto de un proceso está distribuido en varias zonas CPU MP MSec S.O. Esbozo de implementación en términos más informáticos Contexto de memoria (Código y Datos)MP/MSec Bloque de control (descriptor) del ProcesoMP (S.O.) Contexto del procesador Reg/MP/MSec Ejecutándose Bloqueado pila

Gestión de Procesos10 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 procesos : array[1..maxProcesos] of descriptorProceso; type descriptorProceso is record pid: ; end record; 584 ejecutandose : idProceso; ¿Correcto?

Gestión de Procesos11 Esbozo de implementación ( ¿Cómo dar los PID’s? ) type descriptorProceso is record pid: idProceso; end record; ¿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 ! Mejor espaciar más los códigos pid: NATURAL; Algo más complejo dar PID’s 0  Descriptor libre ¿ejecutandose?

Gestión de Procesos12 Esbozo de implementación ( ¿Estados y su gestión? ) type unEstado is (ejecutandose, preparado, espLapso, espFinHijo, zombie);

Gestión de Procesos13 Esbozo de implementación ( ¿Estados y su gestión? ) type unEstado is (ejecutandose, preparado, espLapso, espFinHijo, zombie); type descriptorProceso is record pid: NATURAL; estado: unEstado; end record; 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 type unaCola is record primero: idProceso := 0; ultimo: idProceso:= 0; end record; preparados: unaCola; sig: IdProceso; ejecutandose: idProceso;

Gestión de Procesos14 Esbozo de implementación ( ¿Procesos bloqueados? ) espLapso => Muy parecido a preparados, sólo que es necesario indicar cuándo despertarles o cuánto falta para despertarles, type descriptorProceso is record pid: NATURAL; estado: unEstado; sig: idProceso; lapso: NATURAL; end record; espLapso : unaCola; El campo sig me sigue sirviendo para encadenar Otras formas de implementarlo:

Gestión de Procesos15 Esbozo de implementación ( ¿Procesos bloqueados? ) espFinHijo => El fin de un hijo sólo puede estar esperándolo su Padre. Puede no ser necesaria una cola. type descriptorProceso is record pid: NATURAL; padre: idProceso; estado: unEstado; sig: idProceso; lapso: NATURAL; end record; El Padre (P) hace wait (H): -- Localizar H en procesos => h if h.estado = zombie then Liberar recursos del Hijo y continuar al Padre else -- hijo vivo p.estado:=espFinHijo; p.sig:=h; liberar CPU; Un Hijo(H) termina exit: If (p.estado = espFinHijo) & (p.sig = h) then liberar recursos Hijo y continuar Padre else h.estado := zombie y liberar CPU

Gestión de Procesos16 Esbozo de implementación ( Concluyendo ) maxProcesos : constant := 100; type idProceso is NATURAL range 0..maxProcesos; type unEstado is (ejecutandose, preparado, espLapso, espFinHijo, zombie); type descriptorProceso is record pid: NATURAL; padre: idProceso; estado: unEstado; sig: idProceso; lapso: NATURAL; SP: address; memoria: ; ficheros: ; tiempos: ; end record; type unaCola is record primero: idProceso := 0; ultimo: idProceso := 0; end record; procesos : array [1..maxProcesos] of descriptorProceso; ejecutandose: idProceso; preparados, espLapso: unaCola; ¿ fork y exec ?

Gestión de Procesos17 Campos en una entrada a la tabla de procesos Esbozo de implementación ( Otro ejemplo )

Gestión de Procesos18 Esbozo de implementación ( El Cambio de Contexto ) Causas? Llamada al Sistema Fin de Proceso Bien/Mal Interrupción Trap (E/S, F.R.) Mecanismo similar Supongamos como causa “Fin de Rodaja” ejecu- tándose Pi Hw (1) (1)Reconocimiento de la interrupción S.O. Pj Ens. (2) (2)Salvar reg (Pi) y conmutar de pila C/Modula/Ada (3) (3)1Recorrer dormitorio 2Elegir siguiente proceso Ens. (4) (4)Recuperar reg (Pj) y cederle control Planificador Dispatcher ¿No hay procesos preparados?

Gestión de Procesos19 Vector de Interrupciones S.O. Esbozo de implementación ( El Cambio de Contexto ) sleep(10) exit(0) TRAP # INT divu d5,d DIV 0 Se salva el SR y PC Cambio de contexto

Gestión de Procesos20 Threads ( Visión abstracta ) Modelo de procesos más común  Espacios de direcciones disjuntos Registros Código Datos, Pila Ficheros Pi Registros Código Datos, Pila Ficheros Pj forkexec ls.exe Facilita protección Pi  Pj, pero: Creación laboriosa Cambio de contexto pesado (procesador + entorno) TLB’s, cachés,... Comunicación vía mensajes más seguro pero más lento ¿Y si los procesos son cooperantes? Objetivo común Colaboración vs agresión Protección más laxa Pueden desear mantener datos comunes con los menores costes de tiempo

Gestión de Procesos21 BD utilidades Threads ( Visión abstracta ) Procesos Ligeros  Espacios de direcciones no disjuntos Registros Pila Registros Pila Código, Datos Ficheros TiTjServidor de localización de utilidades C1C1 C2C2 CnCn S consulta alta consulta petición respuesta petición ¡ Muy eficaz con multiprocesadores ! Soportados de dos formas: En el espacio del S.O. En el espacio del Usuario Biblioteca

Gestión de Procesos22 Threads ( “Linux” ) int __clone (int (*fn) (void *arg), void *child_stack, int flags, void *arg) Como fork sólo que crea un Thread “Específico de Linux” Thread soportado como tal por el S.O. (no portable) Biblioteca pthread (API POSIX c) int pthread_create (pthread_t * thread, atributos, funcion, argumentos) pthread_t pthread_self (void) int pthread_exit (void *estado) int pthread_join (pthread_t thread, void **estado) ¿ fork + threads ?

Gestión de Procesos23 Threads ( Ejemplos de uso: tonto.c ) #include int main (int argc, char *argv[]){ pthread_t tA, tB; int datoA=0; datoB=0; pthread_create(&tA, NULL, A, NULL); pthread_create(&tB, NULL, B, NULL); pthread_join (tA, NULL); pthread_join (tB, NULL); exit (0); } void *B (void *basura) { datoB = 2000; sleep (5); printf (“datoA=%d\n”, datoA); pthread_exit (NULL); } void *A (void *basura) { datoA = 1000; sleep (5); printf (“datoB=%d\n”, datoB); pthread_exit (NULL); } datoC=0; int datoC; ?

Threads ( Ejemplos de uso: cuentaPar.c ) cuentaPar.c: Número de apariciones de un número en un vector const N = 40; objetivo = 6; numCPUs = 4; var vector array[1..N] of integer; ¿ Algoritmo paralelo ? T0T0 T1T1 T2T2 T3T Gestión de Procesos24

int longRodaja, numVecesLocal[MAX_ESCLAVOS], *vector; void *esclavo (void *parametro) {..... } int main (int argc, char *argv[]) { int i, numVeces, cardinalidad = atoi (argv[1]); int numEsclavos = atoi (argv[2]); pthread_t pids[MAX_ESCLAVOS]; // Pedir memoria e inicializar vector // Crear esclavos y esperar a que terminen su trabajo for (i = 0; i < numEsclavos; i++) pthread_create (&pids[i], NULL, esclavo, (void *) i); for (i = 0; i < numEsclavos; i++) pthread_join (pids[i], NULL); // Sumar los valores de todos e informar del resultado numVeces = numVecesLocal[0]; for (i = 1; i < numEsclavos; i++) numVeces = numVeces + numVecesLocal[i]; printf (“Veces que aparece = %d\n”, numVeces); } %cuentaPar Threads ( Ejemplos de uso: cuentaPar.c ) 25 Gestión de Procesos

// Variables globales int longRodaja, numVecesLocal[MAX_ESCLAVOS], *vector; void *esclavo (void *parametro) { int yo, inicio, fin, i, j, numVeces; yo = (int) parametro; inicio = yo * longRodaja; fin = inicio + longRodaja; // Buscar en mi parte del vector numVeces = 0; for (i = inicio, i < fin; i++) if (vector[i] == NUM_BUSCADO) numVeces++; numVecesLocal[yo] = numVeces; pthread_exit (NULL); } Gestión de Procesos26 Threads ( Ejemplos de uso: cuentaPar.c )

51,2864,260,85 61,1274,860,81 71,1134,920,70 80,9985,490,69 cuentaPar // Recorriéndolo diez veces 2 Xeon E5520 Quad 2,26GHz 8ML3 12GB 500GB Threads ( Ejemplos de uso: cuentaPar.c ) Gestión de Procesos27 EsclavosTiempoAceleraciónEficiencia 15,480 22,7212,011,01 41,4083,890,97 A n = T 1 / T n E n = A n / n

sortPar.c: Ordenar un vector en memoria T0T0 T1T1 T2T2 T3T ordenar T0T0 T2T2 mezclar T0T mezclar Threads ( Ejemplos de uso: sortPar.c ) Gestión de Procesos28

sortPar.c: Ordenar un vector en memoria [Refinamiento] ABCD EF G esclavo (yo: integer); ordenarRodaja(yo); case yo of 0: mezclar(A,B,E); mezclar(E,F,G); 1: ; 2: mezclar(C,D,F); 3: ; end; ? 1.La mezcla es destructiva => vector auxiliar Va Vb Va 2Mezclar requiere haber ordenado … => semáforos Threads ( Ejemplos de uso: sortPar.c ) Gestión de Procesos29 sem_init sem_wait sem_post

#define MAX_ENTERO #define MAX_ESCLAVOS 4 // Solo funciona con 4 esclavos // VARIABLES GLOBALES int cardinalidad, longRodaja; int *vector, *vectorBis; sem_t S1a0, S3a2, S2a0; void imprimir (int *vector) { int i; printf ("Contenido del vector\n"); printf ("====================\n"); for (i=0; i<cardinalidad; i++) { printf ("%6d ", vector[i]); if ((i%10) == 0) printf ("\n"); } printf ("\n"); } void mezclar (int i, int longRodaja, int *vOrg, int *vDst) { int iDst, iTope, j, jTope; iTope = i + longRodaja; j = iTope; jTope = j + longRodaja; for (iDst = i; iDst < jTope; iDst++) { if (i == iTope ) vDst[iDst] = vOrg[j++]; else if (j == jTope ) vDst[iDst] = vOrg[i++]; else if (vOrg[i] < vOrg[j]) vDst[iDst] = vOrg[i++]; else vDst[iDst] = vOrg[j++]; } Threads ( Ejemplos de uso: sortPar.c ) Gestión de Procesos30

void *esclavo(void *parametro) { int yo, inicio, fin, i, j, imenor, menor; int unCuarto, unMedio; yo = (int) parametro; inicio = yo * longRodaja; fin = inicio + longRodaja; unMedio = cardinalidad / 2; unCuarto = cardinalidad / 4; // Ordenar por insercion directa for (i = inicio; i < fin; i++) { imenor = i; menor = vector[i]; for (j = i; j < fin; j++) if (vector[j] < menor) { imenor = j; menor = vector[j]; } vector[imenor] = vector[i]; vector[i] = menor; } // Fase de mezclas. Solo valida para 4 esclavos switch (yo) { case 0: sem_wait (&S1a0); mezclar(0, unCuarto, vector, vectorBis); sem_wait (&S2a0); mezclar(0, unMedio, vectorBis, vector); break; case 1: sem_post (&S1a0); break; case 2: sem_wait (&S3a2); mezclar(unMedio, unCuarto, vector, vectorBis); sem_post (&S2a0); break; case 3: sem_post (&S3a2); break; default: printf ("Error\n"); break; } pthread_exit(NULL); } Threads ( Ejemplos de uso: sortPar.c ) Gestión de Procesos31

int main( int argc, char *argv[] ) { int i, numEsclavos; pthread_t pids[MAX_ESCLAVOS]; cardinalidad = atoi(argv[1]); numEsclavos = MAX_ESCLAVOS; longRodaja = cardinalidad / numEsclavos; // Pedir memoria e inicializar el vector vector = malloc(cardinalidad * sizeof(int)); vectorBis = malloc(cardinalidad * sizeof(int)); for (i=0; i<cardinalidad; i++) vector[i] = random() % MAX_ENTERO; imprimir(vector); // Inicializar semaforos para sincronizar sem_init (&S1a0, 0, 0); sem_init (&S3a2, 0, 0); sem_init (&S2a0, 0, 0); // Crear esclavos y esperar a que terminen su trabajo for (i=0; i<numEsclavos; i++) pthread_create (&pids[i], NULL, esclavo, (void *) i); for (i=0; i<numEsclavos; i++) pthread_join (pids[i], NULL); imprimir(vector); return (0); } sort => 8:350 sortPar => 2:100 Threads ( Ejemplos de uso: sortPar.c ) Gestión de Procesos32

Gestión de Procesos33 pthread_create pthread_join pthread_exit pthread_self Threads ( En el espacio de usuario ) El S.O. no los soporta Cambio contexto rápido Distintos planificadores read, … ¡ Bloqueantes ! Falta de página ¡Planificación expulsora!

Gestión de Procesos34 Threads ( En el espacio del S.O. ) ?

Gestión de Procesos35 Comunicación entre Procesos Los procesos cooperantes necesitan mecanismos para sincronizarse y comunicarse información de forma segura Sincronización  Ordenación temporal de la ejecución de procesos A antes que B Canal de PanamáTortilla de patatas BatirPelarPelar HuevosCebollasPatatas Mezclar, Añadir Sal y Freir Comunicación  Paso de información entre tareas Síncrona o Asíncrona Filtros Unix: who | wc | sed -e ‘s/ [ ]*/:/g’ | cut -d: -f2

Gestión de Procesos36 Condiciones de Carrera La falta de sincronismo entre procesos cooperantes da problemas Canal de Panamá  Barco encallado Tortilla de Patatas  No hay quien se la coma Uso de datos / recursos comunes  Inconsistencia ¡Que buen negocio! ¡Me tangan!

Gestión de Procesos37 Condiciones de Carrera (Modelización con threads) Ingreso de Taxista 1 = Ingreso de Taxista 2 = Total recaudacion = int cuenta; void *taxista(void *parametro) {..... } int main( int argc, char *argv[] ) { int i, numEsclavos; pthread_t pids[MAX_ESCLAVOS]; numEsclavos = atoi(argv[1]); cuenta = 0; // Crear esclavos y esperar a que terminen su trabajo for (i=0; i<numEsclavos; i++) pthread_create (&pids[i], NULL, taxista, (void *) i); for (i=0; i<numEsclavos; i++) pthread_join (pids[i], NULL); printf ("Total recaudacion = %d\n", cuenta); return (0); }

Gestión de Procesos38 Ingreso Condiciones de Carrera (Modelización con threads) void *taxista (void *parametro) { // Variables recaudacion = 0; mio = 0; do { espera = random() % MAX_ESPERA; for (i=1; i<espera; i++); importe := random (maxImporte); mio := mio + (importe / RATIO_TAXISTA); cuenta := cuenta + importe – (importe / RATIO_TAXISTA); recaudacion := recaudacion + importe; } while (mio < SUELDO_DIA); printf (“Ingreso de Taxista %d = %d\n”, yo, recaudacion – mio); pthread_exit (NULL); } Hacer Carrera Buscar Cliente

Gestión de Procesos39 Condiciones de Carrera (Modelización con threads) Threadspc1:4Corespc9:8Cores Fallos x

Gestión de Procesos40 3: cuenta := cuenta + importe Condiciones de Carrera (El problema) 3.1: PUSH importe 3.2: PUSH cuenta 3.3: ADDP 3.4: POP cuenta 3.1, 3.2 T1 T cuenta T1.importe T1.SP 3.1, T2.importe T2.SP 3.3, cuenta 3.3, cuenta ¿problema?

Gestión de Procesos41 Exclusión mutua y Región crítica (La solución) RC Aquí como máximo un Pi Exclusión Mutua Integridad Datos Comunes Aquí cero, uno o más Pi Los Pi indicarán cuándo EntranEnRC y cuándo SalenDeRC

Gestión de Procesos42 Exclusión mutua y Región crítica (La solución) EntrarEnRC; cuenta := cuenta + importe – (importe div ratioTaxista); SalirDeRC; REQUISITOS En una misma Región Crítica no más de un proceso Sin supuestos: #µP, #Pi, velocidades relativas,..... Ningún Pi fuera de su Región Crítica bloqueará a otros Pj Decisión de quién entra a una Región Crítica en un tiempo finito

Gestión de Procesos43 Implementación de la Exclusión Mutua Mecanismos: Inhibición de interrupcionesSemáforos Cerrojos (espera activa)Monitores HwSw Lenguaje S.O. Inhibición de interrupciones Taxistas InhibirInterrupciones cuenta := cuenta + importe PermitirInterrupciones  RC muy corta o pueden perderse interrupciones  Exclusión total vs parcial DirecciónGeneralDeTráfico repeat aguardarAgazapados y ¡foto! InhibirInterrupciones numeroMultas++ PermitirInterrupciones until cubiertoCupo  Sólo válido en monoprocesador  Peligroso en manos del usuario  Útil dentro del propio S.O.

Gestión de Procesos44 Implementación de la Exclusión Mutua ( Cerrojos ) Una variable “cerrojo” por cada RC distinta que indica Libre/Ocupada Taxistas Entrar (RCTaxistas) cuenta := cuenta + importe Salir (RCTaxistas) Guardia Civil Entrar (RCDGT) numeroMultas++ Salir (RCDGT) while RCT = ocupada do null; RCT := ocupada cuenta := cuenta + importe; RCT := libre entrartst.bRCT bnzentrar move.b#$FF,RCT pushimporte pushcuenta addp popcuenta salirmove.b#$00,RCT RCTdc.b0 ¡ No funciona !

Gestión de Procesos45 Implementación de la Exclusión Mutua ( El cerrojo falla ) T1 T2 00 RCT entrartst.bRCT tst.bRCT bnzentrar move.b#$FF,RCT T1.SR Z 1 FF RCT T2 dentro RCT bnzentrar move.b#$FF,RCT FF RCT ¡¡ T1 también dentro RCT !!

Gestión de Procesos46 Implementación de la Exclusión Mutua ( Un cerrojo seguro? ) El Hw ayuda con una instrucción atómica que consulta y cambia valor tas.bcerrojo, valor tst.bcerrojo move.bvalor,cerrojo Algoritmos: Dekker, Dijkstra, Knuth, Peterson, entrartas.bRCT,#$FF bnzentrar pushimporte pushcuenta addp popcuenta salirmove.b#$00,RCT RCTdc.b0 F.R.¿Habrá problemas? No funciona en multiprocesador ya que TAS es ininterrumpible dentro de un procesador, pero supone dos accesos al bus: 1Lectura del cerrojo 2Modificación del cerrojo ¡SI!

Gestión de Procesos47 Implementación de la Exclusión Mutua ( Un cerrojo seguro! ) T1 T2 00 RCT tas.bRCT,#$FF tas.bRCT,#$FF bnzentrar T1.SR Z 1 FF RCT FF RCT bnzentrar T1 en RCT FF RCT T2 no puede entrar en RC mientras está T1 tas.bRCT,#$FF bnzentrar

Gestión de Procesos48 Implementación de la Exclusión Mutua ( TAS todavía falla! ) TAS  PedirBus, Leer, PedirBus, Escribir  P1  T1PB, L1, PB, E1  P2  T2PB, L2, PB, E2 ???  P1  P2 RCT L1, E1, L2, E2 T1 T2 L2, E2, L1, E1 T2 T1 L1, L2, E1, E2 T1 T2 tas.bRCT,#$FF bnzentrar PHPH tasl.bRCT,#$FF bnzentrar ¡ Todavía dos problemas ! Espera Activa Inversión de prioridades PLPL deadLock ¿ Qué hacer ? TASL “TAS with Lock”  BusLock, Leer, Escribir, BusRelease ( El Hw nos ayuda )

Gestión de Procesos49 Implementación de la Exclusión Mutua ( RC POSIX ) int pthread_mutex_lock (pthread_mutex_t *regionCritica) int pthread_mutex_unlock(pthread_mutex_t *regionCritica) ¿Posible implementación (sin espera activa)? type pthread_mutext_t is record libre : BOOLEAN; cola : unaCola; end record; F RCTPiPj lock (RCT): inhibir interrupciones salvarEstado(ejecutandose) if RCT.libre then RCT.libre = FALSE elsemeter (ejecutandose, RCT); ejecutandose = planificar(); recuperarEstado(ejecutandose) rte /*Se habilitan interrupciones*/ Multiprocesador ? tasl ¡ Ojo !

Gestión de Procesos50 Implementación de la Exclusión Mutua ( Semáforos ) Soportado por el S.O. garantiza exclusión mutua sin espera activa type Semaforos is private; Inicializar (S: Semaforos; Valor: NATURAL); Bajar (S);-- Puede bloquear al proceso (Si Valor = 0) Subir (S);-- Puede desbloquear a UN proceso Operaciones Atómicas Dar soporte a RC con semáforos es fácil: Inicializar (S_RCT, 1)Inicializar (S_RCGC, 1) Bajar (S_RCT)Bajar (S_RCGC) Cuenta := Cuenta + ImportenumeroMultas++ Subir (S_RCT)Subir (S_RCGC)

Gestión de Procesos51 Implementación de la Exclusión Mutua ( Semáforos ) Precisando la semántica: P.Bajar (S)  IF Valor(S) > 0 THEN Valor (P.Bajar(S)) = Valor(S) – 1 ELSE P deja UCP y se bloquea esperando P’.Subir(S) P.Subir(S)  IF Hay_algun_Pi_esperando_en (S) THEN Sacar a uno de ellos de espera INDETERMINISMO Proceso continuado Proceso que coge UCP JUSTICIA ELSE Valor (P.Subir(S)) = Valor (S) + 1

Gestión de Procesos52 Implementación de la Exclusión Mutua ( Semáforos ) private type Semaforos is record valor : NATURAL; cola : unaCola; end record; procedure Inicializar (S: out Semaforos; valor: NATURAL) is begin S.valor := valor; end Inicializar; Esbozo de implementación: 0 SPiPkPj ¿Dónde están los semáforos? Hacen falta operaciones del estilo: crear, conectarse, destruir Exclusión mutua, Salvado estado Pi Dispatcher

Gestión de Procesos53 Implementación de la Exclusión Mutua ( Semáforos ) procedure Bajar (S: in out Semaforos) is begin if S.valor = 0 then encolar (ejecutandose, S.cola); planificar; else S.valor := S.valor - 1; endif; end Bajar; procedure Subir (S: in out Semaforos) is begin if S.cola.primero /= 0 then encolar (sacarProceso(S.cola), preparados); planificar; else S.valor := S.valor + 1; endif; end Subir;

Gestión de Procesos54 Implementación de la Exclusión Mutua ( Semáforos POSIX ) int sem_init(sem_t *S, int global, unsigned int valor) int sem_wait(sem_t *S) int sem_post(sem_t *S) int sem_destroy (sem_t *S)

Gestión de Procesos55 Paso de mensajes Debilidades del Sincronismo + Memoria Común: Primitivas de bajo nivel (Inhibir Interrupciones, TASL, Semáforos) Inviable en sistemas débilmente acoplados sin memoria común Solución: Envío y recepción de mensajes P org P dst Enviar (P dst, msj)Recibir (P org, msj) Escribe Lee Primera aproximación a la sintaxis: void enviar (int Pdestino,void recibir (int Porigen, char * msj);char * msj); ¿Puede fallar enviar/recibir? ? ? int

Paso de mensajes ( Ejemplos de uso: cuentaParMsj.c ) ¿Cómo podría ser cuentaPar.c si no hay memoria común? …0 6 7 …6 2 5 …2 1 7 … + 8 esclavo1esclavo2esclavo3esclavo4 maestro …0 6 7 …6 2 5 …2 1 7 … El vector lo tiene un proceso “maestro” El maestro:reparte “envía” trabajo a los “esclavos” y recoge “recibe” resultados …0 6 7 …6 2 5 …2 1 7 … Gestión de Procesos56

Gestión de Procesos57 Paso de mensajes ( Ejemplos de uso: cuentaParMsj.c ) #define longRodaja (N/4) int vector[N], iRodaja; int veces, vecesLocal; // Repartir trabajo iRodaja = 0; for e in 1..4 { enviar (e, &vector[iRodaja], longRodaja); iRodaja += longRodaja; } // Recoger resultados veces = 0; for e in 1..4 { recibir (e, &vecesLocal, 1); veces += vecesLocal; } #define longRodaja (N/4) int rodaja[longRodaja]; int veces; recibir (0, rodaja, longRodaja); veces = contarEn (rodaja); enviar (0, &veces, 1); maestro esclavo

Gestión de Procesos58 Paso de mensajes (muchas semánticas) rec (Po, msj) env (Pd, msj) Pd¿Bloqueo? El bloqueo dependerá de la  |  de mensajes  msj  Se le entrega a Pd y continua  msj  Se bloquea a Pd hasta No siempre Tiempo Real Tolerancia a Fallos Bloquear Bloquear un máximo No Bloquear int recibir (int Porg, char * msj, int TmaxEsp)  7 0 ? ? Po ¿Bloqueo? ¿Recibió Pd? Po Independencia del enlace de comunicación

Gestión de Procesos59 Paso de mensajes (Cuestiones de Diseño) Mensajes de longitud fija vs variable Capacidad de almacenamiento0..  Envío por copia vs referencia Comunicación Directa vs Indirecta Pi B PjPi Pj Simétrica vs Asimétrica Unidireccional vs Bidireccional

Gestión de Procesos60 Paso de mensajes (Mensajes de longitud fija vs variable) Longitud Fija El S.O. siempre envía el total La aplicación distingue distintos msj. Simplifica la gestión de la capacidad de almacenamiento del canal Longitud Variable El S.O. envía lo que diga la aplicación ¿Cómo? 110 Mensaje de 110 bytes En el propio mensaje enviar (Pdest, msj, 110) En la llamada

61 Paso de mensajes (Mensajes de longitud fija vs variable) MINIX 3 typedef struct { int m_source; int m_type; union { mess_1 m_m1; mess_2 m_m2; mess_3 m_m3; mess_4 m_m4; mess_5 m_m5; mess_7 m_m7; mess_8 m_m8; } m_u; } message; m_source m_type m1_i1 m1_i2 m1_i3 m1_p1 m1_p2 m1_p3 m_source m_type m2_i1 m2_i2 m2_i3 m2_l1 m2_l2 m2_p1 m_source m_type m3_i1 m3_i2 m3_p1 m3_ca1 m_source m_type m4_i1 m4_i2 m4_i3 m4_i4 m4_i5 Práctica 4: Nueva llamada SO Proceso70.if (proceso_vivo(84) # Llamada 57

Gestión de Procesos62 Paso de mensajes (Capacidad de almacenamiento 0..  ) Ilimitada (  ) PoPd PoPd ¡Nunca Bloqueo! Limitada ( 8 ) PoPd PoPd Hueco  Sin Bloqueo ¡No hay Hueco! Bloqueo Sin Bloqueo Estado = Lleno Comunicación Asíncrona Nula ( 0 ) PoPd ¡Siempre Bloqueo! PoPd Espera a Pd.recibir PoPd Cita “Rendez-vous” PoPd Comunicación Síncrona Po sabe que Pd recibió ¿Y aquí?

Gestión de Procesos63 PoPd Paso de mensajes (Envío por copia vs referencia) Escribir env (Pd, msj) 1 rec (Po, msj) 2 ¡ 2 copias extra por cada envío/recepción ! Leer Envío por referencia PoPd pedirBuffer Escribir env (Pd, msj) rec (Po, msj) Leer liberarBuffer Complejidad pedir/liberar Buffer ¿Y si no hay memoria común? ¿Seguridad?

Gestión de Procesos64 Paso de mensajes (Comunicación Directa) Indicación explícita A qué proceso se desea enviar De qué proceso se desea recibir ClienteServidor ¿ es primo? SÍrepeat read (msjp.num);recibir (Pc, &msjp); enviar (Ps, &msjp);enviar (Pc, recibir (Ps, &msjr);respuesta(msjp)) imprimir (msjr.esPrimo)forever forever Simétrica

Gestión de Procesos65 Paso de mensajes (Comunicación Directa “Características”) Creación automática del enlace PoPd Necesidad de conocer los Pid’s de los procesos De Pi a Pj SÓLO un enlace en cada sentido ClienteServidor esPrimo? Hora? ClienteServidor ? Tipo de mensaje ¿Todo resuelto? ClienteServidor PPPPPPPH Un enlace asocia SÓLO a dos procesos

Gestión de Procesos66 Paso de mensajes (Un enlace asocia SÓLO a dos procesos) C1 C2 S C1 C2 S repeat ifrecibir (PC1, &msjp ) then enviar (PC1, respuesta (msjp)); elsifrecibir (PC2, &msjp ) then enviar (PC2, respuesta (msjp)); forever Servidor Inanición Espera Activa, 1 Mitigada? 50 Clientes???? ! Demasiadas pegas ¡

Gestión de Procesos67 Paso de mensajes (Comunicación Directa Asimétrica) Mejor admitir un recibir de cualquier proceso (no uno concreto) C1 C2 S int recibir (char * msj) Pid del proceso remitente int recibir (int * remitente, char * msj) equivalentes repeat remitente := recibir (&msjp); enviar (remitente, respuesta (msjp)); forever Servidor ¿Más de un servidor? int enviar (char * msj) Pid del proceso que recibió??? C S1 S2

Gestión de Procesos68 Paso de mensajes (Comunicación Indirecta) bPeti PCPS 1  1 bPeti PC PS 1 PS m 1  M bPeti PC 1 PC n PS 1 PS m N  M ¿Quién recibe? Indeterminismo Justicia Integridad bPeti PC 1 PC n PS N  1 ¿De quién recibí? PC n enviar (buzon, msj)recibir (buzon, msj) int recibir (buzon, msj) PC n

Gestión de Procesos69 Paso de mensajes (Comunicación Indirecta) Los enlaces pueden ser Unidireccionales o Bidireccionales PCPS ¿ Problemas ? PC 1 PS PC 2 ¿ Y aquí ? Lo normal Unidireccionales: bPeti PC PS 1 PS 2 bResp ¿ Código del Cliente y de los Servidores ? Lo más general: B1 P2 P4 P5 B2P3 P1 Varios Procesos Varios Buzones Todo dinámico

Gestión de Procesos70 Paso de mensajes (Comunicación Indirecta) type Buzones is private; functionCrear(nombreB: Nombres ) return Buzones; functionConectarse(nombreB: Nombres) return Buzones; procedureEnviar(b: in out Buzones; msj: Mensajes); procedureRecibir(b: in out Buzones; msj: out Mensajes); procedureDestruir(b: in out Buzones); Un modelo: Capacidad * *  Propietario * Excepción  buzonInexistente,... ¡ Problemática Destrucción ! Mensajes en el buzón Procesos bloqueados Referencias a buzones destruidos mqd_t mq_open (const char *name, int oflag, …) int mq_send (mqd_t mqid, const char *msgptr, size_t msgsz, unsigned msgprio) ssize_t mq_receive (mqd_t msid, char *msgp, size_t msgsz, unsigne *msgprio) int mq_close (mqd_t mqid) POSIX

Gestión de Procesos71 Planificación de Procesos ( Criterios ) Planificar  Elegir el siguiente Pi a ejecutar JUSTICIA EFICIENCIA RENDIMIENTO MINIMIZAR TIEMPOS Criterios Carga Sin CPU Ejecutándose Pi Tiempo de Retorno CPU Tiempo útil Tiempo inútil Tiempo de Espera ¿Tiempo de Respuesta? Pi Criterios difícilmente alcanzables: Favorecer Pi  Perjudicar Pj

Gestión de Procesos72 Planificación de Procesos ( P CPU vs P E/S ) P CPU P E/S Periodos largos de CPU Periodos cortos de CPU ? ¿Cómo reconocerlos? Abandona voluntariamente la UCP

Gestión de Procesos73 Sistemas Batch No expulsores o expulsores con un quantum grande Reducen cambios de contexto y mejoran el rendimiento Por niveles, Primero en llegar primero en servir FCFS, Más corto el siguiente SJF, Tiempo restante menor SRTN Sistemas interactivos Expulsores: evita la monopolización de la CPU Round-Robin, prioridades, múltiples colas, Más corto el siguiente SPN (envejecimiento) Sistemas de tiempo real Monotónico en frecuencia Deadline más próximo el siguiente Planificación de Procesos ( Políticas )

Gestión de Procesos74 Planificación de Procesos ( Por niveles ) Planificación a medio plazo Memoria Planificación a corto plazo CPU CPU I T2 T2T2 T3T3 T5T5 T 1, T 2, T 3, T 4, T 5, T 6 S.O. Entrada al sistema frecuencia alta frecuencia baja

Gestión de Procesos75 Planificación de Procesos ( Primero en llegar FCFS ) Sólo cuando un proceso abandona voluntariamente la CPU, la misma se asigna al proceso que lleva más tiempo preparado (FIFO) DC A B AD B CD B C A E/S Sencillo, pero  Ausencia de política DCBA DCBA Tesp Tret 9 14 Tesp Tret 6 11 “Efecto convoy” {P E/S } n P UCP P E/S {P E/S } n-1 P UCP E/S T >> T <

Gestión de Procesos76 Planificación de Procesos ( Efecto convoy ) P UCP = {10UCP + 2E/S}*P E/S = {1UCP + 2 E/S}* P UCP P E/S CPU al 100%, pero tan sólo 30 unidades de tiempo en E/S CPU al 100% y además, 55 unidades de tiempo en E/S P UCP P E/S ??

Gestión de Procesos77 Planificación de Procesos ( El más corto primero SJF ) Objetivo: Minimizar Tesp/ret CPU 3458 ¿Óptimo? ¿Dónde esperan los procesos? CPU preparados ¿Aplicable SJF en planificación a largo y a corto plazo? ¿Más corto? Tiempo total de CPU Lo declara el usuario Si engaña  KILL ¿Más corto? Sistemas interactivos Contraejemplo A(2) B(4) C(1) D(1) E(1)

Gestión de Procesos78 Variante expulsora del SJF. Cuando llega un trabajo nuevo, comparar su petición de tiempo con el tiempo que le queda al actual. Seleccionar el menor. Favorece a los trabajos nuevos A(2) B(4) C(1) D(1) E(1) ¿Tiempo medio de espera? Planificación de Procesos ( Tiempo restante menor SRTN )

Gestión de Procesos79 Planificación de Procesos (Round Robin) “Todos iguales”: Turno Rotatorio o Rodajas de Tiempo A cada Pi que pasa a ejecución se le dá una rodaja “cuanto” de tiempo aLa consume totalmente y se le expulsa Pi rodaja bLa usa parcialmente y abandona voluntariamente la UCP Pi sleep, wait, exit Política FIFO de gestión de la cola de preparados Dos cuestiones de diseño: 1¿Cómo elegir el tamaño de la rodaja? 2¿Cómo determinar el fin de rodaja? Ley del 80%

Gestión de Procesos80 Planificación de Procesos (Round Robin) 1¿Cómo elegir el tamaño de la rodaja?Sea Tcc = 5 mseg (mucho) aRodaja pequeña 20 mseg => Burocracia del 20% bRodaja grande 500 mseg => Burocracia del 1% UCP útil Respuesta lenta a usuarios interactivos ¿Degenera en FCFS? Mejor interactividad Ejemplo: P1, P2, P3 => 24, 3 y 3. Rodajas 4 vs 12 y Tcc = 0,5 P1P2P3P1 33,5 P1P2P3P1 31,5 Valores comunes: mseg

Gestión de Procesos81 Planificación de Procesos (Round Robin) 2¿Cómo determinar el fin de rodaja? aUna interrupción periódica P1P2P3P4 sleep ¿Somos justos con P3? ¿viable? F(int) en [1µseg..20mseg] Dar 2 rodajas Resetear interrupción bSumar ticks de una interrupción más frecuente P1P2 sleep P3P4

Gestión de Procesos82 Planificación de Procesos (Prioridades) “Unos más importantes que otros”: Cada Pi prioridad explícita 0 N N 0 mín máx expulsora P3P3 P7P7 P1P1 UCP siempre ejecuta Pi más prioritario UCP libre  ejecutar Pi más prioritario Igualdad de prioridad  FCFS, Round Robin Prioridades estáticas vs dinámicas Sencillo pero inanición P3P3 P7P7 P1P1 P9P9 ¿ tiempo real ? no expulsora P3P3 P7P7 P1P1

Gestión de Procesos83 Planificación de Procesos (Prioridades dinámicas) aEvitar la inanición: Disminuir la prioridad a medida que se usa la UCP Aumentar la prioridad si se está tiempo en preparados ¿ Favorece a los trabajos cortos ? bP E/S vs P UCP Favorece a los Pi ligados a E/S ¿Cuáles son P E/S ? ¿Todo el tiempo será P E/S ? P E/S aquellos que usen una parte menor de la rodaja de UCP Ejemplo con rodajas de 100 mseg: P1 usa 2 mseg de UCP  P E/S P2 usa 25 mseg de UCP  P UCP Prio (P1) = 100/2 = 50 Prio (P2) = 100/25 = 4 ¿Rango de prioridades [0..N]? Estáticas muy bajo  16 Dinámicas muy variable

Gestión de Procesos84 Planificación de Procesos (Múltiples colas) “Mezcla de políticas”: Cada Pi asociado a una cola de forma estática Prioridad FCFS Round Robin Quantum Dos elecciones: 1Seleccionar cola 2Seleccionar proceso dentro de la cola ¿Expulsora?

Gestión de Procesos85 Planificación de Procesos (Múltiples colas realimentadas) “Mezcla de políticas”: Cada Pi asociado a una cola de forma dinámica aMenos Cambios de Contexto Prioridad Rodajas Variables Rodajas para Pi  1, 2, 4, 8, 16 bFavorecer selectivamente P E/S Prioridad 3Terminal 2E/S 1Rodaja corta 0Rodaja larga Consumir rodajas: Bajar de prioridad

86 Planificación de Procesos (MINIX 3) /usr/src/kernel/proc.h PiPi SI consumió su rodaja Nueva rodaja Prioridad++ ¡Menor! Encolar_Al_Final SINO Encolar_Al_Principio sched Preparados MaxPrioridad MinPrioridad RoundRobin proc[log].p_nextready

Gestión de Procesos87 Planificación de Procesos ( Pi más corto siguiente SPN ) CPU preparados ¿Más corto? SJFSPN Tiempo de próxima posesión de UCP ? ¿Predicción? (  i )   i+1 = F ( t i,  i )  i+1 =  t i + (1-  )  i y  = 1/2 Predicción t i   i 

Gestión de Procesos88 Dado m eventos periódicos evento i ocurre en el periodo P i y precisa C i segundos El sistema es planificable si Hard real time vs Soft real time Eventos: periódicos vs aperiódicos (Leer las secciones 7.4.2, y 7.4.4) Planificación de Procesos ( Sistemas de Tiempo Real )

Gestión de Procesos89 Separar qué se puede hacer de cómo hacerlo Un proceso puede saber cuáles de sus threads hijos son los más importantes y asignarles prioridad Algoritmo de planificación parametrizado Mecanismo en el kernel Los procesos de usuario ponen el valor de los parámetros Los procesos de usuario indican la política Planificación de Procesos ( Política vs Mecanismo ) pthread_attr_setschedpolicy(…) => FIFO, RR, OTHERS

Gestión de Procesos90 Quantum por proceso de 50 mseg Cada thread ejecuta 5 mseg de ráfaga de CPU Planificación de Threads ( Espacio de usuario )

Gestión de Procesos91 Planificación de Threads ( Espacio de kernel ) Quantum por proceso de 50 mseg Cada thread ejecuta 5 mseg de ráfaga de CPU

Gestión de Procesos92 Sistemas multiprocesador µP1µP2µP3µP4 Cada µP su cola Peligro de carga desequilibrada µP1µP2µP3µP4 ¡ Ojo !  Spin Lock Planificar  ¿Qué thread? ¿En qué núcleo? 1.Tiempo compartidoThreads independientesCola única No escalable con aumento núcleos Espera activa si FR  Spin Lock ¡Estoy en RC!  Alarga rodaja Problemática caches  Afinidad

Gestión de Procesos93 Sistemas multiprocesador Ordenando claves “burbuja” en Intel Core 2 Quad Q6600 2,46GHz µP 0 4MB L2 µP 1 µP 2 4MB L2 µP 3 sched_setaffinity

Gestión de Procesos94 Sistemas multiprocesador 2.Espacio compartidoThreads cooperantesApropiarse {µP} n Núcleo ocioso cuando Pi.bloqueado Sin multiprogramación  ¡Menos burocracia! Sin “n” núcleos libres no me ejecuto Servidor Web con {threads} variable

Gestión de Procesos95 Sistemas multiprocesador 3.Planificar por pandillasThreads cooperantesTiempo/Espacio Espacio compartido Tiempo compartido FIN