12.10.2014 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!