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.1.3. Observaciones sobre la Creación <strong>de</strong> un Proceso (Padre e Hijo).<br />

• Las u-Areas son iguales a excepción <strong>de</strong>l puntero a la Tabla <strong>de</strong> Procesos. Una vez creado el contexto<br />

estático va por el dinámico. El kernel copia la primera capa (capa 1) que contiene el nivel <strong>de</strong><br />

usuario y también la pila <strong>de</strong>l kernel (con la capa <strong>de</strong> llamada a fork). Si la implementación incluye<br />

pila <strong>de</strong>l kernel en la uArea ya en el punto anterior se hace esta copia (en cualquier caso la pila <strong>de</strong>l<br />

padre e hijo son iguales). Ahora hace una copia falsa en la pila <strong>de</strong>l hijo para simular que se ha<br />

ejecutado antes. En esta capa se <strong>de</strong>be incluir el contexto <strong>de</strong> registros <strong>de</strong> la capa 1.<br />

• Observar que padre e hijo comparten los archivos abiertos antes <strong>de</strong>l fork (los que se abran <strong>de</strong>spués<br />

ya van a cuenta <strong>de</strong> cada proceso), por lo que en el siguiente código ejemplo los dos procesos jamás<br />

leen o escriben en el mismo offset <strong>de</strong> los archivos <strong>de</strong>scritos por fr y fw. En este caso ambos<br />

procesos compartirán las tablas <strong>de</strong> archivos cada uno con los valores para fr y fw apuntando a la<br />

misma entrada en la Tabla <strong>de</strong> Archivos. Aunque <strong>de</strong> la apariencia que se copia el archivo por dos<br />

veces, lo cierto es que el contenido <strong>de</strong>l archivo <strong>de</strong>stino <strong>de</strong>pen<strong>de</strong>rá <strong>de</strong> como se planifiquen los<br />

procesos.<br />

<strong>2.</strong>7.1.4. Clonado en Linux (clone).<br />

• Diferentes libros sobre sistemas operativos <strong>de</strong>finen un proceso <strong>de</strong> diferentes formas, empezando<br />

por “instancia <strong>de</strong> un programa en ejecución” y finalizando con “lo que es producido por las<br />

llamadas <strong>de</strong>l sistema fork o clone”. Bajo Linux, hay tres clases <strong>de</strong> procesos:<br />

− el/los thread(s) vacío(s),<br />

− threads <strong>de</strong>l kernel,<br />

− tareas <strong>de</strong> usuario.<br />

• El thread vacío es creado en tiempo <strong>de</strong> compilación para la primera CPU; es entonces creado<br />

“manualmente” para cada CPU por medio <strong>de</strong> la función específica <strong>de</strong> la arquitectura<br />

fork_by_hand() en arch/i386/kernel/smpboot.c, el cual <strong>de</strong>senrolla la llamada al sistema fork a mano<br />

(en algunas arquitecturas). Las tareas vacías comparten una estructura init_task pero tienen una<br />

estructura privada TSS, en la matriz <strong>de</strong> cada CPU init_tss. Todas las tareas vacías tienen pid = 0 y<br />

ninguna otra tarea pue<strong>de</strong> compartir el pid, esto es, usar el flag CLONE_PID en clone.<br />

• Los threads <strong>de</strong>l kernel son creados usando la función kernel_thread() la cual invoca a la llamada al<br />

sistema clone en modo kernel. Los threads <strong>de</strong>l kernel usualmente no tienen espacio <strong>de</strong> direcciones<br />

<strong>de</strong> usuario, esto es p->mm = NULL, porque ellos explícitamente hacen exit_mm(), ej. a través <strong>de</strong> la<br />

función daemonize(). Los threads <strong>de</strong>l kernel siempre pue<strong>de</strong>n acce<strong>de</strong>r al espacio <strong>de</strong> direcciones <strong>de</strong>l<br />

kernel directamente. Ellos son asignados a números pid en el rango bajo. Funcionando en el anillo<br />

<strong>de</strong>l procesador 0 (en x86) implica que los threads <strong>de</strong>l núcleo disfrutan <strong>de</strong> todos los privilegios <strong>de</strong><br />

E/S y no pue<strong>de</strong>n ser pre-<strong>de</strong>socupados por el scheduler o planificador.<br />

• Las tareas <strong>de</strong> usuario son creadas por medio <strong>de</strong> las llamadas al sistema clone o fork, las cuales<br />

internamente invocan a kernel/fork.c:do_fork().<br />

• Por tanto Linux, permite crear clones <strong>de</strong> procesos. Un proceso clon se crea por la llamada la<br />

sistema clone por duplicación <strong>de</strong> su proceso padre. Pero contrariamente a un proceso hijo clásico,<br />

pue<strong>de</strong> compartir una parte <strong>de</strong> su contexto con su padre. Según las opciones especificadas en la<br />

llamada al sistema clone, se pue<strong>de</strong>n compartir una o más partes <strong>de</strong> su contexto:<br />

− El espacio <strong>de</strong> direccionamiento. Los dos procesos comparten los mismos segmentos <strong>de</strong><br />

código y <strong>de</strong> datos. Toda modificación efectuada por uno es visible por parte <strong>de</strong>l otro.<br />

− Las informaciones <strong>de</strong> control <strong>de</strong>l sistema <strong>de</strong> archivos. Los dos procesos comparten los<br />

mismos directorios raíz y actual. Si uno <strong>de</strong> estos directorios es modificado por uno <strong>de</strong> los<br />

procesos (por la primitivas chdir y chroot), la modificación es efectiva para el otro.<br />

− Los <strong>de</strong>scriptores <strong>de</strong> archivos abiertos. Los dos procesos comparten los mismos <strong>de</strong>scriptores<br />

<strong>de</strong> archivos abiertos. Si uno <strong>de</strong> ellos cierra un archivo, el otro ya no pue<strong>de</strong> acce<strong>de</strong>r a él.<br />

− Los gestores <strong>de</strong> señales: los dos procesos comparten la tabla <strong>de</strong> funciones llamada en la<br />

recepción <strong>de</strong> una señal. Toda modificación por parte <strong>de</strong> uno <strong>de</strong> los procesos (sigaction),<br />

provoca el cambio <strong>de</strong> la rutina <strong>de</strong> tratamiento <strong>de</strong> la señal por el otro proceso.<br />

− El i<strong>de</strong>ntificador <strong>de</strong> proceso. Los dos procesos pue<strong>de</strong>n compartir el mismo número <strong>de</strong><br />

proceso.<br />

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

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

Saved successfully!

Ooh no, something went wrong!