Baixe o app para aproveitar ainda mais
Prévia do material em texto
T164s Tanenbaum, Andrewa S. Sistemas operacionais [recurso eletrônico] : projeto e implementação / Andrew S. Tanenbaum, Albert S. Woodhull ; tradução João Tortello. – 3. ed. – Dados eletrônicos. – Porto Alegre : Bookman, 2008. Editado também como livro impresso em 2008. ISBN 978-85-7780-285-2 1. Sistemas operacionais. I. Woodhull, Albert S. II. Título. CDU 004.4 Catalogação na publicação: Mônica Ballejo Canto – CRB 10/1023 3 ENTRADA/SAÍDA Uma das principais funções de um sistema operacional é controlar todos os dispositivos de E/S (Entrada/Saída) do computador. Ele precisa enviar comandos para os dispositivos, cap- turar interrupções e tratar de erros. Também deve fornecer uma interface simples e fácil de usar entre os dispositivos e o restante do sistema. Na medida do possível, a interface deve ser a mesma para todos os dispositivos (independência de dispositivo). O código de E/S repre- senta uma parte signifi cativa do sistema operacional como um todo. Assim, para realmente entender o que um sistema operacional faz você precisa compreender como funciona a E/S. O modo como o sistema operacional gerencia a E/S é o principal assunto deste capítulo. Este capítulo está organizado como segue. Primeiramente, veremos alguns dos prin- cípios da organização do hardware de E/S. Em seguida, examinaremos o software de E/S em geral. O software de E/S pode ser estruturado em camadas, com cada camada tendo uma tarefa bem defi nida a executar. Estudaremos essas camadas para vermos o que elas fazem e como se encaixam. Logo após, vem uma seção sobre impasses. Defi niremos os impasses precisamente, mostraremos como eles são causados, forneceremos dois modelos para analisá-los e discuti- remos alguns algoritmos para evitar sua ocorrência. Em seguida, passaremos a ver o MINIX 3. Começaremos com uma visão geral da E/S no MINIX 3, incluindo interrupções, drivers de dispositivo, E/S dependente de dispositivo e E/S independente de dispositivo. Depois dessa introdução, veremos vários dispositivos de E/S em detalhes: discos, teclados e vídeo. Para cada dispositivo, estudaremos seu hardware e software. 3.1 PRINCÍPIOS DO HARDWARE DE E/S Diferentes pessoas vêem o hardware de E/S de diferentes maneiras. Os engenheiros elétricos o vêem em termos de chips, fi os, fontes de alimentação, motores e todos os outros componen- tes físicos que compõem o hardware. Os programadores vêem a interface apresentada para o software — os comandos aceitos pelo hardware, as funções que ele executa e os erros que podem ser informados. Neste livro, estamos preocupados com a programação de dispositivos de E/S e não com o seu projeto, construção ou manutenção; portanto, nosso interesse estará restrito à programação do hardware e não no seu funcionamento interno. Contudo, muitas vezes a programação de muitos dispositivos de E/S está intimamente ligada à sua operação CAPÍTULO 3 • ENTRADA/SAÍDA 217 interna. Nas próximas três subseções, ofereceremos uma breve base geral sobre hardware de E/S no que diz respeito à programação. 3.1.1 Dispositivos de E/S Grosso modo, os dispositivos de E/S podem ser divididos em duas categorias: dispositivos de bloco e dispositivos de caractere. Um dispositivo de bloco armazena informações em blocos de tamanho fi xo, cada um com seu próprio endereço. Os tamanhos de bloco comuns variam de 512 a 32.768 bytes. A propriedade fundamental de um dispositivo de bloco é que é possível ler ou escrever cada bloco independentemente de todos os outros. Os discos são os dispositivos de bloco mais comuns. Se você olhar de perto, não há uma divisão clara entre os dispositivos que são endereçá- veis por blocos e os que não são. Todo mundo concorda que um disco é um dispositivo ende- reçável por blocos porque, independente de onde esteja o braço do disco em dado momento, sempre é possível buscar outro cilindro e, então, esperar que o bloco solicitado passe sob o cabeçote. Agora, considere uma unidade de fi ta usada para fazer backups de disco. As fi tas contêm uma seqüência de blocos. Se a unidade de fi ta receber um comando para ler o bloco N, ela sempre poderá retroceder e avançar a fi ta até chegar a esse bloco. Essa operação é aná- loga a um disco fazendo uma busca, exceto que demora muito mais. Além disso, pode ou não ser possível reescrever um bloco no meio de uma fi ta. Mesmo que fosse possível usar fi tas como dispositivos de bloco de acesso aleatório, isso seria forçar a sua natureza: normalmente, elas não são utilizadas dessa maneira. O outro tipo de dispositivo de E/S é o dispositivo de caractere. Um dispositivo de carac- tere envia ou aceita um fl uxo de caracteres, sem considerar nenhuma estrutura de bloco. Ele não é endereçável e não tem nenhuma operação de busca. As impressoras, interfaces de rede, mouses (para apontar) e a maioria dos outros dispositivos que não são do tipo disco podem ser vistos como dispositivos de caractere. Essa classifi cação não é perfeita. Alguns dispositivos simplesmente não se encaixam. Os relógios, por exemplo, não são endereçáveis por bloco. Tampouco eles geram ou aceitam fl uxos de caracteres. Tudo que eles fazem é causar interrupções em intervalos bem defi nidos. Apesar disso, o modelo de dispositivos de bloco e de caractere é geral o sufi ciente para poder ser utilizado como base para fazer uma parte do software do sistema operacional tratar com E/S independente de dispositivo. O sistema de arquivos, por exemplo, trata somente com dispositivos de bloco abstratos e deixa a parte dependente de dispositivo para um software de nível mais baixo, chamado driver de dispositivo. Os dispositivos de E/S têm uma variação enorme em suas velocidades, o que impõe uma pressão considerável no software para funcionar bem com diferentes taxas de dados. A Figura 3-1 mostra as taxas de dados de alguns dispositivos comuns. A maior parte desses dispositivos tende a fi car mais rápida à medida que o tempo passa. 3.1.2 Controladoras de dispositivo Normalmente, as unidades de E/S consistem em um componente mecânico e um componente eletrônico. Freqüentemente é possível separar as duas partes para fornecer um projeto mais modular e geral. O componente eletrônico é chamado de controladora de dispositivo ou adaptador. Nos computadores pessoais, ele freqüentemente assume a forma de uma placa de circuito impresso que pode ser inserida em um slot de expansão. O componente mecânico é o dispositivo em si. Essa organização aparece na Figura 3-2 Normalmente, a placa controladora contém um conector, no qual pode ser ligado um cabo que vai até o dispositivo em si. Muitas controladoras podem manipular dois, quatro ou 218 SISTEMAS OPERACIONAIS até oito dispositivos idênticos. Se a interface entre a controladora e o dispositivo for padro- nizada, como uma interface ANSI, IEEE ou um padrão ISO ofi cial, ou de fato, então as em- presas poderão fazer controladores ou dispositivos que se encaixem nessa interface. Muitas empresas, por exemplo, produzem unidades de disco que combinam com as interfaces IDE (Integrated Drive Electronics) e SCSI (Small Computer System Interface). Mencionamos essa distinção entre controladora e dispositivo porque o sistema opera- cional quase sempre lida com a controladora e não com o dispositivo. A maioria dos compu- tadores pessoais e dos servidores utiliza o modelo de barramento da Figura 3-2 para comu- nicação entre a CPU e as controladoras. Os computadores de grande porte freqüentemente utilizam um modelo diferente, com computadores de E/S especializados, chamados canais de E/S, que assumem parte da carga da CPU principal. Monitor Teclado USBCD-ROM Unidade de disco rígido Controladora de disco rígido Controladora USB Controladora de teclado Controladora de vídeoMemóriaCPU Barramento Figura 3-2 Um modelo para conectar a CPU, a memória, as controladoras e os dispositivos de E/S. Dispositivo Taxa de dados Teclado 10 bytes/s Mouse 100 bytes/s Modem de 56K 7 KB/s Scanner 400 KB/s Camcorderdigital 4 MB/s CD-ROM de 52x 8 MB/s FireWire (IEEE 1394) 50 MB/s USB 2.0 60 MB/s Monitor XGA 60 MB/s Rede SONET OC-12 78 MB/s Gigabit Ethernet 125 MB/s Disco serial ATA 200 MB/s Disco SCSI Ultrawide 4 320 MB/s Barramento PCI 528 MB/s Figura 3-1 Algumas taxas de dados típicas de dispositivo, rede e barramento. CAPÍTULO 3 • ENTRADA/SAÍDA 219 Freqüentemente, a interface entre a controladora e o dispositivo é de baixo nível. Um disco, por exemplo, poderia ser formatado com 1024 setores de 512 bytes por trilha. Entre- tanto, o que realmente sai da unidade de disco é um fl uxo serial de bits, começando com um preâmbulo, seguido dos 4096 bits de um setor (512 × 8 bits) e, fi nalmente, uma soma de verifi cação, também chamada de Código de Correção de Erros (ECC – Error-Correcting Code). O preâmbulo é gravado quando o disco é formatado e contém o número do cilindro e do setor, o tamanho do setor e dados similares. A tarefa da controladora é converter o fl uxo serial de bits em um bloco de bytes e realizar toda correção de erro necessária. Normalmente, o bloco de bytes é primeiramente montado, bit a bit, em um buffer dentro da controladora. Depois que sua soma de verifi cação tiver sido verifi cada e o bloco declarado como livre de erros, ele poderá então ser copiado na memória principal. A controladora de um monitor também funciona como um dispositivo serial de bits, em um nível igualmente baixo. Ela lê na memória os bytes que contêm os caracteres a serem exibidos e gera os sinais usados para modular o feixe de elétrons do tubo de raios catódicos (CRT). A controladora também gera os sinais para fazer um feixe CRT realizar o retraço ho- rizontal, após ele ter terminado uma linha de varredura, assim como os sinais para fazer um retraço vertical, após a tela inteira ter sido varrida. Em uma tela LCD esses sinais selecionam pixels individuais e controlam seu brilho, simulando o efeito do feixe de elétrons de um CRT. Se não fosse a controladora de vídeo, o programador de sistema operacional teria de progra- mar a varredura explicitamente. Com ela, o sistema operacional inicializa a controladora com alguns parâmetros, como o número de caracteres ou pixels por linha e o número de linhas por tela, e deixa que ela se encarregue de fazer a exibição. As controladoras de alguns dispositivos, especialmente a dos discos, estão se tornando extremamente sofi sticadas. Por exemplo, as controladoras de disco modernas freqüentemen- te têm internamente vários megabytes de memória. Como resultado, quando uma leitura está sendo processada, assim que o braço chega ao cilindro correto, a controladora começa a ler e armazenar dados, mesmo que ainda não tenha chegado ao setor necessário. Esses da- dos colocados na cache podem ser úteis para atender requisições subseqüentes. Além disso, mesmo após os dados solicitados serem obtidos, a controladora pode continuar a colocar na cache dados de setores subseqüentes, pois eles provavelmente serão necessários poste- riormente. Dessa maneira, muitas leituras de disco podem ser manipuladas sem qualquer atividade do disco. 3.1.3 E/S mapeada em memória Cada controladora tem alguns registradores utilizados para comunicação com a CPU. Escre- vendo nesses registradores, o sistema operacional pode fazer o dispositivo enviar dados, acei- tar dados, ligar-se ou desligar-se, ou executar alguma outra ação. Lendo esses registradores, o sistema operacional pode saber qual é o estado do dispositivo, se ele está pronto para aceitar um novo comando etc. Além dos registradores de controle, muitos dispositivos possuem um buffer de dados que o sistema operacional pode ler e escrever. Por exemplo, uma maneira comum de os com- putadores exibirem pixels na tela é por meio de uma memória RAM de vídeo (que basica- mente é apenas um buffer de dados), disponível para programas ou para o sistema operacio- nal escreverem. Surge assim o problema de como a CPU se comunica com os registradores de controle e com os buffers de dados dos dispositivos. Existem duas alternativas. Na primeira estratégia, 220 SISTEMAS OPERACIONAIS cada registrador de controle recebe um número de porta de E/S, um valor inteiro de 8 ou de 16 bits. Usando uma instrução de E/S especial, como IN REG,PORT a CPU pode ler o registrador de controle PORT e armazenar o resultado no registrador REG da CPU. Analogamente, usando OUT PORT,REG a CPU pode escrever o conteúdo de REG em um registrador de controle. A maioria dos pri- meiros computadores, incluindo praticamente todos os de grande porte, como o IBM 360 e todos os seus sucessores, funcionavam dessa maneira. Nesse esquema, os espaços de endereçamento da memória e da E/S são diferentes, como se vê na Figura 3-3(a). Um espaço de endereçamentoDois endereços Dois espaços de endereçamento Memória Portas de E/S 0xFFFF… 0 (a) (b) (c) Figura 3-3 (a) Espaço de E/S e de memória separados. (b) E/S mapeada em memória. (c) Misto. Em outros computadores, os registradores de E/S fazem parte do espaço de endereça- mento normal da memória, como se vê na Figura 3-3(b). Esse esquema é chamado de E/S mapeada em memória e foi introduzido com o minicomputador PDP-11. Cada registrador de controle recebe um endereço exclusivo ao qual nenhuma memória é atribuída. Normal- mente, os endereços atribuídos estão no topo do espaço de endereçamento. Um esquema misto, com buffers de dados de E/S mapeados em memória e portas de E/S separados para os registradores de controle, aparece na Figura 3-3(c). O Pentium usa essa arquitetura, com os endereços de 640K a 1M reservados para buffers de dados de dispositivo, em computadores compatíveis com o IBM PC, além de portas de E/S de 0 a 64K. Como esses esquemas funcionam? Em todos os casos, quando a CPU quer ler uma palavra, ou da memória ou de uma porta de E/S, ela coloca o endereço necessário nas linhas de endereço do barramento e, então, envia um sinal READ em uma linha de controle do barra- mento. Uma segunda linha de sinal é usada para dizer se é necessário espaço de E/S ou espa- ço de memória. Se for espaço de memória, a memória responderá a requisição. Se for espaço de E/S, é o dispositivo de E/S que responderá. Se houver apenas espaço de memória (como na Figura 3-3(b)), todo módulo de memória e todo dispositivo de E/S compara as linhas de endereço com o intervalo de endereços que ele atende. Se o endereço cair em seu intervalo, ele responderá ao pedido. Como jamais um endereço é atribuído simultaneamente à memória e a um dispositivo de E/S, não há nenhuma ambigüidade e nenhum confl ito. CAPÍTULO 3 • ENTRADA/SAÍDA 221 3.1.4 Interrupções Normalmente, os registradores da controladora têm um ou mais bits de status que podem ser testados para determinar se uma operação de saída está concluída ou se novos dados estão disponíveis em um dispositivo de entrada. Uma CPU pode executar um laço, sempre testando um bit de status, até que um dispositivo esteja pronto para aceitar ou fornecer novos dados. Isso é chamado de consulta seqüencial (polling) ou espera ativa (busy wait). Vimos esse conceito na Seção 2.2.3 como um possível método para tratar com seções críticas e, naquele contexto, ele foi rejeitado como algo a ser evitado na maioria das circunstâncias. No âmbito da E/S, onde você pode ter de esperar por um tempo muito longo para que o mundo externo aceite ou produza dados, a consulta seqüencial não é aceitável, exceto para sistemas dedica- dos muito pequenos, que não executam múltiplos processos. Além dos bits de status, muitas controladoras utilizam interrupções para informar à CPU quando estão prontas para ter seus registradores lidos ou escritos. Vimos na Seção 2.1.6 como as interrupções são manipuladas pela CPU. No contexto da E/S, tudo que você precisa saber é que a maioria dos dispositivos de interface fornece uma saída que é logicamente igual ao bit de status de “operação completa” ou “dados prontos” de um registrador, mas que se destina a ser usada para estimular uma das linhasde pedido de interrupção (IRQ – Interrupt ReQuest) do barramento do sistema. Assim, quando uma operação termina, ela interrompe a CPU e começa a executar a rotina de tratamento de interrupção. Esse código informa ao sistema operacional que a E/S está concluída. O sistema operacional pode então verifi car os bits de status para saber se tudo correu bem e recuperar os dados resultantes ou iniciar uma nova tentativa. O número de entradas na controladora de interrupção pode ser limitado; os PCs da clas- se Pentium têm apenas 15, para dispositivos de E/S. Algumas controladoras são conectadas diretamente na placa-mãe do sistema; por exemplo, as controladoras de disco e teclado de um IBM PC. Nos sistemas mais antigos, a IRQ usada por dispositivos era confi gurado por meio de chaves ou jumpers associados às controladoras. Se o usuário comprasse um novo dispo- sitivo, tinha de confi gurar a IRQ manualmente, para evitar confl itos com as IRQs existentes. Poucos usuários conseguiam fazer isso corretamente, o que levou a indústria a desenvolver a tecnologia Plug’n Play, na qual a BIOS pode atribuir IRQs automaticamente para os disposi- tivos no momento da inicialização, evitando, assim, confl itos. 3.1.5 Acesso direto à memória Tenha ou não E/S mapeada em memória, a CPU de um sistema precisa endereçar as controla- doras de dispositivo para trocar dados com elas. A CPU pode solicitar dados de uma controla- dora de E/S um byte por vez, mas fazer isso para um dispositivo como um disco, que produz um bloco de dados grande, desperdiçaria muito tempo de CPU; portanto freqüentemente é usado um esquema diferente, chamado Acesso Direto à Memória (DMA – Direct Memory Access). O sistema operacional só pode usar DMA se o hardware tiver uma controladora de DMA, o que a maioria dos sistemas possui. Às vezes, essa controladora é integrada nas con- troladoras de disco e em outras, mas tal projeto exige uma controladora de DMA separada para cada dispositivo. Mais comumente, é disponível uma única controladora de DMA (por exemplo, na placa-mãe) para regular as transferências dos vários dispositivos de E/S, muitas vezes de forma concomitante. Não importa onde esteja localizada fi sicamente, a controladora de DMA tem acesso ao barramento do sistema independente da CPU, como se vê na Figura 3-4. Ela contém vários registradores que podem ser escritos e lidos pela CPU. Isso inclui um registrador de endere- ços de memória, um registrador contador de bytes e um ou mais registradores de controle. Os 222 SISTEMAS OPERACIONAIS registradores de controle especifi cam a porta de E/S a ser usada, a direção da transferência (leitura ou escrita do dispositivo de E/S), a unidade de transferência (um byte ou uma palavra por vez) e o número de bytes a transferir em uma rajada. CPU Controladora de DMA Controladora de disco Memória principal Buffer 1. A CPU programa a controladora de DMA Interrompe ao terminar 2. O DMA solicita transferência para a memória 3. Dados transferidos Barramento 4. Sinal de reconhecimento Controle Contador Endereço Unidade de disco Figura 3-4 Operação de uma transferência de DMA. Para explicarmos o funcionamento do DMA, vamos primeiro ver como ocorrem as lei- turas de disco quando o DMA não é utilizado. Primeiramente, a controladora lê o bloco (um ou mais setores) da unidade de disco em série, bit por bit, até que o bloco inteiro esteja em seu buffer interno. Em seguida, ela calcula a soma de verifi cação para verifi car se não ocor- reu nenhum erro de leitura. Então, a controladora causa uma interrupção. Quando o sistema operacional começa a executar, ele pode ler o bloco de disco do buffer da controladora, um byte ou palavra por vez, executando um laço, com cada iteração lendo um byte ou palavra de um registrador de dispositivo da controladora, armazenando-o na memória principal, incre- mentando o endereço de memória e decrementando a contagem de itens a serem lidos até que ela chegue a zero. Quando o DMA é usado, o procedimento é diferente. Primeiramente, a CPU programa a controladora de DMA, confi gurando seus registradores para saber o que deve transferir e para onde (etapa 1 na Figura 3-4). Ela também envia um comando para a controladora de disco, dizendo a ela para que leia dados do disco em seu buffer interno e confi ra a soma de verifi cação. Quando dados válidos estiverem no buffer da controladora de disco, o DMA poderá começar. A controladora de DMA inicia a transferência enviando uma requisição de leitura para a controladora de disco pelo barramento (etapa 2). Essa requisição de leitura é semelhante as outras e a controladora de disco não sabe, nem se preocupa, se ele veio da CPU ou de uma controladora de DMA. Normalmente, o endereço de memória a ser escrita é posto nas linhas de endereçamento do barramento, de modo que, quando a controladora de disco busca a próxima palavra de seu buffer interno, ela sabe onde escrevê-la. A escrita na memória é outro ciclo de barramento padrão (etapa 3). Quando a escrita termina, a controladora de disco envia um sinal de reconhecimento (ack – acknowledgement) para a controladora de DMA, também pelo barramento (etapa 4). Então, a controladora de DMA incrementa o endereço de memória a ser usado e decrementa a contagem de bytes. Se a contagem de bytes ainda for maior do que 0, as etapas 2 a 4 serão repetidas, até que ela chegue a 0. Nesse ponto, a controladora causa uma interrupção. Quando o sistema operacional inicia, não precisa copiar o bloco na memória; o bloco já está lá. CAPÍTULO 3 • ENTRADA/SAÍDA 223 Talvez você esteja se perguntando por que a controladora simplesmente não armazena os bytes na memória principal assim que os recebe do disco. Em outras palavras, por que ela precisa de um buffer interno? Existem dois motivos. Primeiramente, usando o buffer interno, a controladora de disco pode conferir a soma de verifi cação antes de iniciar uma transferên- cia. Se a soma de verifi cação estiver incorreta, um erro será sinalizado e nenhuma transferên- cia para a memória será feita. O segundo motivo é que, uma vez iniciada uma transferência de disco, os bits continu- arão chegando do disco a uma velocidade constante, esteja a controladora pronta para eles ou não. Se a controladora tentasse escrever os dados diretamente na memória, ela teria que usar o barramento do sistema para cada palavra transferida. Se o barramento estivesse ocupado por algum outro dispositivo que o estivesse usando, a controladora teria de esperar. Se a pró- xima palavra do disco chegasse antes que a anterior tivesse sido armazenada, a controladora precisaria armazená-la em algum outro lugar. Se o barramento estivesse muito ocupado, a controladora poderia acabar armazenando muitas palavras e também tendo muita administra- ção a fazer. Quando o bloco é colocado no buffer internamente, o barramento não é necessá- rio até que o DMA comece; portanto, o projeto da controladora é muito mais simples, pois a transferência de DMA para a memória não crítica com relação ao tempo. Nem todos os computadores utilizam DMA. O argumento contra ele é que a CPU prin- cipal freqüentemente é muito mais rápida do que a controladora de DMA e pode fazer o trabalho com velocidade muito maior (quando o fator limitante não é a velocidade do dis- positivo de E/S). Se não houver nenhum outro trabalho para ela, não tem sentido fazer a CPU (rápida) esperar que a controladora de DMA (lenta) termine. Além disso, livrar-se da controladora de DMA e fazer com que a CPU realize todo o trabalho no software signifi ca economia de dinheiro, o que é importante em sistemas de baixo custo ou portáteis como os sistemas embarcados. 3.2 PRINCÍPIOS DO SOFTWARE DE E/S Vamos agora deixar o hardware de E/S de lado e ver o aspecto software. Primeiramente, vere- mos os objetivos do software de E/S e, depois, as diferentes maneiras pelas quais a E/S pode ser feita do ponto de vista do sistema operacional. 3.2.1 Objetivos do software de E/S Um conceito importanteno projeto de software de E/S é a independência de dispositivo. Isso signifi ca que deve ser possível escrever programas que possam acessar qualquer disposi- tivo de E/S sem a necessidade de especifi car o dispositivo antecipadamente. Por exemplo, um programa que lê um arquivo como entrada deve ser capaz de ler um arquivo em um disquete, em um disco rígido ou em um CD-ROM, sem precisar ser modifi cado para cada dispositivo diferente. Analogamente, qualquer pessoa deve ser capaz de digitar um comando como sort <input >output e fazê-lo funcionar com a entrada proveniente de um disquete, de um disco IDE, de um disco SCSI ou do teclado, e ter a saída indo para qualquer tipo de disco ou para a tela. Cabe ao sistema operacional resolver os problemas causados pelo fato desses dispositivos serem diferentes e exigirem seqüências de comandos muito diferentes para operações de leitura ou de escrita. Intimamente relacionado à independência de dispositivo é o objetivo da atribuição uniforme de nomes. O nome de um arquivo ou de um dispositivo deve ser simplesmente 224 SISTEMAS OPERACIONAIS uma string ou um inteiro e de modo algum deve depender do dispositivo. No UNIX e no MINIX 3, todos os discos podem ser integrados na hierarquia do sistema de arquivos de maneiras arbitrárias, de modo que o usuário não precisa saber qual nome corresponde a qual dispositivo. Por exemplo, um disquete pode ser montado na raiz do diretório /usr/ast/ backup, de modo que copiar um arquivo para esse diretório signifi ca copiá-lo no disquete. Desse modo, todos os arquivos e dispositivos são endereçados da mesma maneira: por um nome de caminho. Outra questão importante para o software de E/S é o tratamento de erros. Em geral, os erros devem ser tratados o mais próximo do hardware possível. Se a controladora descobre um erro de leitura, ela mesma deve tentar corrigi-lo, se puder. Se não puder, então o driver de dispositivo deverá tratar dele, talvez apenas tentando ler o bloco novamente. Muitos erros são passageiros, como os erros de leitura causados por partículas de poeira no cabeçote de leitura, e desaparecerão se a operação for repetida. Somente se as camadas mais baixas não forem ca- pazes de lidar com o problema é que as camadas mais altas devem ser informadas. Em muitos casos, a recuperação do erro pode ser feita de modo transparente em um nível baixo, sem que os níveis superiores nem mesmo saibam a respeito dele. Outra questão importante são as transferências síncronas (com bloqueio) versus as- síncronas (baseadas em interrupções). A maior parte da E/S física é assíncrona — a CPU inicia a transferência e vai fazer outra coisa, até a chegada da interrupção. Os programas de usuário são muito mais fáceis de escrever se as operações de E/S causam bloqueio — após uma chamada de sistema receive, o programa é automaticamente suspenso até que os dados estejam disponíveis no buffer. Cabe ao sistema operacional fazer com que as operações que, na verdade, são baseadas em interrupções, se pareçam com bloqueios para os programas de usuário. Uma outra questão para o software de E/S é o uso de buffers. Freqüentemente, os da- dos provenientes de um dispositivo não podem ser armazenados diretamente em seu destino fi nal. Por exemplo, quando um pacote vem da rede, o sistema operacional não sabe onde co- locá-lo, até o ter armazenado em algum lugar e examiná-lo. Além disso, alguns dispositivos têm restrições de tempo real severas (por exemplo, os dispositivos de áudio digital) de modo que os dados devem ser colocados antecipadamente em um buffer de saída para desvincular a velocidade com que o buffer é preenchido da velocidade com que ele é esvaziado, para evitar a falta de dados. O uso de buffers envolve um volume de cópias considerável e freqüentemen- te tem um impacto importante sobre o desempenho das operações de E/S. O último conceito que mencionaremos aqui são os dispositivos que podem ser compar- tilhados versus dispositivos dedicados. Alguns dispositivos de E/S, como os discos, podem ser empregados por muitos usuários ao mesmo tempo. Nenhum problema é causado pelo fato de vários usuários terem arquivos abertos, no mesmo disco, ao mesmo tempo. Outros dispositivos, como as unidades de fi ta, precisam ser dedicados a um único usuário até que ele tenha terminado de usá-la. Então, outro usuário pode utilizar a unidade de fi ta. Ter dois ou mais usuários escrevendo blocos misturados aleatoriamente na mesma fi ta defi nitivamente não funciona. A introdução de dispositivos dedicados (não compartilhados) também apre- senta uma variedade de problemas, como os impasses (deadlocks). Novamente, o sistema operacional deve ser capaz de manipular tanto dispositivos dedicados quanto compartilhados, de uma maneira que evite problemas. Freqüentemente, o software de E/S é organizado em quatro camadas, como se vê na Fi- gura 3-5. Nas subseções a seguir, veremos cada uma delas por vez, começando com a inferior. A ênfase deste capítulo são os drivers de dispositivo (camada 2), mas resumiremos o restante do software de E/S para mostrar como as partes do sistema de E/S se encaixam. CAPÍTULO 3 • ENTRADA/SAÍDA 225 3.2.2 Rotinas de tratamento de interrupção As interrupções são uma realidade desagradável; embora não possam ser evitadas. Elas de- vem ser bem ocultadas no interior do sistema operacional, para que o mínimo possível do sis- tema saiba a seu respeito. A melhor maneira de ocultá-las é fazer com que o driver que inicia uma operação de E/S seja bloqueado até que a E/S tenha terminado e a interrupção associada ocorra. O driver se bloquear sozinho, usando-se, por exemplo, uma instrução down em um semáforo, uma instrução wait em uma variável de condição, uma instrução receive em uma mensagem ou algo semelhante. Quando a interrupção acontece, a função de tratamento faz o que for necessário para atendê-la. Então, ela pode desbloquear o driver que a iniciou. Em alguns casos, ela apenas completará uma instrução up em um semáforo. Em outros, executará uma instrução signal em uma variável de condição em um monitor. Ainda, em outros casos, ela enviará uma men- sagem para o driver bloqueado. Em todos os casos, o efeito geral da interrupção será que um driver que anteriormente estava bloqueado agora poderá executar. Esse modelo funciona melhor se os drivers forem estruturados como processos independentes, com seus próprios estados, pilhas e contadores de programa. 3.2.3 Drivers de dispositivo Anteriormente neste capítulo, vimos que cada controlador de dispositivo possui registradores utilizados para fornecer comandos ou para ler seu status (ou ambos). O número de registrado- res e a natureza dos comandos variam radicalmente de um dispositivo para outro. Por exem- plo, um driver de mouse precisa aceitar informações do mouse dizendo quanto ele se moveu e quais botões estão sendo pressionados no momento. Em contraste, um driver de disco precisa saber a respeito de setores, trilhas, cilindros, cabeçotes, movimento do braço, propulsão do motor, tempos de acomodação do cabeçote e todos os outros fatores mecânicos necessários para fazer o disco funcionar corretamente. Obviamente, esses drivers serão muito diferentes. Assim, cada dispositivo de E/S ligado a um computador precisa de algum código espe- cífi co do dispositivo para controlá-lo. Esse código, chamado de driver de dispositivo, geral- mente é escrito pelo fabricante do dispositivo e distribuído junto com ele em um CD-ROM. Como cada sistema operacional precisa de seus próprios drivers, os fabricantes de dispositivo normalmente fornecem drivers para vários sistemas operacionais populares. Normalmente, cada driver de dispositivo manipula um tipo de dispositivo ou uma classe de dispositivos intimamente relacionados. Por exemplo, provavelmente seria uma boa idéia ter um único driver de mouse, mesmo que o sistema suporte várias marcas diferentes de mou- se. Como outro exemplo, um driver de disco normalmente pode manipular vários discos dediferentes tamanhos e velocidades, e talvez também um CD-ROM. Por outro lado, um mouse e um disco são tão diferentes, que são necessários drivers diferentes. Software de E/S em nível de usuário Software do sistema operacional independente de dispositivo Drivers de dispositivo Rotinas de tratamento de interrupção Hardware Figura 3-5 Camadas do sistema de software de E/S. 226 SISTEMAS OPERACIONAIS Para acessar o hardware do dispositivo (quer dizer, os registradores da controladora), tradicionalmente, o driver de dispositivo faz parte do núcleo do sistema. Essa estratégia ofe- rece o melhor desempenho e a pior confi abilidade, pois um erro em qualquer driver de dis- positivo pode derrubar o sistema inteiro. O MINIX 3 diverge desse modelo para melhorar a confi abilidade. Conforme veremos, no MINIX 3, cada driver de dispositivo agora é um processo separado em modo usuário. Conforme mencionamos anteriormente, os sistemas operacionais normalmente classi- fi cam os drivers como dispositivos de bloco (como os discos) ou como dispositivos de ca- ractere (como os teclados e as impressoras). A maioria dos sistemas operacionais defi ne uma interface padrão que todos os drivers de bloco devem suportar e uma segunda interface pa- drão que todos os drivers de caractere devem suportar. Essas interfaces consistem em várias funções que o restante do sistema operacional pode chamar para fazer o driver trabalhar. Em termos gerais, a tarefa de um driver de dispositivo é aceitar requisições abstratas do software independente de dispositivo (que está acima dele) e cuidar para que as requisições sejam executadas. Uma requisiçõa típica para um driver de disco é ler o bloco n. Se o driver estiver ocioso no momento da chegada de uma requisição, ele começará a executá-la imedia- tamente. Entretanto, se ele já estiver ocupado, normalmente colocará a nova requisição em uma fi la de requisições pendentes para serem tratadas assim que for possível. O primeiro passo na execução de uma requisição de E/S é verifi car se os parâmetros de entrada são válidos e, caso não sejam, retornar um erro. Se a requisição for válida, o próximo passo será transformá-la dos termos abstratos para concretos. Para um driver de disco, isso signifi ca descobrir onde o bloco solicitado está realmente no disco, verifi car se o motor da unidade de disco está funcionando, determinar se o braço está posicionado no cilindro correto etc. Em resumo, o driver deve decidir quais operações da controladora são exigidas e em que seqüência. Uma vez que o driver tiver determinado quais comandos deve enviar para a controlado- ra, ele começará a executá-los, escrevendo nos registradores de dispositivo da controladora. As controladoras simples podem manipular apenas um comando por vez. As controladoras mais sofi sticadas aceitam uma lista encadeada de comandos, os quais serão executados sem a intervenção do sistema operacional. Após o comando (ou comandos) ter sido executado, ocorre uma de duas situações. Em muitos casos, o driver de dispositivo deve esperar até que a controladora realize algum traba- lho para ele; portanto, ele bloqueia a si mesmo até que a interrupção entre para desbloqueá-lo. Em outros casos, entretanto, a operação é executada rapidamente, de modo que o driver não precisa ser bloqueado. Como exemplo desta última situação, em algumas placas gráfi cas, rolar a tela exige apenas escrever alguns bytes de comando nos registradores da controladora. Nenhum movimento mecânico é necessário; portanto, a operação inteira pode ser concluída em poucos microssegundos. No primeiro caso, o driver será desbloqueado pela ocorrência da interrupção. No se- gundo caso, ele nunca será bloqueado. De qualquer modo, após a operação ter terminado, ele deve verifi car a existência de erros. Se tudo estiver correto, o driver poderá ter dados para passar para o software independente de dispositivo (por exemplo, um bloco que acabou de ser lido). Finalmente, ele retorna algumas informações de status para informar situações de er- ros, ou não, para quem o chamou. Se houver outras requisições enfi leiradas, agora uma delas poderá ser selecionada e iniciada. Se nada estiver enfi leirado, o driver será bloqueado e fi cará aguardando a próxima requisição. Tratar com requisições de leitura e gravação é a principal função de um driver, mas pode haver outros requisitos. Por exemplo, talvez o driver precise confi gurar um dispositivo CAPÍTULO 3 • ENTRADA/SAÍDA 227 no momento que o sistema está sendo inicializado ou na primeira vez que ele for usado. Além disso, pode haver necessidade de gerenciar requisitos de energia, manipular dispositi- vos Plug ’n Play ou tratar de eventos de log. 3.2.4 Software de E/S independente de dispositivo Embora um trecho do software de E/S seja específi co a um dispositivo, uma grande parte dele é independente deste. O limite exato entre os drivers e o software independente de dispositivo depende do sistema, pois algumas funções que poderiam ser executadas de maneira indepen- dente de dispositivo podem, na verdade, por efi ciência ou outros motivos, serem executadas nos drivers. As funções que aparecem na Figura 3-6 normalmente são executadas no software independente de dispositivo. No MINIX 3, a maioria do software independente de dispositivo faz parte do sistema de arquivos. Embora nosso estudo do sistema de arquivos seja deixado para o Capítulo 5, veremos, aqui, rapidamente, o software independente de dispositivo para darmos alguma perspectiva sobre a E/S e mostrarmos melhor onde os drivers se encaixam. Interface uniforme para drivers de dispositivo Buffers Informe de erros Alocação e liberação de dispositivos dedicados Fornecimento de um tamanho de bloco independente de dispositivo Figura 3-6 Funções do software de E/S independente de dispositivo. A função básica do software independente de dispositivo é executar as funções de E/S comuns a todos os dispositivos e fornecer uma interface uniforme para o software em nível de usuário. Veremos a seguir os problemas acima com mais detalhes. Interface uniforme para drivers de dispositivo Um problema importante em um sistema operacional é como fazer todos os dispositivos e drivers de E/S parecerem mais ou menos iguais. Se discos, impressoras, monitores, teclados etc., tiverem todos interfaces diferentes, sempre que aparecer um novo dispositivo periférico, o sistema operacional deverá ser modifi cado para esse novo dispositivo. Na Figura 3-7(a), ilustramos simbolicamente uma situação na qual cada driver de dispositivo tem uma interface diferente com o sistema operacional. Em contraste, na Figura 3-7(b), mostramos um projeto diferente, no qual todos os drivers têm a mesma interface. Com uma interface padrão é muito mais fácil de instalar um novo driver, desde que ele seja compatível com a interface existente. Isso também signifi ca que os desenvolvedores de drivers sabem o que é esperado deles (por exemplo, quais funções eles devem fornecer e quais funções do núcleo eles podem chamar). Na prática, nem todos os dispositivos são absolutamente idênticos, mas normalmente existe apenas um pequeno número de tipos de dispositivo e mesmo esses geralmente são quase idênticos. Por exemplo, até os dispositivos de bloco e de caractere têm muitas funções em comum. Outro aspecto do fato de ter uma interface uniforme é o modo como os dispositivos de E/S são nomeados. O software independente de dispositivo cuida do mapeamento de nomes de dispositivo simbólicos para o driver correto. Por exemplo, no UNIX e no MINIX 3, um nome de dispositivo, como /dev/disk0, especifi ca exclusivamente o i-node de um arquivo 228 SISTEMAS OPERACIONAIS especial e esse i-node contém o número principal do dispositivo (major number), que é usado para localizar o driver apropriado. O i-node também contém o número secundário do dispositivo (minor number), que é passado como parâmetro para o driver, para especifi car a unidade a ser lida ou escrita. Todosos dispositivos possuem números principais e secun- dários, e todos os drivers são acessados usando-se o número principal do dispositivo para selecionar o driver. Intimamente relacionada com a atribuição de nomes está a proteção. Como o sistema impede que os usuários acessem dispositivos que não podem acessar? No UNIX, no MINIX 3, e também nas versões mais recentes do Windows, como o Windows 2000 e o Windows XP, os dispositivos aparecem no sistema de arquivos como objetos nomeados, o que signifi ca que as regras de proteção normais para arquivos também se aplicam aos dispositivos de E/S. O administrador do sistema pode então confi gurar as permissões corretas (isto é, no UNIX, os bits rwx) para cada dispositivo. Uso de buffers O uso de buffers também é um problema tanto para dispositivos de bloco como para dis- positivos de caractere. Para dispositivos de bloco, o hardware geralmente insiste em ler e escrever blocos inteiros simultaneamente, mas os processos de usuário estão livres para ler e escrever em unidades arbitrárias. Se um processo de usuário escrever meio bloco, o sistema operacional normalmente manterá esses dados em memória até que sejam escritos os dados restantes, momento este em que o bloco irá para o disco. Para dispositivos de caractere, os dados podem ser escritos mais rapidamente do que eles podem aparecer na saída, precisando então do uso de buffers. Uma entrada de teclado que chega antes de ser necessária também exige o uso de buffers. Informe de erros Os erros são muito mais comuns no contexto da E/S do que em qualquer outro. Quando eles ocorrem, o sistema operacional precisa tratar deles da melhor forma possível. Muitos erros são específi cos do dispositivo; portanto, apenas o driver sabe o que fazer (por exemplo, tentar novamente, ignorar ou gerar uma situação de pânico). Um erro típico é causado por um bloco de disco que foi danifi cado e não pode mais ser lido. Após o driver ter tentado ler o bloco certo número de vezes, ele desiste e informa o software independente de dispositivo. O modo como o erro é tratado a partir daí é independente do dispositivo. Se o erro ocorreu durante a Sistema operacional Sistema operacional Driver de disco Driver de impressora Driver de teclado Driver de disco Driver de impressora Driver de teclado (a) (b) Figura 3-7 (a) Sem uma interface de driver padrão. (b) Com uma interface de driver padrão. CAPÍTULO 3 • ENTRADA/SAÍDA 229 leitura de um arquivo de usuário, pode ser sufi ciente informá-lo para quem fez a chamada. Entretanto, se ele ocorreu durante a leitura de uma estrutura de dados fundamental para o sistema como, por exemplo, o bloco que contém o mapa de bits mostrando quais blocos estão livres, talvez o sistema operacional tenha que exibir uma mensagem de erro e terminar. Alocando e liberando dispositivos dedicados Alguns dispositivos, como os gravadores de CD-ROM, só podem ser usados por um único processo em dado momento. Cabe ao sistema operacional examinar as requisições de utili- zação do dispositivo e aceitá-los ou rejeitá-los, dependendo de o dispositivo solicitado estar disponível ou não. Uma maneira simples de tratar essas requisições é exigir que os processos executem operações open diretamente nos arquivos especiais dos dispositivos. Se o disposi- tivo não estiver disponível, a operação open falhará, fechando esse dispositivo dedicado e, então, liberando-o. Tamanho de bloco independente de dispositivo Nem todos os discos têm o mesmo tamanho de setor. Cabe ao software independente de dispositivo ocultar esse fato e fornecer um tamanho de bloco uniforme para as camadas su- periores; por exemplo, tratando vários setores como um único bloco lógico. Desse modo, as camadas superiores só tratam com dispositivos abstratos, todos os quais utilizam o mesmo tamanho de bloco lógico, independente do tamanho do setor físico. Analogamente, alguns dispositivos de caractere enviam seus dados um byte por vez (por exemplo, os modems), enquanto outros os enviam em unidades maiores (por exemplo, as interfaces de rede). Essas diferenças também podem ser ocultadas. 3.2.5 Software de E/S em espaço de usuário Embora a maior parte do software de E/S esteja dentro do sistema operacional, uma peque- na parte dele consiste em bibliotecas ligadas ao programas do usuário e até de programas inteiros executando fora do espaço de endereçamento do núcleo. As chamadas de sistema, incluindo as de E/S, normalmente são feitas por funções de biblioteca. Quando um programa em C contiver a chamada count = write(fd, buffer, nbytes); a função de biblioteca write será ligada ao código-objeto do usuário e contida no programa binário presente na memória no momento da execução. O conjunto de todas essas funções de biblioteca claramente faz parte do sistema de E/S. Embora essas funções façam pouco mais do que colocar seus parâmetros no lugar apro- priado da chamada de sistema, existem outras funções de E/S que executam um trabalho real adicional. Em particular, a formatação da entrada e saída é feita por função de biblioteca. Um exemplo da linguagem C é printf, que recebe como entrada uma string de formato e possivel- mente algumas variáveis, constrói uma string em ASCII e, então, chama write para enviar a string para a saída. Como um exemplo de printf, considere a instrução printf(“The square of %3d is %6d\n”, i, i*i); Ela formata uma string consistindo na string de 14 caracteres “The square of ”, seguida do valor i como uma string de 3 caracteres e, então, da string de 4 caracteres “ is ”, depois i2 como seis caracteres e, fi nalmente, um avanço de linha. 230 SISTEMAS OPERACIONAIS Um exemplo de função semelhante para entrada é scanf, que lê a entrada e a armazena nas variáveis descritas em uma string de formato usando a mesma sintaxe de printf. A biblio- teca de E/S padrão contém várias funções que envolvem E/S e todas são executadas como parte de programas de usuário. Nem todo software de E/S em nível de usuário consiste em funções de biblioteca. Outra categoria importante é o sistema de spooling. O spool é uma maneira de tratar com disposi- tivos de E/S dedicados em um sistema de multiprogramação. Considere um dispositivo com típico com spool: uma impressora. Embora tecnicamente seja simples permitir que qualquer processo de usuário abra o arquivo de caracteres especial que corresponde a impressora, su- ponha que ele o abrisse e depois não fi zesse mais nada por várias horas. Nenhum outro pro- cesso poderia imprimir nada. Em vez disso, é criado um processo especial, chamado daemon, em um diretório espe- cial, o diretório de spool. Para imprimir um arquivo, um processo primeiro gera o arquivo inteiro a ser impresso e o coloca no diretório de spool. Cabe ao daemon, que é o único proces- so a ter permissão para usar o arquivo especial associado a impressora, imprimir os arquivos no diretório. Protegendo-se o arquivo especial contra o uso direto por parte dos usuários, o problema de alguém deixá-lo aberto desnecessariamente por muito tempo é eliminado. O spool não é utilizado apenas por impressoras, mas também em várias outras situa- ções. Por exemplo, o correio eletrônico normalmente usa um daemon. Quando uma men- sagem é enviada, ela é na verdade colocada em um diretório de spool de correio eletrônico. Posteriormente, o daemon de correio tentará enviá-la realmente. Eventualmente, em um dado momento, pode não ser possível contatar o destinatário, nesse caso, o daemon deixa a mensa- gem no spool, com informações de status indicando que deve ser tentado um reenvio dentro de alguns instantes. O daemon também pode enviar um aviso para o remetente dizendo que o envio da mensagem foi adiado, ou, após um atraso de algumas horas, ou alguns dias, que a mensagem não pôde ser entregue. Tudo isso se dá fora do sistema operacional. A Figura 3-8 resume o sistema de E/S, mostrando as diferentes camadas e as principais funções de cada uma. De baixo para cima, as camadas são: o hardware, as rotinasde trata- mento de interrupção, os drivers de dispositivo, o software independente de dispositivo e os processos de usuário. Requisição de E/S Camada Resposta de E/S Funções de E/S Faz chamada de E/S; formata a E/S; spooling Atribuição de nomes, proteção, bloqueio, uso de buffers, alocação Configura registradores de dispositivo; verifica status Desbloqueia driver ao término da E/S Executa operação de E/S Processo de usuário Software independente de dispositivo Drivers de dispositivo Rotinas de tratamento de interrupção Hardware Figura 3-8 Camadas do sistema de E/S e as principais funções de cada uma. As setas na Figura 3-8 mostram o fl uxo de controle. Quando um programa de usuário tenta ler um bloco de um arquivo, por exemplo, o sistema operacional é chamado para exe- cutar a chamada. O software independente de dispositivo procura por esse bloco na cache CAPÍTULO 3 • ENTRADA/SAÍDA 231 em memória (um tipo de buffer). Se o bloco necessário não estiver lá, ele chama o driver de dispositivo para enviar a requisição para o hardware, para obtê-lo do disco. Então, o processo é bloqueado até que a operação de disco tenha terminado. Quando a operação de disco tiver terminado, o hardware gerará uma interrupção. A rotina de tratamento de interrupção será executada para descobrir o que aconteceu; isto é, qual dispositivo quer ser atendido imediatamente. Então, ela extrai o status do dispositivo e desbloqueia o processo que estava esperando a conclusão da operação de E/S para permitir que o processo de usuário continue sua execução. Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. Capa Iniciais Ficha catalográfica Folha de rosto Ficha técnica Os autores Dedicatória Prefácio Sumário 1: Introdução 2: Processos 3: Entrada/saída 4: Gerenciamento de memória 5: Sistema de arquivos 6: Leituras recomendadas e bibliografia Apêndice A: Instalando o minix 3 Apêndice B: O código-fonte do minix Apêndice C: Índice para os arquivos Índice
Compartilhar