Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Tema 3. Gestión Avanzada de Procesos Juan Piernas Cánovas Departamento de Ingenierı́a y Tecnologı́a de Computadores Universidad de Murcia Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Índice 1 Planificación de procesos en multiprocesadores Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos 2 Planificación de procesos de tiempo real Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano 3 Gestión de procesos en Linux Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Multiprocesadores de memoria compartida 2 o más CPUs que comparten una RAM común Comunicación entre CPUs y módulos de RAM mediante una red de interconexión: bus, crossbar, red omega,. . . Según el tiempo de acceso a memoria: UMA (Uniform Memory Access): módulos RAM compartidos NUMA (Non-Uniform Memory Access): módulos RAM locales pero compartidos lógicamente cc-NUMA: NUMA con cachés coherentes Propiedad importante de los multiprocesadores: el valor que lee una CPU de una palabra puede no coincidir con lo que escribió previamente en esa misma palabra Supondremos que todos los procesadores son iguales (aunque hay casos en los que la E/S sólo se puede hacer en ciertos procesadores) Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Sistema operativo privado por CPU CPU 1 CPU 2 CPU 3 CPU 4 Memory Has private OS Has private OS Has private OS Has private OS 1 2 Data Data 3 4 Data Data OS code I/O Bus Código del SO compartido y copia privada de los datos Ventajas: se comparten dispositivos de E/S y el reparto de la memoria es flexible Inconvenientes: No hay balanceo de carga (los procesos no pueden cambiar de CPU y los hijos van a la misma CPU que el padre) No se comparten páginas (las que le sobran a un SO no las puede aprovechar otro) No se comparten datos. Ejemplo: cachés de buffers independientes. ¿Qué pasa si se modifica el mismo bloque de disco en más de una caché? Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Multiprocesadores amo-esclavo CPU 1 CPU 2 CPU 3 CPU 4 Memory Master runs OS Slave runs user processes Slave runs user processes Slave runs user processes User processes I/O OS Bus El SO en una única CPU en donde se atienden todas las llamadas al sistema El resto de CPUs ejecutan procesos que se reparten la memoria que deja libre el SO Se resuelven casi todos los problemas del modelo anterior Inconveniente: con muchos procesos y CPUs, el amo se convierte en un cuello de botella al tener que atender todas las llamadas al sistema Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Multiprocesadores simétricos (SMP) CPU 1 CPU 2 CPU 3 CPU 4 Runs users and shared OS Runs users and shared OS Runs users and shared OS Runs users and shared OS I/O Memory OS Locks Bus Una única copia del SO que puede ejecutar cualquier CPU Una llamada al sistema se atiende en la CPU en la que salta ⇒ no hay un amo que sea cuello de botella Ventajas: balanceo dinámico de procesos y de memoria Problema: proteger las estructuras de datos globales del SO: Solución incorrecta: convertir el SO en una gran sección crı́tica Solución correcta: dividir el SO en sec. crı́ticas independientes y proteger las estructuras globales individualmente ¡Esta es la organización más común hoy en dı́a! Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Sincronización de multiprocesadores Solución incorrecta: deshabilitar interrupciones (locales) Solución: instrucción TSL con bloqueo de bus. Si no hubiera bloqueo de bus: Word 1000 is initially 0 CPU 1 Memory CPU 2 1. CPU 1 reads a 0 2. CPU 2 reads a 0 3. CPU 1 writes a 1 4. CPU 2 writes a 1 Bus Problemas de TSL: Puede interactuar negativamente con el protocolo de coherencia de cachés (TSL es de escritura): Solución 1: leer palabra y ejecutar TSL sólo si palabra == 0 Solución 2: pausa aleatoria entre ejecuciones de TSL Supone una espera activa. Posible solución: cambiar de proceso si la espera activa dura ya cierto tiempo Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Planificación de procesos Bidimensional: qué proceso y en qué CPU Se debe tener en cuenta la relación entre procesos: independientes (procesos de usuarios distintos) y dependientes (make paralelo, hilos de un proceso,. . . ) Importancia de los detalles del hardware (cachés, etc.) El algoritmo de planificación especı́fico es menos importante (FCFS puede ser sólo un poco peor que un RR) Con varios procesadores, una planificación eficiente que aproveche al 100 % las CPUs es todavı́a más complicada Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Procesos independientes Una única estructura de datos para los procesos listos que se seleccionan mediante un algoritmo FCFS, multinivel, etc.: 0 1 2 3 4 5 6 7 8 9 CPU CPU 4 goes idle 10 11 12 13 14 15 Priority 7 6 5 4 A D F 3 2 1 0 1 2 3 5 6 7 8 9 CPU 12 goes idle 10 11 12 13 14 15 B E C G H J K I L 0 A Priority 7 6 5 4 M N (a) G H J K L (b) 1 2 3 5 6 7 8 9 B 10 11 13 14 15 Priority 7 6 5 4 B C D E F 3 2 1 0 0 A I M N C D F 3 2 1 0 E G H J K L I M N (c) Balanceo dinámico de la carga, aunque la estructura de datos se puede convertir en un cuello de botella Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Procesos independientes Planificación inteligente: dar un poco más de CPU a los procesos que posean un bloqueo repetitivo (spinlock) Planificación por afinidad: intentar que un proceso se ejecute en la misma CPU de antes (posibles éxitos en caché y TLB) Planificación de dos niveles: Nivel superior: al crear un proceso se asigna a una CPU. Si una CPU se queda sin procesos, se le asigna uno de otra CPU Nivel inferior: cada CPU tiene una colección de procesos que planifica por sı́ misma con su propio algoritmo Beneficios: Distribución más o menos uniforme de la carga Afinidad de caché (como en el 2o tipo de planificación) Menos competencia por la estructura de datos global Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Procesos relacionados Cuando hay procesos o hilos relacionados, lo mejor es que se ejecuten a la vez en procesadores diferentes Si se planifican independientemente, puede surgir el siguiente Thread A running problema: 0 CPU 0 A0 B0 A0 B0 Time 0 B1 A1 100 B0 B1 A1 Reply 2 Reply 1 CPU 1 A0 Request 2 Request 1 B1 200 A1 300 400 500 600 La planificación de procesos relacionados se asemeja al problema del reparto de marcos de página donde hay que: evitar la hiperpaginación (≡ demasiados cambios de contexto) asignar a un proceso un no mı́nimo de marcos para que progrese adecuadamente (≡ no mı́nimo de procesadores) Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Procesos relacionados Planificación de espacio compartido Cuando surge un nuevo grupo de procesos (o hilos), asigna en exclusiva a cada proceso del grupo una CPU libre ⇒ Si el proceso se bloquea, la CPU se desperdicia Si no hay suficientes CPUs libres, ningún proceso del grupo se asignará a una CPU y, por tanto, ninguno se podrá ejecutar Lo ideal es que el no de componentes del grupo se adapte al no de procesadores disponibles Planificación ideal para las aplicaciones (no hay cambios de contexto) pero algunas CPUs se pueden infrautilizar 8-CPU partition 6-CPU partition 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Unassigned CPU Juan Piernas Cánovas 4-CPU partition 12-CPU partition Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Multiprocesadores de memoria compartida Sistemas operativos para multiprocesadores Sincronización de multiprocesadores Planificación de procesos Procesos relacionados Planificación tipo pandilla Caracterı́sticas: Un grupo de procesos (pandilla) se planifica como una unidad Todos los miembros de una pandilla se ejecutan a la vez en diferentes CPUs, que comparten con otros procesos Todos los miembros de una pandilla inician y terminan sus porciones de tiempo juntos Lo importante: todas las CPUs se planifican a la vez de forma periódica (aunque alguna quede ociosa mientras tanto) CPU 0 0 A0 1 A1 2 A2 3 A3 4 A4 5 A5 1 B0 B1 B2 C0 C1 C2 2 Time 3 slot 4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4 E5 E6 A0 A1 A2 A3 A4 A5 5 B0 B1 B2 C0 C1 C2 6 D0 D1 D2 D3 D4 E0 7 E1 E2 E3 E4 E5 E6 Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Sistemas de tiempo real Los sistemas de tiempo real (STR) cada vez más importantes: experimentos de laboratorio, robótica, control aéreo, etc. La exactitud del sistema depende tanto del resultado lógico de un cálculo como del instante en el que se produzca el resultado Suele ser crı́tico el tiempo de respuesta a sucesos externos (tiempo de reconocer y tratar interrupciones) Caracterı́sticas de los STR actuales: Cambios rápidos de procesos o hilos Pequeño tamaño (con una funcionalidad mı́nima asociada) Capacidad de responder rápidamente a interrupciones externas Multitarea con mecanismos de comunicación entre procesos Ficheros especiales para lectura/escritura de alta velocidad Minimizar el tiempo en que las interrups. están deshabilitadas Alarmas y temporizadores especiales El corazón del STR es el planificador a corto plazo Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Sistemas de tiempo real Dos tipos de sistemas: Sistemas de tiempo real estricto: todas la tareas deben cumplir sus plazos de tiempo el SO debe conocer cuánto tardan en ejecutarse las funciones no se permite memoria virtual ni acceso a almacenamiento secundario Sistemas de tiempo real flexible: algunas tareas pueden no cumplir sus plazos posible en sistemas de tiempo compartido con modificaciones en el planificador y puntos de expropiación dentro del núcleo ¿Cómo deben planificarse los procesos para cumplir las restricciones de tiempo en un STR estricto? Lo normal es que la planificación sea apropiativa por prioridad Los algoritmos pueden ser estáticos o dinámicos Un conjunto de m procesos P es planificable en un sistema Ci monoprocesador sı́ y sólo sı́ m i=1 Pi ≤ 1 Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Planificación de procesos en tiempo real Supondremos que el sistema conoce: m: número de tareas Pi : periodo con el que debe ejecutarse cada proceso Ci : consumo de CPU de cada proceso en cada periodo Di : tiempo máximo en el que el proceso debe realizar el trabajo (Ci ≤ Di ≤ Pi ) Ri : tiempo de respuesta máximo de cada proceso Se trata de asegurar que Ri ≤ Di para cada proceso Se denomina hiperperiodo del sistema a H = mcm(Pi ). El comportamiento temporal se repite cada hiperperiodo Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Planificación de procesos en tiempo real Ejemplo de tareas periódicas: Deadline for A1 Starting moment for A1, B1, C1 Deadline for B1 Deadline for C1 A A1 B A2 A3 B1 B2 C C1 0 A4 B3 C2 10 20 30 40 A5 B4 C3 50 60 70 80 90 100 110 120 Time (msec) Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos 130 140 Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Planificación de tasa monotónica (RMS) Para procesos periódicos desalojables que cumplen: 1 2 3 4 5 Di = Pi Cada proceso termina dentro de su periodo Los procesos son independientes Cada proceso necesita el mismo tiempo de CPU en cada uno de sus periodos o ráfagas Los procesos no periódicos, si los hay, no tienen plazos Para simplificar, supondremos que el desalojo de procesos es instantáneo y que no requiere procesamiento adicional Algoritmo: 1 2 A cada proceso se le asigna una prioridad estática igual a su frecuencia ( P1i ) Siempre se ejecuta el proceso listo de mayor prioridad Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Planificación de tasa monotónica (RMS) Ejemplo: A B A3 A2 A1 B1 B2 C C1 B4 C3 C2 A1 B1 C1 A2 B2 C2 A3 EDF A1 B1 C1 A2 B2 C2 A3 10 20 30 40 A5 B3 RMS 0 A4 50 60 B3 A4 B3 70 80 90 A4 100 C3 A5 B4 C3 A5 B4 110 120 130 Time (msec) RMS garantiza el éxito de la planificación cuando Pm Ci 1 m i=1 Pi ≤ m(2 − 1). Si no se cumple la condición podrı́a fallar o todavı́a tener éxito Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos 140 Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Planificación de tasa monotónica (RMS) El test anterior es suficiente, pero no necesario, y no es aplicable a un modelo de tareas más general Test basado en el tiempo de respuesta: Se basa en los tiempos de respuesta de las tareas en el peor caso, que se da cuando todas las tareas están listas a la vez (a ese instante se le llama instante crı́tico) Para la tarea de mayor prioridad, R = C ParaP el resto, Ri = Ci + Ii , donde la interferencia máxima P Ii = j∈hp(i) ⌈ PRji ⌉Cj , es decir, Ri = Ci + j∈hp(i) ⌈ PRji ⌉Cj Se puede calcular mediante la relación de recurrencia: X wn win+1 = Ci + ⌈ i ⌉Cj Pj j∈hp(i) P empezando por wi0 = Ci + j∈hp(i) Cj y parando cuando win+1 = win o cuando win+1 > Pi (la tarea falla) Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Planificación de tasa monotónica (RMS) Ejemplo: Tareas (la columna R es lo que vamos a calcular): P C Prioridad R Tarea 1 7 3 3 3 Tarea 2 12 3 2 6 Tarea 3 20 5 1 20 Para la tarea 1: w10 = 3 Para la tarea 2: w20 = 3 + 3 = 6 w21 = 3 + ⌈ 67 ⌉ · 3 = 6 Para la tarea 3: w30 = 5 + 3 + 3 = 11 ... 20 w34 = 5 + ⌈ 20 ⌉ · 3 + ⌈ 12 ⌉ · 3 = 20 7 Éxito ya que Ri ≤ Pi para todas las tareas Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Planificación de tasa monotónica (RMS) Problema de inversión de prioridades: En la mayorı́a de los sistemas, las tareas no son totalmente independientes ya que interaccionan mediante datos comunes, paso de mensajes, etc. En estos casos, puede ocurrir que una tarea tenga que esperar a que otra de menor prioridad libere un recurso Los bloqueos por inversión de prioridad ponen en peligro la planificabilidad del sistema Posible solución: herencia de prioridades. Si una tarea p está bloqueada por una tarea q de menor prioridad, entonces q cambiará su prioridad por la de p hasta que libere el recurso Ahora las prioridades no son totalmente estáticas Este problema puede surgir en otros sistemas y puede dar lugar a livelock con esperas activas Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Planificación de primero el plazo más cercano (EDF) Planificación dinámica que no requiere que: los procesos sean periódicos el tiempo de CPU sea el mismo en cada ráfaga o periodo Algoritmo: Cuando un proceso necesita CPU, anuncia su presencia y su plazo (instante en el que debe haber finalizado) Se mantiene una lista de procesos listos ordenada por plazo Siempre se ejecuta el proceso que tiene el plazo más cercano (si es un proceso nuevo, se apropia de la CPU) Si un proceso hace que el sistema no sea planificable se rechaza su ejecución temporalmente EDF el éxito de la planificación siempre que Pm garantiza Ci i=1 Pi ≤ 1 Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Introducción Planificación de tasa monotónica Planificación de primero el plazo más cercano Planificación de primero el plazo más cercano (EDF) Ejemplo: A A1 B B1 A2 A3 B2 C C1 A1 B1 B4 EDF A1 B1 10 20 C1 30 C3 Failed B2 A2 B2 A2 40 A5 B3 C2 RMS 0 A4 50 60 A3 70 C2 80 B3 90 A4 100 110 C3 120 A5 130 B4 140 Time (msec) RMS es mucho más sencillo que EDF, pero EDF es menos restrictivo: se puede elegir entre uno u otro en función del % de uso de CPU Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Planificación de procesos en Linux 2.4.22 Cada proceso tiene una prioridad (normalmente 20) y se utiliza el número nice para hacer: 20-nice Cada proceso tiene también un quantum, contado en jiffies (10ms) Para cada proceso se calcula un valor de bondad: Máxima para los procesos en tiempo real Más prioridad a los procesos que no consumen su quantum completo Mı́nima para los que han consumido su quantum Se elige el proceso de mayor bondad Cuando todos los procesos listos se quedan sin quantum: quantum = (quantum/2) + prioridad Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Linux 2.4.22 kernel/sched.c Goodness (no-realtime) inline int goodness( ... ) { weight = p->counter; if (!weight) goto out; #ifdef CONFIG_SMP /* Give a largish advantage to the same processor... */ /* (this is equivalent to penalizing other processors) */ if (p->processor == this_cpu) weight += PROC_CHANGE_PENALTY; #endif weight += 20 - p->nice; goto out; out: return weight; } Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Linux 2.4.22 kernel/sched.c void schedule(void) { repeat_schedule: /* * Default process to select.. */ next = idle_task(this_cpu); c = -1000; list_for_each(tmp, &runqueue_head) { p = list_entry(tmp, struct task_struct, run_list); if (can_schedule(p, this_cpu)) { int weight = goodness(p, this_cpu, prev->active_mm); if (weight > c) c = weight, next = p; } } /* Do we need to re-calculate counters? */ if (unlikely(!c)) { struct task_struct *p; for_each_task(p) p->counter = (p->counter >> 1) + NICE_TO_TICKS(p->nice); goto repeat_schedule; } // next es el proceso a seleccionar... } Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos Planificación de procesos en multiprocesadores Planificación de procesos de tiempo real Gestión de procesos en Linux Bibliografı́a Bibliografı́a Andrew Tanenbaum. ((Sistemas Operativos Modernos)), 2a edición, capı́tulos 7 y 8. Prentice Hall, 2003 William Stallings. ((Sistemas Operativos)), 4a edición, capı́tulo 10. Prentice Hall, 2001 Apuntes de la asignatura ((Sistemas de Tiempo Real)). Juan Piernas Cánovas Tema 3. Gestión Avanzada de Procesos