Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 SO I – Cap. 5 1 SO I – Cap. 5 5 Input/Output 5.1 Princípios de I/O em Hardware 5.1.1 Dispositivos de I/O Abaixo podemos ver alguns dispositivos e suas velocidades típicas: Dispositivo Taxa de transmissão Teclado 10 bytes/seg Mouse 100 bytes/seg Modem 56K 7 KB/seg Canal de telefone 8 KB/seg Impressora laser 100 KB/seg Scanner 400 KB/seg Ethernet 1.25 MB/seg USB 1.5 MB/seg Disco IDE 5 MB/seg CD-ROM 40x 6 MB/seg Ethernet 100 Mbps 12.5 MB/seg Bus ISA 16.7 MB/seg Disco EIDE (ATA-2) 16.7 MB/seg FireWire 50 MB/seg Disco SCSI Ultra 2 80 MB/seg Gigabit Ethernet 125 MB/seg Bus PCI 528 MB/seg AGP 2,1 GB/seg Sun Gigaplane XB backplane 20 GB/seg Categorias de dispositivos: Bloco: armazena informações em blocos de tamanho fixo. Ex.: discos, fitas. Caracter: entrega ou aceita streams de dados, sem considerar qualquer estrutura. Ex.: terminais, impressoras, redes, mouse, etc. Outros: relógio, terminais com telas mapeadas em memória. 5.1.2 Controladores de dispositivos Componentes de uma unidade de I/O: Mecânico: a unidade em si (pode englobar também elementos eletrônicos); Eletrônico: controlador do dispositivo. Em PCs, o controlador é um cartão de circuito impresso que pode ser inserido nos slots do computador. Os mini e microcomputadores modernos usam um sistema de barramento único para acessar todos os dispositivos. Mainframes usam múltiplos barramentos e computadores especializados em I/O (canais de I/O) para diminuir a carga da CPU principal. Ex.: controlador de disco. Um disco pode ser formatado com 32 setores de 2KB por trilha. Quando se faz uma leitura, o que o disco devolve é um stream serial de bits! Composição do stream: Um preâmbulo; 16384 bits do setor; 2 SO I – Cap. 5 2 SO I – Cap. 5 Checksum e/ou código de correção de erros (ECC). Preâmbulo: escrito quando o disco é formatado; Contém o cilindro, número e tamanho do setor, etc. Função da controladora de disco: Converter o stream de bits em um bloco de bytes; O bloco é mantido num buffer dentro da controladora. Fazer correções de erros; Declarar o bloco livre de erros. Registradores: Cada controladora possui alguns para se comunicar com a CPU; Em alguns computadores, esses registradores fazem parte da memória regular – I/O mapeado em memória! Controladora de I/O Endereços de I/O Vetor de interrupção Teclado 060-063 9 Disco 320-32F 13 Impressora 378-37F 15 Disquete 3F0-3F7 14 RS232 (princ.) 3F8-3FF 12 RS232 (secund.) 2F8-2FF 11 Endereços de I/O: Faixas de endereços são relacionadas com certos dispositivos; A identificação de um comando pelo dispositivo correto é feita pela lógica de decodificação da controladora; Em geral, as faixas são padronizadas; Se um fabricante altera a faixa de endereços de um dispositivo, todos os programas que trabalham com endereços de I/O (SO!) precisam ser modificados para rodar naquele computador. O SO usa os registradores para passar comandos para a controladora; Há registradores para receber parâmetros, também; O SO dispara um comando e vai tratar de outras coisas; Quando a controladora termina um comando, ela interrompe a CPU para avisar que o que foi pedido está feito. 5.1.3 I/O Mapeado em Memória Cada controladora possui alguns registradores de controle: Permitem a comunicação com a CPU; O SO pode escrever neles para: o Passar dados; o Receber dados; o Ligar ou desligar o dispositivo. Lendo esses registradores, o SO pode: o Determinar o estado do dispositivo; o Verificar se ele pode aceitar um novo comando. Além disso, cada controladora possui um ou + buffers, que o SO usa para escrever ou ler os dados das operações pedidas. Há duas abordagens para a CPU se comunicar com os registradores das controladoras. 3 SO I – Cap. 5 3 SO I – Cap. 5 Na 1 a . cada registrador recebe um número de porta; instruções especiais permitem ler ou gravar dados nesses registradores. IN <REG> <PORTA> Lê um dado da porta <PORTA> para o registrador <REG> OUT <PORTA> <REG> Escreve o conteúdo de <REG> na porta <PORTA> A 2 a . abordagem é mapear todos os registradores de controle em memória. Cada registrador é associado a um endereço de memória que não é associado a uma posição de memória real. Um sistema misto, usado pelo Pentium, possui buffers de controladoras nos endereços de 640KB a 1MB, enquanto os registradores são mapeados em memória do endereço 0 a 64KB. Quais seriam as vantagens e desvantagens desses métodos? Para o I/O mapeado em memória, a vantagem é que um programa escrito inteiramente em C pode controlar o I/O sem dificuldades. Basta mapear os registradores em variáveis do programa. Se o sistema usa portas e instruções de I/O, um programa em C precisa ter algumas rotinas em assembler. O I/O mapeado em memória permite melhor proteção, já que o SO pode evitar que um processo faça I/O não mapeando a região dos registradores no seu espaço de endereçamento. Se as controladoras estiverem em páginas diferentes, é possível dar um dispositivo a um usuário sem que ele possa acessar os demais. Com I/O mapeado em memória, instruções que testam memória também podem testar os registradores. Isso simplifica os programas. Se não, é preciso ler as portas para algum registrador antes de testá- lo. Uma desvantagem importante é que, hoje, a maioria dos computadores possui caches de memória. Colocar as páginas dos registradores em cache seria desastroso. Ex. Um programa testa um registrador – aquela página vai para o cache – um novo teste pega o valor lido anteriormente – quando o I/O for feito (e o registrador mudar), o programa não terá como descobrir que isso ocorreu. Uma solução para esse problema é desativar o cache para determinadas páginas. Isso obriga a se ter um hardware + complexo, e o SO também. 4 SO I – Cap. 5 4 SO I – Cap. 5 Mas o grande problema parece estar na seguinte tendência atual. Os computadores modernos possuem barramentos dedicados de alta velocidade para acesso à memória. O problema é que os dispositivos não tem como ver os acessos à memória, já que eles seguem por barramentos diferentes. Há 3 soluções para esse problema, nenhuma delas completamente boa: A CPU envia todos os endereços para a memória; se algum não responder, ela envia por outro barramento. o Exige + complexidade do hardware. Usar um dispositivo intermediário que testa os endereços e repassa-os para dispositivos potencialmente interessados. o O problema é que dispositivos não conseguem tratar requisições na mesma velocidade da memória. Usar um sistema + complexo, como a ponte PCI do Pentium, que possui tabelas carregadas em tempo de boot com faixas de endereços reservados. o Endereços recebidos que pertencem a regiões não mapeadas são desviados para o barramento PCI. 5.1.4 DMA – Direct Memory Access Como a leitura de disco acontece sem DMA? 1. A controladora lê um bloco (1 ou + setores) do disco; 2. Isso é feito bit a bit, até que o bloco inteiro esteja armazenado no buffer interno da controladora; 3. Em seguida, ela computa o checksum para verificar se houve algum read error; 4. A controladora causa uma interrupção; 5. O SO realiza um loop lendo byte a byte (ou palavra a palavra) do buffer, através de um registrador da controladora, e transfere o bloco para a memória. Problema: perde tempo de CPU! O DMA livra a CPU deste trabalho: Ao fazer o pedido de leitura, a CPU fornece 3 parâmetros: Endereço do bloco no disco (setor); Endereço de memória onde o bloco deve ser armazenado; Número de bytes a transferir. Para fazer DMA, a controladora precisa ter alguns elementos: O buffer; Um registrador que aponta o byte atual dentro do buffer; Um registradorcom o endereço de memória para transferir o byte atual; Um contador de bytes a transferir. 5 SO I – Cap. 5 5 SO I – Cap. 5 Loop de transferência: A controladora transfere o byte atual do buffer para a memória; Incrementa os 2 registradores; Subtrai 1 do contador; Quando o contador chega a Zero, o processo para. Ao término da transferência, ocorre uma interrupção para avisar o SO que os dados estão no endereço dado! Por que é preciso um buffer para a controladora? O barramento é único! O fluxo de bits do disco para a controladora não pode ser interrompido; Se a controladora vai armazenar um byte na memória e o barramento está ocupado por outra operação, ela tem que esperar! Isso pode levar a perda de bits do disco se a controladora não estiver pronta para recebê-los! O buffer interno torna o projeto da controladora mais simples. Ela não precisa ser real time! Conseqüências: Enquanto a transferência está sendo feita, o próximo setor pode passar pela cabeça de leitura! Algumas controladoras não conseguem fazer entrada e saída simultaneamente: Seriam necessários pelo menos 2 buffers; Além disso, seria preciso um sistema de duplo controle (possivelmente paralelo)! Neste caso, enquanto a controladora está transferindo dados para a memória, o próximo setor é perdido. Interleaving: Processo de armazenar os setores em disco de forma alternada; Em vez de os blocos serem mantidos em seqüência (0 - 1 - 2 - 3 - 4 - 5 - 6 - 7), eles são mantidos de forma alternada (0 - 4 - 1 - 5 - 2 - 6 - 3 - 7 - interleaving simples); Dependendo da necessidade, é possível manter um interleaving de mais níveis (0 - 3 - 6 - 1 - 4 - 7 - 2 - 5 - duplo). O acesso ao barramento pode ser de 2 tipos: Uma palavra por vez: o A controladora de DMA pede uma palavra por vez; o Se nesse tempo a CPU quiser usar o barramento, ela espera; o Também chamado de cycle stealing. 6 SO I – Cap. 5 6 SO I – Cap. 5 Por bloco: o O DMA diz ao dispositivo para adquirir o controle do barramento; o Várias transferências são feitas; o O barramento é liberado; o Mais eficiente, mas pode bloquear a CPU e outros dispositivos por tempo considerável. Nem todos os computadores usam DMA. As CPUs atuais são mais rápidas que o DMA. Esta opção permite projetar hardware mais simples, o que é interessante em sistemas embutidos. 5.1.5 Interrupções Num computador típico, o sistema de interrupções funciona conforme a figura a seguir: Atualmente, usa-se linhas de interrupção no barramento, em vez de linhas específicas entre cada dispositivo e a controladora. A controladora de interrupção atende uma interrupção imediatamente, desde que não esteja ocupada. Se ela estiver tratando uma interrupção anterior, a atual é ignorada. Mas o dispositivo continua com o pedido ativo até ser atendido. Se duas interrupções chegam à controladora simultaneamente, aquela de maior prioridade será atendida primeiro. A prioridade é definida em geral por tipo de dispositivo ou por ordem no barramento. A controladora coloca um número nas linhas de endereço que indica qual dispositivo requer atenção e gera um sinal que interrompe a CPU. O sinal faz com que CPU pare o que está fazendo e passe a fazer outra coisa: O número nas linhas de endereço é usado como um índice numa tabela chamada de vetor de interrupção; Desta tabela se tira um endereço novo para o contador de instruções; Esse endereço é o início da rotina de tratamento para aquele dispositivo; A localização do vetor de interrupções pode ser fixa por hardware, ou definida por algum registrador especial. Neste caso, o SO carrega a tabela com os endereços que quiser. Uma das primeiras coisas que a rotina de tratamento faz é confirmar que recebeu a interrupção. Isso é feito colocando um valor em um dos registradores da controladora de interrupções. 7 SO I – Cap. 5 7 SO I – Cap. 5 O atraso desta confirmação pode evitar condições de corrida caso ocorram interrupções simultâneas. O hardware deve salvar certas informações antes de iniciar a rotina de tratamento. O que salvar depende da CPU. O mínimo seria o CI, mas algum sistema pode exigir que todos os registradores sejam salvos, etc. Uma pergunta importante: onde salvar esses dados? Uma opção é colocar em registradores internos. O SO pode ler esses dados depois Um problema é que a interrupção não pode ser confirmada até que esses dados todos sejam salvos (uma nova interrupção pode sobrescrever os dados da anterior). Isso causa períodos longos de tempo com interrupções desabilitadas, que podem causar perda de dados. Assim, a maioria das CPUs salva os dados em pilha. A questão é: qual pilha? Se for a corrente, pode ser de um processo do usuário. O ponteiro de pilha pode não ser legal (causaria um erro fatal). A rotina de tratamento pode ganhar uma falha de página (seria muito desagradável). Se for o do kernel, obrigaria uma mudança de estado da CPU. Isso obriga uma troca de contexto na MMU, invalida caches, TLB, etc. As CPUs modernas são superescalares e usam muitos pipelines. Uma interrupção obriga a perder pipelines, invalidar caches, etc. Outro problema: a instrução corrente não pode ser definida com precisão. Há circuitos de processamento paralelo, instruções sendo executadas adiantadas, etc. Salvar que contexto, neste caso? Uma interrupção que deixa a máquina num estado bem definido é chamada de interrupção precisa. Para tanto, é preciso atender 4 propriedades: O CI é salvo em lugar conhecido; Todas as instruções anteriores àquela apontada pelo CI foram executadas completamente; Nenhuma instrução depois daquela apontada pelo CI foi executada; O estado de execução da instrução apontada pelo CI é conhecido. Essas regras têm algumas implicações: Instruções depois daquela apontada pelo CI podem ser iniciadas; Caso elas tenham feito mudanças em registradores e/ou memória, elas devem ser desfeitas antes que a interrupção aconteça; A instrução do CI pode ou não ter sido executada; Esse estado deve ser preciso; Em geral, se a interrupção é de I/O a instrução ainda não foi executada; Se temos um trap ou page fault, então o CI aponta para a instrução que causou o problema; 8 SO I – Cap. 5 8 SO I – Cap. 5 Uma interrupção que não atende esses requisitos é chamada de interrupção imprecisa: São bastante desagradáveis para um projetista de SO; Essas máquinas, em geral, guardam um grande volume de dados sobre o estado interno do sistema na pilha; O SO deve varrer esses dados e determinar o que acontece; Salvar e tratar esses dados em cada interrupção toma muito tempo; Isso leva a um contrassenso interessante: CPUs superescalares muito rápidas às vezes não são apropriadas para aplicações de tempo real devido a sistema de interrupções lento. No Pentium Pro, a Intel usou pela 1 a . vez sistemas superescalares: Foi adotado o sistema de interrupções precisas por compatibilidade com os processadores anteriores, que não eram superescalares; A lógica de interrupção é bem complexa, para garantir que as interrupções não contrariem uma das propriedades; O preço pago é em área do chip (não em tempo); Se não houvesse o problema de compatibilidade, essa área poderia ser usada por caches maiores, dando mais velocidade ao sistema; Por outro lado, interrupções imprecisas fazem o SO mais complicado e lento. Difícil dizer qual abordagem é melhor. Uma possibilidade é fazer uso de sistemas mistos: Interrupções de I/O seriam precisas, pois são mais rápidas de tratar; Traps tipo erros fatais de execução seriam imprecisos, pois não seria necessário reiniciar a execução do processo. 5.2 Princípios de I/O em Software 5.2.1 Metas do Software deI/O Independência de dispositivo: Programas podem usar arquivos em discos ou disquetes da mesma maneira! Nomes uniformes: Os nomes de arquivos devem ser strings ou inteiros; Esses nomes não podem depender de onde os arquivos estão armazenados. Tratamento de erros: Erros devem ser tratados o mais perto possível do hardware; Se a controladora descobre um erro de leitura, ela deve tentar corrigi-lo sozinha; Em geral, ela tenta ler novamente; Muitos erros são transientes - ex. problemas elétricos no momento da leitura - desaparecem se a operação é repetida. Síncrono x assíncrono: A maioria do I/O é assíncrona (a CPU dispara e vai fazer outra coisa); Programas são mais fáceis de escrever se o I/O for bloqueante; Depende do SO tornar operações assíncronas em síncronas. 9 SO I – Cap. 5 9 SO I – Cap. 5 Buffers: É comum ter que armazenar um dado antes que ele seja entregue no destino (pacotes de rede); Alguns dispositivos têm restrições de tempo que obrigam a guardar dados em buffers para atender as taxas de transmissão (som e vídeo); O uso de buffers implica em tempo para copiar dados de um lado para outro. Dispositivos compartilhados x exclusivos: Alguns dispositivos (ex. disco) podem ser usados por mais de um usuário ao mesmo tempo; Outros (ex. fitas) devem ser dedicados; Dispositivos dedicados trazem problemas, tipo deadlocks. 5.2.2 I/O Programado Forma mais simples de se fazer I/O, onde a CPU é responsável por tudo. Suponha um programa que deseja imprimir alguma coisa. O processo do usuário adquire a impressora (desde que esteja disponível) e faz uma chamada para imprimir o que deseja. O SO copia o texto para um buffer no espaço do kernel. Ele faz isso porque talvez o mapa de memória precise ser alterado. O SO verifica se a impressora está disponível (há um registrador que permite ver o estado dela). Se estiver, copia um caracter do buffer para o registrador de dados da impressora. Esta ação ativa a impressora. O SO verifica se a impressora está pronta para receber o próximo carcater e assim por diante. O que o SO faz pode ser visto abaixo: A 3 a . linha é uma operação de busy waiting (neste caso, também chamada de polling). Quando a impressão estiver terminada, o sistema devolve o controle para o processo do usuário. Este método é interessante se o tempo de impressão de um caracter for pequeno. 10 SO I – Cap. 5 10 SO I – Cap. 5 Também é útil em sistemas embutidos, onde a CPU não tem mais nada para fazer. Sistemas mais complexos, onde há muitas atividades pendentes, precisam de outras soluções. 5.2.3 I/O Baseado em Interrupções Suponha uma impressora que não bufferiza os caracteres recebidos e imprime a 100 caracteres/seg. A impressão de um caracter leva 10 mseg. Neste tempo, é possível fazer uma troca de contexto e processar outra coisa. Neste caso, em (a) o tratamento da chamada de sistema dispara o primeiro caracter e chama o scheduler. Com interrupções habilitadas, quando a impressora imprimir um caracter ela gera uma interrupção. O serviço de interrupções verifica se os caracteres acabaram e desbloqueia o processo que pediu a impressão. Se não, envia outro caracter, confirma a interrupção para a impressora e devolve o controle ao processo interrompido. 5.2.4 I/O Usando DMA A desvantagem do método anterior é que as interrupções ocorrem a cada caracter. O tratamento de uma interrupção toma um certo tempo, então isso leva a queda de desempenho da CPU. Uma alternativa é o uso de DMA. Neste caso, o controlador de DMA é programado e a CPU vai fazer outra coisa. Apenas no fim, o tratamento de interrupção é avisado e o I/O está pronto. 11 SO I – Cap. 5 11 SO I – Cap. 5 5.3 Camadas de Software de I/O 5.3.1 Interrupt handlers Processos que pedem I/O bloqueiam! Formas de bloqueio: Um down() em um semáforo; Um wait() numa variável de condição; Receive() de uma mensagem. Quando a interrupção ocorre (comunicando que o I/O está pronto), o procedimento que manipula a interrupção desbloqueia o processo que solicitou (up(), signal(), send(), etc.). Uma amostra do tratamento necessário pode ser visto abaixo: Salvar os registradores que não tenham sido salvos; Criar um contexto para a rotina de tratamento de interrupções (TLB, MMU, tabelas de páginas, etc.); Alocar uma pilha; Dar confirmação para o controlador de interrupções; Copiar os registradores salvos para a tabela de processos; Chamar o serviço de tratamento de interrupções – ele extrai informações do controlador de interrupções; Escolher que processo deve executar a seguir; Montar o contexto do processo escolhido (MMU, TLB, etc.); Carregar os registradores do processo escolhido; Iniciar a execução do novo processo. 5.3.2 Device Drivers Contém o código dependente do dispositivo; É o elemento que dispara os comandos para a controladora preenchendo seus registradores; Verifica o status da controladora após os comandos; Ex.: device driver de um disco: Sabe quantos registradores a controladora tem e para que servem; Conhece todos os elementos do disco: setores, trilhas, cilindros, cabeças, movimento do braço, interleave, motor, etc. Função do device driver: Aceita requisições abstratas da camada independente de dispositivo; Dispara os comandos; Trata de múltiplas requisições; Verifica as condições do dispositivo para realizar os comandos; Preenche os registradores da controladora; Bloqueia quando o comando for demorado; Acorda por interrupção; Verifica (e corrige) erros; 12 SO I – Cap. 5 12 SO I – Cap. 5 Passa dados para o software independente de dispositivo; Retorna informação de status ou de erro. Drivers podem ser reentrantes, no sentido de que um driver pode ser interrompido enquanto está fazendo um tratamento, e pode ser chamado novamente para tratar um evento relativo ao mesmo dispositivo. Ex. Placas de rede – enquanto está tratando um pacote, pode chegar outro. Drivers não tem permissão para fazer system calls. Mas podem chamar outros pontos do kernel diretamente, se necessário. Ex. Para liberar páginas para usar como buffers. 5.3.3 Software de I/O Independente de Dispositivo Funções: Interface uniforme com os device drivers: O uso de interfaces diferentes para cada dispositivo tornaria o SO muito complexo; Ele teria que ser modificado para cada novo dispositivo; A interface significa o conjunto de funções disponíveis para contactar o driver. Nomes: É preciso um cuidado especial em mapear um nome simbólico para o driver apropriado; No Unix, um nome qualquer ( /dev/disk0 ) na verdade especifica um i-node para um arquivo especial; Esse i-node contém o major device number, usado para encontrar o driver correto; Também possui o minor device number, passado como parâmetro para o driver (especifica a unidade). Proteção: No Unix, os dispositivos aparecem no sistema de arquivos como objetos com nomes comuns; As regras de proteção de arquivos se aplicam aos dispositivos; O administrador do sistema pode estabelecer as permissões adequadas para cada dispositivo. Tamanho de bloco independente de dispositivo: Discos diferentes podem ter diferentes tamanhos de bloco físico; O software independente de dispositivo pode criar um tamanho de bloco lógico para o sistema e resolver as diferenças entre as unidades específicas. Buffers: O uso de buffers é extremamente importante em qualquer dispositivo; Na figura abaixo, pode-se ver o uso de um modem com e sem buffers; Em (a) o processo do usuário recebe diretamente cada caracter – inviável; Em (b) o processo fornece um buffer noespaço do usuário para receber N caracteres – o processo é acordado quando o buffer está cheio; 13 SO I – Cap. 5 13 SO I – Cap. 5 Em (c) o kernel fornece um buffer – quando ele está cheio, o modem é interrompido e o conteúdo é copiado para o usuário; Em (d) o kernel fornece 2 buffers – quando um está cheio, o modem pega o outro, enquanto o kernel transfere os dados recebidos até o momento. O problema com a bufferização em excesso é o desempenho. P. Ex. Abaixo pode-se ver o uso de vários buffers em momentos diferentes da transferência de um pacote de rede. Alocação de espaço em dispositivos de blocos: Alocar e liberar dispositivos dedicados; Alguns dispositivos só podem ser usados por um processo por vez (ex. Gravador de CD); O SO examina as requisições e libera ou não, dependendo se o dispositivo está disponível; No Unix, a requisição é um open num arquivo especial que descreve o dispositivo; Se este arquivo não estiver presente, o dispositivo está em uso; Uma alternativa é ter um mecanismo especial de controle desse tipo de dispositivos; Se um deles está em uso, o processo é bloqueado. Retorno de erros. 14 SO I – Cap. 5 14 SO I – Cap. 5 Realiza funções de I/O comuns a todos os dispositivos; Interface uniforme com o software ao nível do usuário. 5.3.4 Software de I/O no Espaço do Usuário Bibliotecas que são link-editadas nos programas do usuário. Ex.: contador = write(fd, buffer, nbytes); Formatação. Ex.: printf(). Spool: Manuseia dispositivos dedicados em ambientes multiprogramados; Processo que faz spool daemon; Diretório de spool onde são armazenadas as requisições para o daemon. A figura acima é um sumário do sistema de I/O. 5.4 Discos 5.4.1 Hardware de Disco Organização de um disco: Cilindros; Cada cilindro contém tantas trilhas quanto cabeças empilhadas verticalmente (em geral, de 1 a 16); Trilhas são divididas em setores (8 a 32 em disquetes, várias centenas em hard disks); Todos os setores contém o mesmo número de bytes; Setores do centro são menores que os da borda; Ainda assim, eles têm o mesmo número de bytes; O espaço extra dos setores externos não é usado. Alguns discos são muito simples e entregam apenas um fluxo de bits. Nesse caso, a controladora faz todo o trabalho. Outros (ex. IDE) contém microcontroladores que realizam tarefas sofisticadas, permitindo à controladora fornecer comandos de alto nível. Uma controladora de disco pode manusear mais de uma unidade, podendo disparar um seek em cada uma - overlapped seeks. Algumas controladoras podem ler ou gravar em um disco enquanto fazem seeks em outros. Ler ou gravar em mais de um disco exige a capacidade de manusear mais de um fluxo de bits ao mesmo tempo: Esses bits chegam à taxa de microsegundos, ocupando toda a capacidade da controladora. 15 SO I – Cap. 5 15 SO I – Cap. 5 Mesmo trabalhando com mais de um disco, a controladora só pode manipular uma transferência por vez para a memória (em geral, o barramento é um só). Atabela abaixo compara uma unidade de disquete com um disco rígido da Western Digital. Discos modernos têm uma geometria diferente dos discos antigos. Antes, o número de setores por trilha era o mesmo para todos os cilindros. Os novos discos são divididos em regiões, onde as mais internas têm menos setores que as mais externas (a). Para esconder isso do software, os discos possuem uma geometris virtual que é apresentada ao SO (b). O software faz requisições na base de x cilindros, y cabeças e z setores por trilha. O hardware do disco traduz para o cilindro, cabeça e setores reais. No Pentium, por compatibilidade com as limitações do PC original, os limites são 65535 cilindros, 16 cabeças e 63 setores por trilha (campos de 16, 4 e 6 bits – cilindros e setores começam de 1, cabeças de 0). Com 512 bytes por setor, o tamanho máximo de um disco é de 31,5 GB. Para ultrapassar esse limite, muitos discos suportam um sistema chamado logical block addressing, onde os setores são numerados a partir do Zero apenas, independente da geometria. RAID O desempenho das CPUs têm crescido muito desde a última década, mas o dos discos nem tanto. Nos anos 70, a média de tempo de seek estava entre 50 e 100 msegs. Agora, começo de 2000, está abaixo de 10 msegs. 16 SO I – Cap. 5 16 SO I – Cap. 5 Na indústria de automóveis, um incremento de 5 ou 10 vezes em desempenho em 2 décadas seria um grande feito. Na computação, é embaraçoso! Portanto, a diferença entre as CPUs e os discos tem aumentado. Para aumentar o desempenho das CPUs, os projetistas têm usado processamento paralelo. Tem-se cogitado o uso de I/O paralelo. Em 1988, Patterson et al. (criador do sistema RISC) propôs um sistema de organização de discos que pode ser usado para melhorar o desempenho e/ou a confiabilidade. RAID (Redundant Array of Inexpensive Disks) foi rapidamente adotado pela indústria: Mudaram o I para Independent; Abriu-se a possibilidade de usar discos caros num sistema RAID! Um RAID é uma caixa cheia de discos ligada a um computador servidor. A controladora é substituída por uma controladora RAID. O conjunto é considerado pelo computador como se fosse um disco único, só que com melhor desempenho e maior confiabilidade. Todos os RAIDs possuem os dados distribuídos pelos drives, permitindo operações em paralelo. Patterson definiu 6 organizações, nomeadas como RAID 0 a 5. Na figura a seguir, pode-se ver os 6 tipos. 17 SO I – Cap. 5 17 SO I – Cap. 5 No RAID 0, um disco virtual único é dividido em N discos de M setores cada um. Os setores são distribuídos por todos os discos de forma roud-robin. O RAID 0 trabalha melhor com grandes requisições. Ele não apresenta redundância, então neste item o RAID 0 pode ser pior que um drive único e grande. Ex. MTBF de 20000 horas por disco, um RAID 0 de 4 discos terá uma falha a cada 5000 horas em média, enquanto um disco único falhará após 20000 horas. O RAID 1 é um sistema de discos duplicados, com um conjunto primário e outro secundário. Na gravação, um bloco é gravado duas vezes. Na leitura, alterna-se entre as cópias distribuindo a carga. O desempenho nas gravações não é bom, mas para leitura é excelente. Sem contar com a tolerância a falhas pela redundância. O RAID 2 trabalha num sistema baseado em palavra (ou mesmo byte). Na figura, cada byte é dividido em 2 partes de 4 bits cada. Um Hamming Code é adicionado, com 3 bits para cada 4 bits. Os 7 bits resultantes são gravados, um bit por drive. Ex. O computador CM-2 da Thinking Machines usa um esquema de 32 bits por palavra, 6 bits de Hamming Code + um bit por paridade. Isso permite alto desempenho, com 32 setores gravados no tempo de um. O Hamming Code permite correção ou recuperação de um bit, o que significa que um drive pode ser perdido sem problemas. O RAID 3 é uma simplificação do RAID 2, com um único bit de paridade acrescentado por cada conjunto de bits de dados. Para correção de erros, é um sistema fraco. Mas para recuperação de crashes é interessante, porque a posição do bit com problema é conhecida. Ao carregar o disco novo, todos os bits são marcados como Zero. Se houver um erro de paridade, basta mudar aquele bit para 1. RAID 4 é um sistema de discos, com paridade por lista de drives. A paridade é mantida em um único drive. Isso pode levar a baixo desempenho se a atualização for feita em um único disco, já que é necessário ler os demais para recalcular a paridade. Esse problema não ocorre no RAID 5, onde a paridade é distribuída por todos os drives. CD-ROMS Os discos óticos foram desenvolvidos originalmente para a gravação de programas de TV. Com sua grandecapacidade, são usados para manter dados de computador de forma mais estética. A 1 a . geração de discos óticos for criada pela Philips para manter filmes. Eram discos de 30 cm. Não tiveram grande aceitação, exceto no Japão. Em 1980, a Philips e a Sony desenvolveram o CD, que rapidamente substituiu os LPs de vinil. Um CD possui 120 mm, com 1,2 mm de altura e um furo de 15 mm. A proposta inicial era que o sistema durasse 100 anos. O CD é gravado numa espiral contínua que faz 22188 voltas ao redor do disco (cerca de 600 por mm). Esticado, teria 5,6 km. 18 SO I – Cap. 5 18 SO I – Cap. 5 Para compensar a velocidade externa e interna, o disco gira a 200 rpm na região externa e a 530 rpm na interna. Os setores têm todos o mesmo tamanho, independente de onde residem. Em 1984, a Philips e Sony lançaram o padrão de armazenamento para computadores usando CDs. O formato do setor de um CD- ROM pode ser visto abaixo. CDs têm 2 modos: Modo 1: figura acima; Modo 2: combina os campos Data e ECC em um campo de 2336 bytes, para aplicações que não se preocupam com correção de erros (som e vídeo). Há 3 níveis de correção de erros: Dentro de um símbolo; Dentro de um frame; Dentro de um setor. Erros de um bit são corrigidos no 1 o . nível; rajadas de erros são corrigidos no 2 o . nível. O restante é corrigido no 3 o . nível. O custo é alto: um grupo de 2048 bytes é armazenado em 98 frames de 588 bits (7203 bytes), com 28% de eficiência. Um drive de CD de velocidade simples opera a 75 setores/seg, ou 153600 bytes/seg (modo 1), ou 175200 bytes/seg (modo 2). 19 SO I – Cap. 5 19 SO I – Cap. 5 Assim, um drive 40x pode entregar dados à velocidade de 40 x 153600 (6144000) bytes/seg, desde que controladora, barramento e SO possam manipular esta velocidade. Um CD padrão de áudio pode conter 74 min. de música. No modo 1, isso significa uma capacidade de 681.984.000 bytes. Isso é indicado como 650 MB, porque 1 MB é 2 20 bytes (1.048.576). Este valor de 74 min. foi definido por Akio Morita (1921-1999), presidente da Sony, que determinou que o CD de música deveria conter a 9 a Sinfonia de Beethoven completa, de forma que fosse possível ouvir toda aquela obra sem interrupção. Para guardar arquivos de computador em CDs, foi feito um acordo sobre um sistema de arquivos padrão. Esse sistema possui 3 níveis: Nível 1: nomes tipo MS-DOS (8 + 3) – diretórios até 8 níveis, sem extensões. Arquivos contíguos. Nível 2: nomes até 32 caracteres. Nível 3: arquivos não contíguos. A princípio, apenas o nível 1 é reconhecido como padrão. CD-R O CD-R é um CD que só pode ser gravado uma vez. Ele possui uma camada de material ótico que o laser destrói na 1 a . gravação. Os dados gravados tornam-se permanentes e o CD não pode ser gravado novamente. O CD-R tem que ser gravado de uma vez só, ou é perdido. Ele é composto de 3 camadas: Uma camada protetora; Uma camada reflexiva; Uma camada de material transparente (dye layer) mas que pode fixar dados se o laser for aplicado com toda potência (8-16 mW). A leitura é feita à potência de 0,5 mW. O CD-R criou o problema de cópia de material com copyright. Para evitar cópias de material não autorizado, alguns esquemas apareceram: Marcar os arquivos com tamanho inválido; o O tamanho correto é mantido em outra região do CD, possivelmente cifrado. ECCs incorretos em setores selecionados; o O software de leitura corrige os erros, tornando o setor inválido; 20 SO I – Cap. 5 20 SO I – Cap. 5 o A aplicação verifica os ECCs carregados, recusando a execução se os valores estiverem corretos. CD-RW CDs regraváveis usam um material diferente para fixação dos dados do que o CD-R. Esse material possui 2 estados: cristalino e amorfo, cada um com diferentes características de reflexão. Os lasers dos drives de CD-RW possuem 3 potências diferentes: Na + alta, o laser converte o estado cristalino do material no estado amorfo, armazenando dados; Na média, o estado amorfo volta a ser cristalino; Na baixa, é possível verificar o estado do material sem alterá-lo. DVD No início, DVD era a sigla para Digital Video Disk, mas agora é oficialmente Digital Versatile Disk. O DVD veio para atender necessidades de 3 indústrias diferentes e poderosas: filmes, eletrônica de consumo e computadores. O formato físico de um DVD é idêntico ao de um CD, mas as seguintes diferenças são importantes: Pontos menores (0,4 microns contra 0,8 microns nos CDs); Espiral mais densa (0,74 microns entre as trilhas contra 1,6 microns nos CDs); Laser vermelho (0,65 microns contra 0,78 microns nos CDs). Juntas essas melhorias permitem uma capacidade de 4,7 GB. Um drive 1x opera a 1,4 MB/seg. O uso de um laser diferente obriga a ter um segundo laser na unidade para ler CDs antigos, CD-Rs e CD-RWs. Com 4,7 GB e usando MPEG-2, um DVD pode armazenar 133 minutos de vídeo full-screen, full-motion a alta resolução (720 x 480), bem como trilha sonora em até 8 idiomas e legendas em 32 idiomas. Foram definidos 4 formatos possíveis: Um lado e uma camada (4,7 GB); Dois lados e duas camadas (8,5 GB); Dois lados e uma camada (9,4 GB); Dois lados e duas camadas (17 GB). Essa quantidade de formatos foi decidida para agradar a todos os interessados: Philips e Sony, Toshiba e Time Warner, etc. Discos de 2 lados teriam uma altura maior que os de 1 lado só. Para que todos os discos sejam iguais, os de um lado só tem uma camada de substrato extra. 21 SO I – Cap. 5 21 SO I – Cap. 5 O DVD foi criado por um concórcio de empresas de eletrônica (7 japonesas) em cooperação com estúdios de Holiwood (alguns pertencentes às empresas japonesas do consórcio). O foco do projeto foi o aluguel de discos e vendas de shows. Uma futura característica inclui a possibilidade de classificar cenas, permitindo ao aparelho pular cenas não apropriadas para a assistência. DVDs dos EUA não são compatíveis com os da Europa, por razões mercadológicas. Holywood não queria que a Europa pudesse comprar filmes americanos após o lançamento nos EUA, mas antes do lançamento na Europa. 5.4.2 Formatação de discos Antes que um disco possa ser usado, ele deve receber uma formatação de baixo nível por software. O formato de um setor pode ser visto abaixo: O preâmbulo começa com um padrão de bits fácil de reconhecer para identificar o início de um setor. Contém também o cilindro e número de setor. O tamanho dos dados depende da formatação, mas em geral é de 512 bytes. O ECC é um código de erros que permite recuperar alguns bits. Um tamanho comum é de 16 bytes. A posição do setor 0 de cada trilha é deslocada por um offset da trilha anterior. Isso é chamado de cylinder skew. A idéia desse mecanismo é bastante simples. Suponha que um programa vai ler setores em sequência de um disco. Se uma trilha tem 32 setores, ler 34 exige ler uma trilha inteira e passar para a próxima. Essa passagem, na verdade, é um seek. P. ex. Um drive de 10000 RPM faz uma rotação em 6 msegs. Se uma trilha contém 300 setores, um novo setor passa pela cabeça a cada 20 microsegs. Se o seek para a próxima trilha leva 800 microsegs., então 40 setores passarão durante o seek. Assim, o skew deveria ser de 40 setores. Em geral, um disco perde 20% de sua capacidade na formatação, por conta de todos os controles adicionados para cada conjunto de dados. Há uma grande confusão na medição de capacidade de um disco: Alguns fabricantes divulgam a capacidade antes da formatação; Alguns SOs trabalham com a unidade GB como 230 bytes; Outros SOs consideram que 1 GB é 109 bytes. Em redes, 1 Gbps significa 10 9 bits/seg, da mesma forma que 1 quilômetro significa 1000 metros (e não 1024). A formataçãodetermina o desempenho também: Um disco de 10000 RPM com 300 setores por trilha de 512 bytes cada; Leva 6 msegs. para ler 153.600 bytes de uma trilha, ou 24,4 MB/seg; 22 SO I – Cap. 5 22 SO I – Cap. 5 Essa taxa é a taxa máxima possível, não importa o tipo de recurso que se use! A controladora tem um buffer para receber os dados lidos do disco. Se ela ler 2 setores consecutivos, após ler o 1 o . ela deve transferir os dados para a memória. Com isso, o 2 o . setor é perdido. Uma solução para esse problema é o uso de interleaving. Entre um setor e o próximo, existe um setor intermediário (no caso de interleaving simples). Se o tempo de trânsito de um setor não for suficiente, pode-se usar interleaving duplo (dois setores entre um e seu próximo). Depois da formatação, vem o particionamento do disco. No Pentium e na maioria dos computadores, o setor 0 contém o Master Boot Record (MBR). Ele contém o código de boot e a tabela de partições, com o setor inicial e tamanho de cada partição. No Pentium, esta tabela tem espaço para 4 partições: Se todas forem Windows, serão nomeadas como C:, D:, E: e F:; Se 3 forem Windows e uma for Unix, as 3 serão nomeadas como C:, D: e E:. O primeiro CD será F:. Para se dar boot de uma partição, ela precisa ser marcada como ativa. O passo final é a formatação alto-nível de cada partição. Esta operação cria um bloco de boot, uma lista de blocos livres (lista ou bitmap), diretório raiz e um sistema de arquivos vazio. Para cada partição, o SO indica qual o sistema de arquivos em uso. O procedimento de boot, em geral, é o seguinte: Ao se ligar a força, o BIOS é executado; Ele lê o MBR, carrega a rotina de boot e passa o controle para ela; Essa rotina verifica qual partição está ativa, lê o setor de boot desta partição e executa-o; Esse setor contém um programa que verifica o diretório raiz por um programa específico e executa-o; Esse programa pode ser o próprio SO ou um carregador maior. 5.4.3 Algoritmos de Escalonamento do Braço do Disco Elementos que influem no tempo de leitura/gravação: Seek: tempo para mover o braço para o cilindro correto; Atraso de rotação: espera pelo setor apropriado passar na cabeça; Tempo de transferência. Na maioria dos discos, o seek time é o maior! 23 SO I – Cap. 5 23 SO I – Cap. 5 FCFS (First Come, First Served): Requisições são atendidas na ordem em que são feitas. Ex.: disco de 40 cilindros, requisições para 11, 1, 36, 16, 34, 9, 12. 0 5 10 15 20 25 30 35 39 Distância: 10+35+20+18+25+3=111 SSF (Shortest Seek First): 0 5 10 15 20 25 30 35 39 Distância: 1+3+7+15+33+2=61 Problema do SSF: com altas cargas e requisições por todo o disco, tende a se manter onde está. Elevador: 0 5 10 15 20 25 30 35 39 Distância: 5+18+2+24+3+8=60 Neste algoritmo, o braço mantém sua direção de movimento enquanto houver alguma requisição naquela direção. Algumas controladoras fornecem um recurso interessante quando há mais de uma requisição para o mesmo cilindro: Quando a cabeça está no cilindro certo, é feita uma leitura para determinar qual o setor que está passando pela cabeça; As requisições são ordenadas para atendimento de acordo com a ordem que os setores passarão pela cabeça. Futuro: O tempo de seek está ficando cada vez menor; Já há discos em que o tempo de rotação é menor do que o de seek; Neste caso, o elevador torna-se obsoleto para levar em consideração primeiro o tempo de rotação. 5.4.4 Tratamento de Erros Tipos de erros mais comuns em discos: 24 SO I – Cap. 5 24 SO I – Cap. 5 Programação: requisitar um setor inexistente; Erros transientes de checksum: causados por flutuação de energia na cabeça; Erros permanentes de checksum: blocos fisicamente danificados; Seek: braço enviado para um cilindro mas chega em outro; Erro de controladora: ela se recusa a aceitar um comando. Problemas no processo de produção podem produzir setores ruins, que não permitem ler de volta os valores escritos. Esses erros podem ser de poucos bits: Nesse caso, se o código de ECC for suficiente o setor pode ser aproveitado ainda; Sempre que este setor for lido, o código de ECC terá que ser usado para corrigir aqueles bits. Se os erros forem maiores, não poderão ser disfarçados. Há duas abordagens para setores ruis: Tratar deles na controladora; o Após o teste de qualidade na fábrica, o disco recebe uma relação dos setores com defeito; o O disco possui setores sobressalentes, que não são usados no trabalho normal; o Os setores com defeito são substituídos pelos sobressalentes. Tratar deles no SO; o Nesse caso, o SO identifica que o setor está com defeito e retira-o das tabelas de alocação; o Não sendo mais usado, não causa problemas. Um problema importante com relação a setores defeituosos é a realização de backups: Se o backup é feito arquivo por arquivo não há problema; Se for feito setor por setor fica difícil evitar que o programa acesse os setores com defeito; Nesse caso, espera-se que ele seja esperto o suficiente para ver que após 10 tentativas com erro o setor deve ser ignorado. 5.5 Relógios 5.5.1 Hardware de relógios Tipos: Simples: ligado na corrente elétrica de 110 ou 220 volts, causa uma interrupção a cada ciclo (50 ou 60 Hz); Oscilador: possui 3 componentes: Um cristal oscilador; Um contador; Um registrador de carga. 25 SO I – Cap. 5 25 SO I – Cap. 5 Sob tensão, o cristal produz um sinal periódico preciso na faixa de 5 a 100 MHz; A cada período, uma unidade é subtraída do contador; Quando ele chega a zero, é gerada uma interrupção. Depois, há vários tipos de relógios: Uma possibilidade é realizar a contagem UMA vez; Outra é usar o registrador de carga para recarregar o contador e o processo é executado novamente; As interrupções periódicas geradas são chamadas de clock tick! 5.5.2 Software de Relógio Funções do software de relógio: Manter a hora certa; Evitar que os processos executem mais que o permitido; Contabilidade do uso de recursos; Chamada ALARM feita por processos usuários; Cronômetro para o SO; Monitoração e estatística. Abaixo pode-se ver 3 formas de se manter a hora certa. Abaixo, pode-se ver a simulação de múltiplos cronômetros com um único relógio físico. 5.6 Terminais 5.6.1 Hardware de Terminal Tipos de terminais: Interface RS-232: Hardcopy: o que é digitado é transmitido para o computador; caracteres recebidos são impressos; 26 SO I – Cap. 5 26 SO I – Cap. 5 Tela TTY: como o Hardcopy, mas mostra os caracteres numa tela; Inteligente: computadores reduzidos (aceita comandos com seqüências de escape – endereça cursor, etc.); Blit: computadores completos. Mapeado em memória: Orientado a caracter; Orientado a bit. RS-232: Sistema de comunicação de hardware; Usa um conector de 25 pinos (terra, transmissão, recepção, e outros que compõem o protocolo); Transmite 1 caracter por vez, bit a bit, precedido de um start bit e finalizado por 1 ou 2 stop bits; Taxas de transmissão: 1200, 2400, 4800 e 9600 bps. UART (Universal Asynchronous Receiver Transmitters): Converte caracter para série de bits e vice-versa. Conectados ao computador por um cartão RS-232; Taxa de transmissão entre 50 e 9600 bps; Pode demorar 1 mseg. para transmitir um caracter; O driver, em geral, envia um caracter e bloqueia, até que a placa possa aceitar outro.
Compartilhar