You are on page 1of 5

Curso de Sistemas Operativos

Agosto Diciembre 2012

Semforos en Linux II
Gamaliel Santos Del Carpio Instituto Tecnolgico de Tuxtla Gutirrez Ingeniera en Sistemas Computacionales
santosdcarpio@hotmail.com

1.- Cdigo del Programa en C para Linux

El programa anterior est desarrollado en C, para Linux, este programa con la funcin fork () crea una copia del cdigo para ejecutar dos procesos uno padre y otro hijo, el

objetivo de este programa es sincronizar la ejecucin de los procesos, con la ayuda de semforos, para que el inicio forzosamente sea con el proceso hijo lo que hace este

proceso es realizar la escritura de un archivo, y el proceso padre imprime en pantalla el resultado. Al inicio del programa se crean los semforos para el proceso padre y el proceso hijo, cuando el fork (), crea los procesos el semforo del proceso hijo se pone en verde y deja que se escriba el mensaje en el archivo, despues de terminar su proceso se entiende que libera y cambia el semaforo a rojo lo cual permite al semaforo del padre ponerse en verde y poder ejecutarse, al terminar el padre tambien libera y su semaforo se pone en rojo y el proceso hijo realiza el mismo procedimiento hasta completar el ciclo.

Supongamos que el primer proceso termina de escribir el fichero. Al acabar con el fichero debe de incrementar el contador del semforo. Al hacerlo, el contador se pone en 0. Como no es negativo, el semforo se encarga de mirar a la cola de procesos pendientes y desbloquear el primer proceso de dicha cola. Con ello, el segundo proceso que quera acceder al fichero contina su ejecucin a y accede al fichero. Cuando este proceso tambin termine con el fichero, incrementa el contador y el semforo vuelve a ponerse en 1, a estar en verde. Es posible que el valor inicial del semforo no sea uno, sea n, en este caso se dejaran pasar a la primera n procesos que lo intenten. Tambin pueden quedar a su vez muchos procesos encolados simultneamente, en este caso el contador quedar con un nmero negativo muy grande.

2.- Semforos
Un Semforo es un mecanismo que previene las coaliciones que se producen cuando dos o ms procesos solicitan al mismo tiempo el uso de un recurso que deben de compartir. El funcionamiento del semforo es como el de un variable contador. Imaginemos que el semforo controla un fichero y que inicialmente tiene el valor de 1 (est en verde). Cuando un proceso quiere acceder al fichero, primero debe decrementar el semforo. El contador queda en cero y como no es negativo, deja que el proceso siga su ejecucin y, por tanto, accede al fichero. Ahora un segundo proceso lo intenta y para ello tambin debe decrementar el contador. Esta vez el contador se pone a -1 y como es negativo, el semforo se encarga de que el proceso quede bloqueado y dormido en una cola de espera. Este segundo proceso no continuar por tanto su ejecucin y no acceder al fichero.

3.- Pasos para Implementar un Semforo


Obtener un array de semforos. La funcin int semget (key_t, int, int) nos permite hacerlo. Se le pasa como primer parmetro la clave obtenida en el paso anterior, el segundo parmetro es el nmero de semforos que se desean y el tercer parmetro son banderas. Estas banderas permiten poner los permisos de acceso a los semforos. Por ejemplo si ponemos 0600|IPC_CREATE indicamos un permiso de lectura y escritura para el propietario y que los semforos se creen si no lo estn, al llamar a semget () nos devuelve un identificador del array de semforos. Uno de los procesos debe inicializar el semforo. La funcin a utilizar es int semctl (int, int, int, int). El primer parmetro es el identificador del array de semforos obtenido

anteriormente, el segundo parmetro es el ndice del semforo que queremos inicializar dentro del array de semforos obtenido. Si se pide un semforo esta parmetro ser 0, el tercer parmetro indica qu queremos hacer con el semforo, el cuarto parmetro se le asigna 1 si queremos que este en verde y 0 si lo que se necesita es que est en rojo.

4.- Uso de Semforos


El proceso que quiera acceder a un recurso comn debe primero decrementar el semforo. Para ello utilizar la funcin int semop (int, struct sembuf*, size_t). El primer parmetro es el identificador del array de semforos obtenido con semget (). El segundo parmetro es una array de operaciones sobre el semforo. Para decrementarlo basta con un array de una nica posicin. El tercer parmetro es el nmero de elementos en el array, es decir, 1.

6 de primaria. La pgina 50 del primer libro es compartida por el segundo, pero puede que no corresponda con el nmero de pgina 50, sino que est en la pgina 124. Sin embargo la pgina es la misma, a pesar de que no est en el mismo sitio dentro del direccionamiento de cada proceso. Los accesos a segmentos de memoria compartida son controlados, como ocurre con todos los objetos IPC System V, y se hace un chequeo de los permisos y credenciales para poder usar dicho segmento. Sin embargo, una vez que el segmento de memoria est siendo compartido, su acceso y uso debe ser regulado por los propios procesos que la comparten, utilizando semforos u otros mecanismos de sincronizacin.

7.- Conclusin
A veces es necesario que dos o ms procesos accedan a un recurso en comn (escribir en un mismo fichero, leer la misma zona de memoria, escribir en la misma pantalla, etc.). El problema es que si lo hacen simultneamente y de forma incontrolada, puede destruir uno la operacin del otro (y dejar el fichero o la memoria con un contenido inservible o la pantalla ilegible). Para evitar este problema estn los semforos. Un semforo de acceso al recurso a uno de los procesos y se lo niega a los dems mientras el primero no termine. Un semforo es un recurso compartido con el que cuenta UNIX para comunicacin entre procesos. En este ejercicio de programacin en el tiempo que se desarroll, se not la diferencia de cuando el cdigo usaba semforos y cuando no lo haca. Cuando no se usaban semforos no se tena el control de los procesos, no se saba que proceso iniciaba primero y que proceso terminaba al ltimo. Se generaban errores por

5.- Campos de struct sembuf


Short sem_num que es el ndice del array del semforo sobre el que queremos actuar. Short sem_op que es el valor en que queremos decrementar el semforo. Short sem_fl la operacin. son las banderas que afectan

6.- Memoria compartida


La memoria compartida es un mecanismo para compartir datos entre dos o ms procesos. Dichos procesos comparten una parte de su espacio de direccionamiento en memoria, que puede coincidir en cuanto a direccin virtual o no. Es decir, imaginemos que tenemos dos libros compartiendo una pgina. El primer libro es El Quijote de la Mancha, y el segundo es un libro de texto de

que el problema exige que primero se le otorgue el recurso necesario al proceso hijo. Si no se aplicaba una programacin cuidadosa el programa iniciaba por el proceso padre, pero si esto sucede no tomar el valor adecuado para realizar la tarea, porque primero necesita que proceso hijo termine para dejar un valor en el archivo. Cuando se utilizaron los semforos de alguna manera se forz al proceso hijo a ejecutarse primero y no dejar que el proceso padre iniciar hasta que el hijo terminar, entonces no se puede producir un error semejante al del primer caso. Otra ventaja muy notoria es la sincronizacin cuando no usbamos semforos se podan ejecutar dos procesos padre y tres hijos o sea, que no exista alternancia entre procesos, surgiran errores suponiendo que se ejecuta una vez el proceso hijo y luego el padre y despus otra vez el padre, pasara casi lo mismo que en el primer caso citado, el proceso padre al ejecutarse tomara un valor inesperado, porque el proceso hijo nunca escribi el valor correspondiente. Y si fuera lo contrario, el proceso padre se quedara sin imprimir un valor porque el hijo se ejecutara dos veces la primera pondra un valor en el archivo y como se ejecuta nuevamente sin que el padre imprima, sobrescribe el archivo y borra el archivo generado en el proceso anterior. Con los semforos nosotros sincronizamos los procesos y hacemos que se ejecuten los procesos en el orden, proceso hijo proceso padre proceso hijo proceso padre y as hasta terminar el programa.

Referencias
[1] Control de Procesos: <stdlib.h>, <unistd.h>, rescatado Septiembre 21, 2011, de http://www.fismat.umich.mx/mn1/manual/node 21.html

[2]semaforos: http://www.fismat.umich.mx/mn1/manual/node 21.html#SECTION002140000000000000000

[3] memoria compartida http://ocw.innova.uned.es/ocwuniversia/Ing _tecnico_infor_sistemas/SO_II/contenidos_h tml/ims_import_6/tema_7_02.htm

[4] memoria compartida http://www.chuidiang.com/clinux/ipcs/mem _comp.php [5] http://sopa.dis.ulpgc.es/iidso/leclinux/ipc/mem_compartida/lec24_m emcomp.pdf

[6] [Oreilly] Daniel P. Bovet, Marco Cesati, Understanding Understanding The Linux Kernel The Linux Kernel. 3rd 3rd Edition Edition. O'Reilly Media, Inc., 2005. ISBN: 0-59600565-2 [[INSIDE INSIDE]] Tigran Aivazian Tigran Aivazian, Dentro Dentro del n del nucleo ucleo Linux 2.4. 3rd Edition. Proyeto Lucas, 2001.

You might also like