Preview only show first 10 pages with watermark. For full document please download

Gestión De Procesos E Hilos En Linux

Descripción: Linux

   EMBED


Share

Transcript

GESTIÓN DE PROCESOS E HILOS EN LINUX TAREAS LINUX Un proceso, o tarea, en Linux se representa por una estructura de datos task struot, que contiene información de diversas categorías: • Estado. El estado de ejecución del proceso (ejecutando, listo, suspendido, detenido, zombi). Pasaremos a describirlo posteriormente. • Información de planificación. Información necesitada por Linux para planificar procesos. Un proceso puede ser normal o de tiempo real y tener una prioridad. Los procesos de tiempo real se planifican antes que los procesos normales y, dentro de cada categoría, se pueden usar prioridades relativas. Hay un contador que lleva la cuenta de la cantidad de tiempo que un proceso ha estado ejecutando. • Identificadores. Cada proceso tiene un identificador único de proceso y también tiene identificadores de usuario y grupo. Un identificador de usuario se utiliza para asignar privilegios de acceso a recursos a un grupo de procesos. • Comunicación entre procesos. Linux soporta el mecanismo IPC encontrado en UNIX SVR. • Enlaces. Cada proceso incluye un enlace a sus padres, enlaces a sus hermanos (procesos con el mismo padre), y enlaces a todos sus hijos. • Tiempos y temporizadores. Incluye el tiempo de creación del proceso y la cantidad de tiempo de procesador consumido por el proceso hasta el momento. Un proceso también puede tener asociado uno o más temporizadores. Un proceso define un temporizador a través de una llamada al sistema; como resultado se manda una señal al proceso cuando finaliza el temporizador. Un temporizador puede ser de un solo uso o periódico. • Sistema de archivos. Incluye punteros a cualquier archivo abierto por este proceso, así como punteros a los directorios directorios actuales y raíz para este proceso. • Espacio de direcciones. Define el espacio de direcciones virtual asignado a este proceso. • Contexto específico del procesador. La información de los registros y de la pila que constituyen el contexto de este proceso. • Ejecutando. Este valor de estado se corresponde con dos estados. Un proceso Ejecutando puede estar ejecutando o está listo para ejecutar. • Interrumpible. Es un estado bloqueado, en el que el proceso está esperando por un evento, tal como la final ización de una operación de E/S, la disponibilidad de un recurso o una señal de otro proceso. • Ininterrumpible. Éste es otro estado bloqueado. La diferencia entre este estado y el estado Interrumpible es que en el estado Ininterrumpible un proceso está esperando directamente sobre un estado del hardware y por tanto no manejará ninguna señal. • Detenido. El proceso ha sido parado y sólo puede ser reanudado por la acción positiva de otro proceso. Por ejemplo, un proceso que está siendo depurado se puede poner en estado Parado. • Zombie. El proceso se ha terminado pero, por alguna razón, todavía debe tener su estructura de tarea en la tabla de procesos. HILOS LINUX Los sistemas UNIX tradicionales soportan un solo hilo de ejecución por proceso, mientras que los sistemas UNIX modernos suelen proporcionar soporte para múltiples hilos de nivel de núcleo por proceso. Como con los sistemas UNIX tradicionales, las versiones antiguas del núcleo de Linux no ofrecían soporte multihilo. En su lugar, las aplicaciones debían escribirse con un conjunto de funciones de biblioteca de nivel de usuario. La más popular de estas bibliotecas se conoce como biblioteca pthread (POSIX pthread), en donde se asociaban todos los hilos en un único proceso a nivel de núcleo. Hemos visto que las versiones modernas de UNIX ofrecen hilos a nivel de núcleo. Linux proporciona una solución única en la que no diferencia entre hilos y procesos. Utilizando un mecanismo similar al de los procesos ligeros de Solaris, los hilos de nivel de usuario se asocian con procesos de nivel de núcleo. Múltiples hilos de nivel de usuario que constituyen un único pro-ceso de nivel de usuario, se asocian con procesos Linux a nivel de núcleo y comparten el mismo ID de grupo. Esto permite a estos procesos compartir recursos tales como archivos y memorias y evitar la necesidad de un cambio de contexto cuando el planificador cambia entre procesos de los m ismos grupos. En Linux se crea un nuevo proceso copiando los atributos del proceso actual. Un nuevo proceso se puede donar de forma que comparte sus recursos, tales como archivos, manejadores de señales y memoria virtual. Cuando los dos procesos comparten la misma memoria virtual, funcionan como hi-los de un solo proceso. Sin embargo, no se define ningún tipo de estructura de datos independiente para un hilo. En lugar del mandato normal fork( ), los procesos se crean en Linux usando el mandato clone ( ). Este mandato incluye un conjunto de flags como argumentos. La llamada al sistema tradicional fork( ) se implementa en Linux con la llamada al sistema done ( ) sin ningún flag. Cuando el núcleo de Linux realiza un cambio de un proceso a otro, verifica si la dirección del directorio de páginas del proceso actual es la misma que en el proceso a ser planificado. Si lo es, están compartiendo el mismo espacio de direcciones, por lo que el cambio de contexto consiste básicamente en saltar de una posición del código a otra. Aunque los procesos donados que son parte del mismo grupo de procesos, pueden compartir el mismo espacio de memoria no pueden compartir la misma pila de usuario. Por tanto, la llamada done ( ) crea espacios de pila separados para cada proceso. Flags de la llamada done( ) de Linux. CLONE_CLEARID CLONE_DETACHED CLONE_FILES CLONE_FS CLONE_IDLETASK Borrar el ID de tarea. El padre no quiere el envío de la señal SIGCHLD en su finalización. El padre no quiere el envío de la señal SIGCHLD en su finalización. Compartir la tabla que identifica los archivos abiertos. Compartir la tabla que identifica al directorio raíz y al directorio actual de trabajo, así como el valor de la máscara de bits utilizada para enmascarar los permisos iniciales de un nuevo archivo. Establecer el PID a cero, que se refiere a la tarea idle. La tarea idle se utiliza cuando todas las tareas disponibles están bloqueadas esperando por recursos. CLONE_NEWNS CLONE_PARENT CLONE_PTRACE CLONE_SETTID CLONE_SETTLS CLONE_SIGHAND CLONE_SYSVSEM CLONE_THREAD CLONE_VFORK CLONE_VM Crear un nuevo espacio de nombres para el hijo. El llamante y la nueva tarea comparten el mismo proceso padre. Si el proceso padre está siendo trazado, el proceso hijo también lo hará. Escribir eI TID en el espacio de usuario. Crear un nuevo TLS para el hijo. Compartir la tabla que identifica los manejadores de señales. Compartir la semántica SEM_UNDO de System V. Insertar este proceso en el mismo grupo de hilos del padre. Si está activado, el padre no se planifica para ejecución hasta que el hijo invoque la llamada al sistema execve(). Si este flag está activado, fuerza de forma implícita a CLONE_PARENT. Compartir el espacio de direcciones (descriptor de memoria y todas las tablas de páginas). GESTIÓN DE HILOS Y SMP EN WINDOWS El diseño de un proceso Windows está limitado por la necesidad de proporcionar soporte a diversos entornos de sistemas operativos. Los procesos soportados por diferentes entornos de sistemas operativos se diferencian en varias cosas, incluyendo las siguientes: • La denominación de los procesos. • Si se proporcionan hilos con los procesos. • Cómo se representa a los procesos. • Cómo se protege a los recursos de los procesos. • Qué mecanismos se utilizan para la comunicación y sincronización entre procesos. • Cómo se relacionan los procesos entre sí. Como consecuencia, las estructuras de los procesos y los servicios proporcionados por el núcleo de Windows son relativamente sencillos y de propósito general, permitiendo a cada subsistema del sistema operativo que emule una estructura y funcionalidad particular del proceso. Algunas características importantes de los procesos Windows son las siguientes: • Los procesos Windows están implementados como objetos. • Un proceso ejecutable puede contener uno o más hilos. • Tanto el objeto proceso como el objeto hilo, tienen funcionalidades de sincronización preconstruidas. La siguiente figura está basada en una de [SOL000], muestra la forma en la que un proceso se asocia a los recursos que controla o utiliza. A cada proceso se le asigna un testigo (token) de seguridad de acceso, denominada la ficha principal del proceso. Cuando un usuario inicia una sesión, Windows crea una ficha de acceso que incluye el ID de seguridad para el usuario. Cada proceso que se crea o ejecuta en representación de este usuario, tiene una copia de este testigo de acceso. Windows lo utiliza para comprobar si el usuario puede acceder a objetos de seguridad, o puede realizar funciones restringidas en el sistema o en un objeto de seguridad. El testigo de acceso controla si un proceso puede modificar sus propios atributos. En este caso, el proceso no tiene un manejador abierto hacia su testigo de acceso. Si el proceso intenta abrir este manejador, el sistema de seguridad determinará si está permitido y por tanto si el proceso puede modificar sus propios atributos. También relacionado con el proceso, hay una serie de bloques que definen el espacio de direcciones virtuales actualmente asignado al proceso. El proceso no puede modificar directamente estas estructuras, ya que dependen del gestor de memoria virtual, que proporciona servicios de asignación de memoria a los procesos. Finalmente, el proceso incluye una tabla de objetos, que trata los otros objetos conocidos por el proceso. Hay un manejador para cada hilo que está contenido en este objeto. También muestra un único hilo. El proceso tiene acceso a un objeto archivo y a un objeto segmento, que define un segmento de memoria compartido. OBJETO PROCESO Y OBJETO HILO La estructura orientada a objetos de Windows facilita el desarrollo de un proceso de propósito general Windows hace uso de dos tipos de objetos relacionados con los procesos: procesos e hilos. Un proceso es una entidad que corresponde a un trabajo de usuario o una aplicación que posee recursos como la memoria y archivos abiertos. Un hilo es una unidad de trabajo que se puede activar, que ejecuta secuencialmente y que es interrumpible, de forma que el procesador puede cambiar a otro hilo. Cada proceso Windows se representa por un objeto. Única forma de invocar a este servicio es a través de mensajes a un objeto proceso que proporciona ese servicio. Cuando Windows crea un nuevo proceso, utiliza el objeto definido para el proceso Windows como plantilla para generar la nueva instancia del proceso. En el momento de la creación se asignan los valores de los atributos. Un proceso Windows debe contener por lo menos un hilo que ejecutar. Ese hilo puede a su vez crear otros hilos. En un sistema multiprocesador, múltiples hilos de un mismo proceso pueden ejecutar en paralelo. Es importante darse cuenta de que alguno de los atributos de los hilos se asemeja a los de los procesos. En estos casos, el valor del atributo del hilo se deriva del valor del atributo del proceso. Por ejemplo, la afinidad de procesador asociada al hilo (thread processor afliniffl es el conjunto de procesadores, en un sistema multiprocesador, que pueden ejecutar este hilo. Este conjunto es igual o un subconjunto de la afinidad de procesador asociada al proceso. Adviértase que uno de los atributos del proceso hilo es el contexto. Esta información permite que el hilo se suspenda y reanude. Más aún, es posible cambiar el comportamiento de un hilo, alterando su contenido cuando el hilo está suspendido. MULTIHILO Windows soporta la concurrencia entre procesos ya que hilos de diferentes procesos pueden ejecutar en paralelo. Además, múltiples hilos del mismo proceso pueden estar asignados a distintos procesadores y pueden ejecutar de modo concurrente. Un proceso multihilo puede lograr la concurrencia sin la sobre-carga del uso de múltiples procesos. Los hilos del mismo proceso pueden intercambiar información a través de su espacio de direcciones común y tienen acceso a los recursos compartidos del proceso. Los hilos de diferentes procesos pueden intercambiar información a través del uso de memoria compartida. Objeto de Proceso en Windows Objeto de Hilos en Windows Un proceso multihilo orientado a objetos es una forma efectiva de implementar una aplicación servidora. Por ejemplo, un proceso servidor podría atender a varios clientes. Cada petición de cliente desencadena la creación de un nuevo hilo del servidor. ESTADO DE LOS HILOS Un hilo de Windows se encuentra en uno de estos seis estados: • Listo (ready). Puede planificarse para ejecución. El activador del micronúcleo conoce todos los hilos listos y los planifica en orden de prioridad. • Substituto (standby). Un hilo substituto se  ha seleccionado para ejecutar en siguiente lugar en un determinado procesador. Si la prioridad del hilo substituto es suficientemente alta, el hilo actualmente en ejecución en ese procesador podría ser expulsado en su favor. De otra forma, el hilo substituto espera hasta que el hilo en ejecución se bloquea o finaliza su porción de tiempo. • Ejecutando (running). Una vez que el micronúcleo realiza un intercambio de hilo o proceso, el hilo susbtituto pasa al estado de ejecución y ejecuta hasta que es expulsado, finaliza su porción de tiempo, se bloquea o termina. En los dos primeros casos vuelve a la cola de listos. • Esperando (waitlag). Un hilo pasa a estado esperando cuando (1) se bloquea en un evento (por ejemplo, E/S), (2) espera voluntariamente por temas de sincronización, o (3) un subsistema manda al hilo a estado de suspendido. Cuando se satisface la condición de espera, el hilo pasa al estado Listo si todos sus recursos están disponibles. • Transición (transition). Un hilo entra en este estado después de esperar si está listo para ejecutar pero los recursos no están disponibles. Por ejemplo, la pila del hilo puede no estar en memoria. Cuando los recursos están disponibles, el hilo pasa al estado Listo. • Terminado (terminated). Un hilo se puede finalizar por sí mismo, por otro hilo o cuando su proceso padre finaliza. Cuando se completan las tareas internas, el hilo se borra del sistema, o puede retenerse por el ejecutivo para futuras reinicializaciones. SOPORTE PARA SUBSISTEMAS DE SISTEMAS OPERATIVOS Los servicios de procesos e hilos de propósito general, deben dar soporte a las estructuras de procesos e hilos de varios SO cliente. Cada subsistema de SO es responsable de sacar provecho de los procesos e hilos de Windows para su propio sistema operativo. Esta área de gestión de procesos/hilos es complicada, y nosotros sólo damos una pequeña visión general. La creación de un proceso comienza con la petición de una aplicación de un nuevo proceso. La aplicación manda una solicitud de creación de proceso a su correspondiente subsistema, que pasa la solicitud al ejecutivo de Windows. El ejecutivo crea un objeto proceso y devuelve al subsistema el manejador de dicho objeto. Cuando Windows crea un proceso, no crea automáticamente un hilo. En el caso de Win32 y OS/2, siempre se crea un nuevo proceso con un hilo. Por consiguiente, para estos sistemas operativos, el subsistema llama de nuevo al gestor de procesos de Windows para crear un hilo para el nuevo proceso, recibiendo un manejador de hilo como respuesta. A continuación se de-vuelven a la aplicación la información del hilo y del proceso. En el caso de Windows 16-bit y POSLX, no se soportan los hilos. Por tanto, para estos sistemas operativos, el subsistema obtiene un hilo para el nuevo proceso de Windows, para que el proceso pueda activarse, pero devuelve sólo la información del proceso a la aplicación. El hecho de que el proceso de la aplicación esté implementado como un hilo, no es visible para la aplicación. Cuando se crea un nuevo proceso en Win32 o OS/2, el nuevo proceso hereda muchos de sus atributos del proceso que le ha creado. Sin embargo, en el entorno Windows, este procedimiento de creación se realiza indirectamente. El proceso cliente de una aplicación manda su solicitud de creación de proceso al subsistema del SO; un proceso del subsistema a su vez manda una solicitud de proceso al ejecutivo de Windows. Ya que el efecto deseado es que el nuevo proceso herede las características del proceso cliente, y no del proceso servidor, Windows permite al subsistema especificar el padre del nuevo proceso. El nuevo proceso hereda el testigo de acceso, límite de cuota, prioridad base y afinidad a procesador por defecto de su padre. SOPORTE PARA MULTIPROCESAMIENTO SIMÉTRICO Windows soporta una configuración hardware SMP. Los hilos de cualquier proceso, incluyendo los del ejecutivo, pueden ejecutar en cualquier procesador. En ausencia de restricciones de afinidad, explicadas en el siguiente párrafo, el micronúcleo asigna un hilo listo al siguiente procesador disponible. Esto asegura que ningún procesador está ocioso o está ejecutando un hilo de menor prioridad cuando un hilo de mayor prioridad está listo. Múltiples hilos de un proceso pueden ejecutar a la vez en múltiples procesadores. Por defecto, el micronúcleo utiliza la política afinidad débil (solf affinity) para asignar procesa-dores a los hilos: el planificador intenta asignar un proceso listo al mismo procesador que lo ejecutó la última vez. Esto ayuda a reutilizar datos que estén todavía en la memoria cache del procesador de la ejecución previa del hilo. Para una aplicación es posible restringir la ejecución de sus hilos a determinados procesadores afinidad fuerte (hard affinity).