Capítulo 5 - Entrada/Saída 5.1 Princípios do hardware de E/S 5.2 Princípios do software de E/S 5.3 Camadas do software de E/S Capítulo 5 - Entrada/Saída 5.1 Princípios do hardware de E/S 5.2 Princípios do software de E/S 5.3 Camadas do software de E/S Controladores de Dispositivos Composto por dispositivos: Mecânico Eletrônico Exemplo: HD Mecânico: Discos magnéticos com cabeçote de leitura e motores que rotacionam e movem os discos e cabeçotes. Eletrônico: Controlador Controladores de Dispositivos Podem ser reutilizados em outros dispositivos, fornecendo uma modularização. Tem como principal função converter o fluxo serial de bits em blocos de bytes e corrigir eventuais erros. Podem ter registradores dentro do espaço de memória (E/S mapeada na memória). E/S Mapeada na Memória (a) Espaços de memória e E/S separados (b) E/S mapeada na memória (c) Híbrido Espaço de Memória e E/S Separados Possui registradores específicos para E/S. É necessário usar códigos específicos de Assembly para acessar os registradores. E/S Mapeada na Memória Mapeia todos os registradores de controle no espaço de memória. É possível acessar através de métodos IN/OUT de C. Não necessita de qualquer mecanismo de proteção, pois o usuário está apenas acessando uma área da memória. E/S Mapeada na Memória (Cont.) Desta forma o SO é capaz de modificar os acesso do usuário a um dispositivo específico apenas incluindo/removendo as páginas desejas em sua tabela de páginas. Dois Espaços de Endereçamento de E/S Este último esquema reserva um espaço na memória para os dispositivos de E/S. Tem desvantagem a necessidade de calcular em tempo de inicialização do sistema quais endereços de memória estão reservados para os dispositivos de E/S. Direct Memory Access (DMA) O controlador solicita um bloco de dados, armazena-o em um buffer e o contador de blocos é decrementado. Ao final deste loop, os blocos de dados são copiados diretamente na memória e uma interrupção é solicitada. Desta forma a CPU é utilizada apenas para iniciar a transferência e esta pode ser alocada para o próximo processo. Direct Memory Access (DMA) Buffer Interno O uso de um buffer interno é de extrema importância, pois os dados chegam a uma taxa constante ao controlador. Caso não houvesse um buffer, os dados seriam perdidos e teriam quer ser relidos. E no caso do barramento se manter ocupado por um longo tempo, um erro de overrun é levantado. Buffer Interno Uma solução para este problema é a leitura intercalada dos dados no disco. A intercalação única resolve o problema quando a taxa de leitura dos dados ocorrem duas vezes mais rápidas que o controlador consegue escrever na memória. Buffer Interno (a) Nenhuma intercalação. (b) Intercalação única. (c) Intercalação dupla. Capítulo 5 - Entrada/Saída 5.1 Princípios do hardware de E/S 5.2 Princípios do software de E/S 5.3 Camadas do software de E/S Projeto de Software de E/S Objetivos Independência de dispositivo. Nomeação uniforme. Tratamento de erros. Projeto de Software de E/S Independência de dispositivo: A escrita de programas que acessam os dispositivos de E/S não deve distinguí-los. Um programa escrito para acessar um dispositivo de bloco (HD) deve ser capaz de acessar da mesma forma um outro dispositivo de bloco (cdrom). Projeto de Software de E/S Nomeação uniforme: Deve suportar uma nomeação independente de dispositivo, usando uma cadéia de caracteres ou um número inteiro. No Unix, todos os discos podem ser integrados a hierarquia do sistema de arquivo e o usuário não precisa qual nome corresponde a qual dispositivo. Projeto de Software de E/S Tratamento de erros: Os erros devem ser tratados o mais próximo possível do hardware. O erro só é passado adiante quando não é possível corrigí-lo. Um exemplo é quando um disquete está sendo lido e o cabeçote está sujo, uma nova solicitação de leitura pode remover a sujeira do cabeçote e o dado é, finalmente, lido. Transferência Síncrona vs Assíncrona Na transferência síncrona é realizado o bloqueio, ou seja, o processo se mantém esperando o resultado/disponibilidade do dispositivo. A assíncrona é orientada à interrupção, a CPU inicia o processo e é alocada para o próximo processo. Transferência Síncrona vs Assíncrona Os programas de usuário são mais simples de escrever usando operações bloqueantes (síncrona). Fica a cargo do sistema operacional realizar as operações orientadas à interrupção parecerem bloqueantes (assíncrona). Uso de Buffer Os programas de E/S podem utilizar buffers para o armazenamento temporário dos dados. Um exemplo é um pacote proveniente da placa de rede. O SO não sabe onde armazenar o pacote sem antes ser analizado. Dispositivos Compartilhados vs Dedicados Alguns dispositivos podem ser usados por vários usuários simultaneamente. Este compartilhamento só é possível em Hds devido a sua capacidade de acesso aleatório Unidades de fita não é capaz de ser compartilhada (dedicada). Formas de E/S Existem três maneiras de se realizar E/S: E/S programada. E/S orientada a interrupção. E/S que usa DMA. E/S Programada A CPU realiza todo o trabalho e fica dedicada ao processo que solicitou a operação. E/S Programada E/S Programada O SO escreve no registrador de E/S os dados byte a byte (b) e, após cada byte escrito, o SO fica esperando o dispositivo ficar disponível novamente (c). E/S Programada E/S Programada A principal desvantagem do uso deste método é que a CPU fica contínuamente verificando o status do dispositivo, causando uma espera ociosa ou polling. Tem como principal vantagem ser extremamente simples de implementar. E/S Orientada à Interrupção Permite que a CPU fique livre para realizar outras operações enquanto o dispositivo não fica disponível. E/S Orientada à Interrupção E/S Orientada à Interrupção O processo envia o primeiro byte, quando o dispositivo fica disponível novamente, uma interrupção é lançada e o tratamento de interrupção é chamado (a). O tratamento de interrupção verifica se ainda há algum dado a ser enviado ao dispositivo, caso haja, o próximo byte é enviado e o processo continua bloqueado (b). E/S Orientada à Interrupção Tem como principal desvantagem a ocorrência de uma interrupção a cada byte. Interrupções são operações custosas. E/S com DMA O controlador de DMA faz o papel da CPU e a operação é realizada usanda E/S programada. E/S com DMA E/S com DMA O processo solicita a operação de E/S e o controlador DMA inicia a tranferência byte a byte, assim como é feita a E/S programada (a). Assim que o buffer inteiro é transferido, uma interrupção é lançada e o processo pode enviar outro buffer ou ser desbloqueado. E/S com DMA A principal vantagem é que ocorre uma interrupção a cada buffer, invés de uma a cada byte. Porém, o controlador pode ser mais lento que a CPU e isto impediria que o dispositivo funcione em sua máxima velocidade. Capítulo 5 - Entrada/Saída 5.1 Princípios do hardware de E/S 5.2 Princípios do software de E/S 5.3 Camadas do software de E/S Camadas do Software de E/S Camadas do Software de E/S Tratadores de Interrupção As interrupções devem ser escondidas ao máximo. Isto é feito bloqueando o driver que iniciou a opração de E/S. Tratadores de Interrupção O tratamento de uma interrupção é algo bem mais complexo que um simples UP sobre algum semáforo. Uma série de passos devem ser executados quando uma interrupção ocorre. Passos de Tratamento de Interrupção (1) 1. Salva quaisquer registradores que ainda não foram salvos pelo hardware de interrupção. 2. Estabele um contexto para a rotina de tratamento de interrupção. 3. Estabele uma pilha para a rotina de tratamento de interrupção. Passos de Tratamento de Interrupção (2) 4. Sinaliza o controlador de interrupção. 5. Copia os registradores de onde eles foram salvos para a tabela de processos. 6. Executa a rotina de tratamento de interrupção. Ela extrairá informações dos registradores do controlador do dispositivo que está interrompendo. Passos de Tratamento de Interrupção (3) 7. Escolhe o próximo processo a executar. Se a interrupção deixou pronto algum processo de alta prioridade anteriormente bloqueado, este pode ser escolhido para executar agora. 8. Estabelece o contexto da MMU (Unidade de gerenciamento de memória) para o próximo processo a executar. Algum ajuste na TLB (tabela de tradução de endereços) também pode ser necessário. Passos de Tratamento de Interrupção (4) 9. Carrega os registradores do novo processo, incluido sua PSW (Program Status Word). 10. Inicia a execução do novo processo. Camadas do Software de E/S Drivers do Dispositivo Cada dispositivo necessita de um código específico do mesmo para controlá-lo. Este código é chamado de driver do dispositivo. Drivers do Dispositivo Geralmente é escrito pelo fabricante e fornecido juntamente com o dispositivo. Cada sistema operacional precisa do seu próprio driver. Drivers do Dispositivo Para ter acesso direto aos registradores dos dispositivos, o driver deve fazer parte do núcleo do SO. Isso é devido à proteção de acesso aos registradores de E/S. Drivers do Dispositivo É possível criar um driver que execute no espaço do usuário e solicite ao SO a escrite e leitura dos registradores. Isto, na realidade, até proporcionaria uma maior estabilidade ao SO, visto que drivers defeituosos podem interferir no núcleo do SO. Posicionamento Lógico dos Drivers Drivers do Dispositivo O SO deve permitir a instalação de novos drivers. No Unix o SO costumava ser um único programa binário, compilado para usar os periféricos. Qualquer mudança nos dispositivos de E/S necessitava uma recompilação do SO. Drivers do Dispositivo Em geral, possuem uma estrutura similar: Inicia verificando se os parâmetros estão corretos e, algumas vezes, uma tradução dos valores é necessária Verifica se o dispositivo está disponível e se o hardware pode executar a requisição imediatamente. Em alguns casos que alguns dispositivos sejam ligados. Drivers do Dispositivo O driver escreve os comandos nos registradores e, alguns, podem ter uma de comandos que são executados sem a ajuda do SO. Controlar um dispositivo significa emitir uma sequência de comandos. É no driver onde a sequência de comandos está armazenada. Drivers do Dispositivo Nos casos que o driver espera por uma ação ser completada, este se autobloqueia e espera por uma interrupção para desbloqueá-lo. Ao fim da operação o driver verifica se há alguma requisição pendente, caso não haja, este se bloqueia e fica a espera de novas requisições. Drivers do Dispositivo Na realidade, o processo de espera e execução de um comando pode ser mais complexo. Uma requisição pode chegar enquanto o driver está executando alguma ação. Alguns devem ser capazes de prover reentrância. Capacidade de executar o código concorrentemente e de forma segura. Drivers do Dispositivo Um dispositivo pode ser removido durante a execução de um processo que o utilizava. O driver deve ser capaz de interromper a transferência e informar os processos sobre a remoção. Isto deve ser feito sem causar nenhum dano às estruturas de dados do núcleo. Camadas do Software de E/S Software Independente de Dispositivo • O SO deve fornecer uma interface uniforme a todos os drivers. – Um HD (dispositivo de bloco) não deve ser tratado diferente de um CD, por exemplo. – Sem isto, as funções de acesso seriam diferentes para cada dispositivo. – Facilita o desenvolvimento. Software Independente de Dispositivo • O acoplamento de um novo driver se torna mais fácil. – • O desenvolvedor sabe o que se espera dele (quais funções devem ser disponibilizadas). Na prática não é exatamente assim, entretanto, alguns dispositivos compartilham semelhanças. Uso de Buffer (a) Entrada sem uso de buffer. (b) Buffer no espaço do usuário. (c) Buffer no espaço do usuário e no núcleo. Uso de Buffer • Novamente o uso de buffer é de extrema importância. • Sem um buffer, a CPU é interrompida, constantemente, para armazenar/analisar o dado que chega. – Os dados podem chegar a uma taxa constante e os novos dados podem ser perdidos. Uso de Buffer (a) Entrada sem uso de buffer. (b) Buffer no espaço do usuário. (c) Buffer no espaço do usuário e no núcleo. Buffer no Espaço do Usuário Uma solução proposta para este problema é utilizando um buffer no espaço de usuário. A rotina de tratamento de interrupção preenche o buffer com os dados que chegam. O processo é desbloqueado quando este está cheio. Buffer no Espaço do Usuário • Se o buffer estiver paginado no disco quando um dado chegar, este terá que ser trazido a memória principal para incluir o novo dado. • O buffer pode ser trancado na memória e se manter na memória principal. – Porém se vários processos realizam isto, a memória ficará cheia de processos que não podem ser paginados. Uso de Buffer (a) Entrada sem uso de buffer. (b) Buffer no espaço do usuário. (c) Buffer no espaço do usuário e no núcleo. Buffer no Espaço do Usuário e no Núcleo • Um buffer pode ser criado no núcleo e os dados são transferidos para o buffer no espaço do usuário quando este está cheio. – Novamente, o tratador de interrupção preenche o buffer no núcleo. – A página associada ao buffer do usuário é carregada na memória principal e os dados são copiados. Buffer no Espaço do Usuário e no Núcleo • Porém, os dados que chegam enquanto a página do buffer do usuário está sendo carregada são perdidos. • A velocidade com que o buffer no núcleo é esvaziado pode ser menor que a velocidade com que os dados chegam. Uso de Buffer (a) Entrada sem uso de buffer. (b) Buffer no espaço do usuário. (c) Buffer no espaço do usuário e no núcleo. Buffer Duplo no Núcleo • Uma melhor solução é utilizando um buffer duplicado no núcleo. • Enquanto um buffer está sendo esvaziado, o outro é utilizado para armazenar os dados que chegam. Uso de Buffer na Saída • Estes problemas podem ocorrer na saída de dados, também. • O processo poderia ficar bloqueado até o envio ser concluido. – Porém, isto pode levar um longo tempo. Uso de Buffer na Saída • O processo poderia ser liberado e uma interrupção seria lançada para avisar a conclusão da transferência. – Poderia gerar uma condição de corrida. – Difícil de programar. – O processo não sabe quando poderá usar o buffer novamente. Uso de Buffer na Saída • O uso de um buffer no núcleo permite que o processo seja liberado imediatamente. – O processo pode usar o buffer usado na transferência novamente, pois foi copiado para o buffer do núcleo. Uso de Buffers • O uso de buffers pode diminuir o desempenho das atividades de E/S. – Os passos devem seguir uma ordem. – Introduzindo novos passos (para uso do buffer) iria aumentar a quantidade de passos. Relatório de Erros • Os erros específicos de dispositivo devem ser tratados pelo driver. • Mas o modelo do tratamento de erro não depende do dispositivo. Relatório de Erros • Podem existir erros de programação. – • Solicitações erradas. Fica a cargo do driver resolver erros reais de E/S. Alocação/Liberação de Dispositivos Dedicados • O SO deve examinar as requisições e aceitála ou rejeitá-la. – • Depende da disponibilidade do dispositivo e das permissões de acesso. Uma solução é realizar uma chamada open para a abertura de arquivos especiais (que estão diretamente associados ao dispositivo). – Caso não esteja disponível, o open falha. Alocação/Liberação de Dispositivos Dedicados • O processo também poderia ser bloqueado até o dispositivo ser liberado. – Pode causar um deadlock. Tamanho de Bloco Independente de Dispositivo • Os discos possuem diferentes tamanhos de setores. • Cabe ao software independente de dispositivo esconder isto. • Deve ser fornecido um tamanho uniforme. – As camadas acima tratam apenas de dispositivos abstratos. Camadas do Software de E/S Software de E/S no Nível do Usuário • Maior parte do software de E/S está dentro do SO. • Uma pequena parte dele é constituida de bibliotecas ligadas aos programas do usuário ou até mesmo programas completos que rodam fora do núcleo. Software de E/S no Nível do Usuário • As chamadas do sistema são normalmente feitas por procedimentos de bibliotecas. – • O conjunto de todos os procedimentos de biblioteca fazem parte do sistema de E/S. Nem todo software de E/S no nível do usuário utiliza procedimentos de biblioteca. – Sistema de Spooling se enquadra nesta categoria. Spooling • O uso de spool é uma forma de lidar com dispositivos dedicados de E/S em sistemas multiprogramação. • Um processo de usuário poderia escrever diretamente na impressora. – Mas se este reter o controle por várias horas, nenhum outro processo poderá usá-lo. Spooling • • Para resolver este problema, são utilizados: – Daemon, é um processo especial que realiza a requisição de E/S. – Diretório de spool, é um diretório especial onde as requisições são colocadas. O daemon é o único processo com acesso ao dispositivo dedicado. Spooling • É, principalmente, utilizado em sistemas de impressão. • Pode ser usado em sistemas de transferência de arquivos pela rede, sistemas de newsgroups...