1 Por que os Algortmos de espera ocupada so, grande parte das vezes, ineficientes?
RESPOSTA: Os algortmos de espera ocupada so ineficientes por que eles tomam a CPU para fazer verificaes de sua varivel.
2 Os semforos so implementados para garantir quais propriedades necessrias?
RESPOSTA: Os semforos, quando implementados, garantem EXCLUSO MTUA e SINCRONIZAO CONDICIONAL.
3 Como funciona o semforo e como implementado ?
RESPOSTA: O semforo uma varivel compartilhada por todos os processos, acessvel a todos eles, composta por duas instrues atmicas P(s) e V(s). P(s) < await (s > 0) s = s 1; > V(s) < s = s + 1 >
4 Quais so os tipos de semforo e explique cada um.
RESPOSTA: | 1 Semforo Genrico | 2 Semforo Binrio | Esses so os dois tipos de semforos, o primeiro contm qualquer varivel NO NULA e o segundo pode conter apenas Zeros (0) e Uns (1).
5 Implemente EXCLUSO MTUA com locks e com semforos.
RESPOSTA: COM LOCK 1. bool lock false; 2. process_1 { 3. while(true){ 4. <await (!lock) lock = true;> 5. seo crtica; 6. lock = false; 7. } 8. } 9. process_2 { 10. while(true){ 11. <await(!lock) lock = true;> 12. seo crtica 13. lock = false; 14. } 15. } COM SEMFORO 1. sem mutex = 1; 2. process [i=1 to M]{ 3. while(true){ 4. P(mutex); 5. seo crtica; 6. V(mutex); 7. } 8. } 6 Implemente a sinalizao de eventos com semforos RESPOSTA: 1. sem arrive_1 = 0, arrive_2 = 0; 2. process worker_1 { 3. while(true){ 4. V(arrive_1); 5. P(arrive_2); 6. } 7. } 8. process worker_2 { 9. while (true){ 10. V(arrive_2); 11. P(arrive_1); 12. } 13. }
7 Como se d a comunicao no PRODUTOR CONSUMIDOR
RESPOSTA: D-se por DEPOSIT E FETCH sendo obrigatoriamente alternada, pois mensagens no podem ser sobrescritas ou lidas por mais de uma vez.
8 Implemente, com semforos, o PRODUTOR CONSUMIDOR
RESPOSTA: 1. typeT buf; sem empty = 1, full = 0; 2. process Produtor [i = 0 to M]{ 3. while(true){ 4. P(empty); 5. buf = data; 6. V(full); 7. } 8. } 9. process Consumidor [i = 0 to N]{ 10. while(true){ 11. P(full); 12. result = buf; 13. V(empty); 14. } 15. }
9 O que so SEMFOROS BINRIOS DIVIDIDOS?
RESPOSTA: Um semforo binrio dividido so semforos FULL E EMPTY dividos em dois, porm utilizados como um s e NO MXIMO TEM O VALOR 1 POR VEZ
10 Qual a vantagem, para o PRODUTOR CONSUMIDOR, de se trabalhar com
rajada? RESPOSTA: Ao trabalhar com Rajada o nosso programa ter a performance aumentada
11 Um Buffer pode ser representado por
RESPOSTA: Um Array ou qualquer estrutura de dados 12 Como funciona o Buffer do DEPOSIT E FETCH RESPOSTA: buf[rear] = data; rear = (rear + 1) % n; PRODUTOR(deposit) result = buf[front]; front = (front + 1) % n; CONSUMIDOR(fetch)
buffer:
rear front
13 Qual a soluo, com semforos, para Buffers limitados?
RESPOSTA: 1. typeT buf[n] 2. sem empty = n, full = 0; 3. int front = 0, rear = 0; 4. process Producer { 5. while(true){ 6. P(empty); 7. buf[rear] = data; rear = (rear + 1) % n; 8. V(full); 9. } 10. } 11. process Consumer { 12. while(true){ 13. P(full); 14. result = buf[front]; 15. front = (front + 1) % n; 16. V(empty); 17. } 18. }
14 Semforos que funcionam como contadores de recursos ( semforos contadores)
so uteis quando ? RESPOSTA: So teis quando vrios processos competem por mltiplas utilidades de um nico recurso. 15 Como so implementados os buffers limitados para vrios processos? RESPOSTA: 1. typeT buf[n] 2. sem empty = n, full = 0; 3. sem mutex_A = 1, mutex_B = 1; 4. int front = 0, rear = 0; 5. process Producer [i=0 to M]{ 6. while(true){ 7. P(empty); 8. P(mutex_A); 9. buf[rear] = data; rear = (rear + 1) % n; 10. V(mutex_A); 11. V(full); 12. } 13. } 14. process Consumer [i=0 to N] { 15. while(true){ 16. P(full); 17. P(mutex_B); 18. result = buf[front]; 19. front = (front + 1) % n; 20. V(mutex_B); 21. V(empty); 22. } 23. }
17 Quais so as duas abordagens para o problema dos Leitores e Escritores?
RESPOSTA: Pode ser usada uma abordagem que trabalha com EXCLUSO MTUA como tambm pode ser usada a abordagem de SINCRONIZAO CONDICIONAL atravs do uso da tecnica de PASSAGEM DE BASTO. 18 Como resolver o problema dos Leitores e Escritores com uso de EXCLUSO MTUA, e quais so os PROS e CONTRAS? RESPOSTA: 1. var = 0; 2. sem mutex_A = 1; 3. sem rw = 1; 4. process Reader [i = 0 to M]{ 5. while(true){ 6. P(mutex_A); 7. var = var + 1; 8. if(var == 1) P(rw); 9. V(mutex_A); 10. Escreve na Base de Dados; 11. P(mutex_A); 12. var = var -1; 13. if (var == 0) V(rw); 14. V(mutex_A); 15. } 16. } 17. process Writer [i = 0 to N]{ 18. while(true){ 19. P(rw); 20. L da Base de Dados; 21. V(rw); 22. } 23. }
- Essa soluo d prioridade aos leitores em detrimento aos escritores.
- Um fluxo contnuo de leitores pode levar a impossibilidade de um escritor acessar a base de dados - A soluo NO JUSTA
19 Qual vantagem temos ao usar a soluo por SINCRONIZAO
CONDICIONAL RESPOSTA: Podemos, com a soluo por sincronizao condicional garantir que os processos escritores NO entrem em estado de STARVATION utilizando registradores atravs de contadores, esses registram a quantidade de leitores e escritores acessando a base de dados
20 A tecnica da passagem de basto parte essencial na SINCRONIZAO
CONDICIONAL, portanto, qual a justificativa para usa-lo? RESPOSTA: A tcnica da Passagem de Basto surge para podermos implementar comandos <await> atravs de semforos, pois a implementao por semforos diretamente IMPOSSIVEL. 21 Descreva o algortmo da passagem de Basto RESPOSTA: 1 PASSO: Substitua o < por P(e); que agora controlar o acesso nos protocolos de entrada 2 PASSO: Verifica as condies para um processo dormir atravs do uso de ifs e implementando os passos para chegar a tal finalidade 3 PASSO: Implementamos os incrementos para os processos que no satisfazem as condies para dormir 4 PASSO: Liberar um dos processos vinculados a um dos semforos utilizados (PASSAR O BASTO)
22 Implemente o algortmo da passagem de Basto
RESPOSTA: 1. int nr = 0, nw = 0; // RW: (nr == 0 ou nw == 0) 2. // e nw <= 1 3. sem e = 1, r = 0, w = 0; 4. int dr = 0, dw = 0; // Numero de escritores 5. //atrasados (dw) e leitores atrasados (dr) 6. process Leitor [i = 0 to M] { 7. while(true) { 8. // <await (nw == 0) nr = nr + 1; > 9. P(e); 10. if ( nw > 0) 11. {dr = dr + 1; V(e); P(r); } 12. nr = nr + 1; 13. // SIGNAL; 14. if (dr > 0) { dr = dr 1/ V(r);} 15. else V(e); 16. read the database; //SC 17. // < nr = nr 1; > 18. P(e); 19. nr = nr 1; 20. // SIGNAL; 21. if (nr = = 0 and dw > 0) 22. { dw = dw 1; V(w); } 23. else V(e); 24. } 25. } 26. process Escritor [i = 0 to N] { 27. while(true){ 28. // < await (nr == 0 and nw == 0) 29. // nw = nw + 1; 30. P(e); 31. if ( nr > 0 e nw > 0) 32. { dw = dw +1; V(e); P(w); } 33. nw = nw + 1 34. // SIGNAL; 35. V(e); 36. write the database; //SC 37. //SIGNAL; 38. P(e); 39. nw = nw +1; 40. if (dr > 0) { dr = dr 1; v(r);} 41. else if ( dw > 0) 42. {dw = dw 1; V(w); } 43. else V(e); 44. } } 23 Implemente o SIGNAL RESPOSTA: 1. if (nw == 0 e dr > 0 ) { 2. // ACORDA LEITOR 3. } else if (nr == 0 and nw == 0 and dw > 0 ) { 4. // ACORDA ESCRITOR 5. dw = dw 1; V(w); 6. } else { 7. // LIBERA LOCK DE ENTRADA 8. V(e); 9. }