Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
)
Soluções de Hardware
Inibição de interrupções
Sincronização de Processos: Semáforos Instrução TSL (apresenta busy wait)
Soluções de software com busy wait
Variável de bloqueio
Alternância estrita
Aula 12 Algoritmo de Dekker
Profa. Patrícia Dockhorn Costa Algoritmo de Peterson
Soluções de software com bloqueio
Sleep / Wakeup, Semáforos, Monitores
1 2 3 N
Profa. Patrícia D. Costa LPRM/DI/UFES 3 Sistemas Operacionais 2008/1 Profa. Patrícia D. Costa LPRM/DI/UFES 4 Sistemas Operacionais 2008/1
Uso de Sleep e Wakeup para o Problema do
Produtor e Consumidor
#define N 100 /* number of slots in the buffer */
Uma Condição de Corrida ...
int count = 0; /* number of items in the buffer */
Buffer está vazio. Consumidor testa o valor de count,
void producer(void) {
while (true){
que é zero, mas não tem tempo de executar sleep, pois
produce_item(); /* generate next item */ o escalonador selecionou agora produtor. Este produz
if (count == N) sleep();
enter_item();
/* if buffer is full,
/* put item in buffer
go to sleep */
*/
um item, insere-o no buffer e incrementa count. Como
count = count + 1; /* increment count of items in buffer*/ count = 1, produtor chama wakeup para acordar
}
if (count == 1) wakeup(consumer); /* was buffer empty? */
consumidor. O sinal não tem efeito (é perdido), pois o
} consumidor ainda não está logicamente adormecido.
void consumer(void){
Consumidor ganha a CPU, executa sleep e vai dormir.
while (true){ Produtor ganha a CPU e, cedo ou tarde, encherá o
if (count == 0) sleep(); /* if buffer is empty, got to sleep */ buffer, indo também dormir. Ambos dormirão
eternamente.
remove_item(); /* take item out of buffer */
count = count - 1; /* decrement count of items in buffer*/
if (count == N-1) wakeup(producer); /* was buffer full? */
consume_item(); /* print item */
}
Prof . Patrícia D. Costa LPRM/DI/UFES
}a 5 Sistemas Operacionais 2008/1 Profa. Patrícia D. Costa LPRM/DI/UFES 6 Sistemas Operacionais 2008/1
com um valor
{ s.count--;
Numa operação V, o semáforo é incrementado e, if(s.count<0){ não negativo
struct binary_semaphore{
Semáforo pode
Exclusão mútua (semáforos binários):
enum {zero, one} value;
ser inicializado
queueType q;} ...
com 0 ou 1
bynary_semaphore mutex = 1;
/* var. semáforo, inicializado com 1 */
void PB(binary_semaphore s) void VB(binary_semaphore s)
{ {
if (s.value == 1) if (s.q esta vazia())
s.value = 0; s.value = 1; Processo P1 Processo P2 ... Processo Pn
else{ else{
... ... ...
coloca o processo na fila q remove o processo P da fila
de s; q de s; P(mutex) P(mutex) P(mutex)
bloquea o processo; coloca o processo P na fila // R.C. // R.C. // R.C.
} de prontos; V(mutex) V(mutex) V(mutex)
} }
} ... ... ...
Profa. Patrícia D. Costa LPRM/DI/UFES 11 Sistemas Operacionais 2008/1 Profa. Patrícia D. Costa LPRM/DI/UFES 12 Sistemas Operacionais 2008/1
Uso de Semáforos (2)
Profa. Patrícia D. Costa LPRM/DI/UFES 13 Sistemas Operacionais 2008/1 Profa. Patrícia D. Costa LPRM/DI/UFES 14 Sistemas Operacionais 2008/1
P(S) P(S)
Profa. Patrícia D. Costa LPRM/DI/UFES 17 Sistemas Operacionais 2008/1 Profa. Patrícia D. Costa LPRM/DI/UFES 18 Sistemas Operacionais 2008/1
(n-1 processos aguardam o n-ésimo processo para todos prosseguirem) - Variáveis compartilhada
}
V(&full); /* increment count of full slots */ acessar o buffer ele faria um down em mutex, agora
Produtor - zero, e também bloquearia. Os dois processos ficariam
void consumer(void){
int item; Consumidor c/ bloqueados eternamente.
Buffer Limitado
P(&full);
P(&mutex);
/*
/*
decrement full count */
enter critical region */ Conclusão: erros de programação com semáforos podem
remove_item(&item); /* take item from buffer */ levar a resultados imprevisíveis.
V(&mutex); /* leave critical region */
V(&empty); /* increment count of empty slots */
consume_item(item); /* do something with the item */
} a. Patrícia D. Costa LPRM/DI/UFES
Prof 23 Sistemas Operacionais 2008/1 Profa. Patrícia D. Costa LPRM/DI/UFES 24 Sistemas Operacionais 2008/1
Deficiência dos Semáforos (2)
garantia que ele conterá o mesmo bloco que ele tinha originalmente.