Sistemas Operativos 2ª Ed.

Page 1


11- Entradas/Saídas A comunicação entre o computador e os seus periféricos é fundamental para a construção de todos os sistemas informáticos. Sem esta comunicação o computador seria ainda hoje uma simples máquina de cálculo com fraca ligação ao mundo que o rodeia. As necessidades de comunicação entre computador e periféricos têm vindo a aumentar significativamente nas últimas décadas, pelo que o subsistema de Entradas/Saídas (E/S) é uma das áreas em permanente evolução. Nos primórdios da utilização de computadores, estes recebiam os dados de entrada em bandas magnéticas e entregavam os resultados dos cálculos efetuados também em bandas magnéticas. Atualmente, os computadores têm que interagir com um elevado número de tipos de periféricos, desde a simples impressora, até à máquina fotográfica, passando pelo teclado, monitor, rato, disco, DVD, microfone, altifalantes, etc. As redes de comunicação tornaram-se também omnipresentes, sendo frequente um computador ter ligações a diversos tipos de redes. Ao contrário dos computadores iniciais, atualmente é necessário que os computadores se adaptem dinamicamente aos periféricos que estão disponíveis em cada momento, pois o número e a frequência com que os periféricos ficam disponíveis ou indisponíveis para um computador não são compatíveis com a sua instalação e remoção manual.

11.1

Objetivos da Gestão das E/S

Para facilitar a comunicação entre aplicações e toda a multiplicidade de periféricos, os sistemas operativos fornecem um modelo de E/S que permite o estabelecimento de canais virtuais com os periféricos, através dos quais os processos recebem e enviam informação que pode ser gerada, armazenada ou mostrada pelo periférico físico. Esta descrição funcional esconde a complexidade real que a implementação das E/S envolve. A maior dificuldade advém da grande diversidade de periféricos existentes e das suas características e modos diferenciados de funcionamento. As operações executadas pelos periféricos são extremamente variadas e, consequentemente, as sequências de controlo e códigos de erro que lhes estão associadas também são muito diferentes. As próprias características físicas da interação também variam de periférico para periférico, por exemplo:

A transferência de informação pode ter como unidade byte, cadeia de carateres, ou blocos de tamanho fixo;

 FCA - Editora de Informática

581


SISTEMAS OPERATIVOS

A velocidade de transferência poder variar de alguns bytes por segundo para os terminais, até ao Gbit por segundo nas redes locais de computadores em fibra ótica; A representação de dados pode ser feita segundo várias normas, tais como: ASCII [ISO, 1975] [ASCII], EBCDIC97, UNICODE [UNICODE], Little Endian, Big Endian, etc.; Em caso de erro ou de um qualquer outro tipo de exceção o periférico pode parar, avisar o operador, repetir as operações que originaram o erro (na expectativa que o erro tenha sido esporádico) ou, nos casos mais evoluídos, efetuar uma recuperação automática.

Esta diversidade foi responsável pelo facto de as E/S constituírem, nos sistemas operativos iniciais, uma das áreas pior estruturadas. Nos sistemas pioneiros, o tratamento das E/S consistia essencialmente num agregado de rotinas totalmente dependente do periférico físico. Os programas eram concebidos para interatuarem com um determinado tipo de periféricos, sendo difícil qualquer alteração desta associação. Esta situação alterou-se na medida em que os sistemas operativos deixaram de comunicar diretamente com os periféricos passando a comunicar com os controladores desses periféricos. Estes controladores são unidades de hardware colocadas nos diversos barramentos que um computador pode possuir, que interagem diretamente com os periféricos e fornecem um conjunto de abstrações mais simples que o fornecido diretamente pelos periféricos. Por exemplo, o sistema operativo não comunica diretamente com o disco através da sua interface IDE [ANSI, 1994], SCSI [ANSI, 1996] ou SATA [SATA, 2009]. O sistema operativo comunica com um controlador que se encontra no seu barramento de periféricos (por exemplo, PCI) que, por sua vez, comunica com o disco através da interface do disco (IDE, SCSI, SATA). Ainda assim, o nível de abstração disponibilizado por estes controladores é baixo, sendo frequentemente necessário conhecer os pormenores de cada controlador. Quais são, então, os dois grandes objetivos que a camada responsável pelas E/S procura endereçar?

Tornar a programação independente dos periféricos e de todos os detalhes das E/S. Idealmente o modelo computacional das E/S deveria ser muito semelhante aos dos canais de comunicação e dos ficheiros; Permitir a inclusão fácil de novos periféricos, o que permite a múltiplos fabricantes criarem o software de adaptação entre o núcleo do sistema operativo e as funções específicas de controlo do periférico, através de uma normalização das interfaces.

Temos, portanto, dois objetivos e duas áreas de intervenção bastante diferentes, a primei-

97

Extended Binary Coded Decimal Interchange Code (EBCDIC) é uma codificação de carateres em números de 8 bits, introduzida pela IBM em 1964.

582

 FCA - Editora de Informática


11- ENTRADAS/SAÍDAS

ra está próxima do programador de aplicações e dos seus modelos computacionais, enquanto a segunda define um modelo de integração com o núcleo para os programadores de sistema que criam o software de gestão dos periféricos. Como é natural esta interface tem também de ter em consideração aspetos de desempenho e segurança que na interação do núcleo com o gestor periférico são muitas vezes críticas para o desempenho do sistema ou do periférico.

11.2

Arquitetura das E/S

Pretende-se fornecer um canal de comunicação entre os processos e os periféricos de um nível de abstração que permita a um programador usar os diferentes periféricos sem necessidade de conhecer os seus pormenores específicos, ou os do seu controlador, e por outro lado permitir a ligação ao sistema operativo de qualquer periférico. A realização destes canais virtuais tem de ser efetuada pelo núcleo do sistema operativo na totalidade ou parcialmente complementada por processos com privilégios especiais porque as operações de escrita/leitura de endereços de memória física, bem como as operações de tratamento de interrupções são operações privilegiadas, i.e., que no modelo de segurança do sistema operativo não fazem parte do conjunto de operações permitidas aos processos (Capítulo 2). A arquitetura de camadas de E/S que adotámos no nosso modelo pode ser descrita como composta por duas interfaces e três módulos de software (Figura 11.1) que serão os objetos das secções seguintes deste capítulo. Interface aplicações Chamada sistema E/S no núcleo

Interface núcleo – Gestor de periféricos

Gestor de periféricos Figura 11.1 - Arquiteturas de camadas do sistema de E/S genérico

A primeira interface disponibilizada pelo modelo computacional visto na perspetiva do programador, assemelha-se, por razões de simplicidade e interoperação, aos modelos computacionais de outros objetos do sistema operativo, nomeadamente os ficheiros e os canais de comunicação. A funcionalidade do módulo “E/S no núcleo” resume-se a receber os parâmetros da chamada sistema, verificar a que periférico se destinam, efetuar verificações de segurança e  FCA - Editora de Informática

583


SISTEMAS OPERATIVOS

criar uma estrutura de dados que permite ao gestor de periférico executar a função. Esta funcionalidade é naturalmente reduzida porque se pretende que o núcleo se adapte facilmente a qualquer tipo de periférico, não podendo, portanto, ter uma funcionalidade que elimine essa generalidade. A segunda interface tem como missão definir um protocolo, no sentido lato, que corresponde a mensagens que são enviadas e recebidas do gestor de periférico para executar uma determinada operação. Esta interface é muito importante para quem desenvolve os gestores de periféricos, porque é a única forma de incluir o respetivo software no núcleo. Para além das primitivas operacionais, a interface entre o núcleo e o gestor de periféricos também tem a API associada à gestão do ciclo de vida dos gestores de periféricos, nomeadamente a sua ativação/desativação. Finalmente o nível correspondente ao gestor de periférico é onde reside a maior parte da funcionalidade, sendo que também ele se pode estruturar em diversos níveis como veremos mais à frente. Este nível é frequentemente designado na literatura por device driver ou device handler. Este nível pode corresponder a código que tem de ser executado no núcleo e portanto com o mesmo nível de privilégio ou poderá nalguns casos ser executado em processos sistema autónomos.

11.3

Modelo Computacional das E/S

A independência entre o modo como as operações de E/S são especificadas nos programas e a forma como são implementadas pelos periféricos físicos começou a tornar-se importante nos sistemas complexos onde havia um conjunto de periféricos que se pretendia utilizar nos programas de maneira uniforme sem ter de usar funções específicas para cada um deles. Nos grandes sistemas de tratamento por lotes era frequente a existência de várias impressoras, leitores de cartões ou unidades de bandas. Nestes sistemas deixou de fazer sentido que o identificador da impressora a utilizar estivesse codificado no programa ou que a leitura de dados de uma unidade de banda não pudesse ser feita a partir de um leitor de cartões. A independência em relação aos periféricos permitia que os programas fossem mais simples, sem sacrificar a capacidade de adaptação a vários periféricos, uma gestão mais eficiente dos recursos do sistema e aumentava a disponibilidade na presença de falhas em alguns dos periféricos. Com a generalização dos sistemas de tempo partilhado, a possibilidade de utilização indiferenciada dos periféricos tornou-se ainda mais importante. Por exemplo, era interessante poder visualizar no terminal a saída do programa antes de a enviar para a impressora. Para criar um modelo computacional que permite a independência entre as aplicações e os periféricos é necessário que a identificação dos periféricos e as operações que neles se executam sejam uniformes. A uniformização das designações dos periféricos permite usar nomes idênticos na parametrização das funções de E/S de uma forma semelhante à que vimos em alguns meca584

 FCA - Editora de Informática


11- ENTRADAS/SAÍDAS

nismos de comunicação entre processos que são identificados por nomes de ficheiros. A uniformização das operações é um pouco mais difícil devido à variedade do tipo de periféricos, mas ainda assim é possível encontrar um conjunto mínimo uniforme que permite a uma aplicação executar um conjunto de operações normalizadas sobre um periférico sem ter que definir a priori o tipo de periférico. A uniformização das designações e das operações são as razões principais para a existência do conceito de periférico virtual nas E/S dos sistemas operativos. Os periféricos virtuais são abstrações que o sistema operativo fornece às aplicações para elas criarem canais virtuais de comunicação com os periféricos físicos. Esta noção foi introduzida em alguns dos sistemas pioneiros e, apesar de utilizarem designações diferentes, o conceito é semelhante (streams – Atlas [Howarth, Payne e Sumner, 1961], files – Multics [Organick, 1972]). O tratamento das E/S uniforme e independente dos periféricos tem grandes semelhanças com o modelo proposto para os mecanismos de comunicação entre processos. Esta capacidade do modelo pode ser explorada de forma a tornar interoperável as E/S com os mecanismos de comunicação entre processos. A possibilidade de enviar a informação produzida por um processo para o canal associado ao dispositivo de entrada de um outro constitui uma ferramenta importante para o desenvolvimento incremental de aplicações complexas. Apesar de tal ser perfeitamente possível anteriormente, a redireção das E/S só adquiriu um uso generalizado no sistema Unix. Este sistema demonstrou as grandes potencialidades do mecanismo para o desenvolvimento modular de aplicações. Com um sistema integrado de comunicação e E/S, um programa pode produzir a sua saída para o terminal, para um ficheiro ou para a entrada de outro programa sem para tal necessitar de qualquer modificação no código. A base destes mecanismos já foi vista no contexto da comunicação entre processos e será agora generalizada às E/S. É evidente que a redireção tem limitações, em particular as sequências de controlo que permitem efetuar operações sobre os periféricos (parametrização, inicialização, etc.) não têm, normalmente, sentido quando redirecionadas para outro processo.

11.3.1

Elementos do Modelo

O modelo de E/S procura garantir a uniformidade de interação com todos os periféricos e solucionar os problemas de segurança advindos da sua partilha. O modelo computacional é composto por três entidades:

Periféricos virtuais – Tal como para os mecanismos de comunicação, podemos considerar que todas as operações de E/S se realizam sobre uma entidade abstrata, um periférico virtual; Funções de E/S – Funções normalizadas e em número reduzido associadas aos periféricos virtuais que permitem a programação, assegurando a independência entre aplicações e periféricos, e simplificando o modelo de segurança; Modelo de segurança que define permissões e direitos de acesso.

 FCA - Editora de Informática

585


SISTEMAS OPERATIVOS

Neste modelo a aplicação começa por abrir um canal de comunicação virtual com o periférico com quem quer comunicar. Se a abertura for bem sucedida, a aplicação realiza um conjunto de operações de escrita, leitura e configuração e por fim fecha o canal, libertando todas as estruturas no núcleo de suporte à comunicação, criadas aquando da abertura do canal. No entanto, cada uma destas três fases (abertura, operações e fecho) tem especificidades que dependem do sistema operativo, do tipo de periférico e do modelo de segurança, pelo que iremos analisar cada uma destas fases em pormenor. Como é natural, o tipo de periférico virtual condiciona as funções que se lhe aplicam, é frequente nos sistemas considerar tipos de periféricos genéricos como os que tratam cadeias de carateres e os que tratam blocos de dados de tamanho fixo ou os que tratam E/S assíncronas como redes de dados. Os periféricos cuja transferência de dados se faz com blocos de tamanho fixo são tipicamente os dispositivos de memória de massa. 11.3.1.1

Abertura e Fecho do Periférico Virtual

O objetivo da fase de abertura de um canal virtual com um periférico é a criação de um conjunto de estruturas no núcleo para suportar a comunicação com esse periférico. Estas estruturas são posteriormente referenciadas, para acesso ao periférico e para fecho do canal, a partir de um identificador criado pela função de abertura do canal. Este identificador é tipicamente um inteiro, embora possa também ser uma referência, válida no contexto de um processo, semelhante aos file descriptors do Unix: IdCanal = AbrirCanal(Nome) FecharCanal(IdCanal)

A função de abertura de canal possui, tipicamente, um parâmetro com a identificação do periférico com que se pretende comunicar. A designação de um periférico varia significativamente com o sistema operativo e mesmo com o tipo de periférico em alguns sistemas operativos, isto apesar de a uniformidade de designação ser um dos objetivos de desenho dos sistemas operativos. Como veremos adiante, os sistemas operativos Unix e Windows utilizam tipos de designações distintas e quer num quer noutro existem alguns tipos de periféricos que são designados de forma distinta dos restantes. Na abertura do canal são validados os direitos do processo de forma a proteger o acesso aos periféricos. 11.3.1.2

Operações de Comunicação e Configuração

Após a abertura de um canal, é possível utilizar o identificador obtido para efetuar operações de leitura, escrita e de configuração do periférico. Dependendo do sistema operativo e do tipo de periféricos podem existir variantes das operações de leitura/escrita e de configuração. A maioria dos sistemas operativos define um conjunto de operações reduzido, que podem ser executadas em cada tipo de periféricos, normalmente correspondem a leituras e escritas de dados, ao posicionamento do ponteiro de leitura e escrita, ou às inspeções do estado de periféricos (Tabela 11.1). Algumas destas operações só são aplicáveis a determinados tipos de periféricos, por exemplo, algumas só são aplicáveis a periféricos cuja transferência de dados se faz com 586

 FCA - Editora de Informática


11- ENTRADAS/SAÍDAS

blocos de tamanho fixo, outras só são aplicáveis a periféricos com suporte para notificação assíncrona, etc. Nome

Parâmetros

Descrição

Ler

(IdCanal, Tampão, bytes) Lê do dispositivo para um tampão de memória.

Escrever

(IdCanal, Tampão, bytes) Escreve de um tampão para o dispositivo.

Posicionar

(IdCanal, Posição)

Posiciona o cursor de leitura ou escrita.

LerAtributos

(IdCanal, Tampão)

Lê atributos do dispositivo.

EscreverAtributos (IdCanal, Atributos)

Modifica os atributos.

LerDirectório

(IdCanal, Tampão)

Lê um diretório para um tampão de memória.

InfoPendente

(IdCanal)

Verifica se existe algo para fazer.

HouveMudança

(dispositivo)

Verifica se o dispositivo mudou (por exemplo, mudança de disquete).

Despeja

(IdCanal)

Assegura que todos os tampões internos são escritos.

Cancela

(IdCanal)

Cancela a última operação pedida.

Tabela 11.1 - Algumas das funções principais de acesso a periféricos

A existência de operações específicas para os dispositivos que tratam blocos de tamanho fixo prende-se com a necessidade/possibilidade de gerir uma cache, em memória, com os blocos de dados mais utilizados, de modo a minimizar o acesso a esses periféricos. A sincronização associada às funções de leitura e escrita também pode ser diferente tal como vimos nos canais de comunicação. Nos acessos em escrita a sincronização mais vulgar é esperar que a transferência para o periférico se efetue antes de enviar mais dados. Contudo, é possível obter ganhos de desempenho significativos se o processo apenas efetuar a transferência para uma estrutura de dados interna ao núcleo ou ao gestor de periférico, prosseguindo imediatamente sem esperar que os dados sejam efetivamente escritos no dispositivo físico. De um modo geral, este funcionamento assíncrono é explorado por quase todas as implementações das funções de escrita nos periféricos. Nos acessos para leitura o tipo de acesso é naturalmente bloqueante, i.e., o processo espera até que a leitura se complete, mas nalgumas situações o bloqueio do processo que efetuou o pedido de leitura não é eficiente, pois existem outras ações que este pode realizar enquanto o pedido de leitura se efetua. Assim, alguns sistemas operativos possibilitam a leitura não bloqueante, sendo que o processo pode ser notificado do fim da leitura por inspeção direta (polling) ou por notificação através de rotinas assíncronas. Apesar de na maioria dos sistemas operativos o conjunto das funções de E/S ser reduzido e igual para qualquer processo, as primitivas de alto nível fornecidas pelas linguagens de programação variam substancialmente e são normalmente independentes das chamadas sistema. As primitivas de E/S das linguagens de alto nível incorporam um conjunto de operações  FCA - Editora de Informática

587


SISTEMAS OPERATIVOS

que, para além das operações de leitura e escrita, resolvem problemas de sincronização, formatação, gestão de tampões, etc. Contudo, é de realçar que a inclusão das funções de E/S nas linguagens de programação impõe um funcionamento rígido não permitindo, por vezes, programar as formas de interação desejáveis. Um exemplo típico é o gets() em C, que lê uma cadeia de carateres do terminal, neste caso a transferência dos carateres lidos para as variáveis do utilizador é apenas efetuada quando o sistema operativo conclui que o utilizador introduziu uma linha completa, i.e., quando o utilizador pressionou a tecla ‘Enter’. Esta implementação impede, na prática, o controlo de um programa através de teclas de posicionamento (setas) dado que não se pretende premir ‘Enter’ para cada movimento. Algumas linguagens, como o Pascal e o Perl, dispõem de instruções específicas para as E/S, outras, como o C e o Java, fornecem bibliotecas de funções (respetivamente a biblioteca stdio e o package java.io, que deverão ser ligadas com o programa). Em ambos os casos o resultado final é a incorporação no programa dos utilizadores de rotinas que efetuam a interface com as chamadas sistema de E/S. Para além da facilidade de utilização, as rotinas de biblioteca de E/S implementam uma gestão de tampões que permite otimizar as transferências de dados. Por exemplo, na interação com um disco não se irá ler um caráter de cada vez, mas um bloco (ou conjunto de blocos), sendo a decomposição em estruturas de dados de granularidade mais fina efetuada pelas rotinas de biblioteca sobre um tampão local. O mesmo raciocínio aplica-se à escrita. A utilização de tampões locais permite uma economia considerável de chamadas ao sistema. A Figura 11.2 contém o pseudocódigo de uma aplicação que transfere dados de um ficheiro para um dispositivo ligado à porta paralela de um computador. O programa começa por abrir o ficheiro e a porta paralela. De seguida, reserva a porta paralela para seu uso privado e indica ao gestor da porta paralela que o dispositivo usa o protocolo IEEE1284 [IEEE, 1994]. Esta indicação permite ao gestor da porta paralela saber quais os comandos de controlo de fluxo para comunicar com o dispositivo. Por fim, o programa entra num ciclo infinito onde testa se existe informação para ler no canal de origem e quando existe lê-a e escreve-a na porta paralela. canalOrigem = Abrir(“FicheiroOrigem”) canalDestino = Abrir(“PortaParalela”) EscreverAtributos(CanalDestino, “Reservar”) EscreverAtributos(CanalDestino, “IEEE1284”) While(true) { while(!InfoPendente(CanalOrigem)) Espera() Ler(CanalOrigem, Tampão) Escreve(CanalDestino, Tampão) } Figura 11.2 - Pseudocódigo de leitura e transferência de dados de um ficheiro ou dispositivo para a porta paralela de um computador

588

 FCA - Editora de Informática


11- ENTRADAS/SAÍDAS

11.3.2

Partilha de Periféricos

Alguns periféricos são utilizados exclusivamente por um processo. Por exemplo, quando se pretende escrever um conjunto de ficheiros numa unidade de gravação de DVD, esta deve ficar para uso exclusivo do processo. Neste caso, a abertura do periférico virtual deve implicitamente efetuar a operação que reserva a utilização do dispositivo, como no exemplo da Figura 11.2, de forma semelhante à utilização de um recurso em secção crítica. Contudo, a maioria dos periféricos são partilhados. Podemos considerar duas formas de efetuar a partilha: implícita pelo sistema operativo e explícita através de mecanismos manipulados pelo gestor de periférico. Os discos magnéticos ilustram o primeiro caso. Os discos são acedidos indiscriminadamente por todos os processos sem que existam problemas de coerência lógica, porque todos o fazem através do sistema de ficheiros que assegura a manutenção correta das estruturas de dados persistentes. No segundo caso temos os periféricos que, apesar de obrigarem a uma utilização exclusiva, não necessitam de ser atribuídos a um processo durante toda a sua execução. As impressoras são o exemplo mais característico. Durante uma impressão, o periférico apenas deve ser utilizado por um cliente, mas seria pouco eficiente que cada processo utilizador reservasse a impressora durante toda a execução. Neste caso a solução é efetuar a E/S de forma indireta. Em vez da rotina de E/S interatuar diretamente com o gestor da impressora, comunica com um processo servidor que controla o gestor de periférico (Figura 11.3). O processo servidor interatua com os restantes processos do sistema utilizando os mecanismos de comunicação entre processos (Capítulo 10). Estes enviam-lhe mensagens que correspondem ao pedido de serviço e o servidor responderá com mensagens indicando a forma como a operação decorreu. O processo servidor pode implementar políticas próprias de gestão, selecionando os pedidos de impressão de acordo com um critério de prioridades. 2 Coloca o pedido na fila Processo utilizador

Processo servidor de impressão 4 Imprime o ficheiro

1 Escreve o ficheiro

3 Lê o ficheiro Gestor de impressora

Figura 11.3 - Partilha indireta de periféricos

 FCA - Editora de Informática

589


SISTEMAS OPERATIVOS

A partilha indireta de periféricos, designada na literatura inglesa por spooling, é utilizada para a gestão de periféricos do tipo das impressoras ou traçador de gráficos (plotter). Seja o acesso ao periférico feito por um serviço de spooling, ou diretamente pela aplicação, o modelo computacional é semelhante, sendo necessário: abrir um canal virtual, efetuar operações de leitura, escrita e controlo sobre esse canal, e fechar o canal.

11.4

A Interface Gestor/Núcleo

As ações de abertura, acesso e fecho de um canal originam um conjunto de operações internas ao sistema de E/S. Essas operações resultam na interação de diversos elementos internos ao sistema de E/S, que constituem o modelo de funcionamento do sistema de E/S.

CPU Spooler Envio de parte do ficheiro 1

6 Notificação de fim GP 5 Lê estado da impressora

TI Envio de alguns carateres 2 Barramento E/S

4 Interrupção

Controlador de Impressora 3 Recebe carateres e indica estado

Figura 11.4 - Exemplo de interação entre as componentes do modelo aplicadas a um rato

A interação entre os elementos do modelo de E/S pode ser exemplificada com as ações decorrentes do envio de um ficheiro para uma impressora (Figura 11.4). Quando o spooler recebe um ficheiro para impressão, envia parte ou a totalidade (se for de reduzida dimensão) desse ficheiro para o gestor da impressora (passo 1 na Figura 11.4). De seguida, o gestor de impressão envia alguns carateres (ou conjuntos de instruções no caso de se tratar de uma impressora PostScript ou PCL) para o controlador da impressora que os envia posteriormente para a impressora (passo 3 na Figura 11.4). Mais uma vez o número de carateres a enviar, de cada vez, é limitado pela memória da impressora. Quando a impressora imprime todos os carateres que lhe foram enviados, notifica o gestor de peri590

 FCA - Editora de Informática


11- ENTRADAS/SAÍDAS

féricos através de uma interrupção (passo 4 na Figura 11.4). A rotina de tratamento de interrupções do gestor da impressora lê o estado da impressora (passo 5 na Figura 11.4) e indica ao gestor de periféricos que pode enviar mais carateres para a impressora, ou que, caso não existam mais carateres, pode notificar o spooler desse facto (passo 6 na Figura 11.4). No modelo de interação do rato com o sistema operativo é o dispositivo que toma a iniciativa de notificar o sistema operativo. No entanto, de uma forma geral os dispositivos só interagem com o sistema depois de serem solicitados para o fazer. Por exemplo, no envio de dados para uma impressora, a resposta do dispositivo é precedida de um conjunto de operações desencadeadas pela aplicação que solicita a impressão.

11.4.1

Fluxo de Ações Típico

Uma operação de E/S típica inicia-se com uma chamada a uma biblioteca de funções específica para esse efeito. Essa função faz uma verificação simples de alguns dos parâmetros que lhe foram passados (por exemplo, numa operação de abertura de canal verifica se o ponteiro para o nome do periférico é nulo) e faz a chamada ao sistema (Figura 11.5, passo 1) para executar o código do gestor de canais virtuais genérico que, por sua vez, redireciona o pedido para o gestor de periféricos respetivo (passo 2). Programa do utilizador

1 Chamada sistema

Funções de E/S

Funções de E/S

SO

Programa do utilizador

Gestão de canais virtuais

E/S Gestor de TI periférico

Controlador de hardware

3Leitura/escrita no controlador ou instruções de in/out

Periférico físico

Gestor de periférico TI

2Input/Output Request Block (IORB)

5 Interrupções Controlador de hardware

Periférico físico

4 Barramento de E/S (por exemplo, USB, SCSI, IDE, RS232, Firewire, etc.)

Figura 11.5 - Sequência de ações de uma operação de E/S típica

Para uniformizar e simplificar a comunicação com os gestores de periféricos o pedido efetuado consiste numa estrutura de dados normalizada, denominada Input/Output Re FCA - Editora de Informática

591


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.