Anda di halaman 1dari 7

Sistemas Operativos I

Grupos Lunes Martes Mircoles Viernes Realizacin 22 de Febrero, 1, 8, 15 de Marzo 23 de Febrero, 2, 9 y 16 de Marzo 24 de Febrero, 3, 10 y 17 de Marzo 19 y 26 de Febrero, 5 y 12 de Marzo

Prctica 1: Procesos y seales


Entrega/Evaluacin 22 de Marzo 23 de Marzo 24 de Marzo 19 de Marzo (Entrega electrnica)

Teora
Procesos
Los procesos tienen un tiempo de vida definido crendose mediante una llamada a fork o vfork. Finalizan mediante un exit o un return en el main o cuando reciben una seal de terminacin. A su vez los procesos hijos creados pueden crear nuevos hijos o ejecutar otros programas mediante llamadas a las funciones de la familia exec. Todos los procesos tienen un proceso padre y pueden ser padres de varios procesos hijos. Esto forma una estructura jerrquica en forma de rbol siendo el proceso init el tronco. Si un proceso termina antes que sus hijos estos pasan a ser hijos de dicho proceso. Para diferenciar unos procesos de otros dentro de este rbol se asigna a cada proceso un identificador nico llamado identificador de proceso, PID. Adems el sistema maneja la llamada process table que consiste en un array de estructuras tipo proc que contienen la informacin sobre los procesos que hay en el sistema, aunque no estn en CPU. Los procesos en System V R2 pueden estar en los siguientes estados:
inicial (idle): El proceso est siendo creado pero todava no est listo para ejecucin. listo (runnable, ready to run) y en espera (blocked, asleep): El proceso est listo para

ser ejecutado. Puede estar en la memoria principal o en el intercambio (swapped).


ejecucin modo usuario (user running) ejecucin modo kernel (kernel running) zombie: El proceso ha terminado pero su proceso padre no ha hecho wait(). Por esto el

proceso permanece en tabla de procesos y para el sistema el proceso sigue existiendo.


parada (a partir de 4.2BSD): El proceso est parado. Esto se debe a que el proceso ha

recibido alguna seal de parada. Para salir de este estado debe recibir la seal de continuacin (SIGCONT). En esta primera prctica de Sistemas Operativos I vamos a familiarizarnos con el uso de la funcin de creacin de procesos fork, de espera de hijos wait y de obtencin de los pid de proceso con getpid y del proceso padre con getppid. Es necesario, por tanto, leer las pginas del manual de dichas funciones antes de empezar los ejercicios.

Escuela Politcnica Superior

Universidad Autnoma de Madrid 1

Sistemas Operativos I

Prctica 1: Procesos y seales

Seales
Las seales son usadas por el kernel para notificar a los procesos de sucesos asncronos. Por ejemplo, si se pulsa Ctrl-C el kernel enva SIGINT. Adems los procesos pueden enviarse seales mediante la funcin kill. Se responde a las seales al volver a modo usuario. Est respuesta puede ser terminar el proceso, ignorar la seal o realizar una accin definida por el usuario. En cualquier caso esta accin no se realiza de manera inmediata. El kernel pone un bit en la estructura proc del proceso indicando que la seal ha llegado y si el proceso est en una espera interruptible lo saca de esta. En este caso la llamada al sistema devolver -1 y errno ser EINTR. En esta segunda parte vamos a familiarizarnos con el uso de las funciones de envo y captura de seales kill y signal, as como de las funciones de espera pause y sigsuspend. Es necesario, por tanto, leer las pginas del manual de dichas funciones antes de empezar los ejercicios.

Ejercicios de procesos
1. Implementa un programa en C que use fork para crear el siguiente rbol de procesos. Ten en cuenta que no es necesario generar ningn tipo de representacin grfica, ms all de una frase indicando cundo se ha creado un proceso, su pid y el pid de su padre. Observa tambin que cada nodo es un proceso, y que el PID mostrado es nicamente orientativo. Por qu crees que algunos nodos aparecen repetidos en el diagrama? (3 puntos)

1978 1978 1978 1980 1979 1979 1981

fork
1 generacin (21 = 2)

fork

fork
2 generacin (2 = 4)
2

2. El orden de la salida al ejecutar el programa 1 es siempre el mismo? Justifica tu respuesta. (1 punto) 3. Modifica el programa anterior, escribiendo un programa2.c que en lugar de generar 4 procesos, genere 32 procesos. Justifica la modificacin realizada al cdigo. (2 puntos)

Escuela Politcnica Superior

Universidad Autnoma de Madrid 2

Sistemas Operativos I Escribe el siguiente cdigo y gurdalo como programa3.c


// programa3.c #include <unistd.h> #include <stdlib.h> #include <stdio.h> int main (int argc, char *argv [], char *env []) { int i, a=1; for (i = 0; i < 10; i++) { switch (fork ()) { case 0: a=3; printf(a= %d\n,a); break; } printf(a=%d\n,a); } exit (0);

Prctica 1: Procesos y seales

4. Por qu puede fallar fork? hay alguna forma de controlar el error de fork? Modifica el cdigo de programa3.c para controlarlo. (2 puntos) 5. Qu otro problema tiene el cdigo del programa3.c? Solucinalo escribiendo el cdigo correcto de programa3.c como programa4.c (2 puntos) 6. Cunto vale la variable a para el cdigo padre del programa4.c? y el para el hijo? por qu no valen lo mismo? en algn momento valen lo mismo? (1 punto) 7. Modifica el cdigo de programa4.c como un nuevo programa5.c en el que el hijo devuelve el valor de la variable a para que el printf que hace el padre muestre el mismo valor que el printf que hace el proceso hijo. (2 puntos) 8. Explica las macros de wait en un ejemplo de programa padre (programa6.c) que cree un proceso, y lo espere con wait, cmo afecta a wait el uso de las macros? (2 puntos) 9. Modifica programa6.c como programa7.c para que en lugar de usar wait, espere al proceso hijo usando waitpid. Qu diferencias encuentras entre el uso de wait/waitpid? (2 puntos) 10. Escribe el cdigo de un programa8.c que reserve en el proceso padre memoria dinmica para una cadena de 20 caracteres de longitud y un proceso hijo. Si en el proceso hijo se pide al usuario que introduzca un nombre para guardar en la cadena. El proceso padre tiene acceso a ese valor? qu ocurre si el usuario no teclea nada? dnde hay que liberar la memoria reservada y por qu? (5 puntos)

Escuela Politcnica Superior

Universidad Autnoma de Madrid 3

Sistemas Operativos I

Prctica 1: Procesos y seales

Ejercicios de seales
Escribe el siguiente cdigo y gurdalo como programa9.c
// programa9.c #include <signal.h> #include <stdio.h> #include <stdlib.h> void (*signal (int sig, void (*func)(int))) (int); void captura (int sennal) { printf ("Capturada la seal %d\n", sennal); fflush (NULL); return; } int main (int argc, char *argv [], char *env []) { if (signal (SIGINT, captura) == SIG_ERR) { puts ("Error en la captura"); exit (1); } while (1); exit (0); }

11. Ejecuta el programa9.c, la llamada a signal supone que se ejecute la funcin captura? cundo aparece el printf en pantalla? por qu no aparece antes? (1 punto) 12. Qu ocurre por defecto cuando un programa recibe una seal y no la tiene capturada? Demuestra tu respuesta modificando el cdigo de programa9.c y guardando el cdigo resultante como programa10.c (2 puntos) 13. Escribe el cdigo de un programa11.c que ignore la pulsacin de Ctrl+C en el teclado. Cmo podras demostrar que realmente la seal ha sido ignorada? (2 puntos) 14. Todas las seales tienen asociada una semntica previa? Si no es as, pon un ejemplo en un programa12.c de algn tipo de seal definida por el usuario (2 puntos) 15. Escribe el cdigo de un programa13.c que intente capturar SIGKILL, y que escriba en la funcin manejadora He conseguido capturar SIGKILL. Por qu nunca sale por pantalla He conseguido capturar SIGKILL? (3 puntos) 16. Por qu se permite el uso de variables globales para compartir datos entre la funcin manejadora y el resto del programa que tiene capturada una seal? (1 punto) 17. Qu diferencia hay entre usar pause o sigsuspend? Demuestra tu respuesta con dos ejemplos de cdigo (programa14.c y programa15.c) (2 puntos) 18. Escribe un programa16.c que capture todas las seales capturables. (2 puntos) 19. Mientras se ejecuta el cdigo de la funcin manejadora del programa16.c asociada a SIGUSR1, envale SIGUSR2 desde otra terminal, qu sucede? por qu? (1 punto) Escuela Politcnica Superior Universidad Autnoma de Madrid 4

Sistemas Operativos I

Prctica 1: Procesos y seales

20. Escribe el cdigo de un programa17.c que establezca una alarma inicial de 20 segundos en los que el programa debe mostrar por pantalla una secuencia numrica creciente separada por comas. Cuando salte la alarma, la ltima lnea mostrada en la pantalla debe ser: Estos son los nmeros que me ha dado tiempo a contar en 20 segundos. (5 puntos)

Escuela Politcnica Superior

Universidad Autnoma de Madrid 5

Sistemas Operativos I

Prctica 1: Procesos y seales

Ejercicio Final de la Prctica 1


Escribe el cdigo de un programa18.c que consista en un sistema bsico de c a l c u l o d e n m e r o s p r i m o s . En particular, se pide que el programa consista en un bucle que: 1. Pide al usuario dos nmeros enteros (de los que se tomar nicamente su valor absoluto). Por ejemplo: 4 y 13. 2. Crea tres procesos hijos: - Un hijo se encarga de calcular todos los primos entre ambos nmeros. En este caso 5, 7, 11, 13 y mostrarlos por pantalla. - Otro hijo decidir si el nmero menor de los dos es primo e informar mediante exit al padre. - Otro hijo decidir si el nmero mayor es primo e informar al padre mediante el exit. S lo el proceso hijo e n c a rg a do d e l c l c u lo d e lo s p r i mo s mostrar su resultado por pantalla. L o s d e m s procesos hijos deben enviar el resultado de su operacin al proceso padre en el retorno de exit. 3. El proceso padre debe realizar una espera no activa para recoger los resultados de los procesos hijos y los debe mostrar por pantalla respetando el siguiente orde: - Primero la lista con los nmeros primos: 5, 7, 11, 13 - despues el resultado sobre el nmero menor: El nmero 4 no es primo - y por ltimo el mensaje del nmero mayor: En nmero 13 es primo. - Si se produjese cualquier error durante el proceso se infomara al usuario por pantalla . El programa debe terminar en cualquier momento cuando el usuario pulse Ctrl+C, liberando todos los recursos solicitados y sin dejar procesos zombie. Tambin debe terminar si el usuario tarda ms de 1 minuto en introducir los valores a y b. Para evitar que cada hijo recalcule los primos ser solo uno de ellos el que lo haga e informe a los dems. Para ello, una vez calculados los nmero primos, enviar una seal a cada uno de los otros hijos para que estos la procesen e informen en consecuencia al padre de si su nmero es primo o no. Para que este mecanismo de comunicacin funcione es imprescindible controlar el orden en que se lanzan los hijos y la sincronizacin entre ellos. Todas las esperas han de ser no activas y, si es posible, no bloqueantes. (20 puntos)

Escuela Politcnica Superior

Universidad Autnoma de Madrid 6

Sistemas Operativos I

Prctica 1: Procesos y seales

Ejemplo de Ejecucin del Ejercicio Final


En cursiva se indica los valores introducidos por el usuario. Introduce el valor del primer operando: 3 Introduce el valor del segundo operando: 15 La lista es: 3, 5, 7, 11, 13 El nmero 3 es primo El nmero 15 no es primo Introduce el valor del primer operando: -2 Introduce el valor del segundo operando: 4 La lista es: 2, 3 El nmero -2 no es primo El nmero 4 no es primo Recibido Ctrl-C. Fin del programa.

Criterios de evaluacin
1. Todos los ejercicios son obligatorios. La puntuacin se obtiene aplicando una regla de tres directa, en la que 63 puntos equivalen a obtener un 10 en esta prctica. 2. Aquellos ejercicios que no contienen una respuesta con cdigo, se evaluarn atendiendo a la explicacin realizada por el alumno/a. Para que el razonamiento sea considerado vlido debe ser suficientemente detallado y se puede apoyar en documentacin externa. En ningn caso, se considerar una respuesta vlida una captura de pantalla sin explicacin, o un cdigo sin explicacin. 3. Los ejercicios que solicitan la realizacin de un cdigo, deben ser tambin explicados, tanto a nivel de comentarios en el propio cdigo (que se debe entregar junto con la memoria, inserto en los ejercicios o en apndices), como en texto como respuesta al ejercicio. Esto es, especialmente relevante en el caso del ejercicio final que debe ir acompaado de una descripcin textual del diseo realizado y la solucin propuesta en el cdigo. 4. No se tendr en cuenta cdigo que no compila. Recibiendo una fuerte penalizacin programas que no realizan una correcta liberacin de los recursos solicitados al Sistema Operativo (por ej. dejar procesos zombie), o que no tienen un correcto control de errores (con especial inters en el control de errores de las llamadas del sistema operativo tratadas en esta prctica). 5. Por ltimo, se valorar la correcta aplicacin de los principios de la programacin estructurada (esto es, organizar el cdigo en funciones en la medida de lo posible, separar las definiciones y estructuras en un archivo .h, no usar nmeros mgicos, etc.)

Escuela Politcnica Superior

Universidad Autnoma de Madrid 7