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
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Diseño <strong>de</strong> Sistemas Operativos<br />
Tema <strong>2.</strong> Gestión <strong>de</strong> Procesos<br />
<strong>2.</strong>7.3.5. Acciones para Despertar (wakeup).<br />
• El kernel eleva el nivel <strong>de</strong> ejecución <strong>de</strong>l procesador en wakeup.<br />
• Para cada proceso que duerme en la dirección <strong>de</strong> entrada:<br />
– Estado <strong>de</strong>l proceso = “listo para ejecutarse”.<br />
– Elimina <strong>de</strong> la lista enlazada <strong>de</strong> procesos dormidos, el proceso en cuestión.<br />
– Coloca en la lista enlazada <strong>de</strong> procesos elegibles para planificar por el scheduler (“listos para<br />
ejecutarse”).<br />
– Limpia el campo <strong>de</strong> la tabla <strong>de</strong> procesos asociado al proceso que indicaba la dirección <strong>de</strong><br />
dormido (estado <strong>de</strong>l proceso).<br />
– Si el proceso <strong>de</strong>spertado no residía en memoria principal ⇒ Despierta al swapper, para que<br />
intercambie el proceso a memoria principal (si no hay paginación por <strong>de</strong>manda).<br />
– Si resi<strong>de</strong> en memoria principal y el proceso <strong>de</strong>spertado es “más elegible para ejecutar” que el<br />
proceso que se está ejecutando (según la prioridad que tiene asociada) ⇒ Activar el flag <strong>de</strong><br />
planificación para que el scheduler le asigne la CPU.<br />
algoritmo wakeup(dirección_bloqueo)<br />
{<br />
Subir nivel <strong>de</strong> ejecución (todas las interrupciones);<br />
Encontrar la tabla hash para la dirección_bloqueo;<br />
foreach (proceso en la cola)<br />
{<br />
Retirar proceso <strong>de</strong> la cola;<br />
Marcarlo como listo para ejecutarse;<br />
Ponerlo en cola <strong>de</strong> Listos;<br />
Borrar dirección_bloqueo <strong>de</strong> la Tabla <strong>de</strong> Procesos;<br />
if (proceso no está en memoria)<br />
Despertar swapper (proceso 0);<br />
else<br />
if (proceso <strong>de</strong>spertado es <strong>de</strong> mayor prioridad que el proceso en ejecución)<br />
Activar flag <strong>de</strong> planificación;<br />
}<br />
Restaurar nivel <strong>de</strong> ejecución<br />
}<br />
<strong>2.</strong>7.3.6. Conclusiones sobre sleep y wakeup.<br />
• Debemos distinguir al menos dos situaciones, procesos que duermen en eventos que son seguros <strong>de</strong><br />
ocurrir y eventos que no lo son. El kernel asigna una prioridad <strong>de</strong> sueño basado en el conocimiento<br />
<strong>de</strong> la seguridad <strong>de</strong> ocurrencia <strong>de</strong>l evento y dispone <strong>de</strong> un umbral para <strong>de</strong>terminar si el proceso será<br />
<strong>de</strong>spertado o no al recibir una señal. Si el proceso ya tiene una señal cuando entra al algoritmo<br />
sleep y su prioridad es interrumpible no entrará a dormir (pue<strong>de</strong> que la señal no se repita y el<br />
proceso se que<strong>de</strong> dormido sin <strong>de</strong>spertar). Si su prioridad es mayor que el umbral, se irá a dormir<br />
esperando por un wakeup explícito.<br />
• Cuando un proceso es <strong>de</strong>spertado por efecto <strong>de</strong> una señal (o no fue a dormir porque tenía una<br />
pendiente) el kernel pue<strong>de</strong> hacer un longjmp <strong>de</strong>pendiendo <strong>de</strong> la razón por la que se invocó sleep. El<br />
kernel hace un longjmp para restaurar el contexto previamente salvado (si no hay forma <strong>de</strong><br />
completar la llamada al sistema que estaba ejecutando). Por ejemplo, si un read <strong>de</strong> terminal es<br />
interrumpido porque se apaga el terminal, el read no <strong>de</strong>bería continuar esperando, sino retornar con<br />
una indicación <strong>de</strong> error. Esto es genérico para las llamadas al sistema que pue<strong>de</strong>n ser interrumpidas<br />
mientras el proceso está dormido. El proceso no <strong>de</strong>bería continuar normalmente <strong>de</strong>spués <strong>de</strong><br />
<strong>de</strong>spertar ya que la llamada al sistema no ha sido satisfecha. Por ello el kernel salva el contexto <strong>de</strong>l<br />
proceso al inicio <strong>de</strong> la llamada al sistema usando setjmp anticipándose a la posible necesidad <strong>de</strong><br />
usar un posterior longjmp.<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>39