Aula 1 - Noções Básicas de Arquiterura de Hardware

Daniel Tiezzi

Estrutura básica de um computador

Um computador é uma máquina que tem a capacidade de executar operações aritméticas e lógicas de forma automática baseada em instruções provenientes de um programa de computador. Um computador completo é composto por uma estrutura de hardware, de um sistema operacional (OS) e de seus componentes periféricos é denominado de um sistema computacional. Nesta aula vamos ver quais são os componentes básicos de um computador e como esses componentes físicos interagem com os programas de computadores (softwares).

A arquitetura básica de um computador segue o padrão definido por von Neumann na década de 40. Ele descreveu o computador digital baseado nos seguintes componentes:

  1. Unidade de processamento central (CPU): possui a unidade de lógica e aritmética (ALU) bem como os registradores;
  2. A unidade de controle: contém as instruções dos registradores e o programa de contagem;
  3. Memória principal: contém as instruções (programas) e dados (memória RAM - Random Access Memory);
  4. Componentes de entrada e saída (I/O).

By Kapooht - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=25789639

Esses componentes são integrados por um sistema de comunicação denominado de barramento (bus em inglês). Pelo fato da memória principal conter as instruções e os dados a serem processados existir um barramento único de comunicação entre a memória e a CPU, esta arquitetura possui um “gargalo” em termos de velocidade de processamento que foi denominado de von Neumann bottleneck. A velocidade de processamento de dados na CPU é muito superior à velocidade de transporte de dados pelo barramento, o que limita a capacidade total do computador. Desta forma, os computadores mais recentes são baseados em novas tecnologias para otimizar o transporte de dados entre a memória principal e a CPU. A arquitetura de Harvard é uma arquitetura de computador que se distingue das outras por possuir duas memórias diferentes e independentes em termos de barramento e ligação ao processador. Outra evolução é a utilização de memória cache entre a memória principal e a CPU.

Veja que falamos sobre outro tipo de memória, a memória cache. Temos que lembrar que existem outros tipos de memória, que funcionam como memória secundária. A memória secundária clássica é o disco rígido (Hard Drive), ou HD como é conhecido. Os registradores também são um tipo especial de memória interna na CPU. Então, qual é a diferença entre essas memórias?

Os computadores utilizam um sistema binário para armazenar e manipular dados. Desta forma, toda a informação armazenada e em processamento no computador está em formato binário, que pode ser representado pelos valores 0 e 1 (se não está familiarizado com o sistema binário de contagem, você precisa ler este adendo antes de continuar). A unidade de memória é denominada bit, e cada unidade pode armazenar ou o valor 0 ou 1. Os registradores, a memória RAM e a memória cache são memórias que chamamos de voláteis. Essas memórias precisam de energia elétrica para funcionar. Cada célula da memória funciona como uma bateria e armazena um bit de informação.Se ela está carregada, o valor naquela célula vale 1, caso contrário, vale 0. Desta forma, se o computador for desligado, essas memórias serão apagadas. Assim, elas não podem ser utilizadas como um método seguro de armazenamento permanente de dados. Para armazenar dados de forma permanente, os computadores utilizam a memória secundária. Essas memórias não dependem da energia elétrica para guardar a informação. Assim, quando escrevemos um programa de computador, nós armazenamos ele na memória secundária. Podemos resumir as características dos diferentes tipos de memória na pirâmide abaixo:

Note que as memórias permanentes são bem mais baratas, mas não seria nem um pouco eficiente um computador utilizar um HD como memória principal. Atualmente, os OSs podem utilizar a memória secundária para armazenar dados e processos que estão em uso pela CPU. Chamamos de memória de swap. A memória de swap é uma região da memória secundária que o OS reserva para utilizar quando a memória principal está cheia. É um artifício que o SO utiliza para não travar o sistema. No entanto, quando o computador está utilizando a memória de swap, os processos começam a ficar lentos. Você já deve ter passado por situações semelhantes e, quando você reinicia o computador, o problema da lentidão se resolve.

Então, a memória RAM armazena programas e dados. Como o armazenamento não é permanente, o computador armazena na memória RAM as instruções e dados que estão sendo utilizados pela CPU. Na memória cache, o OS mantém os dados e instruções que estão sendo mais utilizados. Então, vamos demonstrar como isso funciona:

1. Vamos imaginar que eu tenho duas instruções (programas) que salvei no meu HD. Vamos colocar dois exemplos de instruções em forma de algoritmo abaixo:

algoritmo_1.txt:

SOMA(a, b):
    Criar variável x para um valor numérico inteiro e atribuir o valor de a;
    Criar variável y para um valor numérico inteiro e atribuir o valor de b;
    Criar variável z para um valor numérico inteiro;
    somar x e y e atribuir o valor resultante em z;
    imprimer o valor da variável z;
FIM;

algoritmo_2.txt:

SUBTRAI(a, b):
    Criar variável x para um valor numérico inteiro e atribuir o valor de a;
    Criar variável y para um valor numérico inteiro e atribuir o valor de b;
    Criar variável z para um valor numérico inteiro;
    subtrair x e y e atribuir o valor resultante em z;
    imprimer o valor da variável z;
FIM;

Veja que minhas duas instruções são arquivos de texto escritos em linguagem natural (no caso em portugês) e eles representam duas instruções para operações matemáticas de soma e subtração. Para que meu computador execute uma das instruções, temos que solicitar a execução. A solicitação deve ser feita por um componente de I/O. Podemos utilizar o teclado para solicitar a execução em linha de comando ou podemos ter um ícone que chama o executável com o clique do mouse. Se uma forma ou outra, se solicitarmos a execução do programa, ele será carregado na memória principal após ser compilado. A compilação é o processo que transforma uma linguagem de programação em uma linguagem de máquina. Lembra-se que já vimos que o computador só trabalha com valores binários. Desta forma a nossa instrução será compilada em um formato binário e será armazenado na memória RAM e estará pronto para ser executado. A instrução em execução pela CPU é um processo. Ou seja, a Unidade de Controle da CPU vai criar um processo para executar nossa instrução.

2. As instruções são executadas linha a linha pelo computador. Veja que nosso programa tem procedimentos que recebem duas variáveis a e b. Ou seja, temos que passar para o computador dois valores junto com a solicitação da execução da instrução. Essas variáveis que passamos juntamente com um procedimento ou função são denominadas de argumentos da função. Um exemplo de como poderíamos chamar uma instrução para que o computador processe seria:

SOMA(3,5)

3. Após a chamada da instrução, o programa é compilado e armazenado na memória RAM e é lido pela Unidade de Processamento. A instrução segue linha a linha:

- criar uma variável de nome x que recebe o valor de a (que foi passado como argumento da função como 3):
Aqui, o computador irá criar uma variável na memória RAM. Uma variável possui diferentes atributos. São atributos clássicos de uma variável: nome, seu tipo (número inteiro, caracter, etc), tamanho de memória ocupada e endereço de memória (local da memória onde a variável está armazenada). Então ele vai reservar um espaço de memória para armazenar a variável em um endereço específico, dar o nome de x e armazenar o valor 3 (11 em binário).

- Criar uma variável de nome y que recebe o valor de b (que foi passado como argumento da função como 5):
O computador reserva um espaço de memória para armazenar a variável em um endereço específico, dar o nome de y e armazenar o valor 5 (101 em binário).

- Criar uma variável de nome z sem um valor definido: O computador reserva um espaço de memória para armazenar a variável em um endereço específico, dar o nome de z.

- Os valores das variáveis x e y são movidos para os registradores onde irá ocorrer a operação aritmética gerenciada pela ALU, que retorna o valor 8 (1000 em binário). Esse valor é então gravado na memória RAM que foi destinada para a variável z.

- O computador envia para o dispositivo de I/O o valor da variável z, que é 1000 em binário o qual é convertido para decimal e imprime o número 8 na tela.

4. A instrução e as variáveis ficam guardadas na memória RAM até que o computador seja desligado ou haja uma instrução para apagar ou guardar outras instruções e dados sobre elas.