Problema do Produtor -Consumidor. Solução por semáforos

Documentos relacionados
Sistemas Operacionais

Sistemas Operacionais. Sincronização: Semáforos Problema dos Leitores/Escritores

Sistemas Operacionais

Comunicação entre processos

Fundamentos de Sistemas Operacionais

7 SINCRONIZAÇÃO DE PROCESSOS

Aula 6: Comunicação entre processos. Instituto Federal da Bahia INF009 - Sistemas Operacionais Profª Flávia Maristela

Sincronização e Comunicação entre Processos

Programação concorrente (processos e threads)

Sincronização e Comunicação entre Processos. Adão de Melo Neto

Sistemas Operacionais. Prof. André Y. Kusumoto

Sistemas Operacionais. Comunicação entre processos

Sistemas Operacionais

Sistemas Operacionais. Interrupção e Exceção

Introdução Aplicações Concorrentes Especificação de Concorrência em Programas Problemas de Compartilhamento de Recursos Exclusão Mútua Sincronização

Sincronização e comunicação entre processos

Sistemas Operacionais

Sincronização de Processos (4) Monitores

Filas. Nesta aula veremos o ADT fila Em um computador existem muitas filas esperando pela impressora, acesso ao disco ou, num sistema timesharing,

Aula 7. Problemas Clássicos de Sincronização. 1.1 O Jantar dos Filósofos. 1.2 Leitores e Escritores. 1.3 O Barbeiro Dorminhoco

Concorrência e Paralelismo

PCS-2529 Introdução aos Processadores. Prof. Dr. Paulo Sérgio Cugnasca

INE5645 Programação Paralela e Distribuída - Prova 1 22/10/2012 Aluno: Parte 1 Controle de Concorrência Conceitos Básicos (2,5)

MC504 - Sistemas Operacionais

Sistemas Distribuídos Aula 7

Programação Concorrente

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Aula 7 e 8 Filas e suas Aplicações. Prof. Leticia Winkler

Revisão Ultima aula [1/2]

Prof. Silvana Rossetto 9 de julho de DCC/IM/UFRJ

Sincronização. Cooperação entre Processos

Solução para o Problema do Produtor-Consumidor

Sistemas Operacionais Sincronização e Comunicação entre Processos

Sistemas Operacionais Aula 08: Sincronização de Processos. Ezequiel R. Zorzal

Sistemas Operacionais. Técnicas de Implementação de Exclusão Mútua. Aula VI Prof. Rosemary Silveira

Listas Lineares Ordenadas

Thread. Thread. Sistemas Operacionais. Leonard B. Moreira. UNIVERSIDADE ESTÁCIO DE SÁ fevereiro, / 41

Fila. Algoritmos e Estruturas de Dados I

SSC510 Arquitetura de Computadores 1ª AULA

Modelagem e implementação de programas concorrentes

Exercícios de Sistemas Operacionais 3 B (1) Gerência de Dispositivos de Entrada e Saída

SCC122 - Estruturas de Dados. Lista Estática Seqüencial

Fundamentos de Sistemas Operacionais

Programação Concorrente com Thread Java. Luiz Affonso Guedes Sistemas Distribuidos

Sincronização de Threads

Estruturas de Dados Encadeadas

BC1518-Sistemas Operacionais. Prof. Marcelo Z. do Nascimento

Organização e Arquitetura de Computadores INTRODUÇÃO

UFG - Instituto de Informática

ORGANIZAÇÃO DE COMPUTADORES CAPÍTULO 6: PROCESSADORES. Prof. Juliana Santiago Teixeira

Série de Problemas - Sincronização com Semáforos

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Sistemas Operacionais

Sistemas Distribuídos

SISTEMAS DISTRIBUÍDOS

TRANSMISSÃO DE DADOS Prof. Ricardo Rodrigues Barcelar

SISTEMAS OPERACIONAIS. Sincronização e Comunicação entre Processos UNIBAN

Sistemas Operativos. Objetivo. Entrega do Questionário. Exercício 1. Exercício 2. Exercício 3. Exercício 4. Grupo 1 Introdução

18/10/2010. Unidade de Controle Controle. UC Microprogramada

Sistemas Operativos: Concorrência

Capítulo 2 Processos e Threads

Ambientes de Execução

Processos e Threads e em sistemas distribuídos. Prof. Me. Hélio Esperidião

Capítulo 2. Multiprogramação. Conteúdo. Objetivo. Recordando. Recordando. DCA-108 Sistemas Operacionais

Tipos Abstratos de Dados

Sincronização e Comunicação Problemas Clássicos

Sincronização em Sistemas Distribuídos

Algoritmos e Programação

Conceito de Processo. Estados de Processos. Diagrama de Estados de Processos

ENADE 2011 SISTEMAS OPERACIONAIS

Capítulo 3. Programação Concorrente. Conteúdo. Objetivos. Recordando. Recordando. Objetivos de sistema operacional. DCA-108 Sistemas Operacionais

Variáveis e Entrada de Dados Marco André Lopes Mendes marcoandre.googlepages.

Pilha. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Arquitetura e Organização de Processadores. Aulas 06 e 07. Superescalaridade

Comunicação entre Processos

Gerência de Dispositivos. Adão de Melo Neto

Variáveis, Tipos de Dados e Operadores

Prof. Leonardo Augusto Casillo

Busca XML - Cliente. *Observação* Se o certificado do cliente não for armazenado nessa tela a pesquisa da NFE para a empresa não será realizada.

Transcrição:

Problema do Produtor -Consumidor Solução por semáforos

Autoria Autores alunos da disciplina SO II Local Instituto de Informática UFRGS Versão v7 agosto de 2008 por C. Geyer

Visão geral do assunto...2 Conceito...3 Conceito mais abrangente...6 Exemplo...19 Exercício...20

Ao longo do texto em questão, será descrito o problema do produtor/consumidor bem como sua solução através do uso de semáforos. Semáforos constituem um mecanismo para sincronização e sinalização entre processos, voltado ao compartilhamento de recursos e dependência entre processos.

A utilização de semáforos garante os dois tipos básicos de sincronização: exclusão mútua sinalização execução de uma operação somente após o término de outra.

O problema do produtor/consumidor consiste de um processo que produz dados para serem consumidos por outro processo. Os dados - ou mensagens - são armazenados temporariamente num buffer enquanto esperam para serem utilizados.

A solução que será apresentada aqui utiliza semáforos para garantir a exclusão mútua e a seqüência correta na execução das operações.

Sejam dois processos: um Consumidor e outro Produtor. O produtor produz dados e os envia ao consumidor; este recebe os dados e os processa.

O problema é que o produtor só pode enviar cada dado quando o consumidor estiver pronto para recebê-lo; logo, o produtor fica esperando sem fazer nada enquanto o consumidor não estiver apto a receber os dados. Da mesma forma, o consumidor sempre precisa esperar um dado enviado pelo produtor para continuar seu trabalho, também possuindo tempo ocioso.

Conceito mais abrangente O problema é como transferir dados de forma que o produtor e o consumidor nunca fiquem inativos sem necessidade. Ou melhor: menos tempo ociosos

O primeiro passo é eliminar o obstáculo de um computador (ou processador) ter de esperar pelo outro antes de enviar ou receber. A solução é introduzir um buffer, onde os dados ficam armazenados temporariamente.

O produtor coloca no buffer os dados que produz e o consumidor retira-os do buffer. Agora, produtor e consumidor podem operar de forma independente um do outro.

Primeiro problema relacionado ao buffer Exclusão mútua no acesso ao buffer em escrita (e leitura) pelo produtor e consumidor Solução: Um semáforo com uso do tipo mutex no acesso ao buffer

Porém, há outro problema: Imagine que o produtor deseja inserir um dado no buffer, mas este está cheio, esperando que o produtor retire dados. Da mesma forma, imagine que o consumidor tenta obter dados do buffer quando este está vazio ou seja, todos os dados enviados pelo produtor já foram processados pelo consumidor.

É necessária uma maneira de impedir os dois problemas: o produtor enviar dados para um buffer cheio. o consumidor receber dados de um buffer vazio.

A solução é fazer com que o produtor faça uma pausa quando o buffer estiver cheio, dando tempo para que o consumidor retire elementos do buffer. Similarmente, o consumidor deve parar quando o buffer estiver vazio, a fim de que o produtor possa inserir elementos no buffer.

Mas como saber quando o buffer está cheio ou vazio? Aqui entra a utilização de variáveis semáforos.

São usadas três variáveis semáforas: fulll para contar o número de espaços ocupados no buffer empty para contar o número de espaços vazios no buffer mutex para garantir que consumidor e produtor não acessem o buffer ao mesmo tempo, ou seja, garantir a exclusão mútua.

Full inicia com o valor 0. Espaços ocupados Empty inicia com o valor n. Onde n é o número de espaços no buffer. Mutex começa com valor 1.

O semáforo mutex é usado pelos dois processos (produtor e consumidor) com a finalidade de garantir a exclusão mútua. Já as variáveis empty e full são usadas para garantir que certas seqüências de eventos ocorram ou não. Ou seja, garantir que o produtor pare quando o buffer estiver cheio e o consumidor pare quando o buffer estiver vazio.

Produtor Quando buffer cheio, espera que o consumidor consuma ao menos 1 e sinalize Consumidor Quando buffer vazio, espera que o produtor produza ao menos 1 e sinalize Questões de implementação Quem incrementa o full (contador de ocupados)?

Questões de implementação Quem incrementa o full (contador de ocupados)? Quem decrementa o empty (contador de livres)? Analogamente em qual semáforo o produtor bloqueia? E em qual o consumidor bloqueia? Lembrando: semáforo bloqueia quando semáforo igual a zero (ou menos) P: bloqueia; V: incrementa

Produtor No estado inicial não bloqueia Buffer vazio Bloqueia quando contador de espaços livres (empty) = zero Consumidor No estado inicial bloqueia Buffer vazio Bloqueia quando contador de ocupados (full) = zero

/*número de espaços no buffer*/ #define N 100 /*semáforos são um tipo especial de inteiro*/ typedef int semaphore; /*controla o acesso à região crítica*/ semaphore mutex = 1; /*contador do número de espaços vazios no buffer*/ semaphore empty = N; /*contador do número de espaços cheios no buffer*/ semaphore full = 0;

void producer (void) { int item; while (TRUE) { produce_item (&item); /*gera algo para colocar no buffer*/ P(&empty); P(&mutex); enter_item (item); V (&mutex); /*decrementa o contador empty; bloqueia se cheio*/ /*entra na região crítica*/ /*coloca um novo item no buffer*/ /*sai da região crítica*/ V (&full); /*incrementa o contador full */ } }

void consumer (void) { int item; while (TRUE) { P (&full); P (&mutex); /* bloqueia se vazio - zero*/ /* decrementa o contador full*/ /*entra na região crítica*/ remove_item (&item); /*retira um item do buffer*/ V (&mutex); V (&empty); /*sai da região crítica*/ /*incrementa o contador empty*/ consume_item (&item); /*processa o item retirado do buffer*/ } }

#define N 100 typedef int semaphore; semaphore mutex = 1; semaphore empty = N; semaphore full = 0; void producer (void) { int item; /*número de espaços no buffer*/ /*semáforos são um tipo especial de inteiro*/ /*controla o acesso à região crítica*/ /*contador do número de espaços vazios no buffer*/ /*contador do número de espaços cheios no buffer*/ } while (TRUE) { produce_item (&item); P(&empty); P(&mutex); enter_item (item); V (&mutex); V (&full); } /*gera algo para colocar no buffer*/ /*decrementa o contador empty*/ /*entra na região crítica*/ /*coloca um novo item no buffer*/ /*sai da região crítica*/ /*incrementa o contador full */ void consumer (void) { int item; } while (TRUE) { P (&full); P (&mutex); remove_item (&item); V (&mutex); V (&empty); consume_item (&item); } /*decrementa o contador full*/ /*entra na região crítica*/ /*retira um item do buffer*/ /*sai da região crítica*/ /*incrementa o contador empty*/ /*processa o item retirado do buffer*/

Conceitos Adicionais [Andrews, 1991] Derivação da solução através de propriedades Propriedades Relação entre contadores de: Início de append (deposit, enter,...) pelo produtor Final de append... Início de retirada (get,...) pelo consumidor Final de retirada...

Conceitos Adicionais [Andrews, 1991] 1ª solução Buffer com somente 1 posição Semáforos split: entre 0 e 1 Alternância obrigatória entre produtor e consumidor Similar a coorotinas :» rotinas que cooperam entre si para resolver o mesmo problema» Modelo de PC onde há alternância em pontos bem definidos

Conceitos Adicionais [Andrews, 1991] 2ª solução Buffer com tamanho n

Resumo Conceito de produtor/consumidor Problema derivado das velocidades distintas Buffer: solução para problema acima 3 novos problemas Acesso exclusivo ao buffer Buffer cheio Buffer vazio Solução com semáforos

Resumo Solução com semáforos Semáforo mutex 1 semáforo de sinalização (ou recursos) Buffer cheio: inicialmente = n Isto é: há n posições livres (recursos) 1 semáforo de sinalização Buffer vazio: inicialmente = zero Isto é: há zero espaços ocupados

Abaixo é apresentada a solução para o problema do produtor/consumidor. Considere um buffer de tamanho N. Producer: Begin... P (Empty); P (Mutex); <add item to buffer> V (Mutex); V (Full);... End. Consumer: Begin... P (Full); P (Mutex); <remove item from buffer> V (Mutex); V (Empty);... End. Quais são os valores iniciais dos semáforos Empty,Full e Mutex listados acima?

Exercícios Exercício A Verifique se é possível mudar a posição das chamadas à primitiva V para os semáforos Cheio ou Vazio A) antes de V(Mutex); B) antes do tratamento do buffer; C) antes de P(Mutex) Exercício B Considerando vários produtores e consumidores, e que os produtores são mais lentos que os consumidores, é possível ocorrer que um ou mais consumidores morram de fome? explique

Revisão Especificação do produtor? Idem do consumidor? Como aumentar a concorrência entre os dois? Explique o problema de exclusão mútua Qual a situação de exceção para o produtor? E para o consumidor?

Revisão Como resolver o problema do acesso concorrente ao buffer com semáforos? Quais semáforos, valores iniciais, uso das primitivas,... Como resolver a exceção do produtor? Idem... Como resolver a exceção do consumidor? Idem...