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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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!