Google

domingo, 30 de março de 2008

Exclusão mútua utilizando semáforos

O semáforo é uma variável que fica associada a um recurso compartilhado, indicando quando este está sendo acessado por um outro processo. Ela terá seu valor alterado quando o processo entra e quando sai da região crítica de forma que se um outro processo entrar em sua região critica ele possa checar antes este valor para saber se o recurso esta ou não disponível. Quando o processo tiver seu acesso impedido, ele será colocado em uma fila de espera associada ao semáforo aguardando sua vez de utilizar o recurso. Todos os processos da fila terão acesso ao recurso na ordem de chegada. O semáforo pode ser usado também para implementar sincronizações condicionais. Isto consiste em um processo que necessita ser notificado sobre a ocorrência de um evento. Pode-se usar o semáforo para notificar este processo sobre a ocorrência deste evento.

Outro tipo de semáforo usado é SEMÁFORO CONSUMIDOR onde ele pode informar ao processo se o buffer está cheio ou está vazio.

SEMÁFORO CONTADOR é aquele que notifica os processos sobre o uso dos recursos. Sempre que um processo usa um recurso qualquer, este semáforo é incrementado e sempre que um processo liberar um recurso ele será decrementado. Este semáforo é útil para evitar que um processo entre na região crítica sem que hajam recursos disponíveis no sistema.
Passos para se implementar um semáforo em C/C++ (Posix)
Incluir o header da biblioteca semaphore.
#include <semaphore.h>

Criar o semáforo, neste exemplo chamado de teste;
sem_t teste; 

Inicialização do semáforo
sem_init(&teste, 0, 0);  

Função para (decrementar/aguardar)
sem_wait(&teste);  

Função para (incrementar/liberar)
sem_post(&teste);  

função para apagar o semáforo após a utilização
sem_destroy(&teste);

A funcionamento do semáforo é bastante simples de ser compreendida, se wait = 0 ele bloqueia, senão, libera o acesso. Quem estiver acessando, ou seja pegou o wait = 1, entra na região crítica e bloqueia, deixando wait =0, ao sair do processo, libera incrementando o valor de wait = 0 para 1 , utilizando post.

Exemplo:


void thread1() void thread2()
{ {
sem_wait(&teste); sem_wait(&teste);

regiao_critica; regiao_critica;

sem_post(&teste); sem_post(&teste);
} {

3 comentários:

Anônimo disse...

Simples e útil, ajudou um palmeirense.Valeu....

TI_2013 disse...

OLAAA Como
Estou implementando esse algotimo e outros de exclusão mutua.

Minha pergunta é: Uso compilador codeBlocks como faço para incluir esta biblioteca nele ???? usei Google mas não sanou monha duvida.


Obrigado!!!

Marcos Rosendo Dalte disse...

Eu nunca utilizei o codeblocks, mas acredito que é da mesma maneira que se faz no linux incluindo o header semaphore.h, mas você tem que verificar se tem ela instalada.
no linux fica em: /usr/include/semaphore.h
da uma investigada onde fica esses header no windows.

Postagens populares