Upload
phamkhanh
View
214
Download
0
Embed Size (px)
Citation preview
1
Entrada/Saída
Capítulo 3
3.1 Princípios do hardware de E/S 3.2 Princípios do software de E/S 3.3 Camadas do software de E/S 3.4 Impasses 3.5 Discos 3.6 Terminais com base em caracteres
2
Introdução O controle da E/S é uma das tarefas centrais de um sistema
operacional, que: • emite comandos para os controladores de dispositivo,
processa interrupções e trata de erros • esconde detalhes específicos dos diferentes dispoitivos
para o resto do S.O. através de uma interface uniforme • tenta paralelizar E/S e processamento da CPU/Memória
para minimizar latência e maximizar vazão de dados no acesso aos dispositivos de E/S
• controla o acesso concorrente dos dispositivos O sub-sistema de E/S consiste de duas camadas: • Software independente dos dispositivos (para cada classe
de dispositivo) • Software dependente do dispositivo (drivers)
3
Tipos de Dispositivo O Dispositivo de E/S é definido por:
– Conjunto de comandos básicos disponibilizados – As funções que executa – As mensagens de status/erro que emite
Existem os seguintes tipos de dispositivo: Dispositivos de bloco = transferem ou armazenam dados em blocos
de tamanho fixo, cada bloco possui um endereço e cada bloco pode ser acessado independentemente (acesso aleatório). Exemplos: Discos (SCSI, IDE), CD/DVD, Fitas, SSDs
Dispositivos de caractere = lê ou escreve uma sequência de caracteres. Cada caractere não possui endereço e não pode ser acessado aleatoriamente. Para cada caractere (ou conjunto pequeno deles), é gerada uma interrupção. Exemplos: Teclado, Mouse, etc.
Obs: Esta classificação é apenas geral: nem todo dispositivo de E/S
se enquadra exatamente em uma dessas categorias. Por exemplo: Fitas de backup, Vídeo mapeado em memória, Modem, Interface de Rede etc.
7
Controladores de Dispositivos
• Partes de dispositivos de E/S – Componente eletro-mecânico (motor, engrenagem, cabeçote
magnético, sensores, etc.) – controlador do dispositivo (um Circuito integrado ou processador)
• A interface física (pinos) entre o controlador e a componente mecânica é padronizada (ISO, SCSI, IDE)
• Um controlador pode fazer o controle conjunto de vários dispositivos (componentes eletro-mecânicas)
• Tarefas do controlador – converter fluxo serial de bits para conjuntos de bytes – Verificação da consistência dos dados (checksum) e correção de erros – Bufferização: agrupar bloco de bytes para transferência para a
memória principal
• Do ponto de vista conceitual, o controlador é o dispositivo de E/S.
8
Arquitetura Conceitual Conceitualmente, é como se houvesse conexão direta entre CPU/Memória e todos os controladores
Em arquiteturas reais, existem vários barramentos e circuitos dedicados para seu acesso, que servem de ponte entre os barramentos
10
Controladores de Dispositivos
• Cada controlador possui registradores que são usados para fazer o controle da E/S (da parte eletro-mecânica) e para emitir informações sobre status e condições de erro.
• Registradores que compõem uma porta de E/S: – Reg. de status (bits) – Reg. de controle (bits) – Reg. de entrada de dados (1-4 bytes) – Reg. de saída de dados (1-4 bytes)
• Em algumas arquiteturas, o espaço de endereçamento da memória RAM e das portas de E/S é único (E/S mapeada em memória) Exemplo: Motorola 680x0
• Em outras arquiteturas, existe um espaço de endereçamento específico para E/S (fora da memória), usado apenas para interação com os controladores.
• A associação de um endereço com a porta de E/S de um controlador é feita no circuito de decodificação de endereços do barramento.
11
E/S mapeada na memória
Espaços de memória e E/S separados • As instruções de E/S (com esses endereços) ativam linhas do barramento para
selecionar o dispositivo e transferir os bits de/para registradores da porta de E/S.
E/S mapeada na memória: • Portas de E/S do dispositivo estão mapeados no espaço de endereçamento do
processador. Driver executa instruções para ler e escrever nas portas (=nos registradores da controladora)
Híbrido: alguns dispositivos usam portas separadas e também espaço mapeado na memória
15
Passos de uma leitura de bloco controlada por CPU
1. CPU escreve comando (p.ex., ler bloco de determinado endereço) em registrador do controlador de disco
2. Controlador aciona a componente eletro-mecânica, e transfere os dados bit-a-bit do disco para um buffer do controlador
3. Controlador calcula a checksum para verificar se há dados corrompidos. Se houver, faz nova leitura.
4. Quando bloco de dados foi completamente lido, controlador levanta uma interrupção
5. Driver executa loop para copiar byte-by-byte o bloco do controlador para a memória principal
Obs: o driver executa na CPU
17
Direct Memory Access (DMA) Em várias arquiteturas existe um componente de HW
dedicado à transferência direta de blocos de dados para a memória - Direct Memory Access (DMA):
• Evita que a CPU tenha que executar o loop para transferência do bloco de/para a memória principal.
• CPU apenas inicia E/S informando: endereço inicial na memória, endereço do bloco no disco, número de bytes a serem transferidos.
20
Funcionamento do DMA Passo a passo de transferência de dados do dispositivo para a memória
usando DMA
21
Acesso Direto à Memória (DMA)
Uma controladora de DMA acessa a memória diretamente: não têm noção de memória virtual
Duas alternativas: • Cópia dos dados para buffer no driver do dispositivo e posterior
cópia para a memória alocada ao processo • Cópia dos dados diratemente para um endereço do processo,
mas então precisa-se garantir que a(s) páginas destino permaneçam na memória (não sejam swapped out)
24
E/S Programada com Polling
Exemplo: Escrita de uma cadeia de caracteres para a impressora usando E/S programada
Software de E/S (driver) consulta repetidamente o status do dispositivo para saber quando dispositivo está pronto (pronto pare receber comando/dados)
Obs: p[] o vetor de caracteres na memória e printer_data_register e printer_status são a porta da controladora da impressora.
25
E/S Orientada à Interrupção
Escrita de uma cadeia de caracteres para a impressora usando E/S orientada à interrupção
a) Código executado quando é feita a chamada ao sistema para impressão b) Rotina de tratamento de interrupção
Interrupções indicam quando uma operacão de E/S está finalizada. Gerenciamento é implementado pela interação entre o device driver e o procedimento de tratamento de interrupcões.
26
E/S Usando DMA
Impressão de uma cadeia de caracteres usando DMA a) Código executado quando quando é feita a chamada ao sistema para impressão b) Rotina de tratamento de interrupção
29
Princípios do Software de E/S Objetivos do Software de E/S (1)
• Independência de dispositivo – Programas podem acessar qualquer dispositivo de E/S sem
especificar previamente qual tipo/modelo/ fabricante do dispositivo
• Nomeação uniforme – Em Unix, accesso a drivers por aplicações em modo usuário
através do sistema de arquivos (dispositivos representados como arquivos especiais a serem abertos)
– Exemplos: • /dev/hda • /dev/hdb • /dev/ttya
• Tratamento de erro – Erros devem ser tratados o mais próximo possível do
hardware
30
Objetivos do Software de E/S (2) • Transferências Síncronas vs. Assíncronas
– transferências bloqueantes vs. orientadas a interrupção
– utilização de buffers para armazenamento temporário
– dados provenientes de um dispositivo muitas vezes não podem ser copiados diretamente para o destino final (memória do processo)
• Gerenciar o acesso concorrente (e otimizado) a dispositivos compartilhados – Disco, monitor, teclado, mouse e rede são
dispositivos de E/S compartilhados
33
Drivers de Dispositivo Características/Tarefas dos Drivers:
– Software para controle básico do controlador do dispositivo – Geralmente realizam o tratamento de interrupções geradas
pelo dispositivo – Encapsula as especificidades de controle do dispositivo – Para alguns dispositivos mantém uma fila de requisições
pendentes – Para discos, traduz requisições lógicas (leia bloco x) em
comandos específicos da controladora (p.exemplo: mova para cilindro 3; leia a transfira dados dos setores 34-35 da trilha 6)
– Espera a chegada de interrupção, verifica integridade dos dados e transfere dados de/para a região de memória do processo
34
Drivers de Dispositivos
• Drivers escrevem e lêm as portas de E/S (comandos específicos, parâmetros de controle e estado do dispositivo)
Quando é carregado, cada driver: • Se registra junto ao núcleo e
verifica se o controlador do seu dispositivo está conectado (ativo).
• Se não, o driver simplesmente permanece inativo.
35
Drivers de Dispositivo • Disponibiliza uma interface API
padrão (de sistema de arquivos) para o restante do sistema
• As operações sobre arquivos open(), read(), write(), close(), seek(), release(), mmap() etc. são mapeadas para os procedimentos específicos de cada driver.
• Cada dispositivo possum um: – major device number = índice para
uma Device Diver Table e um – minor device number = parâmetro
que caracteriza o aparelho (mas interpretação pode variar de driver para driver)
40
Software de E/S Independente de Dispositivo
Implementa funções e estruturas de dados usadas por vários tipos de E/S e fornece uma interface uniforme para as aplicações.
Funções típicas do software de E/S independente de dipositivo
API uniforme para os drivers dos dispositivos
Bufferização
Tratamento e notificação de falhas
Alocação e liberação de dispositivos dedicados Definição de tamanho único de bloco, independente de dispositivo
API e nomes uniformes • Drivers precisam implementar uma interface (API) uniforme.
Isso permite isolar as especificidades dos dispositivos e instalar novos drivers
• Chamadas de sistema para E/S como as de arquivos simplifica
o uso • Arquivos especiais (em /dev) representam dispositivos de E/S
41
Seus i-nodes contém: Major device number = número do driver Minor device number = parâmetro do driver (a unidade do dispositivo)
• Bits de controle de acesso rwx definem as permissões de acesso ao dispositivo
API para block devices: open, close, strategy, size e xhalt; API para character devices: open, close, read, write, ioctl, mmap, segmap, xpoll, xhalt
Software Independente do Dispositivo Provê vários serviços relacionados à E/S: escalonamento, uso de buffers e caches, spooling, alocação e liberacão de dispositivo e tratamento de erros Escalonamento de E/S:
– Quando processo faz requisição de E/S em bloco essa é enfileirada, por dispositivo
– O Escalonador de E/S decide sobre a ordem de envio das requisições para os discos, p/ otimizar acesso (aumentar vazão, baixar o tempo médio de resposta das requisições)
– Faz a busca antecipada de blocos para cache
Escalonador de E/S pode ter vários objetivos: – Minimizar seek time do disco – Priorizar E/S de certos processos – Garantir iguais larguras de banda p/ acesso do disco para cada processo – Garantir que certas requisicões serão procesadas antes de um certo
tempo
47
Software Independente do Dispositivo Tratamento de falhas: • chamadas de E/S retornam não só um valor de sucesso (0/1), mas também
um código de erro (em Unix errno), com informação sobre natureza da falha
• Para falhas transitórias, pode-se tentar repetir a operação de E/S, mas erros permanentes precisam ser tratados
Alguns controladores/drivers: • informam a natureza da falha de hardware (tipo de erro de hardware, ou
requisição ilegal) • geram logs de erros, que podem ser consultados. Exemplos de falhas: • Requisição para um setor inexistente • Setor de disco fisicamente danificado • Impureza na superfície do disco • Erro na busca (braço do cabeçote não se posicionou no cilindro correto) • … 48
49
Software Independente de Dispositivo
a. Sem buffer: E/S bloqueante e mono-programação b. Buffer em espaço do usuário: E/S assíncrona, mono-programação c. Buffer no driver e no processo: permite multi-programação d. 2 ou mais buffers no driver: permite paralelizar transferência dos dados
do dispositivo e cópia para processo
Bufferização: • para compensar diferentes taxas de transferência (RAM vs dispositivo) • para mapear quantidade de bytes da requisição a tamanhos de blocos
Buffer Circular • É a generalização do buffer duplo • Desacopla a taxa de transferência de dados da E/S da taxa de
consumo dos dados pelo processo destinatário • Usado para fazer a busca antecipada de blocos (provável
necessidade de blocos vizinhos) • Permite atender requisições de leitura de vários processos
50
E/S com buffers • E/S Orientada a bloco (block-oriented)
– Processo pode processar um bloco enquanto o outro está sendo lido para memória
– Buffers ficam residentes em memória RAM – Subsistema de E/S mantém associação entre requisições (c/ seus
blocos) e processos do usuário – Escalonador de E/S otimiza transferência de/para disco
• E/S Orientada a caracteres (character-oriented) – Uma linha é lida/escrita de cada vez (com CR- Carriage return)
sinalizando fim da linha – Os caracteres no buffer podem ser pré processados antes de serem
entregues para o processo (raw & cooked mode) – Exemplo: na E/S de teclado: processar o efeito de DEL, ou CTRL,
ESC, etc.
53
Software Independente do Dispositivo Principais Funções:
Mapeamento de nomes simbólicos (/dev/tty00) para os drivers correspondentes
Permissões para acesso aos dispositivos como de arquivos Mapeamento de tamanho de bloco único para tamanhos de setores variados em discos diferentes. Transferência controlada de bytes do disco para interface de rede, compensando diferentes taxas de dados de cada dispositivo Gerenciamento de blocos livres nos dispositivos de bloco (discos)
Funções para a bloqueio e liberação de dispositivos dedicados
Se erro não pode ser compensado/contornado pelo driver, deve informar ao programa do usuário o tipo e erro
Exemplos: APIs genéricas mapeadas para funções específicas.
54
Suporte a E/S em modo usuário Há suporte a E/S nas bibliotecas ligadas a programas do usuário (stdio, ioctl,
etc.) Por exemplo a formatação da entrada e saída, printf e scanf efetuam a contatenacão de strings, e a conversão de
octetos para caracteres, inteiros, float, etc.
Mas também há programas utilitários e processos (daemons), responsáveis por realizar uma tarefa específica relacionada à E/S
Exemplos: • lpd - spool de arquivos para a impressão • inetd, ftpd, rshd, httpd, dhcpd - processos que tratam E/S com a rede
55
Disco 3
E/S orientada a bloco: Estrutura do Disco
• Cilindro: coleção de N trilhas (uma em cada superfície de disco) • Trilha: uma circunferência de raio T completa em uma
superfície de disco; contém número variável de setores • Setor: uma parte de uma trilha (com número fixo de bytes) O tempo de acesso a um setor depende essencialmente do tempo
de posicionamento do pente de leitores até o cilindro correspondente e da velocidade de rotação do disco.
Disco 2 cilindro
Disco1
setor
trilha
57
Setores em um Disco
Geometria física de um disco (com dois tamanhos de setor) vs geometria virtual A controladora conhece a geometria física e faz o mapeamento de um endereço lógico de bloco para o setor correspondente
Geometria física Geometria lógica
Desempenho no acesso ao Disco O cabeçote precisa ser posicionado na trilha, no início do setor alvo.
Isso envolve: • Tempo de posicionamento (Seek time)
– Tempo para posicionar o cabeçote na trilha
• Latência rotacional – Tempo necessário para que o início do setor apareça abaixo do cabeçote
• A fim de minimizar o seek time médio para várias requisições pendentes, deve-se escalonar as mesmas
• O Escalonador de E/S de bloco executa um algoritmo de escalonamento de disco
59
Algoritmos de Escalonamento de Disco
2) Algoritmo Mais-Próximo-Primeiro (Shortest Seek Time First -SSTF) : – Usa tabela indexada por cilindro com lista de requisições para cada cilindro – Enquanto move o cabeçote para um cilindro, novos pedidos vão chegando – Escolhe sempre o cilindro mais próximo do atual – Atende todos os pedidos para o cilindro corrente
Posição "inicial
Pedidos"pendentes
1) First-Come-First Served (FCFS): não há como otimizar tempo de posicionamento (seek time).
Ordem de Requisições: 11 1 36 16 34 9 12 Sequência de posicionamentos
60
Algoritmos de Escalonamento de Disco
Principal problema do Shortest Seek Time First: • Se a chegada dos pedidos ocorre com distribuição
uniforme em todos os cilindros, então: • Para discos muito utilizados, o cabeçote tenderá a permanecer nos
cilindros do meio, e mover-se com menor probabilidade (PB) para os cilindros nos extremos.
• Portanto, dados gravados em cilindros das extremidades levarão mais tempo para serem acessados do que dados em cilindros centrais.
Disco
Posição atual
PB PA PA > PB Posição atual
PB PA PA > PB
61
Algoritmos de Escalonamento de Disco
Algoritmo do elevador (SCAN): • Manter o sentido da movimentação até que não haja mais pedidos para
acesso em “cilindros a diante” • No sentido de movimentação, atende primeiro os cilindros mais
próximos • Um flag (UP/DOWN) registra o sentido de movimentação.
Ordem chegada: 11 1 36 16 34 9 12
Sequência de posicionamentos
Algoritmo do Elevador
Variantes: 1. Mover o cabeçote somente até o cilindro mais afastado
para qual exista uma requisição • Vantagem: ganha-se eficiência no atendimento global das
requisições 2. Mover o cabeçote até o cilindro mais afastado,
independente de haver requisição • Vantagem: garante-se um tempo médio igual de atendimento
para requisições nos cilindros centrais e extremos do disco • Desvantagem: se não há blocos escritos nos cilindros além dos
limites, é improvável que cheguem requisições para lá. 3. Registrar quais foram os cilindros mais extremos usados
até então (cilmin, cilmax), e fazer a varredura dentro desse intervalo.
63
Algoritmos de Escalonamento de Disco
Algoritmo Circular SCAN (C-SCAN) • Objetivo: prover um tempo de espera mais uniforme para todas as
trilhas • Como o SCAN, move o cabeçote de uma extremidade para outra,
atendendo todas as requisições no caminho. • Mas quando o cabeçote atinge o cilindro mais extremo, ele retorna ao
início do disco (sem atender a requisições)
Ordem chegada: 11 1 36 16 34 9 12
Sequência de posicionamentos
65
Desempenho de Acesso: Formatação de Disco
Algumas controladoras são incapazes de fazer entrada e saida de seu buffer em paralelo.
• Por isso, discos são formatados com setores entrelaçados (b) e (c), para permitir E/S mais eficiente de setores consecutivos
• Enquanto controladora copia blocos do setor 0 para memória, disco faz a rotação e quando cabeçote está sobre o setor 1, controladora já está pronta para receber esse setor.
68
Aumento de desempenho por paralelismo
• Redundant Array of Inexpensive Disks (RAID) • A controladora RAID opera vários discos sincronamente e
multiplica a taxa de atendimento de requisições • Mais discos è maior probabilidade de falha do conjunto è requer
redundância de informacão • Possibilita também a troca de discos sem parar o sistema (hot
swap) • Faixa = conjunto de blocos (bytes, ou bits)
Faixas espelhadas em discos • garante
redundância • mas duplica a
qtde de discos
Como aumentar a taxa de atendimento de requisições ao disco?
Faixas consecutivas podem ser atendidas
em paralelo (sem redundância)
71
Redundância de Disco
Faixas de paridade espalhadas por todos os discos. • Corrige blocos com defeito • Requisições concorrentes de escrita
podem ser executadas em paralelo
RAID nivel 6
Semelhante a RAID 5 mas com dupla paridade: redundância de faixas de redundância • Pode tolerar a falha de até dois
discos. • Mais discos estarão envolvidos em um
update de um bloco (B1) -> diminuindo a possibilidade de paralelismo
Fatiamento em blocos faz com que escrita possa ocorrer somente no disco do bloco e no disco de paridade. Mas o bloco a ser atualizado e o de paridade precisam ser previamente lidos para a controladora para permitir o re-calculo do bloco de paridade.
Fatiamento em nível de blocos: blocos de paridade (XOR sobre o conteúdo dos blocos) em disco separado: • Corrige blocos com defeito • Disco único de paridade torna-se o
gargalo em requisições paralelas (acabam sendo sequenciais)
RAID 1+0 e 5+0
72
Animações Flash: http://www.fujitsu.com/global/products/computing/storage/eternus/glossary/raid/index.html
RAID 5+0
E/S Orientada a caracteres • Para dispositivos como:
– Teclado – Mouse – Terminal orientado a caracter – Portas Seriais – Interface de rede
• As requisições são para leitura/escrita caracter a caracter (e.g. put(c), get (c))
• Para compensar diferentes taxas de produção e consumo de caracteres, utiliza-se buffers
• Alguns caracteres são de controle e precisam ser interpretados antes de serem consumidos pelo processo alvo.
79
81
Teclado: Funcionamento de uma entrada de dados
• Controlador gera uma interrupção para avisar que tecla foi acionada (e seu # obtido)
• Driver copia um número (código de tecla pressionada/solta) da controladora para buffer interno – driver converte para código ASCII – muitos SOs fornecem mapas de teclas ou páginas de
códigos carregáveis (pois teclados têm códigos de teclas não padronizadas)
• Núcleo recebe uma requisição de leitura de um processo, e repassa para driver
Software de Entrada • Processamento de caracteres
– Usuário digita “hella← o” – Teclado gera: “hellactrl-Ho” – Processo deve receber “hellactrl-Ho” ou “hello” ?
• Modo crú (raw mode) – Driver entrega diretamente cada caracter ao processo (incl. teclas
ctrl, alt, f1-f10, alt, shift,…) – Sem modificações, sem eco (=mostrar o caracter digitado) – Alguns programas usuários requerem esse modo: shell, vi, emacs,
login (p/ senha)
• Modo processado (cooked mode) – Caracteres são armazenados em buffer até que uma linha toda
tenha sido acumulada – Driver faz o processamento de caracteres especiais no buffer, e
ecoa o resultado na tela – POSIX padroniza o efeito de teclas especiais – É o modo canônico (default)
Modo Cozido
• Driver precisa... – Bufferizar uma linha inteira antes de passa-la para o
processo – Processar caracteres de controle especiais
• Ctrl-C, ERASE, Del, line-erase, Tab, shift – Ecoar o caracter digitado – Nova linha pode ser procesada em paralelo com o
processamento de linha anterior
• Para isso, precisa de buffers internos de entrada
• Bufferização é necessária para lidar com digitação antecipada: • enquanto linha está sendo processada, outra linha é digitada
e já pode ser lida) • processo consumidor ainda não está executando
86
Pool de buffers Buffer dedicado para cada terminal
Software de Entrada Buffers no Driver de terminal
Duas abordagens de bufferização p/ digitação antecipada: • para computadores com muitos terminais
Manter um pool de buffers a serem usados por demanda • para computadores com 1 usuário:
Manter um buffer por terminal (e.g., 500 bytes)
E/S de Terminais orientados a caracter “echo” de caracteres no monitor
Driver teclado
Driver monitor
ESC seq.
echo
Interrupts and key numbers
read(mode,buff,1)
Raw/cooked Echo (Y/N)
controllers
Questões: • Onde colocar o echo? Dado que outros programa tambem podem estar escrevendo no terminal? • E quando a entrada ultrapassa a largura da linha do terminal? Troca de linha ou truncar linha? • Diferença de velocidade entre entrada e o echo: Alguns terminais processam letras/numeros mais
rápido do que mudança de linha; então o driver do teclado deve inserir caracteres de prenchimento (nulos)
Saida para um terminal
• O terminal aceita sequencias de escape (escape sequence), que embutem controles especiais (para cursor)
Exemplo: esc [ 3 ; 1 H esc [ 0 K esc [ 1 M
• Cada fabricante de terminal define sequencias ligeiramente diferentes – Dificulta fazer software independente do dispositivo – Unix usa arquivo “termcap”
• É uma base de dados que gera as sequencias de escape para cada fabricante.
Vá p/ posição (3,1)
Da tela
Apague a linha
Suba linhas seguintes em 1 linha
ESCAPE: 0x1B
Papel do termcap Fazer a tradução de comandos genéricos de saída para sequências de escape específicas para o tipo de terminal sendo usado.
95
Software de Saída
Seqüências de escapes ANSI são usadas para controlar navegação e edição em editores de texto
• reconhecidas pelo driver do terminal • ESC é o caractere de escape ASCII (0x1B) • n,m, e s são parâmetros numéricos opcionais
96
Hardware de Vídeo (1)
Para terminais/monitores mapeados na memória • driver escreve diretamente na RAM de vídeo do monitor
97
Hardware de Vídeo (2)
• Uma imagem da RAM de vídeo – tela monocromática simples – modo caractere
• Tela correspondente – os x´s são bytes de atributos
• Para rolagem da tela: controladora mantém um registro de qual palavra na memória VRAM corresponde ao início da tela
104
Terminais conectados por rede X Window System (X11)
X windows (MIT) foi um sistema cliente-servidor, onde terminais podiam ser compartilhados por várias máquinas na rede.
Usuário do terminal X precisava autorizar seus programas remotos (nos clientes) a jogarem a saída para uma janela do terminal.
No X Windows: entrada é empacotada em mensagens, transferida pela rede para o cliente, que processa o dado e retorna resultado (output) também através de um pacote
112
Impasses (Deadlocks) Em várias situações o sistema operacional (ou um programa do
usuário) precisa ter acesso exclusivo a mais de um recurso ou dispositivo. Por exemplo, para cópia direta de dados entre dois dispositivos de E/S
Impasses podem ocorrer para vários tipos de recurso: arquivos, dispositivo de E/S (fita, CD/DVD gravável) ou uma base de dados
• Exemplo em Banco de Dados: – Processo A faz lock em registro R1, e B faz lock em registro R2.
Quando A tenta adquirir R2, é bloqueado, e não libera R1. Assim, B pode ficar bloqueado também
Recurso:: qualquer coisa que pode ser acessada por um único processo a cada vez.
Um sistema tem vários tipos de recurso, e geralmente várias instâncias de cada tipo. Cada instância poderá ser usada por um único processo.
113
Impasses Recurso preemptivo:: que pode ser tirado do processo que o está
usando sem causar problemas Exemplo de recurso: memória principal
– Processo pode ser swapped out Recurso não-preemptivo:: não pode ser tirado do processo que o está
usando sem causar uma falha no processamento ou inconsistência no estado do recurso
Exemplo de recursos: impressora, ou fita • Impasses só ocorrem com recursos não-preemptivos! • Esperas mútuas por recursos preemtivos podem ser resolvidos
realocando o recurso de um processo para outro.
• Recursos não preemptivos são acessados em sessão crítica: (Requisita recurso; Usa recurso; Libera recurso)
A requisição bloqueia enquanto o recurso está em uso por outro
processo.
114
Impasses Definição de Impasse: Se todos os processos de um conjunto estão bloqueados e esperando por
um recurso (uma liberação da SC) atribuído a outro processo do mesmo conjunto pode fazer.
Quatro condições são necessárias para existência de um impasse: 1. Exclusão Mútua: cada recurso só pode ser atribuído a no máximo
um processo; 2. Condição segura&pede: O processo que é detentor de um recurso
pode solicitar outros recursos. 3. Todos os recursos são não-preemtivos: apenas o processo detentor
do recurso pode liberá-lo; 4. Espera circular: deve existir uma cadeia circular de dois ou mais
processos, cada um esperando por recursos sendo mantidos por outro processo;
115
Modelando Impasses Essas 4 condições podem ser modeladas usando um Grafo
direcionado de Recursos (e processos)
Grafos de Recursos podem seu usados para verificar se uma certa sequência de requisições de recursos leva a um impasse:
è Execute as requições passo-a-passo e verifique se em algum momento obtém-se um ciclo.
Impasse ⇔ se houver um ciclo no grafo!
116
Exemplo
Se existe possibilidade de ocorrência de impasse o S.O. precisa criar um escalonamento seguro de processos, i.e. suspender temporariamente um processo.
è No exemplo: executar primeiro A e C, depois B.
A ordem de alocação de recursos (escalonamento) determina ocorrência de impasse! Sejam 3 processos:
117
Estratégias para lidar com impasses 1. Ignore o problema, e torça para que não ocorra!
• Abordagem prática • Compromisso entre: probabilidade de ocorrência vs
impacto negativo sobre uso do sistema vs custo de implementação
• A maioria dos Sistemas Operacionais (incl. Unix/Minix) seguem essa abordagem
2. Detecção e Recuperação • A cada alocação de recurso (ou periodicamente) verifique
o Grafo de Recursos; • se houver um ciclo, termine um dos processos (e desfaça
seus efeitos colaterais nos recursos já alocados) 3. Prevenção de impasses
• evite qualquer uma das 4 condições necessárias para impasses
4. Alocação segura de recursos
118
Prevenção de Impasses Idéia: impor restrições sobre os processos/ recursos para evitar
ocorrência de qualquer uma das 4 condições necessárias: 1. Exclusão Mútua: cada recurso é associado no máximo a um
processo; 2. Condição segura & pede: O processo que é detentor de um
recurso pode solicitar novos recursos. 3. Todos os recursos são não-preemtivos: somente o processo
de posse do recurso pode liberá-lo; 4. Espera circular: deve existir uma cadeia circular de dois ou
mais processos, cada um esperando por recursos sendo mantidos por outro processo;
Vejamos métodos para (evitar) cada condição...
119
Prevenção de Impasses
1. Evitar exclusão mútua: Limite o acesso ao recurso a único processo (gerente), e.g. spooler de
impressora ...mas nem todos os recursos podem ser gerenciados dessa forma Exemplo: se spooler também usa espaço em disco: se começa a imprimir
job1 antes de ter todos os dados em disco, um job de impressão (job2) pode ocupar todo o espaço restante no disco e evitar que job1 conclua impressão
120
Prevenção de Impasses 2. Evitar condição Segura&Pede:
Alternativa 1: Faça com que cada processo requisite todos os recursos antes de começar. Mas isso gera problemas:
• Pode ser impossível conhecer de antemão todos os recursos que processo irá acessar.
• Alocação de recursos não será eficiente: recursos serão bloqueados (lock) mesmo enquanto o processo estiver acessando outros recursos
Alternativa 2: Se um processo quer requisitar um novo recurso, precisa antes liberar temporariamente (e re-adquirir posse) de todos os recursos que detém
• Problemas: Os recursos já alocados têm um estado (relacionado ao acesso) que precisa ser mantido. Então, liberação temporária teria que desfazer esse estado. Os processos seriam frequentemente interrompidos e teriam que refazer suas operacões (èaumenta a sobrecarga)
121
Prevenção de Impasses 3. Evite nâo-preempção:
Todos os recursos teriam que ser preemptivos, mas isso é impossível (p.ex. Impressora, fita backup)
4. Eliminar condição de espera circular – de alguma forma: Alternativa 1: garanta que cada processo mantenha um único recurso a
cada momento (isso limitaria formas de acesso) Alternativa 2: defina uma ordem global dos recursos e garanta que todas
as alocações são feitas sempre seguindo essa ordem. Ciclo é evitado pois se i≠j então: se A mantém Ri não irá requisitar Rj, ou se B mantém Rj não irá requisitar Pi.
Variante: Em vez de impor uma ordem estrita de requisições garanta que
nenhum processo requisite um recurso com no. maior do que um recurso que já possui. Problema:
Pode ser impossível conhecer de antemão todo o conjunto de recursos potencialmente requisitados, impossibilitando uma ordenação prévia
Alocação segura de recursos
As demandas máximas de recursos de todos processos precisam ser conhecidas de antemão Duas abordagens: • Não inicie um processo se as suas demandas
máximas pode gerar um impasse • Não permita uma alocação incremental de recursos
se esta pode levar a um impasse (Algoritmo do Banqueiro)
123
124
Alocação segura de recursos
O Algoritmo do Banqueiro (Dijkstra,65) determina uma alocação segura de recursos de forma que impasses nunca irão ocorrer.
Idéia princial: – Mantenha sempre suficientes recursos (estado seguro) de
maneira que sempre exista um processo que possa alocar todos os recursos que precisa e assim possa terminar
• Estado seguro:: é um estado de alocação de recursos tal que exista uma sequência de estados futuros de alocação dos recursos (e finalização dos processos) que garanta que todos os processos em algum momento obterão todos os recursos necessários e terminarão.
125
Algoritmo do Banqueiro Exemplo para várias instâncias de único tipo de recurso (por
exemplo, $$): Um banco dá crédito a fazendeiros até um limite máximo; clientes
sacam o dinheiro à medida que precisam dele; o banco precisa garantir que sempre haverá suficiente dinheiro disponível em face aos créditos concedidos.
Exemplo: Banco tem um total de 10 unidades (p.ex. R$ 10 milhões)
para todos os seus clientes.
Estado inicial Estado seguro Estado não seguro
126
Algoritmo do Banqueiro Generalizando para recursos de vários tipos
• Usa 2 matrizes (de recursos alocados/e recursos ainda não alocados) e 3 vetores: – E: total de instâncias de cada tipo de recurso – P: total de instâncias alocadas de cada tipo de recurso – A: quantidades disponíveis de cada tipo de recurso
Existe a sequência de processos que conseguem terminar: D ; A; {C, E}; {E,C}, B
127
Algoritmo do Banqueiro Verificação se uma nova requisição de recursos (equivale
a saque de parte do empréstimo) vai levar a um estado seguro:
1. Procure por processo P (linha da matriz de recursos não alocados) cuja demanda restante de recursos é menor do que A. Se não existe tal processo, então sistema pode entrar em impasse;
2. Senão, assuma que P terminou, marque-o como tal, e adicione o número máximo de recursos de P ao vetor A.
3. Repita passos 1 e 2 até que todos os processos foram marcados como terminados, ou então verificou-se que estado não é seguro è requisição não deve ser atendida.
128
Algoritmo do Banqueiro Trata-se de um trabalho teórico interessante ... Mas
raramente aplicado na prática. Principais problemas:
– Impossibilidade de conhecer de antemão as quantidades máximas de recursos necessários para cada processo;
– Teria que analisar todos os processos no sistema – O conjunto de instâncias de recursos é dinâmico
Existem abordagens mais pragmáticas para a Prevenção de Impasses (p.ex. Bloqueio em 2 fases, principalmente para bancos de dados) – Processo tenta bloquear todos os registros que precisa (fase
fase 1) de uma vez. Se um (ou mais) dos registros já está bloqueado, processo aborta e tenta alocar novamente mais tarde
– Se tiver sucesso, faz os acessos e libera todos os registros simultaneamente (fase 2).