Processos Excluso Mtua 2 Comunicao e Sincronizao Eduardo Nicola F. Zagari Mecanismos para se Mecanismos para se Obter Excluso M Obter Excluso M tua tua Mecanismos de Hardware: Inibio de Interrupes Instruo TSL (Test and Set Lock) Mecanismos de Software: Com Espera Ocupada: Variveis de Travamento (Lock Variables) Alternncia Estrita Soluo de Peterson Sem Espera Ocupada: Dormir e Acordar (Sleep and Wakeup) Semforos Contadores de Eventos Monitores Troca de Mensagens 2 3 Comunicao e Sincronizao Eduardo Nicola F. Zagari Inibi Inibi o das Interrup o das Interrup es es Soluo mais simples Desabilitam-se todas as interrupes aps se entrar na regio crtica ao sair, reabilitam-nas Se as interrupes no ocorrem, o processo no pode sofrer preempo Problema 1: ... e se o processo no reabilitar as interrupes? Problema 2: se o sistema tem 2 CPUs e somente uma tem as interrupes inibidas, a outra pode acessar a memria compartilhada Por outro lado, muito conveniente que o kernel possa desabilitar as interrupes para atualizar variveis ou listas Concluso: soluo adequada para o kernel, mas no para processos de usurio 4 Comunicao e Sincronizao Eduardo Nicola F. Zagari Instru Instru o TSL ( o TSL (Test Test and and Set Set Lock Lock) ) Instruo especial que permite ler uma varivel, armazenar seu contedo em uma outra rea e atribuir um novo valor a esta varivel (hardware) uma instruo indivisvel: executada sem interrupo Varivel compartilhada flag: quando flag = 0, qualquer processo pode faz-la igual a 1 (instruo TSL) 3 5 Comunicao e Sincronizao Eduardo Nicola F. Zagari (cont.) Instru (cont.) Instru o TSL o TSL enter_region: tsl register, flag | copia flag p/ | registrador e faz flag = 1 cmp register, #0 | o flag zero? jnz enter_region | se no,lock e setado;loop ret | retorna, entrou na R.C. leave_region: mov flag, #0 | guarda um 0 em flag ret | retorna a quem chamou 6 Comunicao e Sincronizao Eduardo Nicola F. Zagari Vari Vari veis de veis de Travamento ( Travamento (Lock Lock Variables Variables) ) Define-se uma nica varivel compartilhada, inicialmente com valor zero Se um processo deseja entrar na regio crtica, ele testa a varivel. Se ela for 1 (recurso liberado), ela feita 0 (recurso trancado) e o processo entra. Caso contrrio, o processo aguarda at que o valor da varivel seja 1 (um) 4 7 Comunicao e Sincronizao Eduardo Nicola F. Zagari (cont.) Vari (cont.) Vari veis de Travamento veis de Travamento x = 0, recurso trancado x = 1, recurso liberado while (x == 0) do /* nada */; Entrada x = 0; Entrada ... Regio Crtica x = 1; Sada Problema: Este mecanismo apresenta a falha de que a alterao de valor para trancado, aps o teste, permite que dois processos executem a Regio Crtica (RC) ao mesmo tempo O teste e a alterao necessitam ser feitos de forma indivisvel (atmica) 8 Comunicao e Sincronizao Eduardo Nicola F. Zagari Alternncia Estrita Alternncia Estrita Inicialmente a varivel turn feita igual a 0 (zero) Assim, o Processo A consegue entrar na regio crtica Enquanto isto, o Processo B ficar continuamente testando a varivel (Espera Ocupada) while (TRUE) { while (turn != 0); Reg_Crtica(); turn = 1; Reg_No_Crtica(); } while (TRUE) { while (turn != 1); Reg_Crtica(); turn = 0; Reg_No_Crtica(); } Processo A Processo B 5 9 Comunicao e Sincronizao Eduardo Nicola F. Zagari (cont.) Alternncia Estrita (cont.) Alternncia Estrita Problema 1: o fato do Processo B ficar fazendo Espera Ocupada deve ser evitado, pois consome tempo de CPU Problema 2: no uma boa soluo quando um processo muito mais lento que o outro Problema 3: viola a condio de que um processo que no esteja em sua regio crtica no bloqueie outro 10 Comunicao e Sincronizao Eduardo Nicola F. Zagari Solu Solu o de Peterson o de Peterson Antes de entrar na Regio Crtica (RC), cada processo chama enter_region com seu n o (0 ou 1) como parmetro. Ao sair, leave_region #include prototypes.h #define FALSE 0 #define TRUE 1 #define N 2 /* n o de processos */ int turn; /* de quem a vez */ int interested[N]; /* todos valores inici- */ /* almente 0 (FALSE) */ 6 11 Comunicao e Sincronizao Eduardo Nicola F. Zagari (cont.) Solu (cont.) Solu o de Peterson o de Peterson void enter_region (int process) { /* process = quem est entrando (0 ou 1) */ int other; /* n o do outro processo */ other = 1 - process; /* o outro processo */ interested[process] = TRUE; /* mostra interesse */ turn = process; /* define flag */ while (turn==process && interested[other]==TRUE); } void leave_region (int process) { /* process = quem est saindo */ interested[process] = FALSE; /* indica sada RC */ } 12 Comunicao e Sincronizao Eduardo Nicola F. Zagari Dormir e Acordar ( Dormir e Acordar (Sleep Sleep and and Wakeup Wakeup) ) Problema da Soluo de Peterson e da Instruo TSL: o processo que no consegue acesso R.C. permanece em espera ocupada (busy waiting): gasta tempo de processador inutilmente pode provocar o Problema da Inverso de Prioridade: Dois processos A (alta prioridade) e B (baixa prioridade) B entra na Regio Crtica; A vai para estado de pronto; A passa para estado de execuo; A fica testando indefinidamente. Chamadas de sistema: SLEEP e WAKEUP 7 13 Comunicao e Sincronizao Eduardo Nicola F. Zagari Problema do Produtor Problema do Produtor- -Consumidor Consumidor Dois processos compartilham um buffer de tamanho fixo. Um dos processos, o produtor, coloca informao no buffer, e o outro, o consumidor, retira informao do buffer. Se o buffer estiver cheio, o produtor dorme e acordado quando o consumidor remover um item Se o buffer estiver vazio, o consumidor dorme at que seja produzido e armazenado algum item 14 Comunicao e Sincronizao Eduardo Nicola F. Zagari (?) Solu (?) Solu o com o com SLEEP SLEEP e e WAKEUP WAKEUP #define N 100 /* n o mximo de tens */ int count = 0; /* n o de tens no buffer */ void producer (void) { int item; while (TRUE) { produce_item(&item); if (count==N) sleep(); enter_item(item); count += 1; if (count==1) wakeup(consumer); } } void consumer(void) { int item; while (TRUE) { if (count==0) sleep(); remove_item(&item); count -= 1; if (count==N-1) wakeup(producer); consume_item(item); } } Produtor Consumidor 8 15 Comunicao e Sincronizao Eduardo Nicola F. Zagari (cont.) Solu (cont.) Solu o com o com SLEEP SLEEP e e WAKEUP WAKEUP Problema: Se o buffer estiver vazio e o consumidor sofrer preempo antes de dormir o produtor produz e envia um wakeup para o consumidor que ainda no est dormindo o sinal se perde e o consumidor dormir para sempre...