Transcript

Tema 8: Procesos en LinuxIES Serra Perenxisa 2009

Gestin de Procesos Un programa ejecutable es ledo del disco por el kernel y es cargado en memoria para ejecutarse, convirtindose en un proceso. En un proceso no slo hay una copia del programa, sino adems el kernel le aade informacin adicional para poder manejarlo. Un proceso se compone de tres bloques fundamentales:

segmento de texto segmento de datos pila

Espacio de Direcciones de un Proceso Unix 0xFFFFFFFFkernel

kernel stack stack (dynamic allocated mem)

system segment (call system) $fp $sp

shared libraries address spaceheap (dynamically allocated mem) un-initiated data (bss) read/write initiated data only read initiated data code (text segment)

static data (data segment) $pc

0x0

Gestin de Procesos

Segmento de texto: cdigo de programa Segmento de datos: variables globales y estticas Pila

Lo crea el kernel y su tamao es gestionado dinmicamente por el. Es una secuencia de bloques lgicos o stack frames Un stack frame se introduce o saca en funcin de si se llama o se vuelve de la llamada a una funcin. Stack frame se compone de: variables locales de funcin Parmetros de funcin Info. para volver al estado anterior de la llamada Las

Gestin de Procesos

Info. para volver al estado anterior de la llamada.

contador de programa puntero a pila al stack frame anterior

Los procesos pueden ejecutarse en dos modos: usuario y kernel. Cada modo maneja su propia pila o stack

stack del kernel: contiene los stack frames de las llamadas a sistema(funciones que se ejecutan en modo kernel) stack del usuario: stack frames de funciones que se ejecutan en modo usuario

Gestin de Procesos UNIX/Linux es un sistema multiproceso que permite la ejecucin de varios procesos de forma simultnea Requiere de otro programa llamado Planificador o scheduler que permite gestionar que proceso entra a ejecutarse en cada instante en la CPU, ya que esta es un recurso limitado. Todo proceso nace cuando algn otro proceso ejecuta la llamada al sistema clone. Una de las muchas formas de llamar a clone es a travs de la funcin fork. clone crea un duplicado idntico del proceso que la ha llamado.

API de Unix para manejo de ProcesosUnix proporciona un nmero de llamadas al sistema para creacin y control de procesos, que incluye:fork: usado para crear un nuevo proceso (hijo). exec: utilizado para cambiar el proceso actual por otro. vfork: usado para crear un proceso nuevo, que comparte el espacio de direcciones del padre. clone(): llamada al sistema en Linux y es una forma genrica de fork() y pthread_create(). wait: esperar por el trmino de la ejecucin de algn proceso hijo. waitpid: usado para esperar el trmino de ejecucin de un proceso hijo especfico. sleep: suspende la ejecucin de un proceso por un tiempo determinado. kill: usado para matar un proceso o enviar una seal. abort: usado para terminar con la ejecucin de un proceso en forma anormal. getpid: devuelve el pid del proceso. getppid: devuelve el pid del proceso padre. getuid: devuelve el identificador de usuario. getpgrp: devuelve el identificador de grupo del proceso.

Gestin de Procesos:clone Nuestro nuevo proceso no ver el espacio de direcciones del proceso padre, ni viceversa. Con mucha frecuencia, despus del clone el proceso llama a exec para lanzar un programa nuevo. La llamada a exec carga un programa en el espacio de direcciones del proceso y le pasa el control, perdindose el proceso llamante. Si un proceso quiere lanzar un programa sin desaparecer, lo que hace es llamar a clone y que el hijo llame a exec (servicios).

Gestin de Procesos:fork Fork: Crea un proceso hijo. Devuelve 0 al proceso hijo y el PID del hijo al proceso padre. El proceso hijo creado es una copia exacta del padre, excepto que recibe un valor diferente de la llamada fork. Devuelve un valor -1 en caso de no poder crearse el proceso hijo.ret=fork() if (ret==-1) {printf(ERROR);} else if (ret==0) {printf(HIJO);} else printf(PADRE)

Gestin de Procesos:fork Todos los procesos tienen un nico padre, pero un padre puede tener mltiples hijos. Existe un proceso especial cuyo PID es 0, este se crea al arrancar el sistema y despus de hacer una llamada fork se convierte en el proceso intercambiador (swapper), el proceso hijo se llama init y su PID vale 1. Este se encarga de arrancar los dems procesos que requiere el sistema.

Usando fork() crear (duplicar) un proceso#include #include #include #include void main(void) { pid_t pid; int i; int n = 10; for (i = 0; i < n; i++) { pid = fork(); if ( pid != 0 ) { printf("\n\n*********************** ITERACION %d **************\n",i); printf("Recien creado: %d\n",pid); printf("Creado por: %d\n",getpid()); printf("*****************************************\n"); break; Cdigo que ejecuta } el proceso hijo } printf("\n\n-------------------------FINAL DEL BUCLE -------------------------\n"); printf("Finalizando bucle de: %d\n",getpid()); printf("....padre = %d\n", getppid()); }

Gestin de Procesos:PID Cuando un proceso muere libera su pid y se puede asignar a cualquier nuevo proceso. En Linux 2.6 el PID se almacena en un entero y permite teoricamente hasta 2147483647(int 32bits=2^(31) +bit signo) procesos.cat /proc/sys/kernel/pid_max ->32768 (por defecto) echo 10000001 > /proc/sys/kernel/pid_max (hasta 1 Milln)

Con frecuencia se llega antes a la limitacin de cota de descriptores, ya que cada proceso consume al menos 3 descriptores (ES, SS, SE)cat /proc/sys/fs/file-max ->101815(por defecto)

Gestin de Procesos:estados El tiempo de vida de un proceso se puede dividir en un conjunto de estados. En un sistema monoprocesador un proceso no esta continuamente ejecutndose, su estado ir cambiando segn unas reglas bin definidas. En el siguiente grfico veremos cual es la transicin de procesos en UNIX/Linux y procederemos a su explicacin:

Gestin de Procesos:estados1.-Ejecutndose en modo usuario: tiene el control del procesador mientras dura el quanto o no realice una llamada al sistema. 2.-Ejecutndose en modo kernel: Cuando el proceso realiza una llamada a sistema, el proceso cambia de estado y pasa ejecutar cdigo de rea de kernel. Cuando termina:

Termina la tarea interrupcin (iret) vuelve a la siguiente instruccin que la llam. Si termina el quanto se hace un cambio de contexto, pasando el siguiente proceso a modo usuario Si carece de algn recurso->Estado dormido Si termina con exit->Estado zombi

Gestin de Procesos:estados3.-Planificado en memoria: tiene reservado los recursos de sistema que necesita. El proceso no se esta ejecutando, esta en cola de "listo para ejecutarse" esperando a que el planificador de tareas(scheduler) se lo permita. 4.-Dormido en memoria: El proceso esta durmiendo cargado en memoria, ya que esta esperando que se complete una operacin (E/S,tiempo de espera(timer)(ejm:sleep 10),espera de recibir un evento o mensaje) Nota: No puede haber un proceso, ejecutndose en modo usuario y kernel a la vez.

Gestin de Procesos:estados5.-Planificado en swap: Esta en memoria secundaria,listo para ejecutarse, pero el intercambiador (proceso 0 swapper) debe cargar el proceso en memoria antes de que el planificador(scheduler) pueda ordenar que pase a ejecutarse. 6.-Dormido en swap: El proceso esta durmiendo y el intercambiador ha descargado el proceso hacia una memoria secundaria para dejar espacio en la memoria principal donde poder cargar otros procesos. 7.-El proceso esta volviendo del modo superusuario al modo usuario, pero el planificador se apropia del proceso y hace un cambio de contexto, pasando otro proceso a ejecutarse en modo usuario.

Gestin de Procesos:estados8.-El proceso acaba de ser creado(con fork) y est en un estado de transicin; el proceso existe, pero ni est preparado para ejecutarse, ni durmiendo. Este estado es el inicial para todos los procesos, excepto el proceso 0. 9.-El proceso ejecuta la llamada exit y pasa al estado zombi. El proceso libera todos los recursos pero mantiene la entrada en la Tabla de Procesos. No termina de morir, esperando la notificacin por parte del padre, de que ha recogido el registro que contiene el cdigo de salida y su estado. Es un estado temporal. En caso de que el proceso padre muera antes de que finalice el hijo, ser el proceso init quin asuma su paternidad.

Gestin de Procesos: estados1- Para ver un proceso en ejecucin, bastara con ejecutar ps aux y localizar en la salida del comando el proceso ps, que debera estar en ejecucin. 2- Si compilamos running.c con la orden gcc o running running.c y ejecutamos el programa ./running tambin veremos un proceso en ejecucin continuada. 3-Con el programa waiting.c que tiene un getchar(), el programa simplemente espera una entrada y est Sleeping. Si se le intenta enviar a segundo plano ./waiting & el sistema nos informa que el proceso pasa a estado T (stopped) por que en segundo plano no puede recibir nada por stdin.

Gestin de Procesos: estados4-ej_fork.c : El padre trabaja mientras que el hijo acaba. Esto resulta en: Padre con estado R e hijo con estado Z Si hicisemos un CTRL+Z el padre pasara a estar T (stopped). Si hacemos kill -9 padre, el hijo muere tambin

Gestin de Procesos: ciclo de vidaLa vida de un proceso comienza con la llamada al sistema de fork, desde el shell por ejemplo con ./a.out : 1.-Con la llamada a fork se crea el proceso, inicindose la informacin de contexto y asignando un PID al proceso hijo a.out. Su proceso padre ser el "shell".( Un proceso no se crea si: no puede encontrar el programa, falta de memoria, se ha sobrepasado el nmero de procesos que se puede crear...) 2.-El proceso pasa a estado "listo para ejecutarse".

Gestin de Procesos: ciclo de vida3.-Existe una funcin "scheduler" o "planificador" que en funcin de la poltica , se encarga de seleccionar a un proceso de la lista de "listo para ejecutarse". 4.-Un vez seleccionado el proceso a ejecutarse por el "planificador", se llama a la funcin "dispatcher" que se encarga de pasar a estado de ejecucin a dicho proceso, restaurando su informacin de contexto.

5.-En ejecucin se pasa de modo usuario a modo supervisor a travs de una llamada a sistema o interrupcin (cada vez que se necesita ejecutar alguna rutina del sistema operativo tal como una operacin de E/S para escribir un mensaje en pantalla...). En modo usuario, se verifica la zona de memoria a la que se accede, no sobrepase su rea de programa de usuario (zona datos e instrucciones) y no modifica el rea del Sistema Operativo(virus). Una vez finalizada la ejecucin de la rutina de E/S, el S.O devuelve el control al programa de usuario, pasando a modo usuario. printf(ejemplo) (modo ususario)->llamada a sistema write(modo kernel)

Gestin de Procesos: ciclo de vida

Gestin de Procesos: ciclo de vida6.-En caso de espera de un proceso por alguna operacin de E/S , por un evento de otro proceso, o un timer(intervalo de tiempo), el planificador enva al proceso a estado durmiendo. Para lo cual el planificador selecciona el siguiente proceso a ejecutar y el dispatcher lo pasa a estado de ejecucin. Una vez que la razn por el que un proceso esta "durmiendo" finalice el planificador pasa a estado "listo de ejecucin". 7.-Los procesos tienen un quanto de tiempo de ejecucin para el uso equitativo de la CPU. Sabiendo que los procesos ms prioritarios tendrn mayor nmero de quantos.

8.-En caso de que la memoria est saturada y haya necesidad de cargar un programa ms prioritario en memoria, el swapper o intercambiador se encarda de pasar un proceso menos prioritario a memoria secundaria guardando la informacin necesaria para volverlo a cargar en memoria, y una vez finalizado la ejecucin de un proceso, de pasarlo a memoria. Este transiego de memoria a disco y disco a memoria se le denomina "swapping de procesos". 9.-Un proceso puede acabar su ejecucin si :

Gestin de Procesos: ciclo de vida

llamada al sistema de fin_programa: exit Otro proceso le manda un SEAL de SIGKILL: kill -9 nPID

Gestin de Procesos: ciclo de vida En ambos casos pasa a estado zombi. El proceso ya no existe pero deja para su proceso padre un registro (cdigo de salida y algunos datos estadticos tales como tiempo de ejecucin) Para que un proceso pueda matar a otro es necesario que tenga privilegios, un proceso padre puede matar a sus procesos hijos.

Gestin de Procesos: ciclo de vida Los procesos se comunican habitualmente realizando llamadas a sistema de "esperar_hijo", que permite al proceso padre sincronizarse con la finalizacin de sus hijos y obtener la informacin de cmo han acabado los hijos por medio de algn tipo de cdigo de retorno.ret=fork() if (ret==-1) {printf(ERROR);} else if (ret==0) {printf(HIJO);} else {wait(&estado);printf(PADRE)}

Gestin de Procesos: Tabla de Procesos El sistema operativo mantiene una tabla de procesos, dentro de la cual se almacena un Bloque de Control de Proceso o PCB (Process Control Block). Un PCB tiene los siguientes campos:

Informacin de identificacin:

PID(Process IDentifier) y PPID(Parent Process Identifier) para relaciones padre-hijo. UID (User Identifier) y GID (Group Identifier) :determina los privilegios del proceso

Gestin de Procesos: Tabla de Procesos

Informacin de control para gestionar el proceso:

Planificacin y estado: Estado:

TASK_RUNNING(ejecutndose o preparado) TASK_INTERRUPTIBLE(dormido, pero admite cualquier seal) TASK_UNINTERRUPTIBLE ( dormido, pero slo responde a la seal que espera) TASK_STOPPED( stopped o traced) TASK_ZOMBIE(esperando un wait() ) Evento por el que espera si esta bloqueado

Gestin de Procesos: Tabla de Procesos

Informacin de control para gestionar el proceso:

Planificacin y estado: Temporizadores

que contabilizan el tiempo de CPU utilizado en modo kernel y modo usuario

Descripcin de los segmentos de memoria asignados al proceso. Estado del procesador: valor de los registros de la cpu

Gestin de Procesos: Tabla de Procesos

Punteros para estructurar los procesos en colas. Para que el planificador las gestione. Comunicacin entre procesos:

Descriptores de eventos: Qu eventos despertarn al proceso. Campo de seales: enumera las seales recibidas pero todava no tratadas.

Gestin de Procesos: Cambio de Contexto Cuando se esta ejecutando un proceso, se dice que el sistema se esta ejecutndo en el contexto de un proceso. Se denomina cambio de contexto a la accin de cargar el procesador con el contexto del proceso que pasa a ocupar la CPU, salvando previamente el contexto del proceso que abandona la CPU en su PCB.

Gestin de Procesos: Cambio de Contexto Se provoca un cambio de contexto cuando:

fin quanto finaliza el proceso operacin de sincronizacin-tenga que esperar llamada al sistema (operacin de entrada/salida) mediante el mecanismo trap (interrupcin software) queda bloqueado a la espera de finalizar la operacin. interrupcin hardware que desbloquee un proceso ms prioritario. la llegada de un proceso ms prioritario

Gestin de Procesos: Planificador de Procesos:Unix,tradicional Los PCBs estarn ordenados en la colas de preparados de acuerdo a la poltica de planificacin utilizada. El planificador se encarga de decidir a quin dar la tajada (slice o quanto) de tiempo. En Unix se utiliza el algoritmo de planificacin que se denomina Round Robin Multinivel con Prioridades Dinmicas.

Gestin de Procesos: Planificador de Procesos:Unix,tradicional 1 aproximacin: Algoritmo Round-Robin

Cola FIFO de procesos planificados Funcionamiento: Se coge el proceso ms antiguo y una vez ejecutado su quanto, vuelve a introducirse en la cola. Ventaja: Es un algoritmo justo. Desventaja: los procesos con mayor prioridad se ejecutarn con la misma frecuencia que los menos prioritarios

Gestin de Procesos: Planificador de Procesos:Unix,tradicional 2 aproximacin: Algoritmo Round-Robin Multinivel

Diferentes colas FIFO, cada una para procesos de la misma prioridad. Funcionamiento: Se coge el proceso ms antiguo de la cola de mayor prioridad. Slo si la cola de mayor prioridad esta vaca pasamos a la de siguiente menor prioridad. Ventaja: ptimo para sistemas de tiempo real Desventaja: No justo, puede haber procesos que jams se ejecuten.

Gestin de Procesos: Planificador: Unix tradicional 3 aproximacin: Algoritmo Round-Robin Multinivel conPrioridades Dinmicas

Diferentes colas FIFO, cada una para procesos de la misma prioridad. La prioridad tiene un componente esttico(nice de 19 a -20) y otro dinmico (segn el proceso va ejecutando slices, su prioridad dinmica va cayendo, y si no emplea el procesador su prioridad dinmica sube). Funcionamiento: Por cada segundo de tiempo se recalculan las prioridades y se reajustan las colas. Se coge el proceso ms antiguo de la cola de mayor prioridad. Slo si la cola de mayor prioridad esta vaca pasamos a la siguiente menor prioridad. Ventaja: Es justo Desventaja: El tiempo recalculando las prioridades dinmicas

Gestin de Procesos: Planificador:Unix,tradicional 3 aproximacin: Algoritmo Round-Robin Multinivel conPrioridades Dinmicas

Los procesos tienen prioridades. Existe una cola para cada una de la prioridades. Se atiende primero a los procesos de la cola -32, en caso de estar vaca se pasa al siguiente nivel hasta llegar a 31. En caso de no haber procesos planificados, se ejecuta el proceso idle Prioridad Total=Prioridad Base + (uso de cpu/2) + Valor Nice Prioridad Total se calcula cada segundo La Prioridad Base ser un valor negativo, si proceso se ejecuta en modo kernel y positivo si modo usuario, y depende de la prioridad del padre.

Gestin de Procesos: Planificador:Unix,tradicional 3 aproximacin: Algoritmo Round-Robin Multinivel conPrioridades Dinmicas.

El Valor Nice:

Es un valor comprendido entre -20 a 19. Por defecto es 0. Un usuario normal nicamente puede bajar la prioridad de su proceso ejecutndolo: nice -n 19 yes>/dev/null & [1] 2546 Un superusuario puede aumantar/reducir la prioridad de un proceso:

Cuando va a ejecutar 1 vez: nice -n -20 yes>/dev/null & Una vez en ejecucin: renice -20 2546

Ordenes relativas a procesos: ps

Lista los procesos activos en el sistema Examinar las opciones en el manual (castellano):

a: informacin de los procesos de todos los usuarios e: variables de entorno u: muestra los procesos de un solo usuario r: slo procesos en ejecucin x: todos los procesos del sistema l: salida larga

Ejemplos: ps aux, ps -edaf

Ordenes relativas a procesos: ps

Campos de salida:

UID (id. de usuario), PID (id. de proceso), PPID (padre), %CPU (ndice de uso del procesador), START (hora de inicio), TTY (terminal en la que se ejecuta el proceso), TIME (tiempo acumulado de CPU consumido por el proceso) PRI (prioridad de ejecucin, dinmica, a menor n mayor prioridad) NI(Valor del NICE) SIZE (tamao en bloques) RSS (tamao en Kb del programa en memoria) STAT (Estado del proceso): D:Durmiendo ininterrumpiblemente R:En ejecucin en ese momento S:Durmiendo Z:Zombie T:Parado W: Swapped out (sin pginas residentes) N:Nice positivo

Ordenes relativas a procesos: ps/top

gcc o running running.c cp running running1 (dos copias del ejecutable) ./running & jobs ps edaf Top S (intervalo) : 0.5 / 1 R (renice) -20 running (mxima prioridad) R (renice) -5 running1 K (kill) U (user) Al hacer el renice el proceso con el nmero ms negativo, consume ms CPU y su tiempo de ejecucin crece. Los dos procesos colapsan el 99% de uso de la CPU. El ratn va lento. + ./running1&

Ordenes de procesos: nice & renice

Nice n comando : fija el valor de nice para la ejecucin de un cierto proceso Valores vlidos de -20 a 19 Los usuarios slo pueden bajar la prioridad El root puede subir la prioridad a un proceso. Ejemplo: lanzar los dos running y running1 con nice diferente y con el comando top visualizar lo que ocurre. Renice n PID: Modifica la prioridad a un proceso ya en ejecucin Ejemplo: invertir la ejecucin de running y running1, para que el menos prioritario pase a ser ms prioritario (y consuma ms CPU).

Ordenes de procesos: sleep, wait, nohup

Sleep tiempo (segundos): Demora durante un cierto tiempo el inicio de una orden o genera una espera durante la ejecucin (sleep 3600; who >> registro) & Wait: cuando en programacin shell, nos interesa esperar a que acaben los procesos en background (&) antes de ejecutar la siguiente orden:

Orden1 > archivo1 & Orden2 > archivo2 & Wait Sort archivo1 archivo2

Nohup: Cuando un proceso muere, todos sus subordinados si los hubieramueren tambin. Al finalizar una sesin (login, konsole) tambin. Con nohup, un comando seguir en ejecucin a pesar de que el usuario que lo lanza se haya desconectado. Es interesante redirigir las salidas para capturarlas:

Nohup orden > salida 2>errores &

Ordenes de procesos: kill y seales

Kill: enva seales a procesos

Kill n_de_seal PID Un usuario puede eliminar cualquier proceso suyo El root puede eliminar cualquier proceso Las seales son sucesos externos a los procesos que tienen un nmero asociado. Por defecto se ejecuta la seal 15 SIGTERM (finalizacin software) La seal n 9 SIGKILL provoca la terminacin incondicional e inmediata del proceso

Kill -9 PID

Ejemplo: Desde konsole arrancar varios programas y finalizarlos con kill y/o con xkill.

Ordenes de procesos: seales

Las seales son mecanismos de comunicacin asncrona de procesos (interrupciones software que pueden ser enviadas a un proceso para informarle de alguna situacin especial) Permiten al proceso reaccionar a los eventos provocados por ellos mismos o por otros procesos. Puede generarse de diversas maneras:

Excepcin Hardware (acceso a pgina de memoria no asignada= SIGSEGV) CTRL+C (SIGINT) del usuario Llamada a kill (enva esa seal a un proceso) Evento gestionado por el ncleo)

Cuando un proceso recibe una seal hay 3 acciones predeterminadas:

Ignorar la seal Invocar una rutina de tratamiento standard (por lo general provocan la terminacin del proceso y generan un core) Invocar una rutina propia (modificada por el proceso)

Procesos: seales de terminacin de procesosNm. Nombre Descripcin1 SIGHUP Terminacin del proceso, desconexin

2 3 6 9 15

SIGINT SIGQUIT SIGABRT SIGKILL SIGTERM

CTRL+C por teclado Terminacin con core Terminacin anormal Terminacin no evitable Terminacin emitida por kill

Procesos: seales de excepcin hardwareNm. Nombre Descripcin4 SIGILL Instruccin ilegal

5 8 11

SIGTRAP SIGFPE SIGSEGV

Punto de parada en programa Floating Point Exception Direccin de memoria no vlida

Procesos: seales de suspensin o seguimiento en la ejecucin de procesosNm. Nombre Descripcin17 SIGCHLD Terminacin de un hijo

18 19 20

SIGCONT SIGSTOP SIGTSTP

El proceso se lleva a primer o segundo plano Suspensin de proceso Emisin de CTRL+Z

Procesos: seales de gestin de alarmas, SAI, entradas/salidasNm. Nombre Descripcin24 SIGXCPU Lmite de CPU (tiempo) sobrepasado

2

SIGALRM SIGPWR

Fin del tiempo de un timer Fallo de alimentacin Datos urgentes para los sockets

23

SIGURG

Procesos: Control de trabajos (bg, fg, jobs, CTRL+Z)1-Desde un terminal en X lanzamos un proceso (mozilla) 2-El terminal queda bloqueado 3-Con CTRL+Z paramos el proceso 4-Con ps vemos que el proceso esta sTopped 5-Con jobs vemos la lista de tareas de esa terminal 6-Con bg lo mandamos a segundo plano 7-Con fg + n de trabajo lo traemos a primer plano de nuevo (bloqueamos terminal)


Top Related