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