Programação Concorrente e Paralela

Documentos relacionados
Sistemas Operacionais

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

Monitores. Programação Concorrente September 11, 2012

Sistemas Operacionais

Sistemas Operacionais. Prof. André Y. Kusumoto

Modelagem e implementação de programas concorrentes

Sistemas Operacionais Aula 6

Tipos de Soluções (cont.)

Modelagem e implementação de programas concorrentes

Sistemas Distribuídos Aula 5

Programação concorrente (processos e threads)

DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO SISTEMAS OPERACIONAIS I SEM/12 PROVA I. Tempo de Prova: 100 minutos / Escore Máximo: 300 pontos

Sistemas Operacionais

Universidade Federal do Pará Instituto de Ciências Exatas e Naturais Faculdade de Computação

Sistemas Operacionais. Prof. André Y. Kusumoto

Fundamentos de Sistemas Operacionais

Fundamentos de Sistemas Operacionais

Programação Concorrente e Paralela. Noemi Rodriguez

Monitores. Setembro de Monitores

Sistemas Distribuídos Aula 7

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

Sincronização e comunicação entre processos

Programação Orientada a Objetos. Concorrência

Concorrência. Condições de Corrida. 5a. Tentativa. Dificuldades: Sincronização de Processos (2) Aula 11 Profa. Patrícia Dockhorn Costa

Sincronização e memória compartilhada no Linux

Curso de Programação Distribuída e Paralela 29/09/2008. Informática UFRGS. Sistemas Operacionais II (C. Geyer) Sincronização 1. Pg.

UFRJ IM - DCC. Sistemas Operacionais I. Unidade II Concorrência

Sincronização de Threads

Comunicação entre processos

7 SINCRONIZAÇÃO DE PROCESSOS

Sincronização e Comunicação

Introdução a Programação Concorrente. Aula 02. Prof. André Luis Meneses Silva

Sincronização e Comunicação entre Processos

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

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

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

Concorrência e Paralelismo

SISTEMA DE ARQUIVOS DO SISTEMA OPERACIONAL

Sistemas Operacionais

1 a Questão Unidade I e II (45 pontos)

Sistemas Operacionais

Sincronização. Objectivos da aula de hoje

Sistemas Operacionais. Comunicação entre processos

Sincronização e Comunicação de/entre Processos. Na Aula Anterior... Nesta Aula. Comunicação entre Processos. Pipes 07/09/2016

MC504 - Sistemas Operacionais

Universidade Federal do Pará Instituto de Ciências Exatas e Naturais Faculdade de Computação

Escalonamento. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 28

Sincronização de Processos (4) Monitores

Só podem ser executados por uma Thread que detenha o lock do objecto

Programação Concorrente

SISTEMAS OPERACIONAIS. 2ª. Lista de Exercícios

Sistemas Operacionais

Sistemas Operacionais

Sistemas Operacionais

Revisão Ultima aula [1/2]

Ponteiros de Variáveis

Roteiro. BC1518-Sistemas Operacionais. Prof. Marcelo Z. do Nascimento Semáforos

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

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

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

Semáforos. Walter Fetter Lages.

Teste de Sistemas de Operação 30 de Maio de 2009

SISTEMAS DISTRIBUÍDOS

Programação Concorrente e Paralela

Sistemas Operativos: Concorrência

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

Solução para o Problema do Produtor-Consumidor

Capítulo 2 Processos e Threads

Alexandro Baldassin Programação Concorrente 2sem, 2017

Linguagem de Programação

Retrospectiva da aula passada... Escalonamento. Na aula passada... Comunicação entre processos (-- O jantar dos filósofos --)

Notas da Aula 5 - Fundamentos de Sistemas Operacionais

Semáforo Volnys Borges Bernal Departamento de Sistemas Eletrônicos Escola Politécnica da USP

Semáforos. Gerenciamento de Recursos I

Programação Concorrente. Prof. Hugo Vieira Neto

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

Fundamentos de Sistemas Operacionais

Teste de Sistemas de Operação 15 de Abril de 2010

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

Sincronização em Sistemas Distribuídos

Sistemas Operacionais. Universidade Federal de Minas Gerais. Aula 4. Comunicação e Sincronização de Processos

Concorrência em Processos

Problemas Típicos de Sincronização

Sistemas Operacionais

Sistemas Distribuídos Aula 17

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

Fundamentos. Módulo 6: Sincronização de Processos. Bounded-Buffer (Cont.) Bounded-Buffer

Algoritmos Distribuídos. AD Modelo Computacional 1

Sistemas Distribuídos e Paralelos

CRIANÇAS BRINCANDO : UMA FERRAMENTA PARA O AUXÍLIO NA APRENDIZAGEM DE PROGRAMAÇÃO CONCORRENTE.

3. Linguagem de Programação C

Semáforos. Gerenciamento de Recursos I

Carlos Eduardo Batista Centro de Informática - UFPB

Monitores. Paulo Sérgio Almeida. Grupo de Sistemas Distribuídos Departamento de Informática Universidade do Minho

LINGUAGEM C: ARRAY: VETORES E MATRIZES

Sistemas Operacionais. Capítulo 7 Sincronização e Comunicação entre Processos

DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO BACHARELADO EM INFORMÁTICA SISTEMAS OPERACIONAIS I 1 0 SEM/05 Teste 2 Unidade 2 DURAÇÃO: 50 MINUTOS

Problema dos Leitores/Escritores

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

Transcrição:

Semáforos e Monitores 2010.2

Notação Andrews: atomicidade e await para definir ações atômicas, Andrews introduz a notação e para especificar sincronização, Andrews introduz a notação: await(b)s; que significa que S só deve começar a ser executado quando B for verdadeira, e que S será executado atomicamente

Exemplo de sincronização: produtor/consumidor também chamado de problema do buffer limitado diversas variantes buffer limitadíssimo!

Exemplo de sincronização: produtor/consumidor int buf, p = 0, c = 0; process Producer { int a[n]; while (p < n) { < await (p == c);> buf = a[p]; p = p+1; process Consumer { int b[n]; while (c < n) { < await (p > c);> b[c] = buf; c = c+1;

Implementação de atomicidade exclusão mútua e regiões críticas process CS [i = 1 to n] { while (true) { protocolo de entrada; regi~ao crítica protocolo de saida; regi~ao n~ao crítica soluções de exclusão mútua devem satisfazer as condições seguintes: 1 exclusão mútua 2 ausência de deadlock (ou livelock) 3 ausência de esperas desnecessárias 4 entrada em algum momento ( eventual em inglês) como visto na última aula!

Implementação de espera por condições complicado no caso geral caso particular: barreiras

Barreira com coordenador processo extra para coordenar os demais: int arrive[1:n] = ([n] 0), continue[1:n] = ([n] 0); process Worker[i = 1 to n] { while (true) { code to implement task i; arrive[i] = 1; <await (continue[i] == 1);> continue[i] = 0; process Coordinator { while (true) { for [i = 1 to n] { <await (arrive[i] == 1);> arrive[i] = 0; for [i = 1 to n] continue[i] = 1;

Como implementar o await com protocolos de EM? < S > implementado por CSenter(); S; CSexit(); e < await(b)s; >? podemos testar a condição dentro da região crítica: CSenter(); while (!B) (???) S; CSexit();

await com protocolos de exclusão mútua... se a alteração da condição B depender de outro processo entrar na região crítica, nada feito... podemos tentar: CSenter(); while (!B) (CSexit; CSenter;) S; CSexit(); mas teremos grande disputa pela EM... aqui poderíamos reaplicar o conceito de back-off

Semáforos exclusão mútua e sincronização por condição Dijkstra, E. W. 1968. The structure of the THE -multiprogramming system. Commun. ACM 11, 5 (May. 1968), 341 346. proposto para sincronização entre processos do sistema operacional! material baseado no Cap. 4 de FMPDP (Andrews)

Definição sintaxe: declaração e inicialização: sem s; sem lock = 1; sem forks[5]; cada semáforo é associado a um valor inteiro não negativo manipulação: operações P e V P(s): < await (s > 0) s = s - 1; > V(s): < s = s - 1 > semáforos binários e semáforos gerais propriedades relativas a liveness dependem de especificação de < await >

Exclusão Mútua sem em = 1; process CS [i = 1 to n] { P(em); a = a + 1; V(em); implementada por um semáforo binário

Cooperação Voltando ao problema do buffer limitadíssimo: int buf; sem empty = 1, full = 0; process Producer { int dados; while (p < n) { /* produz dados */ P(empty); buf = dados; V(full); process Consumer { int dados; while (c < n) { P(full); dados = buf; V(empty); /* consome dados */ exemplo de split binary semaphore

Cooperação [cont] e se tivermos vários produtores e vários consumidores? int buf; sem empty = 1, full = 0; process Producer { int data; while (p < n) { /* produz dados */ P(empty); buf = data; V(full); process Consumer { int data; while (c < n) { P(full); data = buf; V(empty); /* consome data */ ainda funciona!

Cooperação [cont] e se tivermos uma estrutura de dados mais complexa? int buf[size]; int nxtfree = 0; int nxtdata = 0; process Producer { int data; while (p < n) { /* produz dados */ buf[nxtfree] = data; nxtfree = (nxtfree+1)%size; process Consumer { int data; while (c < n) { data = buf[nxtdata]; nxtdata = (nxtdata+1)%size; /* consome dados */ um processo de cada tipo x vários processos de cada tipo

Buffer Limitado - 1 processo de cada tipo int buf[size]; int nxtfree = 0; int nxtdata = 0; -- uso de semáforos contadores sem empty = SIZE; sem full = 0; process Producer { int data; while (p < n) { /* produz dados */ P(empty); buf[nxtfree] = data; nxtfree = (nxtfree+1)%size; V(full); process Consumer { int data; while (c < n) { P(full); data = buf[nxtdata]; nxtdata = (nxtdata+1)%size; V(empty); /* consome dados */

Buffer Limitado - n processos de cada tipo int buf[size]; int nxtfree = 0; int nxtdata = 0; -- uso de semáforos contadores e de exclus~ao mútua sem empty = SIZE; sem full = 0; sem exc = 1; process Producer { int data; while (p < n) { /* produz dados */ P(empty); P(exc); buf[nxtfree] = data; nxtfree = (nxtfree+1)%size; V(exc); V(full); process Consumer { int data; while (c < n) { P(full); P(exc); data = buf[nxtdata]; nxtdata = (nxtdata+1)%size; V(exc); V(empty); /* consome dados */

Outros exemplos filósofos canibais e cozinheiros estudo de padrões de problemas em alguns casos o desenho de uma solução por semáforos é bastante complicado macacos e cipó problema de leitores e escritores escritores precisam de acesso exclusivo ao recurso leitores podem acessar o recurso concorrentemente com outros leitores

Passagem de Bastão em alguns casos o desenho de uma solução por semáforos é bastante complicado exemplo: problema de leitores e escritores escritores precisam de acesso exclusivo ao recurso leitores podem acessar o recurso concorrentemente com outros leitores

Leitores e Escritores especificação baseada em < await >

A técnica de passagem de bastão Criamos: um semaforo e associado à entrada nos comandos atômicos (< await(b)s; > ou < S :>) um semáforo sb e um contador db para cada condição B distinta (inicializados com 0) Cada < await(b)s; > fica associado ao seguinte código: P(e) if (!B) { db++; V(e); P(sb); S; SIGNAL onde o trecho SIGNAL corresponde à passagem de bastão para outros processos que estejam em espera

Voltando ao Buffer int buf[size]; int nxtfree = 0; int nxtdata = 0; process Producer { int data; while (p < n) { /* produz dados */ < await ((nxtfree+1)%size!= nxtdata) buf[nxtfree] = data; nxtfree = (nxtfree+1)%size; > process Consumer { int data; while (c < n) { < await ((nxtfree!= nxtdata) data = buf[nxtdata]; nxtdata = (nxtdata+1)%size; > /* consome dados */

Solução com Passagem de Bastão para Prod/Cons mais complicada que a ad-hoc... porém derivada de forma metódica...

Problema da Barreira int chegaram[numiters] = {false,...,false process trab [i = 1 to n] {... for (iter = 0; iter < NUMITERS; iter++) { trabalha; barreira(iter); void barreira (int iter) { <chegaram[iter]++> <await chegaram[iter] == NUMPROCS>

Problema dos leitores e escritores figuras Andrews

Exercício broadcast atômico: Imagine que existe um buffer com n posições. Um produtor pode depositar mensagens somente quando houver uma posição livre e uma posição só pode ser reutilizada quando todos os C consumidores tiverem lido a mensagem. Cada consumidor deve receber as mensagens na ordem em que foram depositadas, mas pode fazê-lo no momento em que desejar. programar com e sem passagem de bastão e mandar por email para 8/9