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 />

algoritmo dupreg(Old_region, New_region)<br />

{<br />

if (Old_region es compartida)<br />

{<br />

El proceso que llama incrementará el contador <strong>de</strong> referencias, que referencian esa región;<br />

Return New_region = Old_region;<br />

}<br />

Asignar nueva región (allocreg);<br />

Preparar tablas iguales a las <strong>de</strong> Old_region;<br />

Asignar memoria física para el contenido <strong>de</strong> New_region;<br />

Copiar el contenido <strong>de</strong> Old_region en New_region;<br />

Return puntero a New_region;<br />

}<br />

<strong>2.</strong>7. LLAMADAS AL SIS<strong>TEMA</strong> PARA GESTIÓN <strong>DE</strong> <strong>PROCESOS</strong>.<br />

<strong>2.</strong>7.1. Creación <strong>de</strong> un Proceso (fork). Duplicación <strong>de</strong>l Proceso Actual.<br />

• La única forma <strong>de</strong> crear un nuevo proceso en UNIX ⇒ llamada al sistema fork.<br />

– Proceso padre ⇒ Proceso que llama a fork.<br />

– Proceso hijo ⇒ Proceso creado.<br />

• Fin <strong>de</strong> la llamada a fork, procesos padre e hijo ⇒ La llamada a fork hace que el proceso actual se<br />

duplique.<br />

– Igual contexto a nivel usuario ⇒ A la salida <strong>de</strong> fork, los dos procesos tienen una copia<br />

idéntica <strong>de</strong>l contexto <strong>de</strong> nivel <strong>de</strong> usuario excepto para el valor <strong>de</strong>l PID.<br />

– Diferente valor <strong>de</strong> retorno <strong>de</strong>l fork.<br />

+ Proceso padre, el PID <strong>de</strong>l proceso creado (proceso hijo).<br />

+ Proceso hijo, el valor 0 para el PID.<br />

• El proceso 0, creado por el kernel cuando se arranca el sistema (swapper, encargado <strong>de</strong> la gestión<br />

<strong>de</strong> memoria virtual), es el único que no se crea vía fork.<br />

• Si la llamada a fork falla, <strong>de</strong>volverá el valor –1 y en errno estará el código <strong>de</strong>l error producido.<br />

• Al volver <strong>de</strong> fork, dos procesos, el proceso padre y el proceso hijo, comparten el mismo código.<br />

<strong>2.</strong>7.1.1. Acciones más Importantes <strong>de</strong>l Kernel al Llamar a fork.<br />

• Busca una entrada libre en la tabla <strong>de</strong> procesos y la reserva para el proceso hijo.<br />

• Asigna un i<strong>de</strong>ntificador <strong>de</strong> proceso (PID) para el proceso hijo. Este número es único e invariable<br />

durante toda la vida <strong>de</strong>l proceso y es la clave para po<strong>de</strong>r controlarlo <strong>de</strong>s<strong>de</strong> otros procesos.<br />

• Realiza un copia <strong>de</strong>l contexto <strong>de</strong>l nivel <strong>de</strong> usuario <strong>de</strong>l proceso padre para el proceso hijo. Las<br />

secciones que <strong>de</strong>ban ser compartidas, como el código o las zona <strong>de</strong> memoria compartida, no se<br />

copian, sino que se incrementan los contadores que indican cuántos procesos comparten esas zonas.<br />

• Las tablas <strong>de</strong> control <strong>de</strong> archivos locales al proceso, como pue<strong>de</strong>n ser la tabla <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong><br />

archivo, también se copian <strong>de</strong>l proceso padre al proceso hijo, ya que forman parte <strong>de</strong>l contexto <strong>de</strong><br />

nivel <strong>de</strong> usuario. En las tablas globales <strong>de</strong>l kernel, tabla <strong>de</strong> archivos y tabla <strong>de</strong> inodos, se<br />

incrementan los contadores que indican cuántos procesos tienen abiertos esos archivos.<br />

• Retorna al proceso padre el PID <strong>de</strong>l proceso hijo, y al proceso hijo le <strong>de</strong>vuelve el valor 0 para su<br />

PID.<br />

int pid;<br />

if ((pid = fork()) == -1)<br />

perror(“Error en la llamada a fork.”);<br />

else if (pid == 0)<br />

// Código que va a ejecutar el proceso hijo.<br />

else<br />

// Código que va a ejecutar el proceso padre.<br />

Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>29

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

Saved successfully!

Ooh no, something went wrong!