Está en la página 1de 10

En el presente articulo se explica como trabajan, crean, gestionan y eliminan los procesos en GNU/linux utilizando GCC o G++.

Adems se explican como es la comunicacin entre procesos y que instrucciones se utilizan para la gestin de procesos. Se hace una nfasis de los mecanismos de comunicacin IPC entre procesos en GNU/linux. Autor:Prof. Daniel Alejandro Yucra Sotomayor (daniel@somoslibres.org) 1.1 Objetivos Especficos a) Explicar en forma descriptiva el funcionamiento de los procesos en un sistema operativo b) Describir los tipo de procesos sus caractersticas y comportamiento en un sistema operativo c) Describir las tcnicas de comunicacin entre procesos. d) Mostrar ejemplos y casos prcticos de comunicacin entre procesos. 1.2 Contenido del PAPER Introduccin En el presente articulo se explica como trabajan, se crea y eliminan los procesos en GNU/linux utilizando GCC o G++. Adems se explican como es la comunicacin entre procesos y que instrucciones se utilizan para la gestin de procesos. Se hace una nfasis de los mecanismos de comunicacin IPC entre procesos. Este material esta dedicado a estudiantes de Informtico de la Universidad Nacional Jorge Basadre Grohmman - Per que quieren aprender el Sistema Operativo GNU/Linux pero desde un punto de vista PRACTICO y no terico ni menos abstracto. (Recuerdo: SOLO PARA PRACTICOS). I. PROCESOS. Definicin formal Programa o comando en ejecucin. Caractersticas: Un proceso consta de cdigo y datos. Los procesos existen en una jerarqua de rbol (varios Hijos, un slo padre). El sistema asigna un identificador de proceso (PID) nico al iniciar el proceso. El planificador de tareas asigna un tiempo compartido para el proceso segn su prioridad (slo root puede cambiar prioridades). Ejecucin de los Procesos Ejecucin en 1er plano: proceso iniciado por el usuario. Ejecucin en 2do plano: proceso no interactivo que no necesita ser iniciado por el usuario. Demonio: proceso en 2do plano siempre disponible, que da servicio a varias tareas (debe ser propiedad de un SU). Ejem. pstree (Arbol de Procesos en GNU/Linux) Tipos de Procesos Proceso zombi: Proceso parado que queda en la tabla de procesos hasta que termine su padre. Este hecho se produce cuando el proceso padre no recoge el cdigo de salida del proceso hijo. Proceso hurfano: Proceso en ejecucin cuyo padre ha finalizado. El nuevo identificador de proceso padre (PPID) coincide con el identificador del proceso init (1). Ejemplo de Procesos en Linux Si ejecutamos la instruccin Top o Gtop en la consola de Linux nos mostrar el siguiente el siguiente detalle: El nmero de identificador de Proceso (PID), El usuario que lo est ejecutando (USER), La prioridad del proceso (PRI), El valor nice (NI), El tamao del proceso (SIZE),

El tamao total del proceso junto con los datos que maneja (RSS), El tamao usado por el proceso en la memoria (SHARE), El estado del proceso(STAT), El porcentaje de CPU ( %CPU) y de memoria (%MEM) El tiempo de ejecucin (TIME) y el nombre del proceso (COMMAND). II. FORMAS DE COMUNICACIN ENTRE PROCESOS Existen 4 formas de comunicacin entre procesos en Linux: 1. A travs de variables de entorno: Solo es posible de padres a hijos. 2. Mediante una seal: Solo indica que algo ha ocurrido y solo lleva como informacin de un nmero de seal. 3. Mediante entrada salida: Es la forma ms corriente a nivel de shell. Ejem: el operador pipe '|' que conecta dos procesos. 4. Mediante tcnicas IPC u otras: Semforos, Memoria compartida, Colas de mensajes. III. MECANISMO DE COMUNICACIN ENTRE PROCESOS 3.1 A travs de variables de entorno: Solo es posible de padres a hijos. Ejecucin de Comandos (Algoritmo) Descripcin: Llamada a un intrprete para ejecutar un comando. El proceso espera a que finalice la ejecucin de la subrutina y devuelve la salida del programa ejecutado. Formato: #include int system (cadena) const char *cadena; Parmetro: cadena - Comando a ejecutar. Ejecucin de Comandos (Algoritmo) Devuelve: Estado de salida del programa ejecutado. -1 o 127 en caso de error. Algoritmo: a) Se crea un proceso hijo (fork) y se lanza (exec) /usr/bin/bsh, que interpreta el comando a ejecutar. b) Si la llamada se hace con camino seguro, la orden exec ejecuta el intrprete /usr/bin/tsh. c) Se ignoran las seales SIGINT y SIGQUIT y se bloquea la seal SIGCHLD. d) La salida de system no afecta a la salida de los procesos hijos del proceso ejecutor. Ejecucin de Comandos (programa) Compile ($make system) y Ejecute el programa con: ($./system) /* system.c - Listar los procesos del usuario usando system. */ #include #include int main () { int salida; /* Salida del comando */ char comando[100]; /* Comando a ejecutar */ printf ("Ejemplo de system. "); sprintf (comando, "/bin/ps -fu %s", getenv ("USER")); salida = system (comando); printf ("Salida del comando: %d ", salida); exit (salida); } Ejecucin de Comandos (Problema?) Suponiendo que no existe el comando NOVAO y sustituyendo la ejecucin de system por la siguiente lnea,

salida = system ("NOVATO"); Qu salida mostrar ? 3.1.1 Creacin de Procesos EN Gnu/linux Descripcin: Crea un nuevo proceso (hijo), copia casi exacta del proceso generador (padre). Formato: #include pid_t fork (); Devuelve: 0 al proceso hijo y PID del hijo al proceso padre (-1, si error). Creacin de Procesos (Algoritmo) Atributos que hereda el proceso hijo. Entorno. Bit FD_CLOEXEC para cada descriptor de fichero. Seales capturadas. SUID y SGID. Estado de privilegios y prioridades. Libreras compartidas y segmentos de memoria compartida. PGID y TTYGID. Directorio actual y directorio raz. Mscara y lmites de medida para ficheros. Eventos y estado de auditora. Estado de depuracin. Creacin de Procesos (Algoritmo) Atributos diferenciadores entre padre e hijo: PID nico. PPID distintos (el PPID del hijo coincide con el PID del padre). El proceso hijo tiene su propia copia de los descriptores de fichero del padre, pero comparte con ste un puntero a fichero para cada descriptor del proceso padre. Bloqueos de proceso, texto y datos no se heredan. Las subrutinas times se ponen a 0. Las alarmas pendientes toman su valor inicial. Se eliminan las seales pendientes para el proceso hijo. Importante: Compile ($make fork) y Ejecute el programa con: ($./fork) Creacin de Procesos (Programa) /* fork.c - Ejecucin conjunta de procesos padre e hijo Bifurcacin)*/ #include #include main () { printf ("Ejemplo de fork. "); printf ("Inicio del proceso padre. PID=%d ", getpid ()); if (fork() == 0) { /* Proceso hijo */ printf ("Inicio proceso hijo. PID=%d, PPID=%d ", getpid (), getppid ()); sleep (1); } else { /* Proceso padre */ printf ("Continuacin del padre. PID=%d ", getpid ()); sleep (1); } printf ("Fin del proceso %d ", getpid ()); exit (0);

} Creacin de Procesos (Problema?) Suponiendo que tenemos que matar uno de los procesos: Qu operaciones tengo que realizar ? Realice un programa en C para eliminar el proceso Hijo y padre 3.2 Mediante una seal: Solo indica que algo ha ocurrido y solo lleva como informacin de un nmero de seal. Seales: Definiciones Formales Seal: Evento que debe ser procesado y que puede interrumpir el flujo normal de un programa. Capturar una seal: Una seal puede asociarse con una funcin que procesa el evento que ha ocurrido. Ignorar una seal: El evento no interrumpe el flujo del programa. Las seales SIGINT y SIGSTOP no pueden ser ignoradas (ver tabla de seales). Seales: Definiciones Formales Accin por defecto: Proceso suministrado por el sistema para capturar la seal (ver tabla de seales). Alarma: Seal que es activada por los temporizadores del sistema. Error: Fallo o accin equivocada que puede provocar la terminacin del proceso. Error crtico: Error que provoca la salida inmediata del programa. Capturar Seales (Algoritmo) Descripcin: Asocia una accin determinada con una seal. Formato: #include void (*signal (seal, accin)) () int seal; void (*accn) (); Capturar Seales (Algoritmo) Parmetros: seal: Nmero de seal, excepto SIGKILL. Accin: Puntero a la rutina asociada con la seal o uno de los valores: - SIG_DFL: accin por defecto para dicha seal. - SIG_IGN: ignorar la seal, Devuelve: Valor de la accin anteriormente asociada; -1, en caso de error. Importante: Compile ($signal.c) y Ejecute el programa con: ($./signal) Capturar seales. (Programa) /* signal.c - Contar el nmero de CTRL-C en 15 segundos */ #include #include int numcortes=0; /* Contador de CTRL-C */ int enbucle=1; /* Controlador de salida del bucle de espera */ void alarma (); /* Captura la seal de alarma SIGALRM */ void cortar (); /* Captura la seal de interrupcin SIGINT */ int main () {

signal (SIGINT, cortar); signal (SIGALRM, alarma); printf ("Ejemplo de signal. "); printf ("Pulsa varias veces CTRL-C durante 15 segundos. "); alarm (15); while (enbucle); signal (SIGINT, SIG_IGN); printf ("Has intentado cortar %d veces. ", numcortes); printf ("Hasta luego Lucas. "); exit (0); } void alarma () { signal (SIGALRM, SIG_IGN); enbucle=0; /* Salir del bucle */ printf ("Alarma! "); } void cortar () { signal (SIGINT, SIG_IGN); printf ("Has pulsado CTRL-C "); numcortes++; signal (SIGINT, cortar); } Alarmas y temporizadores. Descripcin: Genera alarmas de reloj (seal SIGALRM) para el proceso actual. Formato #include unsigned int alarm (segundos) unsigned int segundos; unsigned int ualarm (valor, intervalo) unsigned int valor, intervalo; Parmetros: segundos: Nmero de segundos para enviar al proceso la seal SIGALRM. valor: Nmero de seales generadas. intervalo: Intervalo (en ms.) entre las seales. Devuelve: alarm devuelve el nmero de segundos que restan para generar la seal. ualarm devuelve el nmero de microsegundos que restan hasta la prxima seal. Importante: Compile ($signal.c) y Ejecute el programa con: ($./signal) Alarmas y temporizadores. /* alarm.c - Esperar una alarma */ #include #include int main () { printf ("Una alarma en 3 segundos. "); alarm (3); printf ("Esperando... "); while (1); printf ("Esta lnea no se ejecutar nunca. "); exit (0); } Alarmas y Temporizadores (Problema?) Cundo se podr habilitar la Lnea de Cdigo del programa ? 3.3. Mediante entrada salida: Pipe y Tuberias

Definicin Formal de Tuberias Tubera: Mecanismo de intercomunicacin entre procesos que permite que 2 o ms procesos enven informacin a cualquier otro. Una pipe relaciona la salida estndar de un comando con la entrada estndar de otro comando. Ejem: Pipe Importante: Compile ($pipe.c) y Ejecute el programa con: ($./pipe ls wc ) Tubera entre dos Comandos usando Pipe /* pipe.c - Tubera entre 2 comandos usando pipe. */ #include #include #define LEER 0 #define ESCRIBIR 1 int main (int contargs, char *args[]) { int descr[2]; /* Descriptores de E y S de la turbera */ { printf ("Formato: %s comando_ent comando_sal. ", args[0]); exit (1); } /*Tuberia entre dos Comandos usando Pipe */ pipe (descr); if (fork () == 0) { close (descr[LEER]); dup2 (descr[ESCRIBIR], 1); close (descr[ESCRIBIR]); execlp (args[1], args[1], NULL); perror (args[0]); } else { close (descr[ESCRIBIR]); dup2 (descr[LEER], 0); close (descr[LEER]); execlp (args[2], args[2], NULL); perror (args[0]); }} Ejemplo de Pipe: $ ls -al /unjbg $ ls -al /etc | less $ man ls | col -b | lpr $ ls -la > nuevo.txt | less $ ./pipe ls more 3.4 Mediante tcnicas IPC u otras: 3.4.1 Mecanismos IPC. a) Caractersticas comunes. El resto del conjunto de mecanismos IPC (semforos, memoria compartida y cola de mensajes) poseen una serie de caractersticas comunes a todos ellos, que se pueden resumir de forma bsica en los siguientes puntos: 1. Una estructura con informacin acerca de qu se est haciendo con dicho mecanismo. 2. Una estructura que define los permisos de los usuarios y grupos de usuarios que pueden acceder al mecanismo IPC. 3. Una clave de acceso o llave. 4. Un conjunto de funciones que permitirn realizar un control sobre el mecanismo en cuestin. Este conjunto de funciones se puede dividir en tres grupos:

La familia get, para crear o buscar un mecanismo. La familia ctl, para realizar operaciones de control y suprimir mecanismos. Un conjunto de funciones particulares a cada mecanismo (msgsnd, shmat, etc.). Operaciones disponibles Colas de mensajes Semforos Memoria compartida fichero include llamada para crear o abrir msgget() semget() shmget() llamada para operaciones de control msgctl() semctl() shmctl() llamadas para operaciones de IPC msgsnd(); msgrcv() semop() shmat(); shmdt() b) Control de las facilidades IPC desde la lnea de rdenes. El sistema operativo UNIX ofrece los siguientes programas para controlar y observar desde la lnea de comandos el desarrollo de los IPC que gestiona el sistema. Comando IPCS El programa estndar ipcs facilita informacin sobre los mecanismos utilizados por nuestro sistema, informando de a quin estn asignados, permisos, informacin estadstica, etc. Ejem: $ipcs Si no se especifica ninguna opcin, el programa muestra un resumen de la informacin administrativa que se almacena para los semforos, memoria compartida y colas de mensajes. Las informaciones que suministra son: T: tipo de mecanismo (q para cola de mensajes, m para segmento de memoria y s para semforo); ID: identificacin del mecanismo; KEY: clave del mecanismo; MODE: derechos de acceso al mecanismo; OWNER: propietario del mecanismo; GROUP: grupo propietario del mecanismo, Sus principales opciones son: -q muestra informacin de las colas de mensajes. -m muestra informacin de los segmentos de memoria compartida. -s muestra informacin de los semforos. -b muestra una informacin completa sobre los mecanismos IPC. Comando IPCRM El programa ipcrm se utiliza para liberar un mecanismo de intercomunicacin, con solo conocer su identificador. Se utiliza de la siguiente forma: $ ipcrm [opciones] id Algunas de las opciones ms importantes son: -q borra la cola de mensajes cuyo identificador coincide con id, -m borra la zona de memoria compartida cuyo identificador coincide con id, -s borra el semforo cuyo identificador coincide con id. Semforos, Memoria compartida, Colas de mensajes. Ejemplo: $ipcrm Comunicacion entre procesos en PHP Para crear un segmento de memoria compartida usamos: $shm_id = shmop_open($key, $mode, $perm, $size); Donde: $key es el numero que idnetifica el segmento de memoria compartida, todos los procesos que quieran acceder a este un mismo segmento deben conocer este numero como clave para acceder al segmento. $mode es el modo de creacion, "c" es usado para crear un segmento mientras que "a" se usa para acceder a

un segmento ya creado $perm define los permisos del segmento de acuerdo al mecanismo de permisos de Unix $size define el tamao del segmento La funcion devuelve un id que debermos usar para leer/escribir en el segmento. No es similar a un identificador de archivo ya que las funciones que se usan para manipular memoria compartida son otras. Ejemplo: - Crear el archivo ipc_php.php $ cat > ipc_php.php - Colocar el siguiente contenido al archvio ipc_php.php <? $shm_id = shmop_open(0xff3, "c", 0666, 190); echo $shm; ?> - Ejecutar el Script PHP $php ipc_php.php - Comprobar el IPC de Memoria Compartida $ipcs -m 3.4.2 Semforos Un semforo es un mecanismo de comunicacin con el cual no se mueven datos, puesto que solo se puede consultar y modificar su valor al tener un carcter puramente informativo. Dijkstra define un semforo como una variable entera positiva o nula sobre la que slo se pueden realizar dos operaciones: wait (tambin denominada P) y signal (tambin denominada V). La operacin wait decrementa el valor del semforo siempre que ste tenga un valor mayor que 0; por lo tanto esta operacin se utiliza para adquirir el semforo o para bloquearlo en el caso de que valga 0. La operacin signal incrementa el valor del semforo y por tanto se utiliza para liberarlo o inicializarlo. Ambas operaciones deben ser atmicas para que funcionen correctamente; es decir que una operacin wait no puede ser interrumpida por otra operacin wait o signal sobre el mismo semforo, y lo mismo ocurre para la operacin signal. Este hecho garantiza que cuando varios procesos compitan por la adquisicin de un semforo, slo uno de ellos va a poder realizar la operacin. Adems, se ha de indicar que este mecanismo memoriza las peticiones de operaciones wait no satisfechas y despierta por tanto a los procesos en espera. El mecanismo IPC de semforos implementado en UNIX es una generalizacin ms compleja del concepto descrito por Dijkstra, ya que va a permitir manejar un conjunto de semforos mediante el uso de un identificador asociado y realizar operaciones wait y signal que actualizan de forma atmica todos los semforos asociados bajo un mismo identificador. Esta complejidad en la utilizacin de los semforos, se justifica mediante la imposibilidad de resolver una cierta categora de problemas con los semforos manipulados individualmente, por medio nicamente de las operaciones wait y signal. 3.4.3 Memoria Compartida Memoria compartida es una regin de memoria que puede ser accedida por mltiples procesos. Por ejemplo, si declaramos un vector de 1000 bytes en un programa, slo puede acceder a l ese programa. Si declaramos un segmento de memoria compartida de 1000 bytes, muchos procesos pueden realizar operaciones de lectura y escritura sobre esa memoria compartida. La ventaja principal de la memoria compartida es que un programa la ve exactamente de la misma forma que si fuera memoria normal. Adems, las operaciones de lectura y escritura son muy rpidas. Su utilizacin es relativamente simple. De la misma forma que las colas de mensajes, cada segmento de memoria compartida tiene asociado una clave. Esta identifica de forma unvoca el segmento de memoria compartida, y cualquier proceso que desee acceder a l necesita conocer la clave. La llamada shmget() se usa para obtener un id para una clave asociada. Este id es similar al id de cola de mensajes y se usa como parmetro en otras llamadas al sistema relacionadas con memoria compartida. La llamada shmget() tambin se usa para crear segmentos de memoria compartida. shmctl() se usa para realizar operaciones de control sobre la memoria compartida, entre ellas, la de eliminar segmentos de memoria compartida del sistema.

shmat() devuelve un puntero que referencia al segmento de memoria compartida. Este puntero se emplea para acceder al segmento de memoria compartida para realizar tanto operaciones de lectura como escritural. shmdt() se emplea para desconectar del segmento de memoria compartida. El siguiente algoritmo muestra como usar memoria compartida: Usa shmget() para obtener el id de la memoria compartida a partir de la clave, creando el segmento de memoria compartida si es necesario. Usa shmat() para obtener el puntero necesario para acceder a la memoria compartida. Accede al segmento de memoria compartidas mediante el puntero, y realiza las operaciones pertinentes. Usa shmdt() para desconectar del segmento. Usa shmctl() para eliminar el segmento de memoria compartida del sistema. En general, la memoria compartida se emplea cuando se necesita transferir gran cantidad de datos en un corto perodo de tiempo. Ejemplo: El programa ejemplo para recursos compartidos analiza el tiempo que lleva en transferir un mensaje mediante una cola de mensajes. Es un programa simple, pero introduce varias tcnicas que pueden usarse en una variedad de aplicaciones diferentes. El algoritmo bsico del programa es : El padre crea una cola de mensajes El padre inicia dos procesos hijos El primer hijo : o Recibe un mensaje de la cola o Llama a gettimeofday() para obtener el instante de tiempo actual o Utilizando el valor de tiempo almacenado en el mensaje, calcula la diferencia y la almacena en un vector o Repite los pasos anteriores un nmero de veces que se indique o Muestra los resultados El segundo hijo: o Llama a gettimeofday() para obtener el instante de tiempo actual o Coloca el valor del tiempo en un mensaje o Coloca el mensaje en la cola de mensajes o Espera para permitir que el otro hijo pueda extraer y procesar el mensaje o Repite los pasos anteriores un nmero de veces que se indique El padre espera a que terminen los hijos y elimina la cola de mensajes 3.4.4 Una cola de mensajes Una cola es una construccin FIFO (first in, first out). En otras palabras, el primer mensaje que se introduce en la cola es el primer mensaje que se extrae de la misma. Esto se dice que es una comunicacin sncrona dado que los mensajes se leen en el mismo orden en que se enviaron, en contraposicin a asncrono, donde el orden de recepcin puede ser diferente del orden de envio. Hay cuatro llamadas al sistema asociadas con colas de mensajes : msgget() sirve para crear una cola de mensajes y/o obtener un identificador (id) de cola de mensajes a partir de una clave. La clave es un nmero nico que sirve para identificar la cola de mensajes. Cada proceso que desee comunicarse con la cola de mensajes debe conocer su clave. El id es un nmero asignado por el sistema y obtenido mediante la llamada msgget() y la clave. El id es un parmetro para los otros comandos que actan sobre la cola de mensajes. msgctl() sirve para realizar operaciones de control sobre la cola, incluyendo su eliminacin. msgsnd() sirve para colocar un mensaje en la cola. msgrcv() sirve para extraer un mensaje de la cola. El siguiente esquema muestra cmo trabajar con colas de mensajes: Usa msgget() para obtener el identificador de la cola de mensajes a partir de su clave, creando la cola si es necesario. Usa msgsnd() y msgrcv() para transferir informacin hacia o desde la cola de mensajes identificada por el id obtenido previamente. Usa msgctl() para eliminar la cola del sistema, o para realizar otras acciones de control sobre la misma. Las colas de mensajes son relativamente fciles de usar. El sistema operativo gestiona los detalles internos de la comunicacin. Cuando se enva un mensaje a la cola, se alerta a cualquier proceso que est esperando obtener un mensaje de la misma. El bloqueo de las colas de mensajes es innecesario dado que el sistema operativo verifica la integridad de la cola y no permitir que dos procesos accedan a la cola de una forma destructiva. Las colas de mensajes tienen dos inconvenientes importantes. Son mecanismos lentos para transferir gran cantidad de datos, y hay una fuerte limitacin sobre el tamao de los paquetes de datos que

pueden transferirse. Por tanto, las colas de mensajes se usan principalmente para pequeas transferencias de datos, con un ancho de banda limitado. Las colas de mensajes son un mecanismo excelente para pasar informacin de control de unos procesos a otros. Autor: MsC.Daniel Alejandro Yucra Sotomayor (daniel@somoslibres.org) Bibliografa Antonio Ovando Sistemas Operativos / Diseo e Implementacin - Apuntes URLs: 1. Administracin de procesos en Sistemas Operativos Monografias.com URL: http://www.monografias.com/trabajos14/ administ-procesos/administ-procesos.shtml

2. Clsicos de Comunicacin entre Procesos URL: http://wwwdi.ujaen.es/~lina/TemasSO/CONCURRENCIA

3. Comunicacin entre Procesos IPC URL: http://labsopa.dis.ulpgc.es/prog_c/IPC.HTM