Conceitos Básicos de Arquitetura de computadores

- Hardware

Um computador digital é constituído por um conjunto de componentes interligados, composto por processadores, memória principal, registradores, terminais, impressoras, discos magnéticos, além de outros dispositivos físicos (hardware). Esses dispositivos manipulam dados, o que proporciona uma maneira confiável de representação.

Todos os componentes de um computador são agrupados em três subsistemas básicos: unidade central de processamento, memória principal e dispositivos de entrada e saída. Estes subsistemas, também chamados de unidades funcionais, estão presentes em todo computador, apesar de suas implementações variarem nas diferentes arquiteturas existentes e comercializadas pelos diversos fabricantes de computadores.
 
 

- CPU

A unidade central de processamento(CPU), ou processador, tem como função principal unificar todo o sistema, controlando as funções realizadas por cada unidade funcional. A CPU também é responsável pela execução de todos os programas do sistema.

Um programa é composto por uma série de instruções que são executadas seqüencialmente pela CPU, através de operações básicas como somar, subtrair, comparar e movimentar dados. Desta forma, a CPU busca cada instrução na memória principal e a interpreta para sua execução.

A CPU é composta por dois componentes básicos: unidade de controle e unidade lógica e aritmética. A unidade de controle (UC) é responsável por controlar as atividades de todos os componentes do computador, mediante a emissão de pulsos elétricos (sinais de controle) gerados por um dispositivo denominado clock. Este controle pode ser a gravação de um dado no disco ou a busca de uma instrução da memória. A unidade lógica e aritmética (ULA), como o nome indica, é responsável pela realização de operações lógicas (testes e comparações) e aritméticas (somas e subtrações).

- Clock

O clock é um dispositivo, localizado na CPU, que gera pulsos elétricos síncronos em um determinado intervalo de tempo (sinal de clock). A quantidade de vezes que este pulso se repete em um segundo define a freqüência do clock. O sinal de clock é utilizado pela unidade de controle para a execução das instruções.

A freqüência do clock de um processador é medida em Hertz (Hz), que significa o número de pulsos elétricos gerados em um segundo de tempo. A freqüência também pode ser utilizada como unidade de desempenho entre diferentes processadores, pois quanto maior a freqüência, mais instruções podem ser executadas pela CPU em um mesmo intervalo de tempo.
 
 

- Registradores

Os registradores são dispositivos de alta velocidade, localizados fisicamente na CPU, para armazenamento temporário de dados. O número de registradores varia em função da arquitetura de cada processador. Alguns registradores são de uso específico e têm propósitos especiais, enquanto outros são ditos de uso geral.
 
 

- Memória Principal

A memória principal, também conhecida como memória primária ou real, é a parte do computador onde são armazenados instruções e dados. Ela é composta por unidades de acesso chamadas células, sendo cada célula composta por um determinado número de bits. O bit é a unidade básica de memória, podendo assumir o valor 0 ou 1. Podemos concluir, então que a memória é formada por um conjunto de células, onde cada célula possui um determinado número de bits.

O acesso ao conteúdo de uma célula é realizado através da especificação de um número chamado endereço. O endereço é uma referência única, que podemos fazer a uma célula de memória. Quando um programa deseja ler ou escrever um dado em uma célula, deve primeiro especificar qual o endereço de memória desejado, para depois realizar a operação.

A especificação do endereço é realizada através de um registrador denominado registrador de endereço de memória (MAR). Através do conteúdo deste registrador, a unidade de controle sabe qual a célula de memória que será acessada. Outro registrador usado em operações com a memória é o registrador de dados da memória (MBR). Este registrador é utilizado para guardar o conteúdo de uma ou mais células de memória, após uma operação de leitura, ou para guardar o dado que será transferido para a memória em uma operação de gravação.

A memória principal pode ser classificada em função de sua volatilidade, que é a capacidade de a memória preservar o seu conteúdo mesmo sem uma fonte de alimentação ativa. As memória chamadas voláteis se caracterizam por poderem ser lidas ou gravadas, como o tipo RAM (random access memory), que constitui quase que a totalidade da memória principal de um computador. O outro tipo, chamado de não volátil, não permite alterar ou apagar seu conteúdo. Este tipo de memória, conhecido como ROM (ready-only memory), já vem pré-gravado do fabricante, geralmente com algum programa, e seu conteúdo é preservado mesmo quando a alimentação é desligada.
 
 

- Memória Cache

A memória cache é uma memória volátil de alta velocidade. O tempo de acesso a um dado nela contido é muito menor que se o mesmo estivesse na memória principal.

Toda vez que o processador faz referência a um dado armazenado na memória principal, ele "olha" antes na memória cache. Se o processador encontrar o dado na cache, não há necessidade do acesso à memória principal; do contrário, o acesso é obrigatório. Neste último caso, o processador, a partir do dado referenciado, transfere um bloco de dados para a cache. O tempo de transferência entre as memórias é pequeno, se comparado com o aumento de desempenho obtido com a utilização desse tipo de memória.
 
 

- Memória Secundária

A memória secundária é um meio permanente (não volátil) de armazenamento de programas e dados. Enquanto a memória principal precisa estar sempre energizada para manter suas informações, a memória secundária não precisa de alimentação.

O acesso à memória secundária é lento, se comparado com o acesso à memória cache ou à principal, porém seu custo é baixo e sua capacidade de armazenamento é bem superior à da memória principal. Podemos citar, como exemplos de memórias secundárias, a fita magnética, o disco magnético e o disco óptico.
 
 

- Dispositivos de Entrada e Saída

Os dispositivos de entrada e saída (E/S) são utilizados para permitir a comunicação entre o computador e o mundo externo. Através desses dispositivos, a CPU e a memória principal podem se comunicar, tanto com usuários quanto com memória secundária, a fim de realizar qualquer tipo de processamento.

Os dispositivos de E/S podem ser divididos em duas categorias: os que são utilizados como memória secundária e os que servem para a interface homem-máquina.

Os dispositivos utilizados como memória secundária, como discos e fitas magnéticas, se caracterizam por armazenar de três a quatro vezes mais informações que a memória principal. Seu custo é relativamente baixo, porém o tempo de acesso à memória secundária é de quatro a seis vezes maior que o acesso à memória principal.

Alguns dispositivos servem para a comunicação homem-máquina, como teclados, monitores de vídeo, impressoras, entre outros. Com o avanço no desenvolvimento de aplicações de uso cada vez mais geral, procura-se aumentar a facilidade de comunicação entre o usuário e o computador. A implementação de interfaces mais amigáveis permite, cada vez mais, que pessoas sem conhecimento específico sobre informática possam utilizar o computador. Scanner, caneta ótica, mouse, dispositivos sensíveis à voz humana e ao calor do corpo humano são alguns exemplos desses tipos de dispositivos.
 
 

- Barramento

A CPU, a memória principal e os dispositivos de E/S são interligados através de linhas de comunicação denominados barramentos, barras ou vias. Um barramento (bus) é um conjunto de fios paralelos (linhas de transmissão), onde trafegam informações, como dados, endereços ou sinais de controle. Ele pode ser classificado como unidirecional (transmissão em um só sentido) ou bidirecional (transmissão em ambos os sentidos).

Na ligação entre CPU e memória principal, três barramentos são necessários para que a comunicação seja realizada. O barramento de dados transmite informações entre a memória principal e a CPU. O barramento de endereços é utilizado pela CPU para especificar o endereço da célula de memória que será acessada. Finalmente, o barramento de controle é por onde a CPU envia os pulsos de controle relativos às operações de leitura e gravação.
 
 

- Ativação/Desativação do Sistema

O sistema operacional é essencial para o funcionamento de um computador. Sem ele, grande parte dos recursos do sistema não estaria disponível, ou se apresentaria de uma forma complexa para utilização pelos usuários.

Toda vez que um computador é ligado, é necessário que o sistema operacional seja carregado da memória secundária para a memória principal. Esse processo, denominado ativação do sistema (boot), é realizado por um programa localizado em uma posição específica do disco (boot block), geralmente o primeiro bloco.

Além da carga do sistema operacional, a ativação do sistema também consiste na execução de arquivos de inicialização. Nestes arquivos são especificados procedimentos de inicialização e configuração de hardware e software específicos para cada ambiente.

Na maioria dos sistemas, também existe o processo de desativação. Este procedimento permite que as aplicações e componentes do sistema sejam desativados de forma ordenada, garantindo a integridade do sistema.
 
 

- Software

O hardware, por si só, não tem a menor utilidade. Para torná-lo útil, existe um conjunto de programas, utilizado como interface entre as necessidades do usuário e as capacidades do hardware. A utilização de softwares adequados às diversas tarefas e aplicações torna o trabalho dos usuários muito mais simples e eficiente.
 
 

- Tradutor

Nos sistemas operacionais antigos, o ato de programar era bastante complicado, já que o programador deveria possuir conhecimento do hardware e programar em painéis através de fios. Esses programas eram desenvolvidos em linguagem de máquina e carregados diretamente na memória principal para execução.

Com o surgimento das primeiras linguagens de montagem (assembly languages) e das linguagens de alto nível, o programador deixou de se preocupar com muitos aspectos pertinentes ao hardware. A utilização dessas linguagens facilitou a construção de programas em muitos aspectos.

Apesar das inúmeras vantagens proporcionadas pelas linguagens de montagem e de alto nível, os programas escritos nessas linguagens (programas-fonte) não estão prontos para ser diretamente executados pela CPU. Para isso, eles têm de passar por uma etapa de conversão, onde toda representação simbólica dos programas é traduzida para código de máquina. Esta conversão é realizada por um software denominado tradutor.

O módulo gerado pelo tradutor é denominado módulo-objeto, que, apesar de estar em código de máquina, na maioria das vezes não pode ser ainda executado. Isso ocorre em função de um programa poder chamar sub-rotinas externas, e, neste caso, o tradutor não tem como associar o programa principal às sub-rotinas chamadas. Esta função é realizada por um utilitário denominado linker.

O tradutor, pelo tipo de linguagem de programação utilizada, pode ser chamado de montador ou compilador.

O montador (assembler) é o utilitário responsável por gerar, a partir de um programa escrito em linguagem de montagem, um programa em linguagem de máquina não executável (módulo-objeto).

A linguagem de montagem é um conjunto de símbolos (mnemônicos) associado às instruções da linguagem de máquina do processador. Apesar das facilidades, como instruções simbólicas e possibilidade de documentação, a programação em linguagem de montagem está diretamente ligada às características da arquitetura do processador. Em função disto, este tipo de linguagem é diferente para cada computador, pois a linguagem de máquina e, consequentemente, a linguagem de montagem são características específicas do processador.

O compilador é o utilitário responsável por gerar, a partir de um programa escrito em uma linguagem de alto nível, um programa em linguagem de máquina não executável (módulo-objeto).

As linguagens de alto nível, como Pascal, Fortran, Cobol, não têm nenhuma relação direta com a máquina, ficando essa preocupação exclusivamente com o compilador. Os programadores de alto nível devem se preocupar apenas com o desenvolvimento de suas aplicações, não tendo que se envolver com detalhes sobre a arquitetura do processador. Assim, os programas-fonte podem ser transportados entre computadores de diversos fabricantes, desde que existam regras de definição para a linguagem. Isso permite o desenvolvimento de aplicações independentes do equipamento.

Um compilador é um utilitário que opera de modo integrado aos componentes do sistema de programação disponíveis, sob a supervisão do sistema operacional. Podemos visualizar, então, o compilador como uma interface entre o sistema operacional e o usuário, de maneira que é possível acessar diversos serviços do sistema sem a necessidade da utilização de linguagem de controle ou de outros utilitários.

- Interpretador

O interpretador é considerado um tradutor que não gera código-objeto. A partir de um programa-fonte, escrito em linguagem de alto nível, o interpretador, no momento da execução do programa, traduz cada instrução e a executa em seguida.

A maior desvantagem da utilização de interpretadores é o tempo gasto na tradução das instruções de um programa toda vez que este for executado, já que não existe a geração de um código executável. A vantagem é permitir a implementação de tipos de dados dinâmicos, ou seja, que podem mudar de tipo durante a execução do programa, aumentando, assim, sua flexibilidade.
 
 

- Linker

O linker (ligador), também chamado de linkage editor, é o utilitário responsável por gerar, a partir de um ou mais módulos-objeto, um único programa executável. Suas funções básicas são resolver todas as referências simbólicas existentes entre os módulos e reservar memória para a execução do programa.

Para resolver todas as referências a símbolos, o linker também pode pesquisar em bibliotecas do sistema ou do próprio usuário. Bibliotecas são arquivos que contêm diversos módulos-objeto e/ou definições de símbolos.
 
 

- Loader

O loader, também chamado carregador, é o utilitário responsável por colocar fisicamente na memória um programa para execução.
 
 

- Depurador

O depurador (debugger) é o utilitário que permite ao usuário controlar toda a execução de um programa a fim de detectar erros na sua estrutura. Este utilitário oferece ao usuário recursos como:

- Linguagem de Controle

A linguagem de controle, também denominada linguagem de comando, é a forma mais direta de um usuário se comunicar com o sistema operacional. Esta linguagem é oferecida para cada sistema operacional para que, através de comandos simples, o usuário possa ter acesso a rotinas específicas do sistema.
 
 

- Linguagem de Máquina

A linguagem de máquina de um computador é a linguagem de programação que o processador realmente consegue entender. Cada processador possui um conjunto único de instruções de máquina, definido pelo próprio fabricante. As instruções especificam detalhes, como registradores, modos de endereçamento e tipos de dados, que caracterizam um processador e suas potencialidades.
 
 

- Processos

O termo processo, é um dos conceitos mais importantes em sistemas operacionais. Um processo é basicamente um programa em execução, sendo constituído do código executável, dos dados referentes ao código, da pilha de execução, do valor do contador de programa (registrador PC), do valor do apontador da pilha (registrador SP), dos valores dos demais registradores de hardware, além de um conjunto de outras informações necessárias à execução do programa.

Para estudar um sistema operacional, precisamos considerar como ele responde a todas as atividades independentes que podem existir. Chamamos essas atividades de processos (tarefas). Elas representam qualquer entidade independente que é executada e compete por recursos. O número de programas por usuário e o de processos por programa pode variar, mas é importante fazer uma distinção entre eles. O sistema operacional não está preocupado com o usuário ou mesmo com o programa (pelo menos não diretamente), sua responsabilidade básica é com os processos que devem ser executados e competem aos recursos.
 
 

- Recursos

Pode-se afirmar, que um sistema operacional deve responder às necessidades de um processo. Para um processo ser atendido em suas necessidades, ele basicamente requer recursos.

Um processo precisa de memória para armazenar suas instruções e dados. Portanto, um sistema operacional deve garantir ao processo uma quantidade de memória suficiente. Mas a memória é um recurso finito. O sistema operacional não deve permitir que o processo ocupe tanta memória a ponto de impedir que outros processos sejam executados. Além disso, a privacidade e a segurança exigem que um processo seja impedido de acessar a memória de outro processo arbitrariamente. O sistema operacional deve não somente alocar, mas também controlar o acesso a esse recurso.

A CPU é outro recurso que o processo precisa para executar suas instruções. Como usualmente há mais processos que CPUs, o sistema operacional deve controlar seu uso, mas deve fazê-lo adequadamente. Os processos importantes devem obter acesso às CPUs rapidamente, e os menos importantes não devem usá-las à custa da exclusão de outros.

Os dispositivos incluem as impressoras, unidades de fita e unidades de disco. Assim como acontece com a CPU, em geral há mais processos do que dispositivos. O que acontece quando vários processos querem escrever na mesma impressora ou na mesma unidade de disco ou fita? O sistema operacional tem de determinar quem tem acesso a quê, além de controlar o fluxo dos dados enquanto os processos lêem e escrevem nos dispositivos.

Uma outra categoria muito importante é a relacionada ao sistema de arquivos. Uma das principais funções do sistema operacional é a de esconder as peculiaridades dos discos e outros dispositivos de entrada/saída. Obviamente são necessárias chamadas de sistema para criar, remover, ler e escrever arquivos. Antes de um arquivo ser lido, ele deve ser aberto, e após a leitura, ele deve ser fechado, de forma que devem ser fornecidas chamadas de sistema para realizar tais coisas.

O que se espera é que o sistema operacional localize rapidamente um determinado arquivo e também possa localizar um determinado registro no arquivo. Como os dispositivos de armazenamento em geral contém milhares de arquivos, e como um arquivo pode conter muitos milhares de registros, esta é uma tarefa complexa.