Trincos Lógicos: Implementações. Trincos lógicos: Propriedades

Documentos relacionados
LEIC/LERC 2008/09 Primeiro Teste de Sistemas Operativos

Sistemas Operativos. Escalonamento e sincronização. Rui Maranhão

Sistemas Operacionais

Sistemas Operativos. IST - LEIC - 1º Semestre. Autoria. estes transparentes: Page 1

Sincronização e comunicação entre entidades de processamento. Mutex Volnys Bernal 1. Tópicos. Exclusão Mútua (mutex) Exclusão Mútua (Mutex)

Sistemas Operacionais: Sincronização entre processos

Exclusão Mútua (mutex)

Sistemas Operacionais II

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

Programação Concorrente Locks

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

1 Porque o estado de um processo deve ser salvo quando ele deixa a CPU?

Sincronização. Objectivos da aula de hoje

LEIC/LERC 2009/10 1º Teste de Sistemas Operativos

Sistemas Operacionais

UNIVERSIDADE LUSÓFONA DE HUMANIDADES E TECNOLOGIAS C SISTEMAS OPERATIVOS

LEIC/LERC 2008/09. Repescagem do Primeiro Teste de Sistemas Operativos

Sistemas de Tempo-Real. Acesso exclusivo a recursos partilhados

Programação Concorrente. Prof. Hugo Vieira Neto

Sincronização. Cooperação entre Processos

LEIC/LERC 2011/12-1º Exame de Sistemas Operativos 16/Janeiro/2012

LEIC/LERC 2009/10 Repescagem do 1º Teste de Sistemas Operativos

LEIC/LERC 2010/11 1º Teste de Sistemas Operativos

UNIVERSIDADE FEDERAL FLUMINENSE INSTITUTO DE COMPUTAÇÃO DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO

Grupo I [7 Val] 1. Considere os seguintes 3 algoritmos de escalonamento num sistema operativo de tempo virtual:

Arquitetura de Sistemas Operativos

Programação Concorrente e Paralela. Noemi Rodriguez

Sistemas Distribuídos Aula 5

Sistemas Operativos: Concorrência

Comunicação entre Processos

( ) ( ) Auto Avaliação F ( ) M ( ) D ( ) Seqüência: Sistemas Operacionais - UCSAL Professor : Marco Antônio C. Câmara Exercícios - Dia 20/04/2011

Comunicação entre processos (2)

Sincronização de Processos (2)

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

Sistemas Distribuídos Aula 7

Redes de Computadores. INF201 - Fundamentos de Sistemas Operacionais - 2º Período

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 de Microprocessadores I Lista de exercícios (questões de provas de semestre anteriores)

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

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

Sistemas Operativos. Processos cooperantes e processos independentes

Sincronização e comunicação entre processos

Sistemas Operacionais

Comunicação entre processos

Função Fundamental do SO

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

Sistemas Operacionais. Prof. André Y. Kusumoto

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

Sistemas Operacionais. Condição de corrida e Região crítica

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

Sistemas Operacionais Aula 7

Capítulo 2 Processos e Threads

Problema dos Leitores/Escritores

Entradas/Saídas. Programação por interrupções Conceitos gerais Programação da porta série Transmissão

Tipos de Soluções (cont.)

Concorrência. Sistemas Distribuídos e Tolerância a Falhas. Lia Ribeiro 1

Transcrição:

Trincos Lógicos: Implementações Algorítmicas Hardware Sistema Operativo Trincos lógicos: Propriedades Exclusão mútua Progresso (liveness) Ausência de interblocagem (deadlock) Ausência de míngua (starvation) Page 1 1

Proposta #1 int trinco = ABERTO; fechar() { while (trinco == FECHADO) ; trinco = FECHADO; abrir() { trinco = ABERTO; Qual a propriedade que não é garantida? Proposta #2 int vez = 1; t1_fechar() { while (vez == 2) ; t1_abrir() { vez = 2; t2_fechar() { while (vez == 1) ; t2_abrir() { vez = 1; Qual a propriedade que não é garantida? Page 2 2

Proposta #3 int t1_quer_entrar = FALSE, t2_quer_entrar = FALSE; t1_fechar() { while (t2_quer_entrar == TRUE) ; t1_quer_entrar = TRUE; t1_abrir() { t1_quer_entrar = FALSE; /* t2 -> simetrico */ Qual a propriedade que não é garantida? Proposta #4 int t1_quer_entrar = FALSE, t2_quer_entrar = FALSE; t1_fechar() { t1_quer_entrar = TRUE; while (t2_quer_entrar == TRUE) ; t1_abrir() { t1_quer_entrar = FALSE; /* t2 -> simetrico */ Porque motivo é garantida a exclusão mútua? Qual a propriedade que não é garantida? Page 3 3

int trinco_t1 = ABERTO; int trinco_t2 = ABERTO; int tar_prio = 1; Algoritmo de Peterson t1_fechar () { T2 é mais prioritária A1: trinco_t1 = FECHADO; B1: tar_prio = 2; C1: while (trinco_t2 == FECHADO && tar_prio == 2); t1_abrir () {trinco_t1 = ABERTO; T1 pretende aceder à secção crítica t2_fechar () { A1: trinco_t2 = FECHADO; B1: tar_prio = 1; C1: while (trinco_t1 == FECHADO && tar_prio == 1); t2_abrir () {trinco_t2 = ABERTO; Algoritmo de Lamport (Bakery) int senha[n]; // Inicializado a 0 int escolha[n]; // Inicializado a FALSE senha contém o número da senha atribuído à tarefa escolha indica se a tarefa está a pretender aceder à secção crítica Fechar (int i) { int j; escolha[i] = TRUE; senha [i] = 1 + maxn(senha); escolha[i] = FALSE; Pi indica que está a escolher a senha Escolhe uma senha maior que todas as outras Anuncia que escolheu já a senha Pi verifica se tem a menor senha de todos os Pj for (j=0; j<n; j++) { if (j==i) continue; while (escolha[j]) ; while (senha [j] && (senha [j] < senha [i]) (senha [i] == senha [j] && j < i))); Se Pj estiver a escolher uma senha, espera que termine Neste ponto, Pj ou já escolheu uma senha, ou ainda não escolheu Se escolheu, Pi vai ver se é menor que a sua Se não escolheu, vai ver a de Pi e escolher uma senha maior Abrir (int i) {senha [i] = 0; Se a senha de Pi for menor, Pi entra Se as senhas forem iguais, entra o que tiver o menor identificador Page 4 4

Conclusão: Soluções Algorítmicas Complexas Latência Só contemplam espera activa Solução: Introduzir instruções hardware para facilitar a solução Soluções com Suporte do Hardware Abrir( ) e Fechar( ) usam instruções especiais oferecidas pelos processadores: Inibição de interrupções Exchange (xchg no Intel) Test-and-set (cmpxchg no Intel) Page 5 5

ExclusãoMútuacom Inibição de Interrupções int mascara; Fechar_hard () { mascara = mascarar_int (); Abrir_hard () { repoe_int (mascara); Este mecanismosódeveserutilizadodentrodo sistema operativo em secções críticas de muito curta duração inibição das interrupções impede que se executem serviços de sistema(i/o, etc) se o programase esquecerde chamarabrir(), as interrupções ficam inibidas e o sistema fica parado Não funciona em multiprocessadores Inibição das Interrupções não Funciona em Multiprocessadores Tarefa T1 dentro da região crítica Tarefa T2 dentro da região crítica Tarefa T1 executa Fechar_hard Tarefa T2 executa Fechar_hard t1 Inibiç ão das interrupç ões t2 Inibição das interrupções t do processador Proc1 do processador Proc2 Page 6 6

Test-and-Set ABERTO EQU 0 ; ABERTO equivale ao valor 0 FECHADO EQU 1 ; FECHADO equivale ao valor 1 Fechar_hard: L1: MOV AX, 0 ; AX é inicializado com o valor 0 (ABERTO) BTS trinco, AX ; testa se trinco e AX são iguais JC L1 ; a carry flag fica com o valor inicial do trinco ; se carry flag ficou a 1, trinco estava FECHADO ; implica voltar a L1 e tentar de novo ; se carry flag ficou a 0, trinco estava ABERTO RET ; trinco fica a 1 (FECHADO) Abrir_hard: MOV MOV RET AX, ABERTO trinco, AX XCHG ABERTO EQU 0 ; ABERTO equivale ao valor 0 FECHADO EQU 1 ; FECHADO equivale ao valor 1 trinco DW 0 ; trinco com valor inicial ABERTO Fechar_hard: MOV AX, FECHADO L1: XCHG AX, trinco CMP AX, ABERTO ; compara o valor de AX com 0 JNZ L1 ; se AX é diferente de zero volta para L1 RET Abrir_hard: MOV AX, ABERTO MOV trinco, AX RET a instrução XCHG assegura que o trinco fica fechado: pois escreveu o valor um (que estava no registo AX) na posição de memória trinco (bus trancado) qualquer outra tarefa que posteriormente execute a instrução cmp AX,ABERTO vai detectar que o valor do trinco é um (está fechado) Page 7 7

XCHG em Multiprocessadores Instante 1 Instante 2 P1 P1 inicia exchange e tranca o bus P1 completa exchange e tranca a secção crítica P2 P2 tenta fazer exchange mas bloqueia-se a tentar obter o bus Instante 3 P1 entra secção crítica P2 verifica que o trinco está trancado e fica em espera activa CPU CPU CPU CPU Cache Cache Cache Cache bus Memoria IO Soluções com Suporte do Hardware Conclusão: Oferecem os mecanismos básicos para a implementação da exclusão mútua, mas... Algumas não podem ser usadas directamente por programas em modo utilizador e.g., inibição de interrupções Outras só contemplam espera activa e.g., exchange, test-and-set Page 8 8

Soluções com Suporte do SO Primitivas de sincronização são chamadas ao SO: Software trap (interrupção SW) Comutação para modo núcleo Estruturas de dados e código de sincronização pertence ao núcleo Usao suporte de hardware (exch. / test-and-set) Veremos duas primitivas de sincronização: Trincos Semáforos Soluções com Suporte do SO Vantagens (intuitivas): se SO souber quais processos estão à espera de secção crítica, nem sequer lhes dá tempo de processador evita-se a espera activa! Soluções hardware podem ser usadas, mas pelo código do SO: dentro das chamadas sistema que suportam o abrir(), fechar(), etc. Page 9 9

Diagrama de Estado dos Processos / Tarefas Em Execução Seleccionado pelo Despacho Retirado pelo Despacho Bloqueado num Trinco ou Semáforo Executável Bloqueado Desbloqueado Estruturasde Dados Associadas aos Trincos Trinco t Bit trinco Fila de procs./tarefas bloqueadas Processos ou tarefas bloqueados no Trinco t Page 10 10

Funções do trinco (mutex) trinco_t = t; t.var=aberto; // trinco inicialmente ABERTO t.numtarefasbloqueadas = 0; Retirar tarefa de execução Salvaguardar o seu contexto Marcar o seu estado como bloqueada Colocar a estrutura de dados que descreve a tarefa na fila de espera associada ao trinco Invocar o algoritmo de escalonamento Fechar_mutex (trinco_t t) { Fechar_hard(t); if (t.var == FECHADO){ numtarefasbloqueadas++; Abrir_hard(t); bloqueia_tarefa(); else { t.var = FECHADO; Abrir_hard(t); Abrir_mutex (trinco_t t) { Fechar_hard(t); if (numtarefasbloqueadas > 0) {desbloqueia_tarefa(); numtarefasbloqueadas--; else t.var = ABERTO; Abrir_hard(t) Este 8/9/2006 programa concorrente está errado! Sistemas É Operativos necessário DEI - ISTassegurar que variáveis partilhadas são acedidas em exclusão mútua Existem tarefas bloqueadas Marcar o estado de uma delas como executável Retirar a estrutura de dados que descreve a tarefa da fila de espera associada ao trinco 8/9/2006 Funções do trinco (mutex) trinco_t = t; t.var=aberto; // trinco inicialmente ABERTO t.numtarefasbloqueadas = 0; Fechar_mutex (trinco_t t) { Fechar_hard(t); if (t.var == FECHADO){ numtarefasbloqueadas++; Abrir_hard(t); bloqueia_tarefa(); else { t.var = FECHADO; Abrir_hard(t); Abrir_mutex (trinco_t t) { Fechar_hard(t); if (numtarefasbloqueadas > 0) {desbloqueia_tarefa(); numtarefasbloqueadas--; else t.var = ABERTO; Abrir_hard(t) É necessário assegurar exclusão mútua no acesso aos atributos do trinco Qual a diferença entre a exclusão mútua no acesso aos atributos do trinco e a exclusão mútua que o trinco assegura? Page 11 11

Espera activa com e sem suporte do núcleo T1 Secção Crítica Abrir(mutex) Solução sem suporte do núcleo T2 Espera activa Fechar(mutex) Secção Crítica Solução com suporte do núcleo T2 Fechar(mutex) Fechar_hard(t) Bloqueada Secção Crítica Page 12 12