Semaforos
Semáforos
06/11/2014
1
Semáforos
Um semáforo simples é uma variável que pode assumir os valores 0 e 1 (semáforo binário). Esta é a forma mais comum
Semáforos que podem assumir diversos valores são chamados de semáforos genéricos ou contadores
Semáforos binários são utilizados para garantir que somente um processo (ou thread) tenha acesso a uma região crítica ou recurso a cada instante
Semáforos contadores permite limitar a quantidade de processos e/ou threads que utilizarão o recurso
Acesso a região crítica
Processo A
Região não crítica do processo A
Operação P com semáforo Região crítica Operação V com semáforo Processo B
Região não crítica do processo B
Apenas um único processo e/ou thread pode entrar na região crítica a cada instante
Semáforos em Unix
Todos as funções de semáforos operam sobre vetores
(arrays) de semáforos contadores
Múltiplos recursos podem ser alocados simultaneamente
As funções de semáforo são:
#include
int semctl(int sem_id, int sem_num, int command, …); int semget(key_t key, int num_sems, int sem_flags); int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops); Função semget()
A função semget() cria um novo semáforo ou obtém uma chave de um semáforo já existente
Definida em int semget(key_t key, int num_sems, int sem_flags);
Onde:
key : um valor inteiro utilizado para permitir que processos não relacionados entre si acessem o mesmo semáforo num_sems : número de semáforos a serem criados sem_flags : modo de criação do semáforo
IPC_PRIVATE : somente o processo que criou o semáforo pode utilizá-lo
IPC_CREAT : cria o semáforo, se não existir
IPC_EXCL : gera erro se o semáforo já existir
Retorna:
Em caso de sucesso, ipc_id, um identificador do semáforo
Em caso de falha, -1
Função semget( )
Todos os semáforos são acessados