Sincronização de Processos (3) - ppt carregar
PublicouClara Reinoso Alterado mais de 6 anos atrás
Apresentação em tema: "Sincronização de Processos (3)"— Transcrição da apresentação:
1 Sincronização de Processos (3)
A Instrução TSL (1) TSL = "Test and Set Lock" Solução de hardware para o problema da exclusão mútua em ambiente com vários processadores. O processador que executa a TSL bloqueia o barramento de memória, impedindo que outras CPUs acessem a MP até que a instrução tenha terminado. A instrução TSL faz o seguinte: Lê o conteúdo de um endereço de memória (variável compartilhada "lock", usada para proteger a R.C.) para um registrador e armazena um valor diferente de zero (normalmente 1) nesse endereço. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES
A Instrução TSL (2) Se lock = 0  R.C. livre; Se lock = 1  R.C. ocupada. (Lock é iniciada com o valor 0). A instrução TSL é executada de forma atômica. As operações de leitura e armazenamento da variável lock são garantidamente indivisíveis, sem interrupção. Nenhuma outra CPU pode acessar lock enquanto a instrução não tiver terminado. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES
4 Prof. José Gonçalves - DI/UFES
A Instrução TSL (3) boolean testset (int lock) { if (lock == 0) { lock = 1; return true; } else { return false; Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES
5 Prof. José Gonçalves - DI/UFES
A Instrução TSL (4) enter_region: tsl register,lock cmp register,#0 jnz enter_region ret <critical region> leave_region: move lock,#0 Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES
6 Prof. José Gonçalves - DI/UFES
A Instrução TSL (5) Vantagens da TSL: Simplicidade de uso (embora sua implementação em hardware não seja trivial). Não dá aos processos de usuário o poder de desabilitar interrupções. Presente em quase todos os processadores atuais. Funciona em máquinas com vários processadores. Desvantagens: Espera ocupada (busy wait). Possibilidade de postergação infinita ("processo azarado" sempre pega a variável lock com o valor 1). Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES
7 As Primitivas Sleep e Wakeup
A idéia desta abordagem é bloquear a execução dos processos quando a eles não é permitido entrar em suas regiões críticas. Isto evita o desperdício de tempo de CPU, como nas soluções com busy wait. Sleep(): bloqueia o processo e espera por uma sinalização, isto é, suspende a execução do processo que fez a chamada até que um outro o acorde. Wakeup(): sinaliza (acorda) o processo anteriormente bloqueado por Sleep(). Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES
8 O Problema do Produtor e Consumidor com Buffer Limitado
Processo produtor gera dados e os coloca em um buffer de tamanho N. Processo consumidor retira os dados do buffer, na mesma ordem em que foram colocados, um de cada vez. Se o buffer está cheio, o produtor deve ser bloqueado, se está vazio, o consumidor é quem deve ser bloqueado. Apenas um único processo, produtor ou consumidor, pode acessar o buffer num certo instante. dado dado dado . . . 1 2 3 N Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES
9 Uso de Sleep e Wakeup para o Problema do Produtor e Consumidor
#define N /* number of slots in the buffer */ int count = 0; /* number of items in the buffer */ void producer(void) { produce_item(); /* generate next item */ if (count == N) sleep(); /* if buffer is full, go to sleep */ enter_item(); /* put item in buffer */ count = count + 1; /* increment count of items in buffer*/ if (count == 1) wakeup(consumer); /* was buffer empty? */ } void consumer(void){ if (count == 0) sleep(); /* if buffer is empty, got to sleep */ 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 */ Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES
10 Uma Condição de Corrida ...
Buffer está vazio. Consumidor testa o valor de count, que é zero, mas não tem tempo de executar sleep, pois o escalonador selecionou agora produtor. Este produz um item, insere-o no buffer e incrementa count. Como count = 1, produtor chama wakeup para acordar consumidor. O sinal não tem efeito (é perdido), pois o consumidor ainda não está logicamente adormecido. Consumidor ganha a CPU, executa sleep e vai dormir. Produtor ganha a CPU e, cedo ou tarde, encherá o buffer, indo também dormir. Ambos dormirão eternamente. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES