Sei sulla pagina 1di 14

Semáforos

Integrantes:
Israel Solís Ahuactzin
Jose Adrian Montiel Cruz
Héctor Manuel Trujillo Castillo
Habid Alberto Betancourt López
Flor Arlethe Ramirez Badillo
Dulce Andrea Téllez Lorenzo
Definición:

Un semáforo es una variable especial o una estructura diseñada para


sincronizar dos o más procesos en un sistema multitareas, de modo que su
ejecución se realice de forma ordenada y sin conflictos entre ellos.

-Fueron inventados por Edsger Dijkstra en 1965


Conceptos:

Un semáforo es una variable entera y puede realizar dos operaciones.


• P (Espera): Se usa cuando un proceso quiere acceder a un recurso
compartido y puede ocurrir:
o Si la variable entera es positiva, toma el recurso y decrementa dicho valor.
o En caso de que el valor sea nulo el proceso se duerme y espera a ser despertado.
P decrementa el valor del semáforo y se utiliza para adquirirlo o bloquearlo.

• V (Señal): Se utiliza para indicar que el recurso compartido esta libre y


despertar a los procesos que estén esperando por el recurso.
V incrementa el valor del semáforo y se utiliza para liberarlo.
• Nota:
Un semáforo no puede tomar un valor negativo y cuando vale cero no se
pueden realizar mas operaciones P sobre el, el proceso que quiera tener
acceso al recurso compartido deberá esperar hasta que el semáforo vuelva a
tener un valor mayor a cero.
Tipos de semáforos:

Dependiendo del número de recursos a gestionar y los problemas que resuelve


un semáforo puede ser:

a) Semáforos contadores: Toman valores positivos mayores o iguales a cero. Se


utilizan para sincronización de procesos.

b) Semáforos binarios: Toman los valores 0 y 1


Se utilizan para lograr la exclusión mutua.
Ficheros:

• “include/linux/sem.h”: Se encuentra las estructuras necesarias para el


manejo de semaforos.
• “ipc/sem.c”: Implementación de las funciones y procedimientos así como las
llamadas al sistema asociadas a estos.
• “ipc/util.c”: Implementación de las funciones ipcget, ipcget_new e
ipcget_public utilizadas para la llamada semget.
• Estructuras:
Estructura sem_array: Se trata de una estructura de control asociada a cada uno de los distintos
conjuntos de semáforos existentes en el sistema. Contiene información del sistema, punteros a las
operaciones a realizar sobre el grupo, y un puntero hacia las estructuras sem que se almacenan en el
núcleo y contienen información de cada semáforo.
Estructura semid_ds: Se trata de una estructura de control asociada a cada uno de los distintos
conjuntos de semáforos existentes en el sistema. Contiene información del sistema, punteros a las
operaciones a realizar sobre el grupo, y un puntero hacia las estructuras sem que se almacenan en el
núcleo y contienen información de cada semáforo. Esta estructura está en desuso actualmente y ha sido
sustituida por sem_array solo se utiliza para compatibilidades.
Estructura sembuf: Se trata de una estructura que se utiliza en semop, y cada dato de este tipo
especifica una operación a realizar sobre un semáforo particular dentro del conjunto. Incrementar,
decrementar o esperar un valor nulo y por lo tanto se usa en la llamada semop.
Estructura sembuf:

• La estructura sembuf tiene estos campos:

struct sembuf {
unsigned short sem_num; // número del semáforo dentro del conjunto
short sem_op; // clase de operación
// según sea >0, <0 o ==0
short sem_flg; // modificadores de operación
};
Estructura semun: Es una unión, se utiliza en la llamada semctl para almacenar o recuperar
informaciones sobre los semáforos.
Estructura seminfo: Estructura que permite conocer los valores límite o actuales del sistema
mediante una llamada a semctl. Estas llamadas no se realizan generalmente en modo directo, sino que
están reservadas a las utilidades del sistema como el mandato ipcs.
Estructura sem: Se usa una estructura sem para cada semáforo en el sistema. Esta indica el valor
actual del semáforo y el pid de la última operación.
Estructura sem_queue: Estructura que permite conocer los procesos que están durmiendo
(bloqueados).
Estructura sem_undo: Estructura utilizada para poder deshacer las acciones en caso de fallo o
terminación del proceso
Principales funciones:

• Semget (creación y búsqueda de grupos de semáforos)


Permite la creación de un grupo de semáforos, o bien la recuperación del identificador de un
grupo ya existente. El grupo de semáforos esta unificado bajo un identificador común.

Prototipo de la función:
#include <sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
int semget (key_t key, int nsems,int semflg);

• key: Identificador del conjunto.


• nsems: Número de semáforos del conjunto.
• Semflg: Máscara de bits.
• Semop (operaciones sobre los semáforos)
Realiza operaciones sobre los semáforos que hay asociados bajo un identificador (semid), dichas
operaciones pueden ser de incremento o decremento.

Prototipo de la función:
#include <sys/types.h>
#include <sys/ipc.h>
#include<sys/sem.h>

int semop(int semid, struct sembuf * sops, int nsops);

• semid: Identificador del semáforo (grupo sobre el cual las operaciones tendrán lugar).
• sops: Puntero a un array de estructuras que indican las operaciones que se llevaran acabo sobre
los semáforos (estructuras sembuf).
• nsops: Número de operaciones a realizar en esta llamada.
• Semctl (el control de los semáforos)
Permite la consulta, modificación o supresión de un grupo de semáforos. También permite
inicializar los semáforos y obtener información sobre el número de semáforos en espera de
aumento.

Prototipo de la función:
#include <sys/types.h>
#include <sys/ipc.h>
#include<sys/sem.h>
int semctl(int semid, int semnum, int cmd,union semun arg);

• semid: Identificador de semáforo válido.


• semnum: Indica cual es el semáforo, de los que hay bajo semid, a que queremos acceder.
• cmd: Indica la accion a realizar
cmd puede tener distintos valores , por ejemplo:
• GETVAL: Se utiliza para leer el valor de un semáforo. El valor se devuelve a través del
nombre de la función, en este caso arg toma el valor cero.
• SETVAL: Permite inicializar un semáforo a un valor determinado que se especifica
en arg.
• IPC_RMID: Le indica al nucleo que debe borrar el conjunto de semáforos agrupados
bajo el identificador semid. Dicha operación no tendrá efecto mientras haya algún
proceso que esté usando los semáforos.
Bibliografía:

• Libro: Fundamentos de Sistemas Operativos 7ma Edición, Autores: Abraham Silberschatz, Peter Baer
Galvin & Greg Gagne
• Libro: Sistemas operativos modernos 3ra Edicion, ISBN: 9786074420463, Autor: Andrew S.
Tanenbaum
• Libro: Unix Programación Avanzada 3ra Edicion , Autor: Francisco M. Márquez
• Wiki de Sistemas Operativos
Enlace: https://1984.lsi.us.es/wiki-ssoo/index.php/Sem%C3%A1foros
• C & Linux
Enlace: http://www.chuidiang.org/clinux/ipcs/semaforo.php

Potrebbero piacerti anche