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