Creación de una nueva cola de prioridades

Solo disponible en BuenasTareas
  • Páginas : 5 (1192 palabras )
  • Descarga(s) : 0
  • Publicado : 19 de diciembre de 2011
Leer documento completo
Vista previa del texto
Ampliación de Sistemas Operativos

Creación de una nueva cola de prioridades

• Descripción de la practica
La práctica final de la asignatura de ampliación de sistemas operativos, consiste en la creación de una nueva cola, en la planificación de Minix. Lo que queremos conseguir es tener una nueva cola, la cual queremos colocar con mayor prioridad que la cola de usuario. Además a esta colael algoritmo que utilizamos es Round Robin por prioridades. Los procesos entraran en nuestra cola, solo si el usuario introduce una prioridad para dichos procesos.

• Planificación
Lo primero que debemos hacer para comenzar nuestra práctica es declarar la cola, y para ello debemos aumentar en uno el número de colas declaradas. En /usr/src/kernel/const.h declaramos la cola con el nombre dePRIORITY_Q con un nivel 2, y NQ con un valor de 4, ya que ese es el número de colas que hay. La colocamos en según lugar, con un nivel mayor de prioridad que la cola USER_Q, porque si el campo priority del PCB tiene un valor >0 será tratado mediante prioridades y si no es así se cargara en la cola USER_Q.

Como podemos ver el siguiente gráfico:

Además en el fichero /src/kernel/proc.h podemosobservar como están declaradas las estructuras de punteros de la cabeza y del final, a las diferentes colas, como rdy_head[NQ] y rdy_tail[NQ], las cuales, al haber cambiado el valor de NQ poseen un ítem más, el de nuestra cola, que estará en la posición 3ª de los vectores apuntadores.

En el fichero /src/kernel/proc.h vamos a modificar el PCB, añadimos un campo llamado priority, para dotar a losprocesos de una característica que defina su prioridad dentro de la cola que acabamos de crear. Este campo lo inicializamos con un valor NIL_PRIORITY, declarado en /usr/src/kernel/const.h con un valor de 0. A continuación procedemos a modificar pick_proc, localizado en el fichero /usr/src/kernel/proc.c, aquí lo que se hace es buscar por las colas según su prioridad si hay algún proceso preparado.Nosotros completamos el código añadiendo un condicional para comprobar que nuestra cola no está vacía, y lo colocamos entre SERVER_Q y USER_Q y si no lo está busca el de mayor prioridad (=0 en la cola PRIORITY_Q, por la cabeza, solo en el caso de que este vacía también rdy_tail apuntara al proceso. Para ello hemos comparado priority de rp con priority de rdy_i que es un puntero índice que varecorriendo todos los PCB's hasta que encuentra uno con mayor prioridad que rp, o rdy_i.p_nextready apunta a NIL_PROC, como variable de final de cola hemos incluido una variable llamada fin, que está declarada al comienzo del archivo tambien /usr/src/kernel/proc.h hemos añadido también *rdy_i

Debemos modificar también el fichero en el que nos encontramos, la función unready(), que sirve parapasar un proceso de la cola de listos a bloqueado, esto lo hacemos de forma similar a lo anterior, situando un else delante del else que maneja la cola USER_Q, dentro del else, añadimos un if que cumple que el proceso solo puede ser de usuario (por los if's anteriores) y con una prioridad distinta de NIL_PRIORITY, con lo cual entrara por PRIORITY_Q. En la función sched(),ponemos lo mismo que paraUSER_Q, pero lo colocamos delante, con un condicional para que sea distinto de NIL_PROC, justo antes de que se gestione USER_Q, así demostramos que al estar delante, vemos que nuestra cola tiene mayor prioridad. El siguiente paso es crear un llamada al sistema, llamada do_new_priority para ello, la creamos en /usr/src/kernel/system.c, que lo que hace es asignar una prioridad, introducida por elusuario al proceso /usr/src/kernel/system.c:do_new_priority()

• Llamada al Sistema
En /usr/include/minix/callnr.h añadimos nuestra llamada al sistema como DO_NEW_PRIORITY asignada a la llamada número 79, también debemos incrementar en uno el número total de llamadas permitidas al sistema (NCALLS) 79. Añadimos en /usr/src/mm/table.c la rutina de servicio de interrupción do_new_priority, /*79=...
tracking img