Вы находитесь на странице: 1из 10

Sistemas Operativos II

Curso 08/09

PRCTICA 2
Planificacin de procesos

Octubre 2008

Sistemas Operativos II

Curso 08/09

NDICE
1 OBJETIVOS...........................................................................................................................................................3
2 ENUNCIADO........................................................................................................................................................3
3 JUGANDO CON LA POLTICA DE PLANIFICACIN....................................................................................3
4 PRIMERA APROXIMCIN..............................................................................................................................6
5 UNA SOLUCIN MS ADECUADA.................................................................................................................8
6 PUNTUACIN......................................................................................................................................................9
7 ANEXOS................................................................................................................................................................9
7.1 Fichero de pruebas: prueba1.c.........................................................................................................................9
7.2 Fichero de pruebas: prueba2.c........................................................................................................................9
7.3 Fichero de pruebas: prueba3.c.......................................................................................................................10

Pgina - 2

Sistemas Operativos II

Curso 08/09

OBJETIVOS

Los principales objetivos de esta prctica son:

Entender la poltica de planificacin de procesos MINIX

Modificar la poltica de planificacin de procesos MINIX

ENUNCIADO

Se pide modificar la estrategia de planificacin de procesos de MINIX 3 atendiendo a los


criterios siguientes:
1. La poltica de planificacin no debe modificar la prioridad de un proceso (s podra
modificarla algn comando externo al planificador)
2. En el momento de determinar qu proceso debe ejecutarse, se seleccionar uno de la
lista ms prioritaria no vaca (no cambia con respecto a MINIX 3)
3. Dentro de una lista, en lugar de aplicar turno circular, debe seleccionarse al proceso
con mayor antigedad en el sistema, considerando su edad como el tiempo
transcurrido desde el momento de su creacin por medio de la llamada al sistema
fork
Se pretende abordar la realizacin de la prctica en tres pasos: primero jugar un poco con la
poltica de planificacin actual sugiriendo hacer unos cambios y ver qu sucede; a
continuacin implementar ya una primera aproximacin a la solucin y acabar con una
solucin definitiva al problema planteado.
3

JUGANDO CON LA POLTICA DE PLANIFICACIN

Se trata de realizar unos ejercicios bsicos que nos permitan entender mejor algunos aspectos
relacionados con la planificacin de procesos en MINIX 3.
En esta prctica se utilizan tres programas de prueba (prueba1.c, prueba2.c y prueba3.c)
que figuran en los anexos. No hace falta crearlos con el editor de textos de MINIX ya que
pueden cogerse de la pgina web de la asignatura. Para poder meter estos ficheros en el
sistema MINIX puede utilizarse el disquete fsico o la imagen de disquete.
Para realizar esta parte de la prctica, hacer lo siguiente:
Encender el puesto de trabajo, seleccionar la opcin Arranca Linux y entrar al
sistema con el correspondiente login y password.
Preparar el disquete (fsico o imagen) con los ficheros de prueba.
Arrancar MinixQEmu y entrar al sistema.
Crear un directorio para el desarrollo de la prctica tecleando: mkdir practica2.
Cambiarse al directorio practica2 recin creado tecleando: cd practica2.

Pgina - 3

Sistemas Operativos II

Curso 08/09

Copiarse los ficheros de prueba utilizando el comando mtools.


Compilar el programa prueba1.c tecleando: cc prueba1.c. Si da errores de
compilacin, editar prueba1.c y quitar los ^M de las lneas de #include.
Ejecutar el programa (tecleando ./a.out). Se observar que en el terminal aparece, de
forma entrelazada, la salida que generan los dos procesos creados:

Al final de la ejecucin del programa quedar una pantalla similar a la siguiente:

Pgina - 4

Sistemas Operativos II

Curso 08/09

Aunque nos salga el prompt *, si tecleamos un comando como ls, nos volver a
salir el prompt correcto #.
Ahora vamos a realizar algunos cambios en el fichero /usr/src/kernel/proc.c que
tienen que ver con modificaciones en la poltica de planificacin para ver qu efecto
producen, concretamente lo que haremos ser incrementar la prioridad de los procesos.
Situarse en /usr/src/kernel y copiar el fichero proc.c como procOrg.c para no perder
la versin original ya que vamos a hacer modificaciones.
Editar proc.c y localizar la funcin sched PRIVATE void sched(rp, queue, front).
Sustituir la sentencia:
if (rp->p_priority < (IDLE_Q-1)) {
rp->p_priority += 1;
}
por:
if (rp->p_priority > 0)
rp->p_priority -= 1;
Grabar la modificacin y cambiarse al directorio /usr/src/tools.
Recompilar el sistema tecleando: make install
Reiniciar MINIX con la nueva imagen. Qu ocurre?

Cul puede ser la explicacin de este comportamiento?

Ahora vamos a eliminar el cambio de prioridad de los procesos y elegir el siguiente


proceso a ejecutar sin tener en cuenta si termin o no su rodaja de tiempo. Para ello,
arrancar MINIX con la imagen original. Si el sistema de ficheros da error al arrancar,
seleccionar la reparacin automtica para todos los errores que nos aparezcan.
Editar de nuevo el fichero proc.c y eliminar la sentencia que hemos tocado en las
pruebas anteriores:
if (rp->p_priority > 0)
rp->p_priority -= 1;
Cambiar la sentencia *front = time_left; por la sentencia *front = TRUE;.

Pgina - 5

Sistemas Operativos II

Curso 08/09

Grabar la modificacin y cambiarse al directorio /usr/src/tools.


Recompilar el sistema tecleando: make install
Reiniciar MINIX con la nueva imagen.
Situarse en el directorio practica2, volver a ejecutar el programa de prueba prueba1.c
(a.out). Qu diferencia se detecta respecto de la ejecucin anterior de este mismo
programa?

Cul puede ser la explicacin de este comportamiento?

Ahora echar un vistazo al programa de prueba prueba2.c para entender su


comportamiento: bsicamente el proceso padre escribe unos 1 y el proceso hijo se
duerme durante un segundo y luego escribe doses 2.
Compilar prueba2.c y ejecutarlo. En qu orden escriben los procesos?

Se consigue cumplir con el objetivo del enunciado de esta prctica?


Al salir del sistema con halt es posible que se quede colgado y no aparezca el monitor.
4

PRIMERA APROXIMCIN

En MINIX, cuando se crea un proceso, se busca un hueco libre en la tabla de descriptores de


procesos para gestionar al proceso recin creado. Esta bsqueda de descriptor libre se hace en
orden estrictamente creciente. En esta primera aproximacin se propone utilizar el ndice que
ocupa el proceso en dicha tabla ya que parece correlacionarse con el orden de creacin de los
procesos, en definitiva, con la antigedad de los mismos.
El ndice que ocupa un proceso en la tabla de descriptores puede derivarse del campo p_nr
del descriptor de cada proceso, cuya definicin puede consultarse en /usr/src/kernel/proc.h.
Hay que tener cuidado, especialmente en el siguiente apartado, ya que este campo toma
valores negativos para las tareas y de cero en adelante para los procesos.
Si consultamos con ms detalle el fichero proc.h, veremos que la tabla de descriptores de
procesos est definida como:
EXTERN struct proc proc[NR_TASKS + NR_PROCS];/*process table*/
En la versin de MINIX que utilizamos NR_TASKS es igual a 4 y NR_PROCS es igual a
100. En definitiva, mientras que p_nr variar de [-4 a 99], los ndices para acceder
Pgina - 6

Sistemas Operativos II

Curso 08/09

adecuadamente a la tabla de procesos deben variar de [0 a 103] tal y como se refleja en la


figura siguiente:

Figura 1: Relacin entre el campo p_nr y el ndice en la tabla de procesos


En definitiva, para tener realmente el ndice de un proceso en la tabla de procesos a partir del
campo p_nr, tendra que escribirse: p_nr + NR_TASKS. En cualquier caso, en esta primera
parte nos basta con utilizar el campo p_nr tal cual ya que refleja, de forma aproximada, la
idea de antigedad.
Seleccionar al proceso ms antiguo a travs del campo p_nr tiene una pega. Cuando el
nmero de procesos que se han ido creando (y posiblemente eliminando) hace que hayamos
consumido todas las entradas de la tabla de procesos, se empieza a buscar de nuevo un
descriptor libre desde el principio de la tabla, por lo que el procedimiento planteado funciona
correctamente mientras no se creen en la instalacin un nmero de procesos mayor que el
nmero de entradas de la tabla de descriptores de procesos.
La ventaja de esta aproximacin es que nos basta con modificar slo el fichero proc.c
(podemos partir del original o del que ya tenemos modificado).
A la hora de hacer efectiva la planificacin, tenemos que evitar que la funcin sched
busque, en cada una de sus activaciones, el proceso ms antiguo de la cola de mayor
prioridad. Parece que puede ser ms eficiente que la funcin enqueue almacene
directamente ya ordenados los procesos, dentro de cada cola, atendiendo al campo p_nr.
Entrar al sistema y modificar el fichero proc.c con los cambios que se han sugerido.
Cuando se consiga compilar el sistema correctamente, arrancar con la nueva imagen y
probar su funcionamiento ejecutando la prueba2. El resultado debera ser el esperado
segn lo marcado por el enunciado. Es as?
Si ejecutamos una prueba en la que se cree un nmero ms elevado de procesos es
muy probable que encontremos algn comportamiento discrepante con el
comportamiento esperado. Para ello, puede utilizarse en repetidas ocasiones la
prueba3. Indicar cul es el comportamiento extrao y en qu momento se produce:

Pgina - 7

Sistemas Operativos II

Curso 08/09

Comprobada la correccin de esta parte con el profesor, guardar el fichero proc.c en


el directorio practica2 con el nombre procP2a.c para podrnoslo llevar y tener una
constancia de nuestro trabajo.
5

UNA SOLUCIN MS ADECUADA

Una alternativa algo mejor a la anteriormente expuesta (aunque con algn defecto menor)
puede ser registrar explcitamente la antigedad de cada proceso en el momento de ser creado.
Para ello debe crearse un campo, para cada posible proceso, en el cual registrar el nmero de
orden con el que fue creado. La funcin enqueue debe entonces ordenar los procesos,
dentro de cada cola de prioridad, atendiendo a dicho orden de creacin.
Esta solucin requiere modificar, adems de proc.c, otros tres ficheros:

proc.h para hacer la declaracin compartida del campo de antigedad de cada proceso
creado. La modificacin natural sera aadir este campo en la estructura proc que
contiene todos los campos de un descriptor de proceso. Sin embargo, tal y como puede
consultarse en el propio cdigo, el acceso a los campos de un descriptor se hace con
desplazamientos y, si cambiamos esta estructura, hay que tocar, posiblemente, dichos
desplazamientos. Una forma de evitar este problema es declararse un array del mismo
tamao que la tabla de procesos y guardar ah el campo de antigedad.

system/do_fork.c para que cuando se cree un proceso se registre correctamente su


antigedad.

main.c para inicializar correctamente los campos de antigedad de los procesos


cargados en la imagen de arranque del sistema as como para anular la antigedad de
los procesos todava no creados.

En esta parte, cuando realicemos bsquedas en el array auxiliar donde guardamos la


antigedad de cada proceso, deberemos tener cuidado de acceder correctamente a partir del
campo p_nr de cada proceso tal y como qued reflejado en la Figura1.
Entrar al sistema y, antes de modificar los ficheros proc.h, system/do_fork.c, y
main.c, copiarlos como procOrg.h, system/do_forkOrg.c y mainOrg.c.
Hacer las modificaciones oportunas en proc.h, proc.c, system/do_fork.c y main.c
para la realizacin de este apartado.
Con esta alternativa deben seguir funcionando correctamente las pruebas 1 y 2. El
programa de prueba3 debe funcionar un nmero muy elevado de intentos.
Comprobada la correccin de esta parte con el profesor, guardar los ficheros proc.h,
proc.c, system/do_fork.c y main.c en el directorio practica2 con los nombres
procP2b.h, procP2b.c, do_forkP2b.c y mainP2b.c respectivamente para as poder
llevarnos estos ficheros y tener una constancia de nuestro trabajo.

Pgina - 8

Sistemas Operativos II
6

Curso 08/09

PUNTUACIN

El apartado 3 Jugando con la poltica de planificacin supone 0,2 puntos, el apartado 4


Primera aproximacin aporta otros 0,3 puntos y el ltimo apartado Una solucin ms
adecuada aporta los 0,2 puntos restantes. Los apartados deben irse completando de forma
secuencial.
La puntuacin total de esta prctica, por lo tanto, es de 0,7 puntos.
7

ANEXOS

7.1

Fichero de pruebas: prueba1.c

/* Lanza dos procesos que generan trazas largas y distintas */


#include <stdio.h>
#include <unistd.h>
int main(void)
{ int x, y, z, pid;

pid = fork();
if (pid != 0)
{ /* proceso padre */
for(x = 1; x < 10000; x++)
{ for(y = 1; y < 100000; y++)
z = y;
printf("1");
}
}
else
{ /* proceso hijo */
for(x = 1; x < 10000; x++)
{ for(y = 1; y < 100000; y++);
z = y;
printf("2");
}
}

7.2

Fichero de pruebas: prueba2.c

/* Dos procesos escriben en el terminal. El primero en ser creado


realiza una espera de un segundo antes de empezar a trabajar */
#define _POSIX_SOURCE
#include <unistd.h>
#include <stdio.h>
int main(void)
{
int x,y,z,pid;
pid = fork();
if(pid == 0)
{ for(x = 1; x < 20000; x++)
{ for(y = 1; y < 10000; y++)
z = y;

Pgina - 9

Sistemas Operativos II
printf("1");
} }
else
{ sleep(1);
for(x = 1; x < 20000; x++)
{ for(y = 1; y < 10000; y++)
z = y;
printf("2");
} } }

7.3

Fichero de pruebas: prueba3.c

/* Se crean 10 procesos (ademas del principal)


que escriben mensajes */
#include <unistd.h>
#include <stdio.h>
#define TOTAL 10
void traza(int num)
{ int x, y, z;
for(x = 1; x < 4000; x++)
{ printf("%d ", num);
for(y = 1; y < 10000; y++)
z = y;
}
}
int main(void)
{ int x;
for( x = 1; x <= TOTAL; x++)
if(fork() == 0)
{ traza(x);
break;
}
}

Pgina - 10

Curso 08/09

Вам также может понравиться