Subsistema de Administración de Procesos en GNU/Linux
Agenda Generalidades. Descriptor de Procesos. Creación de Procesos. Implementación de Hebras. Finalización de Procesos.
Generalidades Proceso. “ Es un código de un programa que se encuentra en ejecución por un determinado tiempo, el cual utiliza una serie de recursos del sistema”. Recursos. –Archivos abiertos & señales. –Datos internos del Kernel. –Estado del procesador. –Espacio de direcciones. –Hebras de ejecución. –Sección de datos (V. globales). Objetos activos –Procesos. –Hebras.
Generalidades Hebra. –Unico contador de programa. –Stack de procesos. –Registros de procesador. –Planificación individual. Visiones. –Sistemas Tradicionales : Cada proceso consiste en una hebra. –Sistemas Modernos: Multihebra, más de una hebra en común. GNU/Linux. –Unica implementación de hebras. –NO diferencia entre procesos y hebras (proceso especial).
Generalidades Procesos proveen dos virtualizaciones. –Memoria Virtual. –Procesamiento Virtualizado. Ciclo de vida del proceso. –Comienza con la creación. –Termina con la finalización del proceso y la liberación de los recursos.
Descriptor de Procesos Estructura Task Descriptor de Procesos. –Contiene toda la información acerca de un proceso. –Definido en.
Descriptor de Procesos Almacenamiento del descriptor. Indentificación de procesos. –Process Identification Descriptor (PID). –PID, valor númerico (int). –Representando por tipo pid_t. –Valor máximo por defecto, ( short int). Valor máximo. –Limita el numéro máximo de procesos que pueda manejar el sistema. –Ambiente de Escritorio: valor defecto apropiado. –Ambiente de Servidor: aumentar valor. –Personalizar valor en /proc/sys/kernel/pid_max
Descriptor de Procesos Estado de los Procesos TASK_RUNNING –Proceso en ejecución. Cualquier proceso que esta ejecutandose. Un proceso en espera en runqueue. Válido para procesos en user-space. TASK_INTERRUPTIBLE –Proceso dormido (bloqueado). A la espera de una condición. Si se cumple la condición cambia estado a TASK_RUNNING. Se despierta y se ejecuta.
Descriptor de Procesos Estado de los Procesos TASK_UNINTERRUPTIBLE –Proceso dormido (bloqueado), sometido solo al cumplimiento de una condición. Espera sin interrupción. No recibe señales. TASK_ZOMBIE –Proceso terminado. A la espera que el padre solicite información del estado de termino. TASK_STOPPED –Ejecución de proceso detenida. Ocurre si recibe señales SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU.
Descriptor de Procesos Estado de los Procesos
Descriptor de Procesos Manipulación de los Estados Kernel requiere cambiar los estados de los procesos. Mecanismo de Manipulación. –Modificar estado. set_task_state(task,state); task->state =state; –Obtener estado. set_current_state(state); state=task->state;
Descriptor de Procesos Contexto de los procesos Ejecución de código de programa. –Leído desde un archivo binario. –Ejecutado en el espacio de direcciones. –Normalmente corre en user-space. –Si ejecuta system calls kernel-space. –Se ejecuta el proceso. –Sale del kernel-space. –Resume su ejecución en el user-space.
Descriptor de Procesos A rbol de familia de procesos init process –Todos los procesos desciende de él. –PID es 1. –Se inicia en el último paso de la etapa de boot. –Lee los system initscripts. –Ejecuta el resto de los programas faltantes, para completar el boot.
Descriptor de Procesos A rbol de familia de procesos Procesos. –Tienen un solo padre. –Tienen cero o más hijos. –Todos los procesos que son hijos del mismo padre se llaman “siblings”. –La relación entre procesos se almacena en el descriptor de procesos.
Creación de Procesos En sistemas UNIX, se crean con dos pasos. –fork(); –exec(); fork(); –Crea una copia del proceso actual. exec(); –Carga el proceso en el espacio de direcciones. –Comienza a ejecutarlo.
Creación de Procesos copy-on-write Tradicional fork(); –Ineficiente. –Copia excesiva de datos. –Mucha información va parar a la basura. Linux fork(); –Se implementa con la system call clone(); –fork(), vfork(), __clone() clone(); –fork(); clone(SIGCHLD, 0); –vfork(); clone(CLONE_VFORK | CLONE_VM | SIGCHLD, 0);
Implementación de Hebras Definición Hebras. –Abstracción de programación moderna. –Compartir espacio de direcciones. –Compartir archivos abiertos.. –Compartir otros recursos. –Permite programación concurrente. –Paralelismo.
Implementación de Hebras Approach Implementación como procesos estándar. Se ve como un proceso que comparte recursos con otros procesos. Utiliza la misma estructura de datos, task_struct.
Implementación de Hebras Creación Se crean como procesos normales. –clone(); Se pasan FLAGs. –clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0); –Comparte: espacio de dirección, recursos del sistema de archivos, descriptores de archivos y manipuladores de señales. –En otras palabras los flags los hacen ver como hebras.
Implementación de Hebras clone() Flags CLONE_FILES: Parent and child share open files. CLONE_FS: Parent and child share filesystem information. CLONE_IDLETASK: Set PID to zero (used only by the idle tasks). CLONE_NEWNS: Create a new namespace for the child. CLONE_PARENT: Child is to have same parent as its parent. CLONE_PTRACE: Continue tracing child.
Implementación de Hebras clone() Flags CLONE_SETTID: Write the TID back to user-space. CLONE_SETTLS: Create a new TLS for the child. CLONE_SIGHAND: Parent and child share signal handlers and blocked signals. CLONE_SYSVSEM: Parent and child share System V SEM_UNDO semantics. CLONE_THREAD: Parent and child are in the same thread group. CLONE_VFORK: vfork() was used and the parent will sleep until the child wakes it. CLONE_UNTRACED: Do not let the tracing process force
Implementación de Hebras clone() Flags CLONE_STOP: Start process in the TASK_STOPPED state. CLONE_SETTLS: Create a new TLS (thread-local storage) for the child. CLONE_CHILD_CLEARTID: Clear the TID in the child. CLONE_CHILD_SETTID: Set the TID in the child. CLONE_PARENT_SETTID: Set the TID in the parent. CLONE_VM: Parent and child share address space.
Implementación de Hebras Kernel Threads Generar gran rendimiento en operaciones de background. Ejecutan en kernel-space. No necesitan espacio de direcciones. Son planificables e interrumpibles. Creación vía clone(); El flag especial CLONE_KERNEL.
Finalización de Procesos System call exit(); –Voluntariamente. Proceso esta listo para terminar. Retorna a la función principal (subrutina). –Involuntariamente. Recibe una señal. –Llama a do_exit();
Finalización de Procesos do_exit() –Definida en kernel/exit.c –Libera todos los recursos utilizados por el proceso. –Informa al proceso padre que ha finalizado. –Proceso queda en TASK_ZOMBIE.
Finalización de Procesos Eliminación del descriptor Proceso padre obtiene información. Remueve el proceso de la lista de tareas. Deallocate el descriptor de procesos. Se elimina del kernel stack.
Preguntas y Respuestas