Unidad 3:Gestión de Procesos Implantación de Sistemas Operativos 1º ASIR Encarni Moreno
Introducción Para definir lo que es un proceso, hay que establecer la diferencia con el concepto de programa: ◦ Un programa es una entidad pasiva compuesta únicamente por un código y unos datos, es decir, tiene un listado fijo. ◦ Un proceso es una entidad activa, es el “programa” en ejecución.
Bloque de Control de Proceso Un bloque de control de proceso (BCP) es una estructura de datos que contiene cierta información importante acerca del proceso, incluyendo, entre otra: ◦ Estado del proceso: Determina la situación actual del proceso. ◦ Identificador de proceso: Es un número i entre 0-N (no se admiten nº negativos). Se le denomina PID y es el mismo durante toda la vida del proceso. ◦ Registros de la CPU: Almacenan información necesaria del proceso cuando se producen interrupciones como consecuencia de un cambio de estado, y así poder recuperarla para volver al estado original. ◦ Límites de memoria: Indican los límites de memoria utilizados por un determinado proceso para evitar que otros los invada. Además existe una zona de memoria donde se colocan los BCP, esa zona solo es accesible por el sistema operativo cuando se encuentra en modo supervisor. ◦ Información del ‘status’ de las operaciones de E/S: Se refiere a las operaciones de E/S que el proceso está realizando, sobre que dispositivos si son de Entrada o de Salida. Estas operaciones, según van siendo atendidas, van siendo eliminadas del BCP. ◦ Información del planificador de procesos: Sobre el tipo de algoritmo de planificación que se esté utilizando.
El PCB es un almacenamiento central de información que permite al sistema operativo localizar toda la información clave sobre el proceso. Cuando el sistema operativo cambia la atención de la CPU entre los procesos, utiliza las áreas de preservación para mantener la información que necesita para reiniciar el proceso cuando consiga de nuevo la CPU. Debido a que los PCB deben ser manipulados con rapidez por el sistema operativo, muchos sistemas de computación contienen un registro de hardware que apunta siempre al PCB del proceso que está en ejecución, el proceso en curso.
Estados de un proceso Durante su existencia, un proceso pasa por una serie de estados discretos. Varias circunstancias pueden hacer que un proceso cambie de estado. Los estados más importantes en que puede encontrarse un proceso son: ◦ En Ejecución (o activo): Si el proceso tiene asignada en ese momento la CPU. ◦ Bloqueado (en espera): Si el proceso espera que ocurra algo (la terminación de una E/S por ejemplo) para poder ponerse en marcha. ◦ Listo (preparado): Cuando el proceso podría usar una CPU, si hubiera una disponible.
Transiciones de Estado El S.O inicia la ejecución de un proceso nuevo que está listo. Cuando este proceso no va a utilizar la CPU durante un tiempo : INTERRUPCIÓN (hay una llamada a E/S etc.) el S.O lo pone bloqueado hasta que acaba esa operación. Mientras tanto pasa a la CPU la ejecución de otro proceso que estuviera listo y realiza los mismos pasos: ejecuta hasta que esté Bloqueado si es necesario y pasa a ejecutar otro. Cuando la acción del proceso que está bloqueado termina (acaba la E/S, etc.) el S.O lo pone otra vez en estado de listo, así hasta que termina con todo el proceso.
El S.O deberá decidir que proceso de los que están listos pasará a ejecutable cuando la CPU quede libre, esta decisión lo hará a través de un Planificador de procesos (DISPATCHER).
Interrupciones Permite interrumpir la ejecución de un proceso ante el acontecimiento de un suceso determinado, tomando el control el S.O. El Procesador puede ejecutar otras instrucciones mientras se está realizando alguna operación de E/S. Ante una interrupción, la forma de actuar es (FLIHo manejador de interrupciones de primer nivel): ◦ Procesador registra situación exacta de la ejecución del trabajo actual. ◦ Se desvía a la rutina de tratamiento de la interrupción. ◦ La procesa según su naturaleza y, posteriormente, reanudar el mismo u otro trabajo de usuario. ◦ La rutina de tratamiento de la interrupción forma parte del S.O. Este programa determina la naturaleza de la interrupción y ejecuta cuantas acciones sean necesarias.
Tipos de Interrupciones Hardware.- Generadas por los dispositivos cuando finalizan una E/S. Software.- Generadas por el propio proceso. Hay 2 tipos: ◦ Llamadas al sistema: Se producen mediante la invocación de una instrucción que existe en casi todos los procesadores (Trap al S.O.). Se usan para pedir servicios al S.O. y se gestionan como si fuesen una interrupción. ◦ Excepciones: Se producen cuando el proceso produce un error grave que impide continuar con su ejecución (por ejemplo “división por cero”) Finaliza proceso y cambiar a otro.
Planificación de Procesos Es el encargado de pasar trabajos o procesos a la memoria principal y a la CPU, decidiendo qué procesos de los que están listos pasarán a ejecución cuando la CPU se libere de algún otro proceso (cuando este pase a estar bloqueado). Sigue los pasos siguientes: ◦ Decidir si se cambia el proceso. ◦ Decidir mediante un algoritmo entre los procesos ejecutables, cual es el siguiente al que le asigna el procesador. ◦ Salvar la información del proceso que se estaba ejecutando ( si no lo hizo el tratamiento de interrupciones) ◦ Cargar toda la información necesaria del proceso elegido. ◦ Pasar el control al siguiente proceso.
Algoritmos de Planificación Apropiativo: Aquellos en los que unos procesos tienen prioridad sobre otros y cuando acaban de estar bloqueados y pasan a listos hacen que el S.O les dé paso a la CPU que abandona el proceso que tenía en ejecución, lo pone listo y pasa a ejecutar el que tiene prioridad. No apropiativo: Aquella en la cual, la CPU ejecuta un proceso hasta que lo termina o por alguna razón éste pasa a estar bloqueado. Para evaluar el comportamiento de los distintos algoritmos se definen, entre otros, los siguientes parámetros: ◦ Tiempo de respuesta: Tiempo transcurrido desde que se hace una petición de CPU, hasta que es satisfecha. ◦ Tiempo de espera: Tiempo que está en estado de listo. ◦ Penalización : tiempo de respuesta= tiempo de finalización / tiempo de CPU ◦ Rendimiento: Número de trabajos terminados por unidad de tiempo.
Algoritmos de Planificación FCFS (First Come First Served): Los procesos son servidos en orden a su llega a la cola de listos. Dichos procesos se ejecutarán hasta que terminen o se bloqueen. Su implementación es una cola FIFO. SJF (Shortest Job First) : Primero el más corto. La CPU se asigna al proceso al que le queda menos tiempo para completar su ejecución y a igualdad de condiciones al primero que haya hecho la petición. SRT (Short Remainder Time): SJF Apropiativo. PRIORIDAD: A cada proceso se le asigna un determinado valor de prioridad, definida interna o externamente. La CPU se asigna al de mayor prioridad y a igualdad se sigue el algoritmo FCFS. En este ejemplo, el proceso de menor número (En la columna prioridad), es el de mayor prioridad.
ROUND ROBIN: La CPU se asigna a los procesos en intervalos de tiempo llamados QUANTUM. Si el proceso finaliza o se bloquea antes de agotar el quantum, se toma el siguiente en la lista y se le asigna un nuevo intervalo de tiempo, si por el contrario agota su quantum pasa al final de la lista. La lista se trata como una cola FIFO.
COLAS MULTIPLES: La cola de ejecutables se divide en varias colas, los trabajos son asignados permanentemente a una cola, según algún criterio (cada cola puede tener un algoritmo de asignación, además debe existir un algoritmo de asignación entre las colas). Si existe traspaso un trabajo puede cambiar de cola bajo algún criterio.
Comunicación de procesos: Paso de mensajes Para comunicar procesos en un ambiente distribuido, además de el uso de un sistema de nombres de recursos, se necesita un esquema de comunicación lógico que dé sentido a estas transacciones. El sistema operativo provee mínimamente dos primitivas, enviar y recibir, normalmente llamadas send y receive, pero tendrá que implementar un enlace de comunicación entre los procesos. Este enlace puede ser unidireccional o multidireccional según permita la comunicación en solo uno o en varios sentidos, y dependiendo de la forma en que se dispara la comunicación
Comunicación Síncrona: Quien envía permanece bloqueado esperando a que llegue una respuesta del receptor antes de realizar cualquier otro ejercicio. Comunicación Asíncrona: Quien envía continúa con su ejecución inmediatamente después de enviar el mensaje al receptor.
Comunicación Directa: Las primitivas enviar y recibir usan directamente el nombre del proceso con el que se comunican. Por ejemplo: enviar (mensaje, A) envía un mensaje al proceso A. Obsérvese que la primitiva sólo debe especificar cual va a ser el proceso Destino, ya que el proceso fuente viene direccionado en la comunicación. Las operaciones básicas Send y Receive se definen de la siguiente manera: Send (P, mensaje); envía un mensaje al proceso P. Receive (Q, mensaje); espera la recepción de un mensaje por parte del proceso Q. Comunicación Indirecta: El proceso coloca el mensaje en un buffer del cual leen los procesos de forma impersonal (el mensaje no está dirigido a ningún proceso en concreto). Comunicación Simétrica: Todos los procesos pueden enviar o recibir. También establece una llamada bidireccional para el caso de dos procesos. Comunicación Asimétrica: Un proceso puede enviar, los demás procesos solo reciben. También llamada unidireccional o no interactiva. Es el esquema típico de algunos servidores de Internet.
Comunicación de procesos: Semáforos Un semáforo es un contador usado para proveer acceso a datos compartidos por múltiples procesos. Para obtener acceso a un recurso compartido el proceso: Chequea el valor del semáforo: ◦ Si el valor es mayor que 0, se puede usar el recurso. El semáforo es decrementado en 1. ◦ Si el valor en 0, el proceso se va a dormir (bloquea) hasta que el valor sea mayor que 0. ◦ Cuando un proceso deja de usar el recurso solicitado, el semáforo se incrementa en 1. La inicialización de semáforos se realiza de la siguiente forma: ◦ Si el recurso tiene acceso de forma exclusiva, inicializamos el semáforo a 1. ◦ En caso contrario el valor será la cantidad de procesos que pueden acceder al recurso de forma simultánea.
Comunicación de procesos: Memoria Compartida Son bloques de memoria que pueden utilizar varios procesos simultáneamente. Existe un proceso creador al cual el SO asigna la cantidad de memoria solicitada. El resto de procesos declara esa zona como memoria compartida para utilizarla. Se necesita sincronizar las lecturas/escrituras en la zona (no se pueden solapar) mediante un método de sincronización.
Hilos Los hilos son un concepto relativamente nuevo de los SO. En este contexto, un proceso recibe el nombre de proceso pesado, mientras que un hilo recibe el nombre de proceso ligero. El término hilo se refiere sintáctica y semánticamente a hilos de ejecución. El término multihilo hace referencia a la capacidad de un SO para mantener varios hilos de ejecución dentro del mismo proceso. Un hilo (proceso ligero) es una unidad básica de utilización de la CPU, y consiste en un contador de programa, un juego de registros y un espacio de pila. Un proceso tradicional o pesado es igual a una tarea con un solo hilo.
Comandos Linux Procesos ps: El comando ps es el que permite informar sobre el estado de los procesos. ps esta basado en el sistema de archivos /proc, es decir, lee directamente la información de los archivos que se encuentran en este directorio. Tiene una gran cantidad de opciones, incluso estas opciones varían dependiendo del estilo en que se use el comando. Estas variaciones sobre el uso de ps son las siguientes: ◦ Estilo UNIX, donde las opciones van precedidas por un guión - ◦ Estilo BSD, donde las opciones no llevan guión ◦ Estilo GNU, donde se utilizan nombres de opciones largas y van precedidas por doble guión
Sea cual sea el estilo utilizado, dependiendo de las opciones indicadas, varias columnas se mostrarán en el listado de procesos que resulte, estas columnas pueden ser entre muchas otras, las siguientes (y principales): p o PID Process ID, número único o de identificación del proceso. P o PPID Parent Process ID, padre del proceso U o UID User ID, usuario propietario del proceso t o TT o TTY Terminal asociada al proceso, si no hay terminal aparece entonces un '?'
T o TIME Tiempo de uso de cpu acumulado por el proceso c o CMD El nombre del programa o comando que inició el proceso RSS Resident Sise, tamaño de la parte residente en memoria en kilobytes SZ o SIZE Tamaño virtual de la imagen del proceso NI Nice, valor nice (prioridad) del proceso, un número positivo significa menos tiempo de procesador y negativo más tiempo (-19 a 19) C o PCPU Porcentaje de cpu utilizado por el proceso STIME Starting Time, hora de inicio del proceso S o STAT Status del proceso,
Estados de un proceso R runnable, en ejecución, corriendo o ejecutándose S sleeping, proceso en ejecución pero sin actividad por el momento, o esperando por algún evento para continuar T sTopped, proceso detenido totalmente, pero puede ser reiniciado Z zombie, difunto, proceso que por alguna razón no terminó de manera correcta, no debe haber procesos zombies D uninterruptible sleep, son procesos generalmente asociados a acciones de IO del sistema X dead, muerto, proceso terminado pero que sigue apareciendo, igual que los Z no deberían verse nunca
pstree: Muestra los procesos en forma de árbol, pstree -- help te da las opciones más comunes. Recomiendo uses lo uses con la opción -A y -G para que te un árbol con líneas con líneas estilo ASCII y de terminal VT100 respectivamente, puedes añadir también -u para mostrar entre paréntesis al usuario propietario del proceso kill: El comando kill, que literalmente quiere decir matar, sirve no solo para matar o terminar procesos sino principalmente para enviar señales (signals) a los procesos. La señal por default (cuando no se indica ninguna es terminar o matar el proceso), y la sintaxis es kill PID, siendo PID el número de ID del proceso. Así por ejemplo, es posible enviar una señal de STOP al proceso y se detendrá su ejecución, después cuando se quiera mandar una señal de continuar y el proceso continuara desde donde se quedo.
◦ #> kill (termina, mata un proceso completamente) ◦ #> kill -SIGKILL (Lo mismo que lo anterior) ◦ Las señales más comunes son la 19 y 20 que detienen momentáneamente la ejecución de un proceso o programa, 18 la continua, 1 que es la señal de hang up que obliga al proceso a releer sus archivos de configuración estando en ejecución y 9 que termina rotundamente un proceso. killall: El comando killall, que funciona de manera similar a kill, pero con la diferencia de en vez de indicar un PID se indica el nombre del programa, lo que afectará a todos los procesos que tengan ese nombre. Así por ejemplo si se tienen varias instancias ejecutándose del proxy server squid, con killall squid eliminará todos los procesos que se esten ejecutando con el nombre 'squid'
nice: Permite cambiar la prioridad de un proceso. Por defecto, todos los procesos tienen una prioridad igual ante el CPU que es de 0. Con nice es posible iniciar un programa (proceso) con la prioridad modificada, más alta o más baja según se requiera. Las prioridades van de -20 (la más alta) a 19 la más baja. Solo root o el superusuario puede establecer prioridades negativas que son más altas. Con la opción -l de ps es posible observar la columna NI que muestra este valor. ◦ #> nice (sin argumentos, devuelve la prioridad por defecto ) 0 ◦ #> nice -n -5 comando (inicia comando con una prioridad de -5, lo que le da más tiempo de cpu)
nohup y &:Cuando se trata ejecutar procesos en background (segundo plano) se utiliza el comando nohup o el operador &. Aunque realizan una función similar, no son lo mismo. Si se desea liberar la terminal de un programa que se espera durará un tiempo considerable ejecutándose, entonces se usa &. Esto funciona mejor cuando el resultado del proceso no es necesario mandarlo a la salida estándar (stdin), como por ejemplo cuando se ejecuta un respaldo o se abre un programa Xwindow desde la consola o terminal. Para lograr esto basta con escribir el comando en cuestión y agregar al final el símbolo & (ampersand). ◦ $> yes > /dev/null & $> tar czf respaldo /documentos/* > /dev/null/ & $> konqueror & (con estos ejemplos se ejecuta el comando y se libera la terminal regresando el prompt) Sin embargo lo anterior produce que el padre del proceso PPID que se invocó sea el proceso de la terminal en si, por lo que si cerramos la terminal o salimos de la sesión también se terminaran los procesos hijos que dependan de la terminal, no muy conveniente si se desea que el proceso continué en ejecución. Para solucionar lo anterior, entonces se usa el comando nohup que permite al igual que '&' mandar el proceso y background y que este quede inmune a los hangups (de ahí su nombre nohup) que es cuando se cuelga o termina la terminal o consola de la cual se ejecutó el proceso. ◦ $> nohup yes > /dev/null & $> nohup czf respaldo /documentos/* > /dev/null/ $> nohup konqueror Así se evita que el proceso se "cuelgue" al cerrar la consola.
Jobs: Si por ejemplo, se tiene acceso a una única consola o terminal, y se tienen que ejecutar varios comandos que se ejecutarán por largo tiempo, se pueden entonces como ya se vió previamente con nohup y el operador '&' mandarlos a segundo plano o background con el objeto de liberar la terminal y continuar trabajando. Pero si solo se está en una terminal esto puede ser difícil de controlar, y para eso tenemos el comando jobs que lista los procesos actuales en ejecución: ◦ #> yes > /dev/null & [1] ◦ #> ls -laR > archivos.txt & [2] ◦ #> jobs [1]- Running yes >/dev/null & [2]+ Running ls --color=tty -laR / >archivos.txt & En el ejemplo previo, se ejecutó el comando yes y se envió a background (&) y el sistema devolvió [1] 26837, indicando así que se trata del trabajo o de la tarea [1] y su PID, lo mismo con la segunda tarea que es un listado recursivo desde la raíz y enviado a un archivo, esta es la segunda tarea. Con los comandos fg (foreground) y bg background es posible manipular procesos que estén suspendidos temporalmente, ya sea porque se les envió una señal de suspensión como STOP (20) o porque al estarlos ejecutando se presionó ctrl-Z. Entonces para reanudar su ejecución en primer plano usaríamos fg: #> jobs [1]- Stopped yes >/dev/null & [2]+ Stopped ls --color=tty -laR / >archivos.txt & #> fg %1 #> jobs [1]+ Running yes >/dev/null & [2]- Stopped ls --color=tty -laR / >archivos.txt & Obsérvese como al traer en primer plano al 'job' o proceso 1, este adquirió el símbolo [+] que indica que esta al frente. Lo mismo sería con bg que volvería a reinicar el proceso pero en segundo plano. Y también es posible matar los procesos con kill indicando el número que devuelve jobs: kill %1, terminaría con el proceso en jobs número 1.
top: Una utilería muy usada y muy útil para el monitoreo en tiempo real del estado de los procesos y de otras variantes del sistema es el programa llamado top, se ejecuta desde la línea de comandos, es interactivo y por defecto se actualiza cada 3 segundos. ◦ $> top Estando dentro de la aplicación, presionando 'h' muestra una ayuda de los posibles comandos que permiten configurar top, por ejemplo, al presionar 's' pregunta por el tiempo en segundos de actualización, etc. Estas son algunas de las herramientas, las más importantes y usadas, para administrar procesos, hay varios programas en ambientes gráficos que en una sola pantalla permiten todo lo anterior y más, y en línea de comandos te recomiendo htop, que es como un top pero en esteroides.htop
Comandos procesos en Windows tasklist: Realiza un listado de todos los procesos que hay. Útil si deseamos eliminar un proceso y no conocemos exactamente su nombre o su PID. taskkill: Permite eliminar un proceso conociendo su nombre o el número del proceso (PID).