TEMA 2. GESTIÃN DE PROCESOS - Universidad de AlmerÃa
TEMA 2. GESTIÃN DE PROCESOS - Universidad de AlmerÃa
TEMA 2. GESTIÃN DE PROCESOS - Universidad de AlmerÃa
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Diseño <strong>de</strong> Sistemas Operativos<br />
Tema <strong>2.</strong> Gestión <strong>de</strong> Procesos<br />
• Los procesos <strong>de</strong> tipo SCHED_OTHER únicamente pue<strong>de</strong>n ejecutarse cuando no existe ningún<br />
proceso <strong>de</strong> “tiempo real” en estado <strong>de</strong> listo para ejecutarse. El proceso a ejecutar se escoge tras<br />
examinar las priorida<strong>de</strong>s dinámicas. La prioridad dinámica <strong>de</strong> un proceso se basa por una parte en<br />
el nivel especificado por el usuario según las llamadas al sistema nice y setpriority, y por otra parte<br />
en una variación calculada por el sistema. Todo proceso que se ejecute durante varios ciclos <strong>de</strong><br />
reloj disminuye en prioridad y pue<strong>de</strong> así llegar a ser menos prioritario que los procesos que no se<br />
ejecutan, cuya prioridad no se ha modificado.<br />
Existen numerosas llamadas al sistema que permiten modificar la política y los parámetros asociados a un<br />
proceso, entre ellas <strong>de</strong>stacamos las siguientes:<br />
• int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param). Modifica la<br />
política (policy) y los parámetros <strong>de</strong> planificación (param) asociados al proceso (pid).<br />
• int sched_getscheduler(pid_t pid). Obtiene la política (SCHED_FIFO, SCHED_RR o<br />
SCHED_OTHER) <strong>de</strong> planificación asociada al proceso (pid) o al proceso actual si pid = 0.<br />
• int sched_setparam(pid_t pid, const struct sched_param *param) y int sched_getparam(pid_t pid,<br />
struct sched_param *param). Establece y obtiene los parámetros <strong>de</strong> planificación asociados al<br />
proceso (pid).<br />
• int sched_get_priority_min(int policy) y int sched_get_priority_max(int policy). Obtiene<br />
priorida<strong>de</strong>s minima y máxima asociadas a la política <strong>de</strong> planificación (policy).<br />
• int sched_rr_get_interval(pid_t pid, struct timespec *interval). Devuelve en la estructura “interval”<br />
el quantum <strong>de</strong> tiempo asociado al proceso (pid) que <strong>de</strong>be ser <strong>de</strong>l tipo SCHED_RR.<br />
• int sched_yield(void). Permite al proceso actual liberar al procesador. Al ejecutar esta primitiva, el<br />
proceso actual se coloca al final <strong>de</strong> la lista <strong>de</strong> procesos “listos para ejecutarse en memoria” y<br />
entonces se ejecuta el scheduler. Si no existen otros procesos en el sistema, cambia al proceso<br />
actual.<br />
La planificación <strong>de</strong> procesos (scheduler) la implementa la función schedule situada en el archivo fuente<br />
kernel/sched.c. También es preciso mencionar a la función goodness que <strong>de</strong>vuelve un valor que indica a<br />
schedule hasta qué punto el proceso necesita el procesador. Por ello goodness, pue<strong>de</strong> <strong>de</strong>volver: –1000 si se<br />
trata <strong>de</strong>l proceso actual para indicar que no <strong>de</strong>be seleccionarse; prioridad estática + 1000 si es un proceso<br />
tiempo real; número <strong>de</strong> ciclos <strong>de</strong> reloj que el proceso <strong>de</strong>be ejecutarse (counter) si se trata <strong>de</strong> un proceso<br />
normal.<br />
La función schedule que implementa la planificación <strong>de</strong> procesos, empieza por <strong>de</strong>splazar el proceso actual al<br />
final <strong>de</strong> los procesos listos (llamando a move_last_runqueue) si el proceso ha agotado todos sus ciclos (su<br />
tiempo). Si el proceso esta en estado = TASK_INTERRUPTIBLE, entonces schedule comprueba si ha<br />
recibido una señal; si es así estado = TASK_RUNNING con el objetivo <strong>de</strong> <strong>de</strong>spertarlo. Para ello, schedule<br />
explora todos los procesos <strong>de</strong> la Tabla <strong>de</strong> Procesos, llama a la función goodness para escoger el siguiente<br />
proceso a ejecutar y al volver <strong>de</strong> la búsqueda, el proceso escogido se convierte en el proceso actual.<br />
Entonces, get_mmu_context llama para restaurar el contexto <strong>de</strong> memoria <strong>de</strong>l proceso y switch_to se llama<br />
para provocar el cambio <strong>de</strong> contexto.<br />
La función schedule gestiona el tiempo asociado a cada proceso a través <strong>de</strong>l campo counter <strong>de</strong>l <strong>de</strong>scriptor <strong>de</strong>l<br />
proceso, pudiendo reiniciarlo cuando consi<strong>de</strong>re oportuno. El campo counter <strong>de</strong>termina el número <strong>de</strong> ciclos<br />
<strong>de</strong> reloj durante los cuales el proceso <strong>de</strong>be ejecutarse. El campo counter pue<strong>de</strong> ser modificado por:<br />
• update_process_time. Esta función es llamada periódicamente por timer_bh, que forma parte <strong>de</strong> la<br />
cola <strong>de</strong> tareas tq_timer, activada por el manejador <strong>de</strong> interrupciones <strong>de</strong>l reloj. Poniendo la variable<br />
need_rsched a 1 si el proceso ha agotado su quantum.<br />
• add_to_runqueue. Esta función aña<strong>de</strong> un proceso a la lista <strong>de</strong> procesos “listos para ejecutarse en<br />
memoria”.<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>65