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.