Está en la página 1de 6

Curso de Sistemas Operativos

Agosto Diciembre 2012

Serie fibonaci en Linux con hilos


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, y tiene como finalidad desarrollar la serie fibonacie de la cantidad ingresada, dentro del cdigo declaro dos hilos de control en cual invoco a mis mtodos activar y desactivar padre e hijo, esto con la

finalidad de tener de una manera mas controlada el flujo del programa, se hace su de los semforos la funcin fork()

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.

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. 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.

Tambin pueden quedar a su vez muchos procesos encolados simultneamente, en este caso el contador quedar con un nmero negativo muy grande.

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.

atributos por defecto y para nuestro ejemplo es suficiente. Si queremos un programa que cree y destruya hilos continuamente, no vale NULL, ya que con esta opcin dejaremos memoria sin liberar cada vez que termine un hilo.

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.- hilos

La funcin que nos permite crear un un nuevo hilo de ejcucin es pthread_create() que admite cuatro parmetros:

pthread_t * es un puntero a un identificador de thread. La funcin nos devolver este valor relleno, de forma que luego podamos referenciar al hilo para "hacerle cosas", como matarlo, esperar por l, etc. pthread_attr_t * son los atributos de creacin del hilo. Hay varios atributos posibles, como por ejemplo la prioridad. Un hilo de mayor prioridad se ejecutar con preferencia (tendr ms rodajas de tiempo) que otros hilos de menor prioridad. Se puede pasar NULL, con lo que el hilo se crear con sus

void *(*)(void *) es un tipo la mar de raro. Aunque asuste, no es ms que el tipo de una funcin que admite un puntero void * y que devuelve void *. Eso quiere decir que a este parmetro le podemos pasar el nombre de una funcin que cumpla lo que acabamos de decir. Esta funcin es la que se ejecutar como un hilo aparte. El hilo terminar cuando la funcin termine o cuando llame a la funcin pthread_exit() (o que alguien lo mate desde otra parte del cdigo). Es bastante habitual hacer que esta funcin se meta en un bucle infinito y quede suspendida en un semforo o a la espera de una seal para hacer lo que tenga que hacer y volver a quedar dormida. void * es el parmetro que se le pasar a la funcin anterior cuando se ejecute en el hilo aparte. De esta manera nuestro programa principal puede pasar un nico parmetro (que puede ser cualquier cosa, como una estructura compleja) a la funcin que se ejecutar en el hilo. La funcin del hilo slo tendr que hacer el "cast" adecuado.

Procesos y Threads (hilos de ejecucin)

Si queremos que nuestro programa empiece a ejecutar varias cosas "a la vez", tenemos dos opciones. Por una parte podemos crear un nuevo proceso y por otra, podemos crear un nuevo hilo de ejecucin (un thread). En realidad nuestro ordenador, salvo que tenga varias cpu, no ejecutar varias cosas a la vez. Cuando digo "a la vez", me refiero a que el sistema operativo ir ejecutando cachos de programa por turnos (por rodajas de tiempo) de forma muy rpida, dando la sensacin de simultaneidad. Cual es la diferencia entre proceso e hilo? Un proceso de unix es cualquier programa en ejecucin y es totalmente independiente de otros procesos. El comando de unix ps nos lista los procesos en ejecucin en nuestra mquina. Un proceso tiene su propia zona de memoria y se ejecuta "simultneamente" a otros procesos. Es totalemente imposible en unix que un proceso se meta, a posta o por equivocacin, en la zona de memoria de otro proceso. Esta es una de las caracteristicas que hace de unix un sistema fiable. Un programa chapucero o malintencionado no puede fastidiar otros programas en ejecucin ni mucho menos a los del sistema operativo. Si el programa chapucero se cae, se cae slo l. Dentro de un proceso puede haber varios hilos de ejecucin (varios threads). Eso quiere decir que un proceso podra estar haciendo varias cosas "a la vez". Los hilos dentro de un proceso comparten todos la misma memoria. Eso quiere decir que si un hilo toca una variable, todos los dems hilos del mismo proceso vern el nuevo valor de la variable. Esto hace imprescindible el uso de semforos o mutex (EXclusin MUTua, que en ingls es al revs,

funciones pthread_mutex...) para evitar que dos threads accedan a la vez a la misma estructura de datos. Tambin hace que si un hilo "se equivoca" y corrompe una zona de memoria, todos los dems hilos del mismo proceso vean la memoria corrompida. Un fallo en un hilo puede hacer fallar a todos los dems hilos del mismo proceso. Un proceso es, por tanto, ms costoso de lanzar, ya que se necesita crear una copia de toda la memoria de nuestro programa. Los hilos son ms ligeros. En cuanto a complejidad, en los hilos, al compartir la memoria y los recursos, es casi obligado el uso de mutex o semforos, as que su programacin suele ser ms complicada y se necesita ser ms cuidadoso. Un proceso, en el momento de lanzarlo, se hace independiente del nuestro, as que no deberamos tener ningn problema, salvo que necesitemos comunicacin entre ellos, que nos liaramos a programar memorias compartidas (con sus correspondientes semforos), colas de mensajes, sockets o cualquier otro mecanismo de comunicacin entre procesos unix. Qu elegimos? Un proceso o un hilo?. Depende de muchos factores, pero yo (y es cosa mia, que tengo un PC obsoleto con linux), suelo elegir procesos cuando una vez lanzado el hijo no requiero demasiada comunicacin con l. Elijo hilos cuando tienen que compartir y actualizarse datos. Por ah he leido que para gestionar entradas/salidas es mejor procesos (atender simultaneamente a varias entradas de sockets, por ejemplo) y que para hacer programas con muchos clculos en paralelo con varias cpu es mejor hilos, siempre y

cuando el sistema operativo sea capaz de repartir automticamente los hilos en las distintas cpu en funcin de su carga de trabajo. Ejemplo de programacin de procesos Vamos a hacer un pequeo ejemplo de programacin de procesos. Intentaremos con el ejemplo, adems de lanzar un nuevo proceso, comprobar que efectivamente las variables "se duplican". Ms adelante veremos cmo comunicar padre e hijo.

[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

8.- Conclusin
Como resultado de esta practica podemos observar que los hilos son mas lijeros que los procesos dado a que nos permiten la opcion de compartir la informacion sin necesidad de hacer otra cosa extra dado a que los hilos estan creados para compartir. [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.

Los semaforos nos ayudan a controlar el flujo del programa de una manera mas organizada.

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

También podría gustarte