En un sistema multiproceso monoprocesador, se pretende utilizar el

Anuncio
E.U. de Informática
Departamento de Informática Aplicada
Examen final de Sistemas Operativos I
EJERCICIO 2 (puntuación 3´5 puntos) Solución
10 de diciembre de 2003
Tiempo Estimado 60 m
1. Indicar cómo se puede reducir dinámicamente la posibilidad de inanición de un proceso.
Asignándole más papeletas, ya que cuantas más tenga, más probabilidad tendrá de ganar. Por ejemplo, se podría
utilizar la técnica del envejecimiento para ir aumentado el número de papeletas de los procesos de la cola de
preparados.
2. Indicar qué nuevas estructuras de datos y/o modificaciones a las ya existentes son necesarias para
soportar este algoritmo de planificación.
int numPapeletasTotales;
idProceso procesoGanador;
/* Papeletas repartidas entre los preparados */
/* Proceso que tiene la papeleta */
Para cada descriptor de proceso, hay que añadir el siguiente campo:
int numPapeletas;
/* Número de papeletas asignadas a cada proceso*/
3. Para que un proceso recién creado pueda participar en el sorteo siguiente, indicar las acciones a realizar
en la llamada al sistema idProceso crearProceso(int numPapeletas).
 Al crear un proceso, habría que guardar el número de papeletas asignadas en su campo:
tablaDescriptores[proceso].numPapeletas = numPapeletas;

También habría que incrementar el número de papeletas del sistema:
numPapeletasTotales = numPapeletasTotales + numPapeletas;

Y por último, reordenar la lista de preparados en orden decreciente de papeletas.
función idProceso
procesoGanador(),
considerando que idPapeleta
solo se encarga de devolver un número aleatorio entre 1 y el total de papeletas
repartidas entre los procesos preparados en el momento de realizar dicho sorteo.
4. Implementar
la
Sorteo(totPapeletas)
idProceso Ganador(){
int suma = 0;
int papeletaGanadora;
idProceso proceso = preparados.primero;
/* se usa la cola de preparados */
papeletaGanadora = Sorteo(numPapeletasTotales);
/* se realiza el sorteo */
while ( suma < papeletaGanadora) {
/* ¿quién tiene la papeleta? */
suma = suma + tablaDescriptores[proceso].numPapeletas;
if (suma < papeletaGanadora)
proceso = tablaDescriptores[proceso].siguiente;
}
return idProceso
/* Este proceso es el ganador */
}
Se saca el proceso ganador de la cola de preparados, se decrementa el número de papeletas que tiene asignadas
del total.
numPapeletasTotales = numPapeletasTotales - tablaDescriptores[proceso].numPapeletas;
5. Indicar qué acciones hay que tomar, para que este algoritmo siga funcionando correctamente, cuando un
proceso se bloquea voluntariamente.
No hay que realizar ninguna acción, ya que cada vez que el proceso toma control de la cpu, se le saca de la cola
de preparados y se actualiza el total de papeletas, por lo que si se bloquea, ya no participa en los siguientes
sorteos. Cuando despierte, para que participe de nuevo en el sorteo, se le incluirá en la cola de preparados y se
incrementará el total de papeletas con las papeletas que tenía asignadas.
Otra implementación podría considerar una cola de procesos ejecutables (preparados + el proceso en ejecución),
de tal forma que, solo cuando un proceso se bloquea, se decrementa su número de papeletas asignadas del total
y se le elimina de la cola de procesos ejecutables. Esta variante intenta reducir la sobrecarga de la modificación
del total de papeletas y de la gestión de la cola de preparados cada vez que un proceso toma o cede el control de
la cpu. Sin embargo, este implementación tendría problemas si se utilizase con sistemas multiprocesador, ya que
podría salir ganador un proceso que ya esta en ejecución.
Descargar