Prévia do material em texto
PDF gerado usando o pacote de ferramentas em código aberto mwlib. Veja http://code.pediapress.com/ para mais informações.
PDF generated at: Fri, 06 Dec 2013 10:38:41 UTC
Sistemas operacionais
Conteúdo
Páginas
Introdução 1
História 2
Estruturas dos sistemas operacionais 2
Gerência de memória 5
Gerência de dispositivos de entrada e saída 15
Sistemas de arquivos 28
Sistemas embarcados 36
Referências
Fontes e Editores da Página 44
Fontes, Licenças e Editores da Imagem 45
Licenças das páginas
Licença 46
Introdução 1
Introdução
O Software de computador pode ser dividido em dois tipos: programas de sistema e programas aplicativos. O
principal programa de sistema é o sistema operacional, que controla todos os recursos do computador e fornece a
base lógica sobre a qual os programas aplicativos são escritos. Sua principal função é isolar os programadores da
complexidade do hardware. É importante salientar que o sistema operacional propriamente dito é aquela parcela que
roda no modo kernel (supervisor). Os compiladores, editores e interpretadores de comando (Shell) executam no
modo usuário. Há duas funções principais de um S.O.:
•• máquina estendida: o S.O. deve apresentar ao usuário o equivalente a uma máquina estendida ou máquina virtual,
teoricamente mais fácil de programar que o hardware;
•• gerenciador de recursos: o S.O. deve oferecer uma alocação ordenada e controlada dos processadores, memórias e
quaisquer dispositivos de E/S que os programas podem competir. Ou seja, o S.O. tem como função gerenciar
eficientemente as diferentes partes do sistema.
Existem quatro modelos de S.O.:
•• sistemas monolíticos: o S.O. é escrito como uma coleção de procedimentos, que podem chamar quaisquer outros
sempre que precisar, sem nenhum tipo de estrutura hierárquica;
•• sistemas em camadas: é um S.O. organizado em uma hierarquia de camadas, construída uma sobre a outra;
•• máquinas virtuais: formado por um monitor de máquina virtual, que rodava no hardware básico e coordenava a
multiprogramação, fornecendo várias máquinas virtuais à camada superior (não máquinas estendidas, e sim
cópias exatas do hardware básico);
•• modelo cliente-servidor: minimização do kernel (através da remoção de código do S.O., movendo para as
camadas mais altas), implementando as funções do S.O. como processos de usuário. Os processos de usuário
(clientes) enviam requisições para os processos servidores, que realizam a operação e retornam a resposta
necessária.
Um S.O., tipicamente, tem quatro grandes componentes: gerenciamento de processos, gerenciamento de dispositivos
de E/S, gerenciamento de memória e gerenciamento de arquivos.
História 2
História
Tradicionalmente, os S.O. podem ser divididos, historicamente, em quatro gerações:
•• 1ª. Geração: os programadores desenvolviam o programa e as funções que, atualmente, estão sob a supervisão do
S.O;
•• 2ª. Geração: o sistema de processamento em lote, que constituía no armazenamento prévio de diversos jobs para
serem processados sequenciamente no computador, marcou esta geração. Um job só iniciava seu processamento
quanto o seu antecessor terminava;
• 3ª. Geração: desenvolvimento do conceito de multiprogramação, ou seja, a partição da memória do computador
em diversas parcelas para que múltiplos jobs pudessem ser executados, dando a sensação para o usuário de um
paralelismo não existente. Por exemplo, enquanto um job esperava por uma operação de E/S (potencialmente
mais demorada), a CPU poderia realizar o processamento de outro job já armazenado na memória;
• 4ª. Geração: com o surgimento das estações de trabalho e dos computadores pessoais, o desenvolvimento de
interfaces gráficas se torna comum. As redes de computadores impulsionam o surgimento de sistemas
operacionais de rede e os sistemas operacionais distribuídos.
Estruturas dos sistemas operacionais
Um sistema operacional fornecia o ambiente no qual os programas (softwares) são executados. Os SOs variam
internamente entre si devido às diversas necessidades e restrições de softwares e hardwares.
Estruturas de Sistemas Operacionais
Sistemas monolíticos
Um micro-computador PC XT rodando o MS DOS 5.0.
Também conhecida como estrutura simples, esta é a
estrutura dos primeiros SO’s. Consistida, basicamente,
por um programa dividido em sub-rotinas, na estrutura
monolítica é permitido a qualquer uma dessas
sub-rotinas em qualquer parte do programa chamar
outra(s) sub-rotina(s). A construção do programa final é
dada com base nos módulos compilados
separadamente, unidos através de um linker. A boa
definição de parâmetros de ligação entre as diferentes
rotinas existentes aumenta e muito o desempenho,
porém o sistema pode parar devido a algum erro
ocasionado por uma dessas rotinas. A exemplo temos o
próprio UNIX, o MS DOS, o FreeBSD, dentre outros.
Sistemas em camadas
Devido ao crescimento das necessidades dos utilizadores e o aperfeiçoamento dos sistemas, foi-se necessário a
modularização da organização do sw do SO. Na abordagem em camadas, o SO é particionado em níveis, onde o
nível mais “baixo” é o hw, e o nível mais “alto” é a interface com o usuário. A principal vantagem dessa estrutura é
justamente a modularização, facilitando sua alteração e depuração de cada camada, além de criar uma hierarquia de
níveis de acesso que permite proteger as camadas mais internas.
Estruturas dos sistemas operacionais 3
As camadas são selecionadas de tal modo que cada uma delas opere diretamente com a camada seguinte de nível
mais baixo. Foi originado na Holanda por Edsger Dijkstra, que utilizou o algoritmo de busca de menor caminho,
também de sua própria autoria, para percorrer dentre as várias camadas, as que atenderão as solicitações de “cima”,
de maneira mais eficiente.
Uma desvantagem desta estrutura é o tempo de resposta ao usuário, pois numa requisição do mesmo, uma camada
irá se comunicar com a outra diretamente seguinte, e assim por diante, possibilitando a modificação de parâmetros a
cada camada, necessidade de dados e ainda o acréscimo de overhead à chamada do sistema, levando, contudo, ao
consumo maior de tempo do que nos SO’s não estruturados em camadas.
Por sua vez, tal estrutura tem uma vantagem maior do ponto de vista tanto do projeto quanto da implementação, pois
a impossibilidade de comunicação direta das aplicações de cima com as de baixo, leva a um controle maior do SO
sobre o hw.
A exemplo temos o Windows NT, o THE e o MULTICS.
Máquina Virtual
Uma máquina virtual é uma cópia via software que busca simular uma máquina real. Uma máquina virtual (Virtual
Machine – VM) pode ser definida como “uma duplicata eficiente e isolada de uma máquina real”. A IBM define uma
máquina virtual como uma cópia isolada de um sistema físico, e esta cópia está totalmente protegida.
Ao invés de ser uma máquina real, isto é, um computador real, feito de hardware e executando um sistema
operacional específico, uma máquina virtual é um computador fictício criado por um programa de simulação. Sua
memória, processador e outros recursos são virtualizados. A virtualização é a interposição do software (máquina
virtual) em várias camadas do sistema. É uma forma de dividir os recursos de um computador em múltiplos
ambientes de execução. lancia delta integrale
Sistemas Cliente-Servidor
Sistemas Cliente-Servidor são modelos de computação que distinguem dois tipos básicos de equipamentos
computacionais: servidores e clientes, sendo interligados entre si geralmente utilizando-se uma rede de
computadores. Neste modelo, geralmente os servidores agregam as funções mais importantes do sistema, deixando
aos clientes apenas o processamento de aplicações mais básicas.
As principais características deste tipo de sistema são:
•• Elevar a camada onde são implementadas as funções normalmente efetuadas pelo sistema operacional
•• Reduzir as funções do sistema operacional
•• Tornar menor e de maisfácil a manutenção cada parte do sistema operacional
Utilização dos recursos de sistemas
Monoprogramação ou monotarefa
Em computação, chama-se monotarefa um sistema operacional que permite a realização de apenas uma tarefa (job)
de cada vez. O processador, memória e periféricos ficam dedicados a um único usuário, e cada tarefa para ser
executada, deve aguardar o encerramento da tarefa atual. Nos sistemas monoprogramados, enquanto uma aplicação
aguarda um evento, o processador pode permanecer ocioso, sem realizar qualquer tipo de processamento, a memória
pode acabar sendo sub-utilizada quando o programa não a utiliza totalmente e os periféricos são dedicados a um
único usuário. Desta forma, os sistemas monoprogramáveis acabam sendo por sua natureza de fácil implementação e
com pouca preocupação com proteção.
Estruturas dos sistemas operacionais 4
Multiprogramação ou multitarefa
Multiprogramação ou Multitarefa é o nome dado à característica de alguns sistemas operacionais de rodar diversas
aplicações simultâneas. Na realidade, na execução multitarefa, o tempo do processador é dividido entre as aplicações
em execução, e a execução das tarefas passa rapidamente de uma para a outra, criando a ilusão de que as aplicações
ocorrem de forma conjunta.
Tipos de Sistemas Operacionais
Sistemas Batch
Os sistemas batch ou sistemas em lote foram os primeiros sistemas multiprogramáveis a serem implementados
(primeira fase da computação), caracterizando-se por programas armazenados em disco ou fita, que uma vez
iniciados, exigem pouca ou nenhuma interação do usuário, processando de forma sequencial e contínua até o fim do
serviço (job), quando então é devolvido o resultado final do processamento. O tempo de execução da tarefa é
conhecido como turnaround.
Sistemas multiprogramados
Nos sistemas monoprogramados o que temos é a existência de um único processo sendo executado de cada vez na
memória. Com a multiprogramação existem vários processos na memória aptos à executar e um em execução. Sem
dúvida, o conceito de multiprogramação é um dos mais importantes nos sistemas operacionais modernos. Se
existirem vários programas carregados na memória ao mesmo tempo, a CPU pode ser compartilhada entre eles,
aumentando a eficiência da máquina e produzindo mais resultados em menos tempo. A idéia por detrás da
multiprogramação é bastante simples. Quando um programa libera a CPU, seja para realizar alguma operação de E/S
ou por outro motivo, ela fica parada. Enquanto espera que o programa volte para executar, a CPU não realiza
nenhum trabalho útil. Para acabar com a ociosidade deste tempo vários programas são mantidos ao mesmo tempo na
memória e o sistema operacional se encarrega de escolher um deles para executar. Assim, sempre que um programa
é interrompido, um outro é escolhido para ser executado em seu lugar. Com isso, a CPU estará durante grande parte
do tempo ocupada processando instruções de programas. Os benefícios da multiprogramação são vários: aumento da
utilização da CPU e da taxa de saída do sistema computacional, isto é, da quantidade de trabalho realizada dentro de
um intervalo de tempo (throughput).
Sistemas de Tempo Compartilhado (Time Sharing)
São sistemas que compartilham o tempo de uso da CPU entre diversos programas. Também conhecido como
time-sharing, consegue executar diversas tarefas simultaneamente, pois existe a divisão do tempo do processador em
pequenos intervalos, denominados fatia de tempo. Caso a tarefa não termine durante a fatia a ela determinada, há
uma interrupção e ela volta para a fila de escalonamento, aguardando novamente sua vez.
Diferente do sistema batch, esse tipo de sistema operacional permite a interação do usuário. Dessa maneira, os
terminais possuem teclado, vídeo e mouse.
Estruturas dos sistemas operacionais 5
Sistemas de Tempo Real
São sistemas no qual o tempo tem uma função essencial. Em geral, um ou mais dispositivos físicos externos ou
computador geram estímulos, e o computador deve reagir apropriadamente a eles dentro de um dado intervalo de
tempo.
Sistemas multiprocessados
Sistemas multiprocessados são sistemas construídos sobre máquinas computacionais que possuem mais de um
processador para propósitos gerais. Entre suas vantagens estão:
• Maior produção (throughput)
•• Reconfiguração
•• Balanceamento
•• Simetria
Acoplamento-Sistemas multiprocessáveis
Modo de comunicação entre os processadores e o grau de compartilhamento de memória e dos dispositivos de
entrada/saída.
Chamadas ao Sistema
Conhecidas como system calls, são instruções que um programa utiliza para se comunicar com o Sistema
Operacional e acessar seus serviços. O aplicativo "chama" o S.O., requisitando algo.
Gerência de memória
A maioria dos computadores trabalha com o conceito de hierarquia de memória, possuindo uma pequena quantidade
de memória cache, muito rápida, uma quantidade de memória principal (RAM) e uma quantidade muito grande de
memória de armazenamento em disco (HD), considerada lenta. O problema básico para o gerenciamento de memória
é que os programas atuais são muito grandes para rodarem, completamente, na memória cache. O gerenciador de
memória deve ser capaz de controlar parte da memória está em uso (e quais não estão), alocar memória para
processos quando eles necessitam e desalocar quando eles terminam e, principalmente, gerenciar a troca entre a
memória principal e o disco, quando a memória principal é muito pequena para armazenar todos os processos.
Existem dois tipos de memória principal: a memória lógica e a memória física. A memória lógica é aquela
manipulada pelos programas, ela é visível para os programas; sempre que um programa necessita alocar um espaço
na memória esse espaço é alocado em memória lógica. A memória física é a memória implementada pelos circuitos
integrados é nela que os espaços alocados em memória lógica vão realmente residir, portanto a memória física tem
tamanho menor que a memória lógica, geralmente. Para isso é necessário realizar uma tradução de endereços lógicos
para endereços físicos, pois assim um programa que aloca uma memória lógica possa ter de fato uma memória física
alocada para si. Esse processo de tradução de endereços lógicos em endereços físicos é realizado por uma unidade de
gerência de memória chamada MMU (Memory Management Unit).
Gerência de memória 6
Memória lógica x Memória física
Os processos não enxergam a memória física, hardware usado para endereçar os circuitos integrados de memória, e
sim a memória lógica, que é a memória capaz de ser endereçada e acessada pelo conjunto de instruções do
processador, sendo que cada processo possui a sua memória lógica que é independente da memória lógica dos outros
processos. A memória física é implementada pelos circuitos integrados de memória, pela eletrônica do computador.
Ela possui espaço de endereçamento físico que é o conjunto formado por todos os endereços dos circuitos integrados
que formam a memória, normalmente esses endereços são em formato hexadecimal. A memória lógica possui um
espaço de endereçamento lógico, maior que o espaço de endereçamento físico, é formado por todos os endereços
lógicos gerado pelo processo, sendo gerado pela CPU e único por processo.
Como o processo "enxerga" endereço de memória lógico e o hardware "enxerga" endereço de memória físico é
necessário ter a conversão de endereço de memória lógico para endereço de memória físico. Esse mapeamento de
endereço lógico em endereço físico é feito pela MMU, unidade de gerência de memória. Basicamente a MMU que
vai mapear os endereços lógicos gerados pelos processos nos correspondentes endereços físicos que serão enviados
para a memória.
Existem duas formas bem simples de transformação do endereço lógico para o físico:
•• A MMU verifica se o endereço lógico é maior que o registrador limite inferior e menor que o registrador limite
superior, se sim encaminha o acesso com esse endereço válido,se não, gera uma interrupção de endereçamento
inválido. Nesse caso o endereço lógico é igual ao endereço físico.
•• A MMU verifica se o endereço lógico é menor que o registrador limite superior, se sim adiciona o registrador
base ao endereço lógico e encaminha o acesso com esse endereço resultante, se não gera interrupção de
endereçamento inválido. Nesse caso o endereço lógico é diferente do endereço físico.
A MMU consiste de um chip ou uma coleção de chips.
Modelo de memória de processos
Para que um programa seja executado ele precisa ser transformado em processo(s), assim é necessário alocar o
descritor de processos, alocar espaço na memória para o código (área conhecida como TEXT, onde se localiza o
programa principal, as funções e as bibliotecas estáticas), os dados (Data, área onde as variáveis são alocadas -
globais, locais estáticas, buffers internos)e a pilha (que possui o HEAP, área onde se localiza as variáveis dinâmicas,
e o STACK, endereços de retorno de chamadas e parâmetros de funções).
A atribuição de endereço físico para as áreas de código e áreas de dados pode ser feita de três formas: em tempo de
compilação, em tempo de carga e em tempo de execução. Em tempo de compilação o programador já faz a
conversão de endereço lógico em endereço físico, pois ele tem conhecimento de qual área da memória ira utilizar.
Em tempo de carga o código precisa ser relocável de forma que todas as referências a memória sejam corrigidas para
que o endereço de carga corresponda (carregador relocador), em outras palavras no momento da carga o programa
executável é interpretado e os endereços corrigidos, dispensando a MMU. Em tempo de execução tem-se o código
absoluto e é realizada uma relocação dinâmica usando a MMU, não sendo necessário corrigir os endereços no
momento da carga do programa em memória.
Gerência de memória 7
Gerenciamento Básico de Memória
Os Sistemas de Gerenciamento de Memória podem ser divididos em duas classes: aqueles que levam e trazem
processos entre a memória principal e o disco durante a execução (fazendo troca de processos e paginação) e aqueles
que mantém os processos fixos em memória primária. As próximas seções apresentam os mesmos.
Monoprogramação
A monoprogramação consiste em executar um processo por vez na memória, dessa forma todos os recursos de
hardware são exclusivos para execução do mesmo.
Monoprogramação sem troca ou paginação
Este é o esquema mais simples possível: só é possível executar um programa de cada vez, compartilhando a memória
entre o programa e o S.O. Existem três variações para este modelo:
•• O SO é carregado na parte inferior da memória, em RAM (Random Access Memory), e deixa a parte superior da
memória disponível para o processo do usuário. O endereçamento por parte do processo usuário inicia do fim da
RAM até o limite da memória.
•• O SO é carregado na parte superior da memória, em ROM (Read-Only Memory), e deixa a parte inferior da
memória disponível para o processo do usuário. O endereçamento do processo usuário vai do endereço 0 ao início
da ROM.
•• Os drives do SO são carregados em ROM (parte superior) e o restante do SO é carregado em RAM (parte
inferior).
Quando o sistema está organizado desta maneira, somente um processo por vez pode estar executando, desta forma
esse tipo de sistema é usado em aplicações de caráter muito específico, como por exemplo sistemas de controle de
temperatura ou pressão.
Multiprogramação
A multiprogramação nada mais é que manter diversos processos na memória, e essa memória precisa ser dividida de
maneira eficiente para que possamos manter o número máximo de processos. Existem diversas técnicas para
gerenciar memória que variam de acordo com o hardware do processador.
Multiprogramação com Partições Fixas
A maneira mais simples de implementar a multiprogramação, em termos de memória, é dividir a mesma,
primeiramente em uma parte para uso do sistema operacional e outra para uso dos processos de usuários. Depois, a
parte dos usuários é dividida em n partições de tamanhos diferentes, porém com valores fixos. Quando um programa
chega, há duas possibilidades: ele é colocado em uma fila de entrada da menor partição capaz de armazená-lo ou ele
é colocado em uma fila de entrada única.
Com o esquema das partições de tamanho fixos, qualquer espaço não ocupado por um programa é perdido. Na
maioria das vezes o programa a ser executado é menor do que a partição alocada para ele. A partição alocada não
pode ser menor que o tamanho do programa e é improvável que o tamanho do programa seja exatamente igual ao da
partição alocada. Assim, é muito provável que ocorra desperdício de memória para cada programa alocado. Esse
desperdício é chamado fragmentação interna, ou seja, perde-se memória dentro do espaço alocado ao processo.
Há outra possibilidade de desperdício de espaço de memória, chamada de fragmentação externa. Ela ocorre quando
se desperdiça memória fora do espaço ocupado por um processo. Por exemplo, suponha que há duas partições
disponíveis e o processo necessita de uma partição de tamanho maior que qualquer uma das duas livres, e ainda,
menor que o total de memória livre, somando-se o tamanho de todas partições livres. Neste caso, o processo não será
executado devido ao esquema que a memória é gerenciada, mesmo que exista memória total livre disponível.
Gerência de memória 8
Outra desvantagem de classificar os programas em entradas separadas é apresentada quando uma fila para uma
partição grande está vazia e filas para partições pequenas estão muito cheias. Uma possível alternativa é colocar
todos os programas em uma única fila de entrada e sempre que uma partição encontrar-se livre, alocar para o
próximo programa da fila. Para não desperdiçar espaço pode-se realizar uma pesquisa para selecionar o programa
que melhor se ajuste ao tamanho da partição. No entanto, isto pode deixar programas pequenos de fora, o que
também é indesejável. Neste caso, é interessante dispor de pelo menos uma partição pequena para programas
pequenos ou criar uma regra que limite o número de vezes que um programa pode ser ignorado, obrigando que o
mesmo seja selecionado em um determinado momento.
Dois conceitos importantes devem ser introduzidos quando há ocorrência de multiprogramação: realocação e
proteção.
Programas (jobs) diferentes são colocados em endereços diferentes (partições). Quando um programa é vinculado, o
linkeditor deve saber em que endereço o programa deve começar na memória. Como o gerenciador de memória só
decide em qual partição (endereço) o programa vai executar quando este chegar, não há garantia sobre em qual
partição um programa vai realmente ser executado. Este problema é conhecido como realocação: modificação dos
endereços especificados dentro do programa de acordo com a partição onde ele foi colocado.
Outra questão importante está na proteção: programas diferentes não podem ter acesso a dados e/ou instruções fora
de sua partição. Sem esta proteção, a construção de sistemas maliciosos seria facilitada. Uma possível alternativa
para ambos os problemas é equipar a máquina com dois registradores especiais de hardware chamados registradores
de base (RB) e registradores de limite (RL). Quando um processo é agendado, o registrador de base é carregado com
o endereço de início de sua partição e o registrador de limite com o comprimento de sua partição. Assim, instruções
são verificadas em relação ao seu endereço de armazenamento e para verificar se o mesmo não está fora da partição.
O hardware protege os RB e RL para impedir que programas de usuário os modifiquem.
Multiprogramação com Partições Variáveis
Nesse modelo, o tamanho das partições são ajustados de acordo com as necessidades dos processos. Os espaços
livres na memória física são mantidos pelo sistema operacional em uma lista, chamada de lista de lacunas. Quando
um processo é criado essa lista é percorrida em busca de uma lacuna de tamanho maiorou igual ao requisitado pelo
processo, se a lacuna possuir um tamanho maior do que o necessário, será criada uma nova lacuna com a porção
extra, dessa forma, o processo receberá o tamanho exato de que necessita.
Existem quatro formas de percorrer a lista de lacunas:
• First-Fit: utiliza a primeira lacuna com tamanho suficiente;
• Best-Fit: utiliza a lacuna que possuir a menor sobra;
• Worst-Fit: utiliza a lacuna que possuir a maior sobra;
• Circular-Fit: igual ao First-Fit, mas inicia a procura na lacuna seguinte à última sobra.
Quando o processo termina, e a memória é liberada, é criada uma nova lacuna. Se essa lacuna for adjacente a outras,
elas são unificadas.
Com as partições variáveis deixa-se de ter fragmentação interna mas continua com a fragmentação externa (espaços
vazios não contíguos), uma solução para resolver este problema seria relocar as partições de forma a eliminar os
espaços entre partições criando uma única área contígua porém essa solução consome muito o processador e o acesso
ao disco, visto que a cada acesso na memória seria necessário verificar a possibilidade de realocação.
Gerência de memória 9
Gerenciamento de memória livre
Além de gerenciar quais espaços em memória estão em uso, é também necessário controlar os espaços de memória
livres. Existem duas técnicas mais utilizadas para resolver este problema, estas serão vistas nas próximas seções.
Gerenciamento de memória livre com mapas de bits
Com mapas de bits, a memória é dividida em unidades de alocação. Cada bit do mapa representa uma unidade de
alocação, sendo que se o bit for 0, a unidade está livre; caso contrário, a unidade está ocupada. Quanto menor for a
unidade de alocação, maior será o mapa de bits e vice-versa. O maior problema com os mapas de bits é que procurar
uma lacuna (seqüência de 0s) suficientemente grande para um determinado processo pode ser uma operação muito
lenta.
O SO mantém um 1 bit para indicar se cada bloco da memória (ou unidade de alocação) está ocupado (1) ou livre
(0). A Memória é dividida em unidades de alocação. Considerações sobre o tamanho do bloco de memória:
Quanto menor a unidade de alocação, maior será o mapa de bits.
- Pequeno: necessidade de muitos bits ⇒ uso ineficiente da memória. Exemplo: se tamanho do bloco = 1 byte, 1/9 da
memória serão utilizados para o mapa de bits.
- Grande: memória sub-utilizada, pois se o tamanho do processo não for múltiplo do tamanho da unidade de
alocação, uma quantidade de memória considerável será desperdiçada no último bloco.
Vantagens do uso de mapa de bits:
•• Simplicidade: o tamanho do mapa depende apenas do tamanho da memória e das unidades de alocação.
Desvantagens:
•• Quanto um processo necessita de k unidades de alocação, o gerenciador de memória deve encontrar uma
sequência de k bits 0, o que se constitui um processo lento.
Gerenciamento de memória livre com listas encadeadas
Neste caso, é mantida uma lista encadeada com os segmentos de memória livres e encadeados. Uma possível
configuração seria manter, em cada entrada, o endereço em que inicia, o seu comprimento e, evidentemente, o
ponteiro para a próxima entrada.
A principal vantagem de utilizar uma lista encadeada classificada por endereço é que sua atualização é simples e
direta. Vários algoritmos podem ser utilizados para encontrar uma lacuna de memória para alocação de um processo:
1.1. Primeiro ajuste: varre a lista desde o início e aloca no primeiro espaço (lacuna) suficientemente grande;
2.2. Próximo ajuste: varre a lista da posição atual e aloca no primeiro espaço suficientemente grande;
3.3. Melhor ajuste: varre a lista completamente e aloca no espaço que gerar a menor lacuna de memória;
4.4. Pior ajuste: varre a lista completamente e aloca no espaço que gerar a maior lacuna de memória disponível, de
modo que a lacuna resultante possa ser suficientemente grande para ser útil;
5.5. Ajuste rápido: mantém diversas listas separadas para os tamanhos de processos mais comuns.
Memória Virtual
A base do funcionamento da Memória Virtual é o Princípio da Localidade que estabelece que há uma tendência
que os futuros endereços de memória de instruções e dados sejam próximos a endereços de memória recentemente
acessados. Esse comportamento se deve as características peculiares aos programas, que frequentemente fazem uso
de endereços em sequência (vetores), localizados em blocos de código bem definidos e frequentemente invocados
(funções), ou de códigos repetitivos (laços de repetição).
A ideia básica da memória virtual é que o tamanho combinado do programa, dos seus dados e da pilha pode exceder
a quantidade de memória física disponível para ele, ou seja, neste caso, a simples troca, vista anteriormente, não
Gerência de memória 10
resolveria o problema. O Sistema Operacional, então, mantém partes do programa atualmente em uso, em forma de
páginas ou segmentos, na memória principal e o restante em disco. Essas páginas/segmentos são "trocados" entre
memória principal e secundária conforme o SO as solicita, conforme a demanda do programa.
A memória virtual também pode trabalhar em um sistema de multiprogramação, com pedaços de vários programas
na memória simultaneamente. Enquanto um programa está esperando parte dele próprio ser trazido para a memória
(ele fica esperando a E/S e não pode executar) a CPU pode ser dada a outro processo, assim como em qualquer
sistema de multiprogramação.
Para a implementação desta técnica, alguns recursos mínimos são necessários: localização da página através do
hardware MMU, carga de página, substituição de página e área de troca, partição ou arquivo especial de troca (swap
ou página) destinada a armazenar páginas.
Muitos sistemas de Memória Virtual utilizam uma técnica denominada paginação, vista mais adiante.
Troca (Swapping)
Em algumas situações não é possível manter todos os processos na memória e uma solução para essas situações é o
mecanismo conhecido como swapping (troca). A gerência de memória reserva uma área do disco para esse
mecanismo, que é utilizada para receber processos da memória. A execução desse processo é suspensa, com isso é
dito que o mesmo sofreu uma swap-out. Mais tarde, esse mesmo processo será copiado do disco para a memória,
mecanismo conhecido como swap-in. Esse mecanismo de trocas de processos no disco tem como objetivo permitir
que o sistema operacional consiga executar mais processos do que caberia na memória.
Esse processo gera um grande custo de tempo de execução para os programas. Fazer a cópia do processo da memória
para o disco e depois fazer o inverso é demorado.
Paginação
O espaço de endereço virtual é dividido em unidades chamadas páginas. As unidades correspondentes na memória
física são chamadas molduras de página (ou quadros). As páginas e as molduras (quadros) têm sempre exatamente o
mesmo tamanho.
No espaço físico (memória) tem-se várias molduras de página. Por exemplo, podem existir 05 páginas situadas no
espaço de endereço virtual que são mapeadas na memória física. No entanto, o espaço de endereço virtual é maior
que o físico. As outras páginas não são mapeadas. No hardware real, um bit presente/ausente em cada entrada
monitora se a página é mapeada ou não.
Quando um programa tenta utilizar uma página não mapeada em uma moldura, a MMU detecta o acontecimento
(que a página não está mapeada) e gera uma interrupção, passando a CPU para o Sistema Operacional. Tal
interrupção é chamada falha de página. O S.O., então, seleciona uma moldura de página pouco utilizada e grava o
seu conteúdo de volta ao disco, substituindo-a pela página requisitada.
Quanto à forma como a paginação pode ser implementada, podemos considerar a paginação simples e a paginação
por demanda. Na primeira, todas as páginas lógicas do processo são mapeadas e carregadas para a memória física,
isso supondo-se que o espaço de endereçamento de memória para um processo tenha o tamanho máximo igual à
capacidade da memória física alocadapara processos. No caso da paginação por demanda, apenas as páginas lógicas
efetivamente acessadas pelos processo são carregadas. Nesse caso, uma página marcada como inválida na tabela de
páginas de um processo pode tanto significar que a página está fora do espaço lógico de endereçamento do processo
ou que simplesmente a página ainda não foi carregada. Para descobrir qual das situações é a verdadeira basta conferir
o descritor de processo, que contém os limites de endereçamento lógico do processo em questão.
Gerência de memória 11
Tabelas de Página
O propósito de tabelas de página é mapear páginas virtuais em molduras de página. No entanto, existem duas
questões que devem ser consideradas:
•• A tabela de páginas pode ser extremamente grande, sendo que cada processo necessita de sua própria tabela de
páginas;
•• O mapeamento deve ser rápido: o mapeamento do virtual para o físico deve ser feito em cada referência da
memória, o que pode ocorrer diversas vezes em uma única instrução,não devendo tomar muito tempo para não se
tornar um gargalo na execução da instrução.
Neste caso, há a necessidade de um mapeamento de páginas rápido e grande. Existem duas formas básicas de
projetar tabelas de páginas:
1.1. ter uma única tabela de páginas, através de uma matriz de rápidos registradores de hardware, com uma entrada
para cada página virtual, indexada pelo número da página. Esta é uma solução cara se a tabela de páginas é
grande;
2.2. manter a tabela de páginas inteiramente na memória principal, sendo que o hardware precisa de apenas um
registrador que aponta para o início da tabela de páginas.
Esta última solução possui algumas variações que têm desempenho melhor. Uma das propostas que busca evitar o
problema de ter enormes tabelas de páginas na memória todo tempo é a de Tabelas de Páginas Multinível. Neste
caso, existe uma tabela de primeiro nível e diversas tabelas de segundo nível. O importante aqui é que somente as
tabelas mais utilizadas estão presentemente na memória. As demais se encontram em disco. Apesar de permitir um
espaço de endereçamento muito grande, o espaço ocupado de memória principal é muito pequeno.
O sistema de tabela de páginas de dois níveis pode ser expandido para três, quatro ou mais níveis, sendo que níveis
adicionais dão mais flexibilidade, mas a complexidade da implementação acima de três níveis dificilmente vale a
pena. Em relação aos detalhes de uma única entrada de uma tabela de páginas, seu arranjo pode depender da
máquina, mas os tipos de informação usualmente são os mesmos.
O campo mais importante é o número da moldura de página, pois o objetivo do mapeamento de páginas é localizar
este valor. Ao lado dele, tem-se o bit de presente/ausente. Se este bit for 1, significa que a entrada é válida e pode ser
utilizada. Se for 0, a página virtual a que esta entrada pertence não está atualmente na memória. Ao acessar uma
entrada da tabela de páginas com este bit configurado como zero ocorrerá uma falha de página.
Os bits "proteção" informam que tipos de acesso são permitidos. Em sua forma simples, este campo contém apenas
um bit, com 0 para leitura/gravação e 1 par leitura somente. Um arranjo mais sofisticado é manter 3 bits, cada um
para habilitar leitura, gravação e execução da página. Os bits "modificada" e "referenciada" monitoram a utilização
da página. Ambos os bits tem como objetivo auxiliar no momento da substituição de páginas. O último bit permite
que o cache seja desativado para a página, recurso importante para páginas que são mapeadas em registradores de
dispositivo em vez da memória.
Alguns bits auxiliares são, normalmente, adicionados na tabela de páginas para facilitar na substituição de páginas
quando a memória física estiver cheia e for necessário retirar uma página lógica da memória física para alocar outra
página lógica. Tem-se o bit de modificação (dirty bit) assim que a página for carregada tem valor zero se a página for
alterada, na memória física, altera-se o valor para 1, portanto se a página for a página vítima e o bit de modificação
for zero não será necessário fazer a cópia da página lógica em memória para a página lógica em disco pois as duas
são iguais. Bit de referência: é zero assim que a página lógica é alocada na página física, se a página for acessada
altera o valor para um (a MMU altera o valor). Bit de trava: usado em páginas que não podem sair da memória física,
o Sistema Operacional "tranca" uma página lógica na memória física ativando esse bit.
Gerência de memória 12
TLBs – Translation Lookside Buffers – Memória Associativa
A TLB, também conhecida como memória associativa, é um dispositivo de hardware cujo propósito é mapear
endereços virtuais em endereços físicos sem passar pela tabela de páginas. Usualmente, ela faz parte da MMU.
Ela constitui-se de um banco de registradores que armazenam um pequeno número de entradas, muito rápidas,
contendo as tabelas de páginas mais utilizadas. Quando um endereço virtual é enviado a MMU, ela primeiramente
verifica se o seu número de página virtual está presente na TLB. Se o resultado for positivo (hit), a moldura de
página é tomada diretamente da TLB sem a necessidade de passar pela tabela de páginas na memória (mais lento).
Caso contrário (miss), a pesquisa é feita normalmente na tabela de páginas presente na memória. Então, uma das
entradas é removida da TLB e a entrada da tabela de páginas pesquisada é colocada em seu lugar.
A TLB melhora bastante o desempenho no acesso à tabela de páginas, visto que registradores são muito mais rápidos
que a memória RAM. Suas desvantagens estão em seu custo (registradores são caros), seu tamanho limitado e o fato
de existir uma única TLB na MMU, sendo esta compartilhada por todos os processos.
Para calcularmos o desempenho da TLB, podemos tomar h como taxa de acerto (taxa em que a página necessária
estará na TLB). Então o erro seria 1-h. Sendo assim, a tempo de acesso hit (tempo necessário para pegar a página da
TLB) é dada pelo tempo de acesso à TLB mais o tempo de acesso à memória uma única vez. Enquanto o tempo de
acesso miss (quando falta a página na TLB) é dada pelo tempo de acesso à TLB mais o tempo de dois acessos à
memória. O tempo de acesso médio é dado pelo tempo de acesso hit multiplicado por h somado do tempo de acesso
miss multiplicado por (1-h). Resumindo em fórmulas, temos:
•• TacessoHit = TacessoTLB + TacessoMemoria
•• TacessoMiss = TacessoTLB + TacessoMemoria + TacessoMemoria
•• TacessoMedio = h x TacessoHit + (1-h) x TacessoMiss
A taxa de acerto (h) depende do tamanho da TLB e do algoritmo que a controla, mantendo as páginas mais
utilizadas.
Tabelas de Páginas Invertidas
Outra abordagem para trabalhar com páginas é manter uma tabela onde cada entrada representa uma moldura de
página ao invés de um endereço virtual. Desta forma, a entrada deve monitorar qual página virtual está associada
àquela moldura de página. Embora as tabelas de páginas invertidas economizem quantidade significativas de espaço
(pelo menos nas situações em que o espaço de endereço virtual é muito maior que a memória física), elas tem a
desvantagem de que o mapeamento (tradução) do endereço virtual para o físico é mais complexo e potencialmente
mais lento. Uma forma de facilitar a tradução do virtual para o físico é a utilização da TLB pesquisada por software.
A pesquisa pode ser feita a partir de um encadeamento de páginas páginas virtuais que possuam um mesmo endereço
hash.
Tamanho de página
Um ponto do qual o projetista deve se preocupar é com o tamanho da página. Conforme visto anteriormente, se esse
tamanho de página for grande, pode ocorrer de o processo utilizador não ocupar todo o espaço a ele destinado. Se a
página tiver um tamanho demasiadamente pequeno, a tabela de páginas será muito grande.
É possível uma modelagem matemática. Considere que cada processo tenha tamanho de s bytes, e cada página tenha
tamanho de p bytes. A tabela de páginas terá um espaçode e bytes por entrada. Assim, o numero de páginas que um
processo precisará é de s/p. O espaço que esse processo ocupa na tabela de páginas é s*e/p. O tamanho perdido na
última página devido a fragmentação interna será de p/2.
Assim, haverá um custo de s*e/p + p/2 da tabela de páginas. Para que o tamanho da página seja ideal, o custo será
zero. Dessa forma, derivando a expressão anterior e igualando a zero obtemos que o tamanho ideal de página é de
s*e*sqrt(2).
Gerência de memória 13
Thrashing
Estado no qual o sistema operacional ao invés de executar instruções efetivas "gasta" tempo efetuando a troca de
páginas entre memória física e memória lógica, em outras palavras desperdiça um tempo significante trazendo ou
removendo páginas da memória. Para o usuário a sensação é que o sistema está travado ou congelado e para o
hardware há um significante acesso ao disco ao invés de processamento.
Algoritmos de substituição de páginas
Como visto anteriormente, sempre que uma página (endereço virtual) não estiver em uma moldura de página, uma
interrupção ocorre e ela deve ser carregada para uma moldura antes de ser executada. No entanto, alguma página que
está atualmente em uma moldura deve ser retirada (gravada em disco). Veja que o algoritmo escolhido afeta
diretamente o desempenho do sistema como um todo, pois "uma escolha errada significa que a página removida será novamente
acessada em seguida, gerando uma nova falta de página. É importante que o algoritmo usado seja capaz de remover da memória física páginas que
provavelmente não serão necessárias em seguida."[R. da S. Oliveira, A. da S. Carissimi e S. S. Toscani; Sistemas Operacionais 2ª ed]
Os algoritmos de substituição de páginas se preocupam em escolher a melhor página a ser retirada da moldura.
Existem várias alternativas:
• algoritmo de substituição de página ótimo: deve ser retirada a página que só será referenciada o mais tarde
possível. Apesar de, teoricamente, ser um algoritmo interessante, é extremamente difícil prever quando uma
página será referenciada;
•• algoritmo de substituição de página não recentemente utilizada(NRU): o S.O. e o hardware mantêm uma coleção
de estatísticas sobre as páginas referenciadas e/ou modificadas (através dos bits de referência e modificação das
entradas da tabela de páginas) e dão preferência para a troca de páginas não referenciadas e/ou não modificadas;
• algoritmo de substituição de página “primeira a entrar, primeira a sair (FIFO – first-in first-out): a página mais
antiga é removida.No entanto, pode estar sendo removida uma página bastante utilizada;
•• algoritmo de substituição de página de segunda chance(SC): uma modificação do algoritmo FIFO, que busca não
substituir uma página antiga e, no entanto, bastante utilizada. A solução é inspecionar o bit R (referenciada) da
página mais antiga; se o bit for 1 (foi referenciada) o bit será limpo e a pesquisa continua. Se todas as páginas
tiverem sido referenciadas, o algoritmo FIFO acaba sendo executado e a página mais antiga (que agora estará com
o bit R limpo) será substituída;
• algoritmo de substituição de página menos recentemente utilizada (LRU – least recently used): a idéia é que as
páginas que foram intensamente utilizadas nas últimas instruções provavelmente serão utilizadas de forma intensa
no futuro próximo. Desta forma, deve ser removida a página que não foi utilizada por mais tempo.
• algoritmo de substituição de página relógio: O algoritmo SC, apesar de mais eficiente do que algoritmo FIFO,
reinsere págimas no final da lista constantemente. Uma solução para isso é q a lista seja ordenada em uma
circularmente tal como um relógio. O ponteiro do relogio aponta para a pagina mais antiga e assim que ocorrer
uma falta a pagina mais antiga é inspecionada. Se o bit R dessa pagina for 0 ele é substituida, se não esse bit é
setado como 0 e o ponteiro aponta para a proxima pagina mais antiga. Esse proesso é então repetido até a proxima
pagina com o bit 0 ser encontrada.
•• algoritmo de substituição de página menos recentemente utilizada(MRU):Trabalha de forma oposta ao algoritmo
otimo, pois há a possibilidade de que as paginas que não foram referenciadas continuem não sendo referenciadas.
A tarefa de implementa-ló é trabalhosa mas possivel. Ele pode ser implementado de uma maneira mais simples
com um contador de 64-bits que é incrementado automaticamente após cada intrução e a tabel de paginas deve ter
um campo extra para armazenar o valor do contador. O valor é então armazenado neste campo correpondente à
pagina que acabou de ser referênciada. Quando o corre a falta o S.O. examina esse campo e substitui a pagina que
tiver o menor deles.Pode-se tambem implementalo com o auxílio de um hardware especial.
Gerência de memória 14
Segmentação
A memória virtual apresentada anteriormente é unidimensional, ou seja, os endereços virtuais vão de 0 até algum
valor máximo. No entanto, em alguns casos, ter dois ou mais espaços de endereços virtuais separados é uma
estratégia interessante. A segmentação prove à máquina vários espaços de endereço completamente independentes,
chamados segmentos, liberando o programador da tarefa de gerenciar a expansão e a contração de tabelas, da mesma
forma que a memória virtual elimina a preocupação de organizar o programa em overlays.
Os comprimentos de cada segmento podem ser diferentes e podem variar durante a execução. Como cada segmento
constitui um espaço de endereçamento completamente independente e diferente, eles podem aumentar ou encolher
sem afetar um ao outro. Para especificar um endereço neste tipo de memória segmentada, o programa deve fornecer
um endereço de duas partes: um número de segmento e o endereço dentro do segmento. É importante salientar que
cada segmento pode conter várias páginas, logo, toda a discussão apresentada anteriormente sobre paginação
continua válida aqui. Outra questão fundamental é que, diferentemente da paginação, que é executada inteiramente
pelo S.O., os segmentos são entidades lógicas das quais o programador está ciente e as quais ele pode utilizar como
qualquer entidade lógica. Um segmento pode conter um procedimento ou uma matriz, ou uma pilha, mas
normalmente ele não contém uma mistura de tipos diferentes.
Como cada segmento forma uma entidade lógica da qual o programador está ciente (tal como pilha, procedimentos,
etc.) segmentos diferentes podem ter tipos de proteção diferentes: é possível especificar que um procedimento só
pode ser executado (sendo proibido ler ou armazenar nele), dados poderão ser lidos e gravados e assim por diante.
Este tipo de proteção é útil para detectar erros de programação. A proteção na memória segmentada é importante
porque o usuário está ciente do que está em cada segmento. Este modelo é difícil de aplicar a paginação, pois a
paginação é invisível ao programador (que não tem como saber de antemão em que página ou moldura um
determinado pedaço de programa está), o que não possibilita a separação dos tipos em cada página.
Uma das possibilidades da segmentação é que ela pode facilitar o compartilhamento de procedimentos e/ou dados
entre vários processos. Um exemplo é uma biblioteca compartilhada. Neste caso, os procedimentos desta biblioteca
permanecem em um único segmento que pode ser utilizado por diversos programas (processos), sem que cada um
precise possuí-la em seu espaço de endereço.
A implementação da segmentação difere da paginação porque as páginas têm tamanho fixo e os segmentos não. A
substituição dos processos gera lacunas fazendo com que a memória se transforme em um tabuleiro de xadrez,
formado por segmentos e lacunas, que pode ser tratado com compactação. No entanto, se os segmentos são grandes
pode ser impossível mantê-los na memória principal em sua totalidade (segmentação pura). Neste caso, pode ocorrer
uma segmentação com paginação: o espaço lógico é dividido em segmentos, este são divididos em páginas lógicas
sendo que cadasegmento terá uma tabela de páginas associada. A segmentação com paginação pode ser
implementada de formas diferentes dependendo do sistema computacional. No Pentium, por exemplo, duas tabelas
são utilizadas para a implantação da segmentação: a LDT (Local Descriptor Table) e a GDT (Global Descriptor
Table). Cada programa tem sua própria LDT, mas há uma única GDT compartilhada por todos os programas no
computador. A LDT descreve segmentos locais para cada programa e a GDT descreve segmentos do sistema,
incluindo o próprio S.O. Com a paginação ativada, os endereços gerados são considerados virtuais e o mapeamento
para o endereço físico ocorre como explicado anteriormente.
Gerência de memória 15
Segmentação com Paginação
A segmentação com paginação vem como uma solução aos problemas da segmentação e da paginação.Utilizando o
meio termo entre os dois métodos combinaremos suas vantagens:
•• A fragmentação interna da paginação é reduzida pela segmentação.
•• A fragmentação externa da segmentação é eliminada pela paginação.
•• A paginação passaria de forma invisível ao programador.
•• A segmentação ofereceria a divisão do processo em módulos(segmentos).
•• Teriamos a facilidade do compartilhamento e proteção da memória pela segmentação.
Basicamente,teriamos um segmento composto por um número fixo e reduzido de bytes(páginas). A desvantagen
seria o uso de 2 tabelas(segmentação e a de paginação) e devido as páginas serem menores teriamos que a tabela de
paginação seria maior.
Conclusões
Sistemas computacionais mais simples não precisam realizar nenhum tipo de gerenciamento pois, usualmente, seus
programas rodam diretamente na memória principal disponível. No entanto, esta não é a situação mais comum. Na
maioria dos sistemas em uso, os programas são muito maiores que a quantidade de memória principal disponível
e/ou é necessário rodar mais de um programa ao mesmo tempo. Nestes casos, a utilização de esquemas de troca,
páginas e segmentos pode ser uma alternativa. Um modelo de memória virtual, que fornece um espaço de
endereçamento maior do que o físico, pode ser disponibilizado para os programadores no desenvolvimento de seus
sistemas. Internamente, no entanto, o S.O. deve ser capaz de gerenciar a memória de forma a manter as partes do
programa em uso na memória principal, armazenando as demais partes em disco.
Gerência de dispositivos de entrada e saída
Uma das principais funções do Sistema Operacional é gerenciar os dispositivos de Entrada e Saída (E/S) ligados ao
computador.
É tarefa do sistema operacional enviar sinais, informando as ações que o usuário espera que o dispositivo realize;
tratar as interrupções e erros gerados pelos dispositivos.
Gerência de dispositivos de entrada e saída 16
Existem duas visões sobre o hardware de E/S: A dos engenheiros, que os vêem como chips, ligações elétricas, etc. E
a visão dos programadores, que vêem uma interface de programação para se comunicar com o dispositivo.
Controladores de dispositivos
Dispositivos de hardware precisam ser controlados para proporcionar a entrada e saída de dados para o processador.
O controle do hardware é realizado por meio de hardware e software apropriados.
A porção de hardware é denominado controlador de hardware e segue padrões determinados pelo barramento (IDE,
SCSI, USB, etc), assim, ligados a cada tipo de barramento existem controladores de hardware: controladora de
hardware IDE, controladora de hardware SCSI, etc.
Para utilizar um dispositivo de hardware, é necessário conectá-lo a interface física da controladora de hardware. Por
exemplo, um disco rígido IDE deve ser conectado a uma das quatro interfaces disponíveis pela controladora IDE.
Em geral, o Sistema Operacional pode ter softwares controladores de dispositivo (driver de dispositivos). Os drivers
de dispositivos para a controladora de hardware, geralmente são genéricos, embutidos no próprio Sistema
Operacional. E os drivers para dispositivos de hardware são geralmente específicos, uma vez que controlam
funcionalidades específicas providas pelos fabricantes.
Periférico é dado como qualquer dispositivo de hardware conectado a um computador de forma a permitir a sua
interação com o mundo externo.
Princípios do software de E/S
Independência do dispositivo
Esse conceito trabalho sobre a possibilidade de escrever programas capazes de acessar um dispositivo E/S sem que
seja necessário um conhecimento prévio sobre qual é o dispositivo. Ou seja, um programa deverá ser capaz de
ler/escrever um arquivo da mesma forma para qualquer dispositivo. Para o caso de se obter a entrada de um
dispositivo para saída em outro - como em "/dispositivo1/arquivo > /dispositivo2", o Sistema Operacional fica
incumbido de tratar dos problemas causados pelo fato de os dispositivos serem desiguais e necessitarem de
sequências de comandos muito diferentes para leitura e escrita.
Nomeação uniforme
O nome de um arquivo ou de um dispositivo deveria ser uma cadeia de strings ou um número inteiro totalmente
independente do dispositivo. Dessa forma, o arquivos e diretórios são endereçados pelo nome do caminho.
Tratamento de erros
De maneira geral, espera-se que os erros, como de leitura por exemplo, sejam tratados em níveis mais baixos, o mais
próximo do hardware.
Tipos de conexão e de transferência de dados
Os dispositivos I/O podem se conectar de forma serial ou paralela. Na interface serial existe apenas uma linha por
onde os dados trafegam. Na interface paralela os dados são transmitidos simultaneamente através das várias linhas
para dados, a quantidade de linhas é um múltiplo de 1 byte (8 bits).
As informações sobre os endereçamentos de I/O ficam armazenadas, Sistema Operacional Linux, no arquivo
/proc/ioports
A transferência pode ser síncrona (bloqueante) - a CPU inicia uma transferência e segue realizando outra atividade
até ser sinalizada por um interrupção (o que acontece na maioria das E/S físicas), ou assíncrona (orientada à
interrupção) - após um read, o programa é suspenso até que os dados estejam disponíveis no buffer.
Gerência de dispositivos de entrada e saída 17
Software de E/S
O principal objetivo do software gerenciador de E/S é padronizar ao máximo o acesso e controle dos dispositivos,
permitindo a inserção de novos dispositivos no sistema computacional sem a necessidade de um outro software
auxiliar. Isso se torna uma tarefa bastante complicada devido à grande variedade, complexidade e particularidades
dos dispositivos periféricos encontrados. Para facilitar isso, o software de E/S é geralmente é dividido em camadas.
Cada camada tem uma função bem definida para executar e uma interface também bem definida para as camadas
adjacentes, por meio de uma serie de operações comuns a todos os dispositivos. Uma forma de implementação dessa
estrutura é dividir o software em quatro camadas, onde temos a camada superior sendo a E/S vista pelo usuário; a
segunda camada o software que enxerga E/S da mesma forma, independente do dispositivo; a terceira camada serve
como interface padrão para drivers, e a ultima (mais inferior), composta pelos drivers propriamente ditos.
Utilização de buffer
O buffer pode ser utilizado em momentos em que os dados não podem ser armazenadas em seu destino final - como
acontece com os pacotes que são recebidos pela rede e que precisam ser examinados. Outro exemplo são os
dispositivos que apresentam restrições de tempo real, em que os dados devem ser antecipadamente colocados em um
buffer de saída a fim de separar a taxa com a qual o buffer é preenchido.Essa taxa é calculada a partir da taxa com a
qual ele é esvaziado. Dessa forma, evita-se a sobreposição do buffer.
Dispositivos compartilhados vs dedicados
Alguns dispositivos, como discos, podem ser usados por vários usuários simultaneamente. Outros, como dispositivos
de fita, devem ser dedicados a um usuário até que este termine sua tarefas. O Sistema Operacional deve ser capaz de
tratarambos, de forma a evitar problemas.
Impasses (Deadlock)
Como dito anteriormente, alguns dispositivos devem ser dedicados a um usuário até que este termine sua tarefa, não
podendo ser interrompido para atender a solicitação de outro processo. Quando dois processos alocam recursos para
si de forma que nenhum dois possa realizar a tarefa, mas também nenhum dos dois disponibilizam estes recursos
antes de realizar a tarefa estes processos encontram-se em um impasse (deadlock) e permaneceram ali até que um
fator externo os retire dessa situação. O princípio básico do impasse é descrito formalmente: Um conjunto de
processos está em um impasse se cada processo do conjunto está esperando um evento que somente outro processo
do conjunto pode causar. Como todos os processo estão esperando, nenhum deles jamais causará qualquer dos
eventos que poderiam acordar qualquer dos outros membros do conjunto e todos os processos continuam a esperar
eternamente.
Dispositivos de Entrada e Saída
Dispositivos de entrada e saída também chamados de dispositivos de I/O e são classificados em três tipos: Caractere,
Bloco, Pseudo-dispositivos.
Essa classificação não é 100% abrangente, uma vez que relógios (temporizadores) em hardware não podem ser
classificados em nenhum destes tipos.
Tais dispositivos se interagem com o SO através de interrupções que podem ser tratadas pelo proprio SO para que
seus dados de I/O sejam encaminhadas corretamente.
Nem todos os dispositivos de E/S se enquadram nessas duas categorias, por exemplo o relógio que apenas gera sinais
de interrupção. Tal dispositivo trabalha em uma ampla variação de velocidade, o que impõe uma considerável
pressão sobre o software, que deve trabalhar bem diante das mais diferentes ordens de magnitude de velocidade.
Gerência de dispositivos de entrada e saída 18
Dispositivos de Caractere
Os conhecidos dispositivos do tipo dispositivos de caractere são assim chamados por terem sua comunicação feita
através do envio e recebimento de um fluxo de caracteres. São usados, muitas vezes, para comunicação com
dispositivos de interface serial. Geralmente as implementações desse tipo priorizam a eficiência da comunicação em
vez do seu volume, neste sentido, é feita de forma não "bufferizada", sendo assim cada caracter é lido/escrito no
dispositivo imediatamente [necessita citação]. A exemplo de dispositivos de caracteres que priorizam a comunicação
e não necessitam de buffer temos o teclado e o mouse.A exemplo de dispositivos de caracteres que já priorizam o
volume ao invés da comunicação temos a impressora, devido a quantidade de dados que chega ser bem maior que
sua velocidade de impressão, logo possui um buffer de impressão.
Dispositivo de caracteres: É aquele que envia/recebe um fluxo de caracteres, sem considerar qualquer estrutura de
blocos, eles não são endereçáveis e não dispõe de qualquer operação de posicionamento. Impressoras e mouses são
exemplos desses dispositivos.
Dispositivos de Bloco
Os dispositivos do tipo dispositivos de bloco são similares aos dispositivos do tipo caractere, porém com uma
diferença: O modo de transmissão dos dados, que é feita na forma de blocos. São dispositivos que a comunicação é
feita por meio de blocos de dados como em HD's, drivers de CD-ROM, flash drivers e dispositivos de
armazenamento em geral.
Outra grande diferença é que os dispositivos de bloco em geral utilizam operações de entrada/saídas bufferizadas, no
sentido de otimizar o desempenho da transferência de dados. O Sistema Operacional aloca um buffer em um tipo de
memória para transferir blocos para cada processo de Entrada e Saída (E/S). Quando um processo envia/requisita
dados para/de um dispositivo, o buffer deve ser preenchido para concluir a operação de E/S. Ao encher, o buffer
completo é transferido e esvaziado para que seja liberado para uma nova operação.
Dispositivo de blocos é aquele que armazena informação em bloco de tamanho fixo, cada um com seu próprio
endereço. O tamanho dos blocos normalmente variam de 512 bytes a 32 K bytes. A propriedade essencial de um
dispositivo de blocos é que cada bloco pode ser lido/escrito independente dos outros. Discos, são exemplos desses
dispositivos.
Pseudo-Dispositivos
Em sistemas do tipo UNIX, arquivos de dispositivo especiais podem não possuir um dispositivo físico
correspondente, estes são chamados de "pseudo-dispositivos".
Ex: /dev/null (recebe dados a serem descartados, como uma 'lixeira') , /dev/random (gera números aleatórios) ,
/dev/zero (gera valores com valor 'zero', útil para criar arquivos preenchidos com esse valor).
Interrupção
Pedido de Interrupção (IRQ)
O Sistema Operacional (SO) chaveia entre os aplicativos ativos para que o usuário tenha a sensação de que estes
estão executando em paralelo. O SO permite que um aplicativo utilize o processador durante um determinado
período de tempo e então permite que outra aplicação o utilize. Como o chaveamento é feito de uma forma muito
rápida temos a impressão de que os aplicativos estão sendo executados ao mesmo tempo.
Um pedido de interrupção (abreviação IRQ (em inglês)) é a forma pela qual componentes de hardware requisitam
tempo computacional da CPU. Um IRQ é a sinalização de um pedido de interrupção de hardware.
Por exemplo: caracteres digitados no teclado, operações de leitura sobre o HD, dados recebidos pelo modem ou
mesmo movimentos do mouse devem ser executados mesmo que a máquina esteja processando alguma tarefa.
Gerência de dispositivos de entrada e saída 19
Dessa forma IRQ´s são canais de comunicação com o processador. Ao receber um pedido através de algum destes
canais, o processador percebe a solicitação de interrompimento de um dispositivo.
Quando um programa de usuário emite uma chamada ao sistema, esta é encaminhada ao driver apropriado. Para
evitar que a CPU fique ocupada interrogando se dispositivo terminou a operação de E/S (espera ociosa), o driver
pede ao dispositivo que lhe sinalize quando isso ocorrer. Dessa forma, o Sistema Operacional poderá executar outras
tarefas enquanto o programa que o chamou pedindo o serviço se encontra bloqueado. Ao final da operação, o
controlador do dispositivo gera uma interrupção, ao chip controlador de interrupção, para sinalizar à CPU.
Caso nenhuma outra interrupção esteja pendente ou em tratamento e nenhum outro dispositivo fez uma requisição de
maior prioridade no mesmo momento, a interrupção é tratada imediatamente. Caso contrário, ela é ignorada, e o
dispositivo continuará emitindo sinal de interrupção.
Após executar uma instrução, a CPU verifica as linhas de interrupções para saber se alguma interrupção foi
sinalizada
Caso tenha sido sinalizada uma interrupção, o hardware grava os registradores da CPU na pilha do programa que
estava em execução e carrega o contador de programa com o endereço da rotina referente à interrupção sinalizada
Interrupções podem ser geradas por hardware ou por software. No caso do hardware, pelo dispositivos periféricos ou
pelo relógio (timer). As interrupções geradas por software são conhecidas como system calls (chamadas ao sistema)
ou trap (armadilha). A diferença primordial entre as interrupções geradas por software e as geradas por hardware,
está no fato de que, conhecendo um programa e seus dados, é possível prever quando as interrupções de software
irão acontecer - o que não é possível no caso das interrupções de hardware.
Interrupções revisitadas
Em hardware, as interrupções trabalham da seguinte forma: quando um dispositivo de E/S finaliza seu trabalho ele
gera uma interrupção, enviando um sinal pela linha do barramento à qual está associado. O sinal é detectado pelo
chip controlador de interrupção localizado na placa mãe, o qual decide o que fazer. Caso esse chip esteja em uso por
outro sinal de interrupção ou seja enviado para esse chip outro sinal de maior prioridade, o sinal é posto em uma fila
para quando o chip ficar ocioso ele tratar esse sinal.
O hardware sempresalva certas informações antes de iniciar a rotina de tratamento da interrupção; no mínimo, o
contador de programas (PC) deve ser guardado.
Existem duas categorias de interrupções:
• Interrupção precisa → Deixa a máquina em um estado bem definido. Possui 4 propriedades:
•• 1. O contador de programa é salvo em um lugar conhecido;
•• 2. Todas as instruções anteriores àquela apontada pelo PC foram totalmente executadas;
•• 3. Nenhuma instrução posterior à apontada pelo PC foi executada;
•• 4. O estado de execução da instrução apontada pelo PC é conhecido.
• Interrupção imprecisa → Deixa a máquina em um estado não bem definido, pois tem concorrência interna.
Complica bastante a vida do projetista do SO, que se vê então obrigado a calcular o que já foi executado e aquilo
que ainda não foi executado, para isso é necessário guardar muito mais informação que o normal.
Gerência de dispositivos de entrada e saída 20
Tratadores de interrupção
As interrupções deveriam ser escondidas para que a menor parte possível do so soubesse de sua existência. A melhor
maneira é bloquear o driver que iniciou uma operação de e/s até que a e/s se complete e uma interrupção ocorra.
O efeito resultante da interrupção fará com que o driver previamente bloqueado esteja novamente apto a executar.
Esse modelo funciona bem sempre que os drivers são estruturados como processos do núcleo do sistema operacional,
com seus próprios estados, suas pilhas e seus contadores de programa.
Interrupções em sistemas Linux
Em antigos computadores, existiam apenas 8 interrupções de hardware. Nos atuais, existem 16 tipos de interrupções
de hardware, numeradas de 0 a 15.
As interrupções que ocorrem em computadores Linux podem ser vistas digitando no shell o comando:
$ cat /proc/interrupts
0 = É o timer do SO.
1 = Interrupção de teclado.
2 = Funciona como ponte para a interrupção 9, e é advinda dos antigos computadores com apenas 8 IRQ's. Dessa
forma, ela permite que esses computadores sejam utilizáveis, quando for necessário uso da interrupção 8 para cima.
3 = geralmente usada pela ttyS1, podendo ser usada por outros dispositivos como placas de rede.
4 = geralmente usada pela ttyS0. Quando é usado um mouse serial, ele trabalho através dessa IRQ.
5 = É a segunda porta paralela. Como muitos computadores não possuem essa porta, ela é muito usada pela placa de
som.
6 = Usada pelo controlador de disquete
7 = Antigamente, era a primeira porta da impressora. Atualmente várias impressoras não usam IRQ's.
8 = Relógio
9 = Ponte com a IRQ2.
10 = É uma interrupção geralmente livre. Geralmente usada por controladores USB.
11 = Outra interrupção livre
12 = Mais uma IRQ livre. Quando há um mouse PS/2, é trabalhada essa IRQ
13 = Processador de dados numérico.
14 = Usada pela primeira controladora de discos rígidos.
15 = Usada pela segunda controladora de discos rígidos.
Convém citar que as IRQ's 14 e 15 não podem ser compartilhadas, devido ao alto grau de importância das mesmas.
Os dispositivos PCI/PCI Express são feitos para permitir o compartilhamento de interrupções. Esse trabalho de
compartilhamento pode ser feito pelo chipset.
Uso de memória por dispositivos
E/S mapeada na memória
Cada controlador tem alguns registradores usados para a comunicação com a CPU. Por meio da escrita nesses
registradores, o SO pode comandar o dispositivo para entregar ou aceitar dados, alternar em ligar/desligar, ou ainda
executar alguma outra tarefa. A partir da leitura desses registradores o SO pode descobrir o estado do dispositivo, se
ele está preparado para aceitar um novo comando, etc. Além dos registradores, usualmente os dispositivos também
possuem um buffer.
Gerência de dispositivos de entrada e saída 21
Existe duas formas para a CPU ter acesso a esses registradores e buffers:
• 1º → Cada registrador de controle é associado a um número de porta de E/S, usando uma instrução especial de
E/S (IN REG, PORT OUT REG, PORT) que seria um acesso direto.
• 2º → Mapear todos os registradores de controle no espaço de endereçamento da memória. Cada registrador de
controle é associado a um endereço de memória único ao qual nenhuma memória é associada, que seria o
mapeamento da E/S na memória.
Essa segunda forma, nos trás duas grandes vantagens, a primeira é que o programador pode tratar esses registradores
como se trata a memória normal, isso é, como uma variável, isso faz com que um driver possa ser completamente
escrito em C/C++, caso seja feita a primeira abordagem, necessariamente o driver terá algum código em
ASSEMBLY. A outra vantagem é que não é necessário qualquer mecanismo de proteção especial para impedir que
os processos do usuário executem E/S, tudo o que o SO tem de fazer é deixar de mapear aquela porção do espaço de
endereçamento associada aos registradores de controle no espaço de endereçamento virtual do usuário.
Acesso Direto à Memória (DMA)
O Acesso Direto à Memória (DMA) é uma das técnicas utilizadas para otimizar o uso de memória por dispositivos.
O DMA é um componente de hardware que permite a transferência direta de dados entre dispositivos periféricos e a
memória principal, tornando assim dispensável a participação da CPU neste processo.
O controlador de DMA é um hardware desenvolvido para desempenhar toda a sequência de transferência de dados
acessando diretamente a memória. Ele gerencia vários canais que podem ser programados para realizar a
transferência de dados, quer seja de um dispositivo para a memória ou vice-versa.
O SO somente pode usar o DMA se o hardware tem o controlador de DMA. O DMA melhora o desempenho do
sistema, pois poupo tempo ocioso da CPU, que poderia muito bem executar a tarefa do DMA, porém como o tempo
de E/S é grande principalmetne para grandes quantidades de dados pode fazer com que a CPU fique muito tempo
ociosa. Quando a quantidade é pequena as vezes é até mais viável fazer a transferência direto pela CPU que é um
hardware mais rápido que o DMA, isso pode causar concorrencia no barramento, pois o barramento utilizado pelo
DMA para acessar a memória é o mesmo utilizado pela CPU. Utilizando o DMA, a CPU requisita ao DMA de onde
começar a ler os bytes, quantos bytes devem ser lidos/escritos e fica livre para executar outras tarefas que sejam CPU
Bound, então quando o DMA termina de realizar sua tarefa, ele transmite um sinal de interrupção para a CPU que
simplesmente usa os bytes.
Note que a CPU pode fazer exatamente o que o DMA faz, isso fica a cargo de projeto. Coloca uma requisição de
leitura no barramento e fica esperando até receber os bytes e assim poder usa-lo, a diferença é que usando a CPU
Gerência de dispositivos de entrada e saída 22
para transferencia de uma quantidade maior de dados, poderá ocasionar em CPU ociosa.
Um computador tem dois gerenciadores de DMA, divididos em canais. Os canais 0 a 3 são gerenciados por um
gerenciador, enquanto os canais 4 a 7 vão para o outro.
Para visualizar quais canais estão em uso em sistemas Linux basta digitar no shell o comando:
$ cat /proc/dma
Os oito canais e seus usos são descritos a seguir: 0 = usado pelo refresh da memória Ram dinâmica. 1 = placas de
som de 8 bits, adaptadores SCSI, placas de rede. 2 = controladora de disquete 3 = porta paralela ECP, placas de som
de 8 bits, adaptadores SCSI, placas de rede, controladores de scanner antigos. 4 = ponte para a controladora de DMA
0~3 5 a 7 = placas de som, adaptadores SCSI, placas de rede.
Os canais 1 a 3 operam sob 8 ou 16 bits, enquanto os canais 5 a 7 operam apenas sob 16 bits.
Dispositivos PCI (e outros de alta velocidade) possuem um controlador de DMA embutido, muito mais rápido que o
DMA simples. Por exemplo, esse controlador é usado em discos rígidos atuais e pode atingir velocidades de
66MB/s.
Processo de Entrada e Saída (E/S)
E/S programada
Neste método o processador executa o programa e tem o controle total sobre as operações de entrada e saída:
•• I - Os dados são copiados parao núcleo;
•• II - O Sistema Operacional envia, para a saída, um caractere de cada vez;
•• III - A cada caractere enviado, a CPU verifica se o dispositivo está pronto para receber outro;
Esse comportamento é chamado de espera ociosa ou polling.
A desvantagem desse método é que como o processador geralmente é mais rápido que o dispositivo de E/S ocorrerá
um desperdício de processamento.
E/S orientada à interrupção
Diferentemente da E/S programada, em que a CPU fica verificando o dispositivo para saber se ele está pronto para
mais operações ou se terminou, na E/S orientada à interrupção, a CPU passa a realizar outras tarefas escalonadas até
que seja informada pelo dispositivo, por meio de uma interrupção, que este está pronto para mais caracteres ou
concluiu sua tarefa. Quando isso acontecer, o processador para o que está fazendo para executar o tratador de
interrupção, quando sua execução estiver terminada, o processador volta à rotina que foi interrompida inicialmente.
Para que seja empregada essa política de interrupções existem detalhes de software e de hardware que devem ser
atendidos, e para que esses detalhes sejam executados, a maioria dos computadores possuem um hardware
denominado controlador de interrupções. As principais funções do controlador de interrupções são:
1.1. identificar a fonte da interrupção;
2.2. priorizar uma interrupção em relação a outra;
3.3. selecionar quais interrupções serão atendidas.
O emprego de interrupções libera o computador para realizar cálculos, então o processador fica responsável apenas
por iniciar a operação de entrada-saída, e quando esta for concluída, executar o tratador de interrupção.
Gerência de dispositivos de entrada e saída 23
E/S usando DMA
No método de E/S orientada à interrupção, a cada caractere processado, é gerado uma nova interrupção à CPU. Para
diminuir o peso de processamento sobre a CPU, que perderia muito tempo por conta das contínuas interrupções,
passa-se tal tarefa para o DMA, que passará a administrar as interrupções por buffer (não mais por caractere). O
DMA executa então a E/S programada (neste caso, não é a CPU que faz o trabalho, mas sim o controlador do DMA).
Quando existe uma quantidade de dados significante para ser transferida a técnica de Interrupções se torna ineficaz,
sendo melhor a utilização de um hardware especial (Controlador de DMA), que transfere os dados diretamente de
um dispositivo de E/S para a memória, ou vice e versa.
A transferência por DMA acontece quando o processador inicializa o controlador DMA, fornecendo todas as
informações necessárias sobre os dados a serem transferidos (quantidade de dados, origem e destino dos blocos e
ainda o sentido da transferência), depois ele dispara a execução do DMA e equanto a transferência estiver ocorrendo
o processador pode se dedicar a outra tarefa. Ao final da transferência o DMA sinaliza ao processador por meio de
uma interrupção de hardware.
Drivers
O que são drivers
Um driver é uma camada de software que faz a comunicação do sistema operacional com o controlador do hardware
que por sua vez faz a interface com o hardware. Drivers escondem as diferenças entre os diversos dispositivos,
através de uma interface de programação unica.
Driver de dispositivo é responsável por implementar as rotinas necessárias ao acesso e à gerência de um dispositivo
específico.
A camada de drivers de dispositivo representa uma parte significativa do sistema de entrada e saída em relação às
funcionalidades. Ela é responsável por implementar as rotinas necessárias ao acesso e à gerencia de um dispositivo
específico.É necessário que o software de E/S realiza a programação de registradores internos de controladores que
compõem a interface física dos dispositivos e implementa os respectivos tratadores de interrupção. Assim, cada tipo
Gerência de dispositivos de entrada e saída 24
de dispositivo requer um driver apropriado. Essa camada fornece uma abstração a mais genérica possível para a
camada superior, a de E/S independente do dispositivo.
Cada dispositivo de E/S ligado ao computador precisa de algum código específico do dispositivo para controlá-lo.
Esse código, chamado de driver do dispositivo.
Para acessar o hardware do dispositivo, o driver normalmente deve ser parte do núcleo do SO.
Os sistemas operacionais geralmente classificam os drivers dentre algumas poucas categorias. As categorias mais
comuns são dispositivos de bloco - os quais contêm vários blocos de dados que podem ser endereçados
independentemente - e os dispositivos de caractere, os quais geram ou aceitam uma sequencia de caracteres.
A maioria dos SOs define uma interface-padrão para todos os drivers de blocos e uma segunda interface-padrão para
todos os drivers de caracteres. Essas interfaces consistem em um nímero de procedimentos que o restante do so pode
utilizar para fazer o driver trabalhar para ele.
Um driver de dispositivo apresenta várias funções. A mais óbvia é aceitar e executar requisições abstratas, de leitura
ou gravação, de um software independente de um dispositivo localizado na camada acima da camada de drivers dos
dispositivos. Mas existem também algumas poucas outras funções que ele tem de executar.
Drivers no Linux X Drivers no Windows
Enquanto no Windows, os drivers são desenvolvidos pelos próprios fabricantes do dispositivo, precisando ser
instalados manualmente e seguindo de um processo de reboot do sistema. Em ambientes GNU/Linux, a instalação
dos "drivers" são incorporados diretamente ao Kernel e vêm pré-instalados no sistema.
Drivers Linux
Em sistemas GNU/Linux os "drivers" são chamados de módulos. O kernel desse sistema é dito monolítico com
vantagens de micro-kernel já que os sistemas GNU/Linux são LKM(Loadable Kernel Modules), já que os "drivers"
ou módulos são carregáveis ao sistema sem a necessidade de um novo processo de bootstrap após a instalação. Para
maior facilidade com o usuário, esse carregamento é feito no processo de bootstrap. Na verdade na maioria dos
sistemas operacionais que conta com o desenvolvimento da comunidade do software livre, os módulos são
desenvolvidos pela comunidade de desenvolvimento. Se esse módulo tem uma boa aceitação pela própria
comunidade e passou por todos os requisitos propostos pela equipe de desenvolvimento do kernel do sistema, esse
pode passar a fazer parte do próprio kernel do sistema. Dessa forma, o usuário não precisa correr atrás da instalação
uma vez que o driver está incorporado e instalado no sistema.
Drivers Windows
Nem sempre a companhia que desenvolveu certo hardware, também tem que desenvolver o driver para o mesmo. Há
casos em que o hardware foi desenvolvido sobre um certo padrão de hardware. Nesses casos, um driver genérico é
desenvolvido pela Microsoft para esse dado padrão. Nem todos os drivers se comunicam diretamente com o
dispositivo. Pode haver uma pilha de drivers para determinado dispositivo, em que parte deles age como um filtro,
transformando os dados de um formato para o outro, enquanto apenas a base da pilha se comunica diretamente com
o dispositivo. Isso pode ser melhor visualizado por uma imagem disponibilizada pela própria Microsoft em seu site:
http:/ / i. msdn. microsoft. com/ dynimg/ IC535115. png
Também, nem sempre os drivers estarão associados a um dispositivo. Também existe os “Software Drivers”. Em
determinados momentos, uma aplicação precisa de acessar recursos que ela só poderia acessar em modo kernel,
porém ela está em modo usuário. Então, divide-se essa aplicação em dois componentes: a aplicação que rodará em
modo usuário, que fará a interface com o usuário e um driver que rodará em modo kernel, dando acesso aos recursos
necessários. Esse driver que roda em modo kernel é chamado de Software Driver. No site da Microsoft também está
disponível uma imagem que ilustra isso:
Gerência de dispositivos de entrada e saída 25
http:/ / i. msdn. microsoft. com/ dynimg/ IC535116. png
Em casos em que determinadohardware desenvolvido não segue um padrão pré-existente, que tenha driver
desenvolvido pela Microsoft, a companhia também precisa desenvolver o driver. No site da Microsoft, existem
explicações sobre como construir um driver para Windows, dicas de performance e outros. Podemos encontrar essas
informações em: http:/ / msdn. microsoft. com/ en-us/ windows/ hardware/ gg454507
Para desenvolver esses drivers, o desenvolvedor deve saber conceitos do funcionamento interno do Windows, como
o gerenciamento de memória, fluxo de entrada e saída, entre outros. Para ajudar em seu desenvolvimento, a
Microsoft disponibiliza o Windows Driver Kit (WDK), com uma série de utilitários para criar um driver, como
bibliotecas, ambiente de desenvolvimento, exemplos, etc. Como parte do WDK, também é disponibilizado o
Windows Driver Foundation (WDF). O WDF define um único modelo de driver que pode ser usado para criar
drivers orientado a objetos, tanto para o modo kernel quanto para o modo usuário. Ele também inclui frameworks
para drivers de modo kernel e modo usuário, além de uma série de utilitários de verificação para o driver.
Formas de instalação
Em Windows, esses drivers são desenvolvidos pelos fabricantes do dispositivo. É criado um arquivo executável
somente com o binário desse driver para a instalação e utilização. Geralmente é um arquivo *.exe. Esse processo faz
com que o usuário fique totalmente alienado daquilo que está acontecendo com a sua máquina durante a instalação.
Em GNU/Linux, os módulos podem ser de vários tipos. O usuário pode baixar o código-fonte, compila-lo e
instala-lo na sua máquina. Esse é um processo bastante dificultoso para quem não tem muito conhecimento técnico
nesses sistemas. Também o usuário pode recorrer ao módulo pré-compilado do sistema. Esse é um processo bastante
similar ao do Windows já que é um script executável pelo gerenciador de pacotes do sistema da máquina.
Dispositivos de armazenamento
É um dispositivo capaz de gravar(armazenar) informação(dados). Essa gravação de dados pode ser feita
virtualmente, usando qualquer forma de energia. Um dispositivo de armazenamento retém informação, processa
informação, ou ambos. Um dispositivo que somente guarda informação é chamado de mídia de armazenamento.
Dispositivos que processam informação podem tanto quanto acessar uma mídia de gravação podem tanto acessar
uma mídia de gravação portátil, ou ter um componente que armazena dados.
Tipos de dispositivos de armazenamento
os dispositivos de armazenamento se diferem quanto ao tipo de mídia, tipo de armazenamento( volátil e não-volátil),
capacidade de armazenamento e velocidade de escrita.
Armazenamento por meio magnético
Dentre os dispositivos de E/S, podemos considerar o disco magnético como sendo o mais importante, devido
diversos papéis que ele desempenha junto ao Sistema Operacional. Dentre esses papéis estão:
•• Armazenamento de dados;
•• Armazenamento de dados com tolerância às falhas de segurança de dados (RAID);
•• Utilização como memória virtual (auxiliando a memória RAM, quando esta não pode guardar todos as páginas de
dados processos, etc);
Os discos magnéticos podem ser confeccionados em diferentes materiais (plástico, metal, etc), recobertos por uma
parte em material magnético. Essa parte magnética será responsável pelo armazenamento de dados. Esse
armazenamento de dados, dá-se pela escrita por parte de um dispositivo de Hardware (cabeçote de leitura e
gravação), o mesmo incidirá um campo magnético que definirá de maneira binária a informação. A união dessas
áreas definidas pelo cabeçote formará uma informação (dados).
Gerência de dispositivos de entrada e saída 26
Da mesma maneira que dados podem ser escritos no disco magnético, eles podem ser recuperados (pelo mesmo
dispositivo de Hardware) que localizaria os dados, então faria a leitura magnética do que foi anteriormente gravado.
Indo mais a fundo sobre as regiões magnéticas do disco, tem-se que ele é dividido em trilhas circulares concêntricas,
separadas por "gaps" (que evita problemas de alinhamento entre as trilhas). Existem duas arquiteturas diferentes para
essas trilhas:
•• CAV - número constante de bits a cada trilha. ---
•• CLV - número de bits por trilha, dependedente da posição da trilha (mais interna ou mais externa).
CAV: Constant Angular Velocity. CLV: Constant Linear Velocity.
Um aumento de temperatura é concorrente ao bom armazenamento de dados, pois ocorre a desorientação dos "spins"
(binários). Esses efeitos devem ser prevenidos pelos desenvolvedores do disco.
Como dito anteriormente, existem diversos tipos de dispositivos de E/S, bem como diversos tipos de discos
magnéticos. São muitas as tecnologias, envolvendo diferentes maneiras de leitura e escrita no mesmo, diferentes
maneiras de se agrupar camadas de disco, diferentes maneiras de trabalhar a velocidade do giro disco, etc.
Armazenamento por meio óptico
Os tipos de armazenamento por meio óptico sâo comumente empregados para o armazenamento de informações
multimídia, como por exemplo som e vídeo.
O funcionamento desses dispositivos se dá por meio de um feixe de laser de alta precisão, que é projetado na
superfície da mídia, está por sua vez, possui sulcos microscópicos capazes de desviar o laser em diferentes direções,
representando assim as informações armazenadas na forma de bits.
Exemplos de dispositivos de armazenamento ópticos são: CD-ROMs, CD-RWs, DVD-ROMs, DVD-RWs, etc.
Armazenamento por meio eletrônico
São dispositivos de memórias de estado sólido ou SSDs. Possuem memória não volátil e funcionam por meios de
circuitos eletrônicos.
Encontramos dispositivos de armazenamento eletrônico em pen drives, cartões de memória e até mesmo em discos
rígidos, onde são usados como buffer.
As gravações de dados em dispositivos de armazenamento eletrônico se da pelo carregamento de elétrons na camada
de óxido existente entre duas portas feitas de materiais semicondutores, essas duas portas representam um dígito
binário (bit). Assim, a presença de elétron entre essas duas portas indica que o ativamento do bit, ou seja, valor 1,
caso não haja a presença de elétrons representa o bit inativo ou valor 0.
Outros dispositivos
RAID
A tecnologia RAID é utilizada para controlar o uso de várias unidades físicas (HDs) em um único servidor na
tentativa de suprir duas de suas necessidades básicas, que são a confiabilidade e o desempenho. A partir deste ponto,
alguns métodos (paridade, mirroring, stripping) são utilizados isolados ou combinados para compor diferentes
estruturas lógicas (RAIDs 0, 1, 2, 3, 4, 5, 6, 10) que podem ser controladas por software ou por hardware. Vale a
pena destacar que o primeiro caso, de controle por software, apresenta pior desempenho, uma vez que os métodos
são realizados diretamente pelo Sistema Operacional, enquanto que no segundo caso, controlado por hardware, o
método utilizado é transparente para o SO e ocupa apenas o hardware, que necessita ser capaz de suportar tal técnica.
Gerência de dispositivos de entrada e saída 27
OS NÍVEIS DE RAID
RAID NÍVEL 0 - Também chamado de "Striping" ou "Fracionamento" este nível é usado quando se deseja melhorar
a performance do computador, nele os dados são divididos em segmentos, que tem um tamanho específico de bloco,
e divididos entre os discos proporcionando grande velocidade na gravação e leitura de informações pois os dados são
gravados ao mesmo tempo nos discos, logo quanto maior o número de discos mais rápido é a distribuição dos dados.
Esse nível não aceita falhas uma vez que não existe redundância ao gravar os dados, logo se um hd der problema
pode ocasionar perda de informações.
RAID NÍVEL 1 - Também chamado de "Mirroring" ou "Espelhamento" este nível é usado quando se deseja garantir
a integridade dos dados, nele os dados são clonados para outro dispositivo, ou seja, se um computador com dois
disco rígidos utilizam este nível, ao gravar dados em um disco automaticamenteserá gravado no outro tornando-os
cópias idênticas, a gravação se torna mais lenta uma vez que precisa ser gravado duas vezes, entretando a leitura é
mais rápida pois existem duas fontes de dados idênticas. Se houver falha em um disco ou perda de dados basta
recuperar o setor defeituoso copiando os arquivos contidos do outro disco, esse nível é muito usado em servidores de
arquivos.
RAID NÍVEL 2 - Este nível é responsável por monitorar os discos quanto a falhas garantindo uma maior
consistência nos dados caso ocorra falta de energia durante a escrita. Essa funcionalidade perdeu utilidade a partir do
momento em que os fabricantes de disco rígidos passaram a implementar mecanismos internos para detectar falhas e
garantir a integridade dos dados.
RAID NÍVEL 3 - Para utilizar esse nível pelo menos 3 discos são necessários, nesse nível os dados são divididos
entre dois discos e o terceiro fica responsável pelas informações de paridade, assim todos os bytes tem sua paridade
exceto 1 que identifica o erro, através dessas informações é possível identificar onde o erro ocorreu garantindo a
integridade dos dados em caso de recuperação, a sua montagem é via software e exige que todos os eixos das
unidades de discos estejam sincronizados.
RAID NÍVEL 4 - Utiliza a mesma técnica do nível 3, porém em caso de falhas os dados são reconstruídos em tempo
real através da utilização da paridade calculada a partir dos outros discos, sendo que cada um pode ser acessado de
Gerência de dispositivos de entrada e saída 28
forma independente. Se algum dos discos estragar a paridade é usada imediatamente para reconstruir o conteúdo e os
outros discos, que armazenam dados, são configurados para utilizarem segmentos grandes permitindo leituras
independentes da informação armazenada.
RAID NÍVEL 5 - Oferece mais desempenho em relação ao nível 4 pois agora a paridade encontra-se distribuída nos
discos, fazendo com que a gravação seja mais rápida pois não é necessário acessar um único disco a cada gravação,
esse é o nível mais utilizado.
RAID NÍVEL 6 - Semelhante ao nível 5 porém usa o dobro de bits de paridade garantindo a integridade de até dois
disco rígidos falharem ao mesmo tempo, o RAID 6 pode ser utilizado para sistemas de missão-critica aonde a
confiabilidade dos dados é essencial.
RAID NÍVEL 0+1 - É o nível mais caro de ser implementado pois exige no mínimo 4 discos rígidos, esse nível
implementa rapidez e integridade dos dados pois ele combina os níveis 0 e 1 onde os dados são divididos entre os
discos para melhorar o rendimento, mas também utilizam outros discos para duplicar as informações.
Sistemas de arquivos
Os sistemas de arquivos estruturam a informação guardada em uma unidade de armazenamento, podendo ser
representada de forma textual ou graficamente utilizando um gerenciador de arquivos. A maioria dos sistemas
operacionais possuem seu próprio sistema de arquivos.
O habitual é utilizar dispositivos de armazenamento de dados que permitem o acesso aos dados como uma corrente
(cadeia) de blocos de um mesmo tamanho, às vezes chamados setores, usualmente de 512 bytes de largura. O
software do sistema de arquivos é responsável pela organização destes setores em arquivos e diretórios e mantém um
registo de que setores pertencem a que arquivos e quais não têm sido utilizados. Na prática, um sistema de arquivos
também pode ser utilizado para acessar dados gerados dinamicamente, como os recebidos através de uma conexão de
rede (sem a intervenção de um dispositivo de armazenamento).
Em geral os sistemas de arquivos proveem métodos essenciais para criar, mover, renomear e eliminar tanto arquivos
como diretórios. Outros permitem a criação de enlaces (links) adicionais a um diretório ou arquivo (enlace duro ou
hard links em Unix).
A estrutura de diretórios costuma ser hierárquica, ramificada ou "em árvore", ainda que pode ser plana. Em alguns
sistemas de arquivos os nomes de arquivos são estruturados, com sintaxes especiais para extensão de arquivos e
números de versão. Em outros, os nomes de arquivos são simplesmente correntes de texto (ou strings de texto, em
inglês) e os metadados da cada arquivo são alojados separadamente.
Nos sistemas de arquivos hierárquicos, usualmente, declara-se a localização precisa de um arquivo com uma corrente
de texto (string de texto, em inglês) chamada "rota" ou "caminho" — ou path em inglês —. A nomenclatura para
rotas - ou caminho - varia ligeiramente de sistema em sistema, mas mantêm pelo geral uma mesma estrutura. Uma
rota vem dada por uma sucessão de nomes de diretórios e subdiretórios, ordenados hierarquicamente de esquerda a
direita e separados por algum caractere especial que costuma ser uma barra ('/') ou barra invertida ('\') e pode
terminar no nome de um arquivo presente ao último ramo de diretórios especificada.
Sistemas de arquivos 29
Características dos sistemas de arquivos
•• Segurança ou permissões
•• listas de controle de acesso (ACLs)
•• Mecanismo para evitar a fragmentação
•• Capacidade de enlaces simbólicos (symbolic links) ou duros (hard links)
•• Integridade do sistema de arquivos (Journaling)
•• Suporte para arquivos dispersos
•• Suporte para quotas de discos
•• Suporte de crescimento do sistema de arquivos nativo
Conceitos de arquivos
Observações sobre o mapa conceitual acima:
•• Arquivos de texto Windows por padrão são codificados em ASCII e não em Unicode.
•• Arquivos de texto Unix por padrão são codificados em Unicode e não em ASCII.
•• O termo "arquivos de repositório" não é uma terminologia reconhecida, tudo indica que se quis dizer "arquivos de
dados".
Tipos de Arquivos
Geralmente os Sistemas Operacionais suportam vários tipos de arquivos. O Unix e o Windows, por exemplo,
suportam diretórios e arquivos organizados em sequência de bytes, sequência de registros e árvores, conhecidos
como arquivos regulares. O Unix, em especial, suporta além dos tipos regulares, arquivos de dispositivo de
caracteres e de blocos. Os arquivos de dispositivo de caracteres são utilizados para modelar dispositivos de E/S, tais
como terminais, redes, impressoras. Já os arquivos de dispositivo de blocos dão suporte aos dispositivos de
armazenamento em massa tais como discos e 'pen-drives'.
Sistemas de arquivos 30
Nomes de Arquivos
Nomear os arquivos é uma tarefa importante, pois será através do nome que um arquivo será encontrado no sistema
de arquivos. Por exemplo, uma aplicação cria um arquivo chamado "dados.txt" e com esse nome outras aplicações
poderão acessar este mesmo arquivo.
As regras referentes a nomenclatura de arquivos variam de acordo com o sistema de arquivos. Alguns sistemas de
arquivos não fazem distinção de letras maiúsculas ou minúsculas, enquanto outros aceitam apenas caracteres em
maiúsculo.
O tipo do arquivo pode ser indicado na extensão do mesmo, que é uma última parte escrita após um ponto(.) no
nome do arquivo. Alguns sistemas operacionais utilizam essa extensão para automatizar as ações referentes aquele
arquivo. Por exemplo, no Windows um arquivo com extensão '.txt' é interpretado como um documento de texto, e ao
executá-lo o sistema já procura uma aplicação que trata este tipo de arquivo, como um editor de texto.
Operações com Arquivos
Seguem uma descrição das operações em arquivos encontradas na maioria dos sistemas de arquivo:
• Criação: criação sem escrita de dado algum.
• Destruição: remoção do arquivo para liberação do espaço.
• Abertura: abertura do arquivo, para colocar na memória os atributos e a lista de endereços para tornar as
operações posteriores mais rápidas.
• Fechamento: remover as referências do arquivos da memória principal.
• Leitura: abertura do arquivo para leitura do seu conteúdo.
• Escrita: processo de escrita do arquivo. Geralmente a escrita começa a partir de onde estiver o ponteiro, caso esse
ponteiro esteja no final do arquivo ou durante a escrita o final for atingido, o arquivo aumentará de tamanho.• Concatenação: forma de escrita que só permite adicionar dados no final do arquivo
• Busca: chamada que coloca o ponteiro em uma posição específica do arquivo. Depois dessa chamada, dados
podem ser lidos/escritos a partir daquela posição.
• Ver atributos: essa chamada verifica certos atributos como permissões, por exemplo. Às vezes é necessário
escrever em um arquivo, porém é necessário verificar se esse arquivo possui permissão de escrita.
• Definir atributos: Serve para definir ou alterar os atributos de certos arquivos. Flags de proteção podem ser
definidas com essa chamada.
• Renomeação: Chamada de sistema para renomear um arquivo.
Implementação de arquivos
A criação de arquivos exige que o sistema operacional tenha controle de quais áreas ou blocos no disco estão livres.
É importante o controle de quais blocos de discos estão relacionados a quais arquivos. Este gerenciamento pode ser
feito, principalmente de varias formas: Alocação contígua, alocação por lista encadeada, alocação indexada e
alocação combinada .
Alocação contígua
É o esquema mais simples de alocar e armazenar os arquivos no disco. Consiste em armazenar um arquivo em
blocos sequencialmente dispostos. Neste tipo, o sistema localiza um arquivo através do endereço do primeiro bloco e
da sua extensão em blocos.
Este tipo de alocação apresenta duas vantagens significativas.
•• É bastante simples de implementar e de realizar o controle sobre os onde os blocos estão.
•• O desempenho de leitura é excelente, pois todo o arquivo pode ser lido em uma única operação a partir do
primeiro bloco de dados.
Sistemas de arquivos 31
No entanto este tipo de implementação apresenta uma grande problema: Fragmentação do disco. Como os arquivos
podem ser criados e eliminados frequentemente, os segmentos livres vão se fragmentando em pequenos pedaços por
todo o disco. O problema pode tornar-se crítico quando um disco possui blocos livres disponíveis, porém não existe
um segmento contíguo em que o arquivo possa ser alocado.
O problema da fragmentação pode ser contornado através de rotinas que reorganizem todos os arquivos no disco de
maneira que só exista um único segmento de blocos livres. Este procedimento, denominado desfragmentação,
geralmente utiliza uma área de trabalho no próprio disco ou em fita magnética.
A alocação contígua é amplamente utilizada em CD-ROMS e em discos apenas para leitura. Neles o tamanho do
arquivo é conhecido anteriormente e nunca vai ser alterado.
Alocação por lista encadeada
Alocação encadeada consiste em manter os arquivos, cada um, como uma lista encadeada de blocos de disco. Dessa
forma uma parte de cada bloco é usada como ponteiro para o próximo bloco. O restante do bloco é usado para dados.
Uma vantagem desse tipo de alocação é que o tamanho do arquivo não precisa ser conhecido antes de sua criação, já
que cada bloco terá um ponteiro para o próximo bloco. Assim o fato de o disco estar fragmentado não ocasiona
problemas para a criação do arquivo.
O problema deste tipo de alocação é o tempo de leitura extremamente lento. O acesso deverá ser sempre sequencial.
Assim para acessar um bloco intermediário será necessário percorrer o arquivo desde o inicio.
Alocação indexada
Alocação indexada é uma forma de resolver o problema do tempo de leitura da alocação por lista encadeada. Isso é
feito por meio de uma tabela de endereços dos blocos ocupados pelo arquivo. Para cada novo bloco alocado,
inclui-se mais um novo item na tabela.
Usando alocação indexada, o acesso aleatório fica mais fácil, pois não é necessário percorrer todos os blocos de
forma sequencial, o endereço de cada bloco fica armazenado na tabela de alocação.
A desvantagem desta abordagem é que a tabela alocação deverá ser mantida na memória principal e dependendo do
tamanho dos blocos do disco ocupará muito espaço de memória o tempo todo.
Alocação combinada
Outra abordagem é a alocação combinada, envolvendo o uso de blocos de índices e de encadeamento dos mesmos.
Essa técnica combina a baixa ocupação de espaço em memória da técnica de lista encadeada e o bom desempenho da
técnica de tabela de índices.
No método de alocação combinada é usado uma técnica chamada de níveis de indireção na indexação. Nesta técnica,
parte de um bloco é utilizado para apontar diretamente blocos de dados, chamado de apontadores diretos, e outra
parte é utilizada pode ser utilizada para apontadores para blocos, chamado de apontadores indiretos. Se usarmos
outros níveis de apontadores, podemos estender essa mesma técnica para apontadores duplamente indiretos e
apontadores triplamente indiretos.
Esta abordagem é tipicamente utilizada na implementação do sistema de arquivos Unix, chamada de I-nodes. Um
I-node (index-node) são os metadados, armazenado em estrutura de dados própria, que relaciona atributos e os
endereços dos blocos de um arquivo.
Sistemas de arquivos 32
Múltiplos sistemas de arquivos
Os sistemas atuais podem acessar vários sistemas de arquivos ao mesmo tempo. Isto é feito de forma transparente ao
usuário e as diferenças no formato dos descritores de arquivos de cada sistema são espelhadas em descritores virtuais
que o sistema operacional mantém.
Soluções envolvendo a coexistência simultânea de vários sistemas de arquivos no mesmo sistema operacional,
começaram a surgir a partir dos anos 80. A princípio, surgiram três soluções, que tiveram um maior destaque nesse
sentido(para o sistema operacional UNIX), são elas:
• File System Switch da AT&T
• arquitetura "gnode" da Digital Equipament Corporation
• Virtual File System da Sun (Solução abordada neste trabalho para exemplificar)
A ideia básica abordada por estas soluções é fazer com que o sistema operacional suporte diversos sistemas de
arquivos diferentes simultaneamente. A solução empregada para facilitar a inclusão de novos sistemas de arquivos,
foi inspirada na gerência de periféricos.
Virtual File System
VFS é uma camada de abstração entre a aplicação e as implementações do sistema de arquivos. O VFS pode, por
exemplo, ser usado para acessar dispositivos de armazenamento locais e de rede de forma transparente, sem que a
aplicação cliente perceba a diferença.
O propósito principal de um VFS é permitir que as várias aplicações clientes possam acessar diversos tipos de
sistemas de arquivos concretos de uma maneira uniforme.
Mapa Conceitual ilustrando o conceito de múltiplos sistemas de arquivos
Sistemas de arquivos 33
Cache de sistemas de arquivos
Uma cache de disco pode ser definida como parte da memória RAM ou memória buffer cache, utilizada para
acelerar o acesso aos dados que estão sendo mais frequentemente requeridos. Para isso a cache de disco pode ser
implementado de duas formas principais:
1 - Através da memória RAM inserida no próprio disco rígido.
2 - Utilização de parte da memória RAM.
Representação da localização da memória Buffer Cache:
Caches de disco rígido são mais eficientes, mas são também muito mais caras. Todos os disco rígidos modernos
possuem uma cache interna. Para complementar a cache interno, os sistemas operacionais criam um segundo cache
usando a memória RAM.
Caches de disco funcionam armazenando os dados mais acessados. Quando um programa precisa acessar um novo
dado, o SO primeiramente verifica se os dados estão na cache antes de lê-lo do disco. Isso porque o acesso à
memória RAM é muito mais rápido do que o acesso ao disco.
Vantagens e Desvantagens da Buffer Cache
•• Minimização do número de transferências entre o disco e a memória (cache hits);
•• O acesso a disco é tratado de uma forma uniforme.Existe apenas uma interface para acessar os dados de um disco;
•• Ajudar a manter a coerências dos blocos. Se dois processos tentam acessar o mesmo bloco a buffer cache ordena
os acessos;
•• Torna o sistema mais vulnerável a acidentes de parada total (falta de energia, por exemplo) ("crashes");
•• Torna a transferência de grandes quantidades de informaçãomais lenta.
Buffers
O número de buffers é configurável de acordo com a memória disponível e o tipo de utilização do sistema. Cada
buffer é constituido de 2 partes:
1 - Zona que contém a cópia de um bloco do disco.O mesmo buffer pode guardar blocos de discos diferentes em
instantes diferentes.
2 - Cabeçalho que contém informação de controle sobre esse buffer.
Segue um mapa conceitual que ilustra os conceitos de mapeamento da memória cache do sistemas de arquivos:
Sistemas de arquivos 34
Gerência de Espaço livre
O monitoramento de espaço livre em um disco é realizado principalmente através de dois diferentes métodos:lista
encadeada e mapa de bits.Esses métodos são descritos abaixo.
Lista Encadeada
Nesta forma de gerenciamento, primeiramente é preciso entender que os blocos livres são blocos que não contém
arquivos (de usuários e programas). Entretanto os mesmos não ficam em branco, pois enquanto não estão sendo
utilizados, eles contém informações que o Sistema Operacional armazena para mapear o espaço livre. Ou seja, estes
blocos estão livres porém não estão vazios.
Desta forma cada bloco livre no disco possui ponteiros para os seguintes espaços livres em disco. Assim, se
considerarmos que um bloco possui um tamanho de 1 KBytes, e um ponteiro tem tamanho de 32 bits, dentro de um
bloco livre temos 255 ponteiros para os próximos blocos livres do disco(uma entrada é reservada ao ponteiro para o
bloco seguinte).
Mapa de Bits
Nesta forma de gerenciamento, é utilizado um espaço fixo adicional em disco especificamente para o mapeamento
do espaço livre, de forma que para cada bloco em disco é utilizado um bit no mapa.Sendo assim, um disco com n
blocos requer um mapa de bits com n bits. Não surpreende,portanto, que os mapas de bits requeiram menos espaço,
já que ele usa 1 bit por bloco, contra 32 bits no modelo de lista encadeada. Somente se o disco estiver quase cheio é
que o esquema de lista encadeada precisará de menos blocos que o mapa de bits. Por outro lado, se houver muitos
blocos livres, alguns deles poderão ser emprestados para conter a lista de livres sem qualquer perda de capacidade de
disco.
Para um mapa de bits,é possível manter apenas um bloco na memória e usar o disco somente quando o bloco
tornar-se cheio ou vazio.
Uma vantagem dessa estratégia é que as alocações em um bloco único de mapa de bits faz com que os blocos de
disco fiquem próximos uns dos outros, minimizando assim os movimentos dos braços de leitura do disco.
Sistemas de arquivos 35
Mapa Conceitual sobre a gerência de espaço livre
Conceitos de diretórios
Diretórios O diretório é uma estrutura de dados que contém entradas associadas aos arquivos onde são armazenadas
informações como localização física, nome, organização e demais atributos; Ou seja, um diretório (ou subdiretório) é
simplesmente outro arquivo, mas é tratado de modo especial; Todos os diretórios têm um bit em cada entrada de
diretório que define a entrada como um arquivo (0) ou um subdiretório (1); Chamadas ao sistema especiais criam e
excluem diretórios; Quando um arquivo é aberto, o SO procura a sua entrada na estrutura de diretórios, armazenando
as informações sobre atributos e localização do arquivo em uma tabela mantida na memória principal; Há,
basicamente, 2 organizações possíveis p/ as entradas: (a) cada entrada contém o nome do arquivo, seus atributos e os
endereços no disco onde ele está armazenado; (b) nome do arquivo e um ponteiro para outra estrutura de dados onde
podem ser encontrados os atributos do arquivos.
Implementação de Diretórios Independente da forma adotada para a implementação de arquivos, a principal função
do diretório é mapear o nome ASCII do arquivo na informação necessária à localização do dado. Cada sistema
operacional possui uma forma própria de entrada de diretório; Serão Apresentados os formatos dos sistemas
operacionais MS-DOS e UNIX.
Diretórios no MS-DOS No MS-DOS, diretórios podem conter outros diretórios, o que leva a uma estrutura
hierárquica para o sistema de arquivos; O MS-DOS utiliza uma entrada de diretórios de 32 bytes, contendo o nome
do arquivo, seus atributos e o número do primeiro bloco do disco.
Sistemas de arquivos 36
Ligações externas
• http:/ / www. ieeta. pt/ ~lau/ Sosd9697/ BufferCache. pdf
• http:/ / www. webopedia. com/ TERM/ D/ disk_cache. html
• http:/ / www. superspeed. com/ desktop/ supercache. php
• Morimoto, Carlos. Cache de Disco (ou Buffer de disco). Disponível em http:/ / www. guiadohardware. net/
termos/ cache-de-disco-ou-buffer-de-disco.
Sistemas embarcados
Introdução
Sistemas embarcados são sistemas computacionais completos e independentes, mais simples que um computador de
propósito geral (desktops), encarregados de executar apenas uma função determinada - tarefas pré-determinadas,
com requisitos específicos - na qual executam geralmente repetidas vezes. Também chamado de sistema embutido,
seu computador é completamente encapsulado, totalmente dedicado ao dispositivo que controla. Esses dispositivos
são compostos fundamentalmente pelos mesmos componentes de um computador pessoal, só que com tamanho e
capacidade limitadas para o fim se destina. São muito utilizados no cotidiano, e seus usuários geralmente não os
consideram com um computador. São exemplos: aparelho de som, televisão, câmera digital, brinquedos, modem
ADSL, entre muitos outros dispositivos. A evolução da microeletrônica e o barateamento das CPU's viabilizaram o
emprego de sistemas embarcados nos diversos equipamentos.
Por serem muito simples, muitas vezes esses sistemas não têm flexibilidade (de software e de hardware) que lhes
permita fazer outras tarefas quaisquer que não sejam aquelas para as quais foram desenhados e desenvolvidos. A
única flexibilidade permitida e desejada é no caso de um upgrade de novas versões, fazendo com que o sistema possa
ser reprogramado, geralmente com correções ou novas funções que o tornem melhor. Mas isto é feito sempre pelos
fabricantes e quase nunca pelos usuários finais.
No processo de desenvolvimento do software do sistema embarcado, ocorre que esta é desenvolvido em um
computador pessoal comum sendo transferido para o sistema embarcado apenas nos estágios finais do
desenvolvimento. Em alguns casos isso é feito através da porta USB (ou de uma porta serial), mas em outros é
necessário gravar um chip de EPROM ou memória flash com a ajuda do gravador apropriado e transferir o chip para
o sistema embarcado para poder testar o software.
Normalmente o usuário final não terá acesso ao software do sistema embarcados, mas interage com o mesmo através
de uma interface, que pode ser um display, um teclado ou até mesmo por uma interface web.
Um grande responsável pelo expansão do uso e aplicação dos sistemas embarcados foi a utilização do
microcontrolador, pelo seu baixo custo, versatilidade e tamanho reduzido. Muitas vezes é ele que desempenha
sozinho todas as funções do aparelho, incluindo controladores para as diversas funções disponíveis e até mesmo uma
pequena quantidade de memória RAM, entre outros recursos.
Existem no mercado os mais diversos tipos de microcontroladores, cada um com um conjunto próprio de periféricos
e funções. Ao invés de desenvolver e fabricar seus próprios chips, as empresas passaram a cada vez mais utilizar
componentes disponíveis no mercado, que são fabricados em massa e vendidos a preços incrivelmente baixos.
Muitos microcontroladores podem ser conectados a dispositivos analógicos, permitindo o uso de sensores diversos.
Isso permite a criação de dispositivos simples, que monitoram temperatura, umidade, entre outros fatores,
executando ações predefinidas em caso de mudanças
Embora os computadores pessoais normalmente roubem a cena, os sistemas embarcados são muito mais numerosos
e são responsáveis por toda a estrutura que utilizamos no dia-a-dia. Eles são também uma das áreas mais promissoras
dentro da área de tecnologia, já que um simples sistemaembarcado pode ser programado para desempenhar
Sistemas embarcados 37
praticamente qualquer função.
Conceitos Básicos de Desenvolvimento em Sistemas Embarcados
Introdução
•• Devido as limitações das plataformas embarcadas é necessário uma plataforma mais robusta para o
desenvolvimento das aplicações.
•• Esta plataforma é chamada de desenvolvimento ou simplesmente Host.
•• Já as plataformas onde as aplicações serão executadas são chamadas de Plataforma Alvo ou simplesmente Target.
Plataforma de Desenvolvimento – Host
•• Geralmente são computadores de propósito geral (Computadores Pessoais).
•• Possuem grande capacidade de armazenamento.
•• Possuem grande quantidade de processamento.
•• Disponibiliza interfaces mais adequadas para o desenvolvedor.
•• É onde serão executadas as ferramentas necessárias para o desenvolvimento de aplicações.
Plataforma Alvo – Target
•• Produto propriamente dito.
•• Plataforma onde as aplicações serão executadas.
•• Suas características foram citadas anteriormente.
•• Geralmente são utilizadas plataformas de referência para o desenvolvimento até chegar ao produto final.
Tipos de Configuração Host/Target
•• É necessário uma interface entre a plataforma host e a plataforma target.
•• Atualmente existem 3 configurações para estas interfaces que são mais comuns:
•• Linked Setup
•• Removable Storage Setup
•• Standalone Setup
Tipos de Configuração Host/Target – Linked Setup
•• Configuração mais utilizada atualmente.
•• Host é conectado ao Target através de um cabo.
•• Geralmente utiliza interface RS-232, USB ou Ethernet para comunicação com o target.
• Possibilita depuração do código “remotamente”;
•• Atualmente, é utilizado este tipo de configuração para a gravação e depuração de software na plataforma alvo
com o auxílio de JTAGs.
Sistemas embarcados 38
Tipos de Configuração Host/Target – Removable Storage Setup
•• Utiliza dispositivos removíveis para cópia da aplicação desenvolvida para a plataforma alvo.
•• Antigamente eram utilizadas placas de gravação contendo sockets para a memória a qual era utilizada na
plataforma alvo.
•• Modelo quase obsoleto, pois este não permite a depuração da aplicação de forma eficaz.
Tipos de Configuração Host/Target – Standalone Setup
•• São utilizados em plataforma alvo bem mais robustas.
•• As ferramentas de desenvolvimento são executadas na plataforma alvo.
•• A plataforma de desenvolvimento é utilizada apenas para acessar a plataforma alvo.
•• Devido a evolução das plataformas embarcadas, este modelo já vem sendo utilizado.
Cross-Compiling
•• É a construção de uma aplicação para uma plataforma distinta da qual está sendo construída.
•• O Compilador, é executado na plataforma de desenvolvimento, porém gera um binário para outra plataforma: A
plataforma alvo.
•• um binário compilado para uma plataforma, só pode ser executado nesta, pois instruções geradas são específicas
para cada arquitetura de processador.
Exemplos de SO’s Embarcados
TinyOS:
É um sistema operacional embarcado open-source projetado para dispositivos de redes de sensores sem fio. Ele
apresenta uma arquitetura baseada em componentes que permite uma rápida inovação e aplicação, minimizando o
tamanho do código devido a restrição de memória inerente aos dispositivos.Sua biblioteca de componentes inclui
protocolos de rede, serviços distribuídos, drivers de sensor, e ferramentas de aquisição de dados. O TinyOS tem
compatibilidade com dezenas de plataformas e placas de sensor.
Contiki
Contiki é um sistema operacional com o código aberto, diferentemente to TinyOS. É um sistema operacional
altamente portátil e multi-tarefas para redes de dispositivos com memória limitada. É escrito na linguagem C e foi
especialmente projetado para microcontroladores com pouca memória. Esse sistema operacional foi desenvolvido no
Instituto Sueco de Ciência da Computação (Swedish Institute of Computer Science) liderado por Adam Dunkels.
Contiki implementa a camada de adaptação 6LoWPAN, que é uma camada que promove a compressão do IPv6,
colocando-o para funcionar nesses dispositivos de memória limitada, possibilitando maior integração dos mesmos
com a Internet. Com o 6LoWPAN, todos os sensores contêm uma IPv6 stack que rodam sobre UDP.
VirtuOS:
Ele foi idealizado para desfrutar dos recursos e do poder de processamento dos processadores arquitetura x86 de 32
bits em microcomputadores de última geração, de arquitetura compatível com os modelos IBM PC™ de modo a
cobrir um largo espectro de aplicações profissionais de propósito geral.
Sua implementação permite um nível de desempenho e de segurança surpreendentes e que viabilizam, a baixo custo,
a instalação de Sistemas Distribuídos de Missão Crítica, pela utilização transparente e simultânea dos ambientes
multitarefa, multiusuário, multiterminal e de redes locais e remotas.
Sistemas embarcados 39
QNX:
É multiusuário, multitarefa, trabalha com rede e possui uma boa interface. A semelhança visual do QNX com o
Linux é explicada pelo fato de ambos os projetos fazerem uso da interface gráfica PHOTON. Versões mais recentes
do QNX possuem diversas aplicações nativas, dentre as quais se destaca o seu navegador de internet, o Voyager, que
renderiza praticamente todo tipo de conteúdo (streaming de áudio e vídeo, flash, etc.) usado atualmente na web. Por
se basear em UNIX, o QNX é confiável e estável, podendo ser ideal para profissionais da área gráfica (3D, edição de
imagem e vídeo e similares). Líderes mundiais como a Cisco, General Eletric e Siemens dependem da tecnologia
QNX para roteadores de rede, instrumentos médicos, unidades telemáticas de veículos, sistemas de segurança e de
defesa, robótica industrial e outras aplicações de missões críticas. Em 2010, a Research In Motion (RIM), fabricante
do BlackBerry, adquiriu o QNX e o implementou em seu primeiro tablet PC, o PlayBook, concorrente direto do
iPad, da Apple.
Windows CE:
É uma versão da não-popular linha de sistemas operativos Windows para dispositivos portáteis, Tablet PCs e
sistemas embarcados. Ele equipa desde micro-computadores até telefones celulares mais antigos e o Dreamcast. É
suportado no Intel x86 e compatíveis, MIPxS, ARM, e processadores SuperH Hitachi.
Exemplos de sistemas embarcados com Linux:
•• PDA Sharp Zauro SL-C3100
•• Multimídia Archos PMA400
•• Roteador Linksys WTR54G
•• Telefones celulares
Exemplos de interação com o Sistema Operacional embarcado
Os sistemas embarcados não possuem uma interface para acesso aos comandos de execução do sistema operacional
embarcado. Eles utilizam de uma conexão com o computador para se ter acesso ao sistema operacional e os seus
comandos de execução, assim como acesso ao kernel, essa conexão simulará um terminal que terá acesso ao sistema
operacional como se estivesse operando no próprio hardware embarcado. A conexão como o computador pode ser
via porta ethernet (conexão de rede tanto local como wireless), porta USB, porta serial e porta paralela, sendo que os
dois últimos casos estão cada vez mais raros na prática devido a ausência das duas portas nos computadores atuais.
Com a conexão física é necessário que se realize a comunicação do computador com o hardware embarcado através
de protocolos (regras de comunicação), sendo que para cada tipo de protocolo de comunicação existem alguns
softwares. Comentaremos os protocolos: Telnet, com dois softwares, e o SSH, com software de mesmo nome.
Telnet é um protocolo de terminal virtual que estabelece conexão com outros computadores ou sistemas embarcados
via comunicação TCP/IP. Existem diversos softwares que utilizam o Telnet, existe o software com o mesmo nome,
Telnet, que utiliza linhas de comandos para a execução dos comandos (plataformas: Linux e Windows); existe o
Hyper Terminal que é um software muito utilizado na configuração de roteadores por meio da porta serial, porém
esse é um software da plataformaWindows, usuários Linux que quiserem utilizá-lo deverão instalar o programas
similares, por exemplo o C-Kermit. SSH, na verdade, é um protocolo que extende do Telnet pois realiza a conexão
por meio de TCP/IP porém com segurança, criptografando as informações no terminal virtual antes de enviar para o
cliente e realiza a autenticação no envio e no recebimento dos dados, o SSH é suportado na plataforma Linux e assim
como o Telnet é executado por linhas de comando, para o Windows existem softwares que suportam esse protocolo.
Sistemas embarcados 40
Acessando um roteador Cisco 1700
Figura 1: Roteador Cisco 1700 ligado ao
computador
Figura 10: Comando show flash
Figura 11: comando show version
O roteador Cisco 1700 é muito utilizado em empresas de médio porte
por oferecer alta velocidade de banda larga e linha dedicada de acesso,
segurança e integração de voz. O sistema operacional embarcado é o
Cisco IOS, ele utiliza uma interface de linha de comando (CLI) como
console de gerenciamento, a CLI utiliza de uma hierarquia de modos,
sendo que cada modo é responsável por executar determinados
comandos. Exemplo de cliente que utiliza o roteador Cisco 1700:
Banco Itaú em agências de pequeno porte.
A primeira configuração do roteador Cisco 1700 deve ser feita através
da porta serial do micro e da porta Console ou Aux do roteador pois o
mesmo vem sem a configuração IP, para configurações posteriores
pode-se usar a porta ethernet do computador com uma porta ethernet
do roteador utilizando-se o protocolo Telnet para comunicação entre os
equipamentos. Realizado as conexões físicas, porta serial do micro
ligado por um cabo Rollover na porta Console do roteador Cisco 1700
(figura 1), e ligados os equipamentos pode-se utilizar do emulador de
terminal (Hyper Terminal) para conectar logicamente o computador no
roteador.
O aplicativo Hyper Terminal exigi algumas configurações todas as
vezes que ele inicializa, a primeira tela (Figura 2) é para configurar o
nome da conexão;
A próxima configuração (Figura 3) é de qual porta usar, se for conectar
na porta serial deve-se escolher a porta serial que o roteador está
ligado, COMX;
A última configuração se refere as propriedades de comunicação, que
por padrão usa-se: Bits por segundo = 9600; Bits de dados = 8;
Paridade = Não; Bits de parada = 1; Controle de fluxo = Hardware
(Figura 4).
Depois das telas de configuração o Hyper Terminal estará pronto para acessar o console, porém nada será mostrado
(Figura5) até que se aperte a tecla Enter (Figura 6).
Para começar a usar o console, novamente, deverá apertar a tecla Enter. Após o pressionamento da tecla, parecerá
um nome> , nome será o nome do roteador, esse primeiro modo é o modo EXEC usuário que é um modo de usuário
que executa poucos comandos (Figura 6).
Para alterar para o modo EXEC privilegiado, modo onde é possível acessar todos os comandos do roteador, basta
digitar enable, aparecerá na tela nome# (Figura 7);
Para entrar no modo de configuração global o comando é configure terminal, deverá estar em modo EXEC
privilegiado, aparecerá nome(config)# (Figura 8);
Para sair do modo EXEC privilegiado basta digitar disable; para sair do modo de configuração global o comando é
exit; para sair do modo EXEC usuário basta digitar exit, o console será fechado. Para saber o que cada modo executa
basta digitar ? que aparecerá na tela os comandos suportados (Figura 9).
Em modo EXEC privilegiado o comando show mostra uma configuração ou um status específico, show
running-config: configuração ativa, conteúdo da RAM; show flash: local onde o Sistema Operacional está salvo,
conteúdo da Flash (Figura 10);
Sistemas embarcados 41
Show version: mostra a versão e qual IOS está carregado (Figura 11); show interfaces: lista todas as interfaces
disponíveis no roteador e seus respectivos status.
O robô voador com linux embarcado, Ar.Drone
“A placa principal inclui um CPU central Parrot P6 do AR.Drone. O chip P6 foi especialmente concebido
para o AR.Drone. Inclui um 468 MIPS ARM926EJ Risc CPU e um acelerador de video. A placa principal
corre com Linux juntamente com o software AR.Drone. A placa principal inclui 256 Mb 200 MHz 32 Bits
MDDR RAM de 32Mb de NAND Flash. Inclui um chipset Wi-Fi da Atheros e uma porta USB para flashing
direto e extensões futuras. O chip Atmel P6MU é um chipset de gestão de energia para o chipset P6. A placa
principal inclui também uma câmera vertical 60FPS. A resolução de vídeo é QCIF (176*144 pixels) que,
combinado com os acelerômetros, providencia a velocidade horizontal do AR.Drone.” (Gohobby)
O brinquedo tem SDK, é possível pilotá-lo com um aparelho PC, Android, iPad, iPhone e qualquer outro brinquedo
nerd programável e com comunicação Wifi.
Com a comunicação Wifi é possível jogar em rede com vários Ar.Drone. O AR.Drone inclui uma unidade de medida
inerte, sensores ultra som e uma câmera vertical, na qual você também consegue gravar vídeos e tirar fotos. Atinge
uma velocidade de 18 km/h, com uma autonomia de vôo de 12 minutos, hélices de alta eficiência, bateria de lítio
polímero (3 células, 11,1 V, 1000 mAh - UL2054), a frequência do vídeo atinge 60 FPS, permite a estabilização,
mesmo com uma leve brisa e travamento automático das hélices no caso de contato.
Configurações: Antes da configuração e compilação mostraremos algumas definições para posterior configuração.
Tilt: Ajusta a velocidade horizontal, porém não esqueça da sensibilidade do acelerômetro que interfere nesta
aceleração. VerticalSpeed: Define velocidade Vertical e o sobe e desce do aparelho.
Yam Speed: Define a velocidade de rotação, ou seja sentido horário ou anti-horário.
O SDK oficial deverá ser obtido através do site: https:/ / projects. ardrone. org/ . Baixe a última versão
descompacto-o com o camando tar xvfz, acesse a pasta e compile (make). Agora o SDK e as bibliotecas já estão
compiladas e prontas para uso. Para conectar com o AR.Drone, coloque a sua interface de rede em modo Ad-Hoc,
informe o nome da rede, desabilite a criptografia e defina o IP, conforme comando abaixo:
$ iwconfig wlan0 mode Ad-Hoc essid [Nome-Rede] key off
$ ifconfig wlan0 192.168.1.2 netmask 255.255.255.0 up
O ip e a maskara de rede depende da estrutura de rede qual o usuário está.
Para testar o programa exemplo, entre na pasta Examples/Linux e execute o binário ardrone_navigation.
$ cd Examples/Linux/
$ ./ardrone_navigation
Se tudo estiver funcionando corretamente, teremos o formulário e/ou painel acima. Clique em "USB Configuration"
para mapear os controles do joystick, wiimote, teclado ou outro dispositivo. Para visualizar o vídeo das câmeras do
AR.Drone, entre na opção "Show Drone Vídeo", finalizando para define a configuração de voo, clique em "Flight
control settings".
Importância dos Sistemas Operacionais Embarcados
Os primeiros sistemas controlados eram feitos com eletrônica analógica através de potenciômetros e capacitores,
porém esse controle era lento e as vezes não atendia as especificações de um projeto que era realizado manualmente.
A descoberta dos transistores possibilitou a criação dos microcontroladores, que reduziu o tamanho dos
computadores e se tornaram digitais, aumentando assim o seu poder de processamento, alguns computadores
ficavam dedicados a uma única tarefa, mas ainda eram sistemas complexos controlados por processadores.
Sistemas embarcados 42
Diferente de computadores de propósito geral, como o computador pessoal, os microcontroladores para serem
usados em projetos específicos precisavam ser programados para poder controlar com precisão as suas tarefas. Já que
o sistema tinha que ser dedicado a tarefas específicas, através de engenharia pode-se otimizar o projeto reduzindo
tamanho, recursos computacionais e custo do produto.
Os sistemas embarcados, geralmente contam com uma quantidade reduzida de recursos como memória, poder de
processamento e outros requisitos como processamento em temporeal, eles não são projetados para utilizar sistemas
operacionais destinados aos computadores pessoais, geralmente os sistemas embarcados utilizam sistemas
operacionais de tempo real especiais que além de consumirem muito menos memória e processamento, são muito
mais estáveis e confiáveis.
Essas características dos sistemas embarcados fizeram com que essa tecnologia alcançasse uma grande importância
no mercado, pois além da sua disponibilidade, os sistemas se tornaram estáveis, seguros e confiáveis, pois imagine se
acontece uma famosa "tela azul" em um sistema médico que controla a vida de uma pessoa, ou em um sistema de
controle de uma aeronave em pleno vôo, assim esses sistemas são projetados para trabalhar ininterruptamente, sendo
possíveis de se auto-recuperarem após acorrerem erros através de técnicas de watchdog timer, que reinicia o sistema
a menos que o software notifique periodicamente que está funcionando corretamente.
Outra importância fundamental que ganhou destaque em projetos de sistemas embarcados foi a redução do consumo
de energia, esse baixo consumo permitiu com que os dispositivos móveis ganhassem força no mercado oferecendo
aos consumidores uma enorme quantidade de recursos, atualmente basicamente todos os dispositivos móveis
utilizam sistemas embarcados sendo perceptível a não ocorrencia de erros graves, quanto a resistência e durabilidade
os sistemas embarcados são projetados para trabalhar em ambientes com condições adversas (vibrações, calor,
poeira, variações na tensão, interferencias eletromagéticas, umidade e etc.).
Antes apenas utilizados em sistemas complexos como sistemas industriais, aeronaves e navios, hoje vemos softwares
embarcados em geladeiras, televisores e fornos de microondas. Estes equipamentos tornam-se cada vez mais
sofisticados, demandando mais e mais complexidade no seu hardware e software embarcado. Alguns números já
demonstram de forma inequívoca a importância do software embarcado no setor industrial. Quando falamos em
diferenciação competitiva, já observamos que parcela significativa da diferenciação entre os produtos baseia-se na
maior oferta de funcionalidade, suportada por tecnologia de software. A revolução digital tem mudado e vai
continuar mudando a dinâmica de muitas indústrias. Na indústria de eletroeletrônicos vemos claramente a
digitalização substituindo o mundo analógico.
Os sistemas embarcados vieram para facilitar o dia a dia do ser humano e automatizar as atividades que antes eram
feitas manualmente, funcionalidades como computador de bordo, análise de dados atráves de dispositivos móveis e
interfaces de comunicação podem ser facilmente implementadas com sistemas embarcados, porém parte dessa
revolução está visivelmente aplicada em segmentos específicos como em aparelhos usados na medicina, nas
engenharias, como sensores que verificam a distancia entre sementes automatizando assim o plantio na agricultura,
entre outras infinidades de processos, suas aplicações não tem limites.
Watchdog
O watchdog time ou computer operating properly (COP) time, como também é conhecido, é uma forma utilizada
para monitorar o sistema embarcado, disparando um reset ao sistema caso o mesmo não retorne mensagem
informando que esta funcionando.
Sendo uma forma de controlar dispositivos que se por algum motivo pararem de funcionar poderiam levar a panes ou
situações de riscos como, por exemplo, algum dispositivo interno de um avião que não pode deixar de responder em
pleno voo; além de outros exemplos. O mesmo funciona normalmente a parte do sistema embarcado, sendo
geralmente um microcontrolador com temporizador, enviando notificações ao sistema em intervalos
pré-configurados.
Sistemas embarcados 43
O watchdog timer não precisa estar necessariamente junto ao sistema embarcado para que funcione, sendo hoje
utilizado watchdog timer através dos protocolos TCP/IP, sendo enviados aos dispositivos pacotes de comunicação e
em caso de não houver resposta o mesmo é reiniciado.
Outra forma de utilização do watchgog timer é em na execução de códigos não confiáveis em sandbox, sendo
colocado um limite de tempo de execução da CPU para o código, suspendendo a execução caso o tempo limite seja
atingido. Esse modelo é normalmente utilizado para prevenir ataques de DoS.
Fontes e Editores da Página 44
Fontes e Editores da Página
Introdução Fonte: http://pt.wikibooks.org/w/index.php?oldid=244133 Contribuidores: Abacaxi
História Fonte: http://pt.wikibooks.org/w/index.php?oldid=244137 Contribuidores: Abacaxi
Estruturas dos sistemas operacionais Fonte: http://pt.wikibooks.org/w/index.php?oldid=261791 Contribuidores: Abacaxi, Guiwp, 1 edições anónimas
Gerência de memória Fonte: http://pt.wikibooks.org/w/index.php?oldid=247256 Contribuidores: Abacaxi
Gerência de dispositivos de entrada e saída Fonte: http://pt.wikibooks.org/w/index.php?oldid=260891 Contribuidores: Abacaxi, Guiwp, 4 edições anónimas
Sistemas de arquivos Fonte: http://pt.wikibooks.org/w/index.php?oldid=264584 Contribuidores: Abacaxi, 1 edições anónimas
Sistemas embarcados Fonte: http://pt.wikibooks.org/w/index.php?oldid=260463 Contribuidores: Abacaxi, CommonsDelinker
Fontes, Licenças e Editores da Imagem 45
Fontes, Licenças e Editores da Imagem
Imagem:IBM PC 5150.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:IBM_PC_5150.jpg Licença: Creative Commons Attribution-ShareAlike 1.0 Generic Contribuidores:
User:Boffy b, User:Dpbsmith
Ficheiro:Definicoes_Gerais.png Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Definicoes_Gerais.png Licença: Creative Commons Attribution-Share Alike Contribuidores:
Funfood, Paulocezar
Ficheiro:SO_DMA.png Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:SO_DMA.png Licença: Creative Commons Attribution-Sharealike 3.0 Contribuidores: User:Crocodilo
Ficheiro:G-Drivers.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:G-Drivers.jpg Licença: Creative Commons Attribution-Sharealike 3.0 Contribuidores: Pjuniorlima
Ficheiro:Mapa_Conceitual_Gerencia_Dispositivos_RAID.png Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Mapa_Conceitual_Gerencia_Dispositivos_RAID.png Licença:
Public Domain Contribuidores: Brunovs
File:MapaConceitual.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:MapaConceitual.jpg Licença: Creative Commons Attribution 3.0 Contribuidores: Wanderson Paim
Ficheiro: Multiplos Sistemas de Arquivos.png Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Multiplos_Sistemas_de_Arquivos.png Licença: Creative Commons
Attribution-Sharealike 3.0 Contribuidores: User:Crocodilo
Ficheiro:Modelo.png Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Modelo.png Licença: Free Art License Contribuidores: Lauroh25
Ficheiro:Aula SO2 2010-10-05 v2.png Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Aula_SO2_2010-10-05_v2.png Licença: Free Art License Contribuidores: Lauroh25
Ficheiro:Mapa Conceitual Sistemas de Arquivos Gerência de Espaço Livre.png Fonte:
http://pt.wikibooks.org/w/index.php?title=Ficheiro:Mapa_Conceitual_Sistemas_de_Arquivos_Gerência_de_Espaço_Livre.png Licença: Public Domain Contribuidores: Brunovs
File:Roteador Cisco 1700 ligado ao computador.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Roteador_Cisco_1700_ligado_ao_computador.jpg Licença: Creative Commons
Attribution-Sharealike 3.0 Contribuidores: User:Titangui
File:Comando show flash.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Comando_show_flash.jpg Licença: Creative Commons Attribution-Sharealike 3.0 Contribuidores:
User:Titangui
File:Comando show version.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Comando_show_version.jpg Licença: Creative Commons Attribution-Sharealike 3.0
Contribuidores: User:Titangui
Licença 46
Licença
Creative Commons Attribution-Share Alike 3.0
//creativecommons.org/licenses/by-sa/3.0/