Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
so:semaforos [2015/04/07 11:53] – [Observações:] maziero | so:semaforos [2023/05/25 18:56] (atual) – maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Construção de semáforos ====== | ||
+ | {{ : | ||
+ | |||
+ | O objetivo deste projeto é implementar **semáforos clássicos** em nosso sistema. As funções a implementar são descritas na sequência. | ||
+ | |||
+ | ==== Cria um semáforo ==== | ||
+ | |||
+ | <code c> | ||
+ | int sem_init (semaphore_t *s, int value) | ||
+ | </ | ||
+ | |||
+ | Inicializa um semáforo apontado por '' | ||
+ | |||
+ | A chamada retorna 0 em caso de sucesso ou -1 em caso de erro. | ||
+ | |||
+ | ==== Requisita um semáforo ==== | ||
+ | |||
+ | <code c> | ||
+ | int sem_down (semaphore_t *s) | ||
+ | </ | ||
+ | |||
+ | Realiza a operação //Down// no semáforo apontado por '' | ||
+ | |||
+ | Se a tarefa for bloqueada, ela será reativada quando uma outra tarefa liberar o semáforo (através da operação '' | ||
+ | |||
+ | A chamada retorna 0 em caso de sucesso ou -1 em caso de erro (semáforo não existe ou foi destruído). | ||
+ | |||
+ | ==== Libera um semáforo ==== | ||
+ | |||
+ | <code c> | ||
+ | int sem_up (semaphore_t *s) | ||
+ | </ | ||
+ | |||
+ | Realiza a operação //Up// no semáforo apontado por '' | ||
+ | |||
+ | A chamada retorna 0 em caso de sucesso ou -1 em caso de erro (semáforo não existe ou foi destruído). | ||
+ | |||
+ | ==== Destrói um semáforo ==== | ||
+ | |||
+ | <code c> | ||
+ | int sem_destroy (semaphore_t *s) | ||
+ | </ | ||
+ | |||
+ | Destrói o semáforo apontado por '' | ||
+ | |||
+ | A chamada retorna 0 em caso de sucesso ou -1 em caso de erro. | ||
+ | |||
+ | <note important> | ||
+ | As tarefas que estavam suspensas aguardando o semáforo que foi destruído devem ser acordadas e retornar da operação //Down// correspondente com um código de erro (valor de retorno -1). | ||
+ | </ | ||
+ | |||
+ | ===== Condições de disputa ===== | ||
+ | |||
+ | Caso duas //threads// tentem acessar o mesmo semáforo simultaneamente, | ||
+ | |||
+ | Como obviamente não podemos usar semáforos para resolver esse problema m(, deve ser usado um mecanismo mais primitivo, baseado em espera ocupada. Para tal, Sugere-se usar [[so: | ||
+ | |||
+ | ===== Observações: | ||
+ | |||
+ | * O arquivo '' | ||
+ | * Os semáforos deverão ser totalmente implementados em seu código; sua implementação não deverá usar funções de semáforo de bibliotecas externas ou do sistema operacional subjacente. | ||
+ | * Você deverá definir a estrutura '' | ||
+ | |||
+ | Sua implementação deve funcionar com estes dois arquivos de teste: | ||
+ | |||
+ | * {{pingpong-semaphore.c}} e {{pingpong-semaphore.txt|sua saída}} | ||
+ | * {{pingpong-racecond.c}} | ||
+ | |||
+ | ===== Outras informações ===== | ||
+ | |||
+ | * Duração estimada: 4 horas. | ||
+ | * Dependências: | ||
+ | * [[Gestão de Tarefas]] | ||
+ | * [[Dispatcher]] | ||
+ | * [[Preempção por Tempo]] | ||
+ | * [[Tarefas suspensas]] | ||
+ | * [[Tarefas dormindo]] |