12.10.2014 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!