terça-feira, 22 de abril de 2008

Computador de Von Neumann (o seu)


Se por acaso tiver complicado entender, leia este post antes

Nos primórdios da computação, lá pela década de 30, Jon Von Neumman definiu um computador como algo que tivesse uma memória, uma unidade de controle, e uma unidade de lógica e aritmética. A esta espécie de conjunto deu-se o nome de arquitetura de Von Neumann. Até hoje, os computadores são feitos seguindo este princípio.(praticamente sem exceções).
A unidade de controle, a memória e a unidade de logica e aritmética comunicam-se entre si. A memória é algo dividido em bytes. Quero dizer, ela é endereçável, ou seja, ela tem vários e vários bytes de capacidade, mas ela é lida (ou escrita) indicando-se qual byte se
quer lêr naquele momento.
Abaixo, a figura de um arranjo de memória de 12 bytes.


A memória guarda instruções, do tipo "leia o byte que está na posição 2 da memória, some com aquele que está na posição 3 e guarde na posição 4".

"E onde é que se faz essa soma?"
É feita na unidade de lógica e aritmética. E quem comanda esse processo de transferir dados entre a memória e unidade de lógica e aritmética é a unidade de controle. Em resumo, a unidade de controle tem um ciclo infinito de buscar a instrução na memória, vê o que tem nessa instrução, fazer o que a instrução manda e colocar o resultado de volta em algum outro lugar da memória. Obviamente, tem lugares da memória onde se tem instruções, e lugares onde se tem dados.

"Então é só isso um computador?"
Claro que não né? Mas a base é essa aí. Ainda tem a se incluir aí algumas coisas, como por exemplo as placas de vídeo, som, rede, o teclado, o mouse... No fim das contas, é algo mais ou menos assim:


Perceba que atualmente se incorpora a unidade de controle(UC) e a unidade lógica e aritmética(ula) dentro do processador (dentre outras coisas que há dentro de um processador). Pode-se perceber também que há um controlador de memória entre o processador e a memória, e que o controlador de memória está ligado a outro controlador, o de dispositivos. Neste último, estão ligados os controladores de teclado e mouse, vídeo e som e o que mais couber nele. De fato, para o programador, os dispositivos agem como parte da memória. Os primeiros endereços da memória (as primeiras posições) são dos dispositivos. Lêr qualquer dado de um dispositivo usb é como ler da memória. É função do controlador de memória "separar" os acessos da memória dos acessos a dispositivos.

Um pouco mais sobre o processador ...
O processador têm dentro de sí, além de Uc e Ula (como na imagem acima) um conjunto de pequenas porçoes de memória, denominadas de registradores. Mas não são como a memória principal. Os registradores guardam dados auxiliares ao funcionamento do corrente programa em execução. Por exemplo, há um registrador que guarda o endereço de memória onde se inicia aquele programa, e há outro que guarda o endereço de onde se iniciam os dados daquele programa. Há um outro chamado contador de programa que guarda o endereço da proxima istrução que será executada. Em geral ele é incrementado de um em um a cada nova instrução que se executa, no entanto, existem instruções que permitem que se salte para posições específicas para trás ou para frente na memória. Certamente um computador não teria a menor utilidade se não houvessem estas. E há ainda os registradores de uso geral, que são usados ao gosto do programador. Dados são movidos da memória para os registradores auxiliares antes de se fazer qualquer operação, porque dentre outras coisas, a memória é bem mais lenta do que os registradores. Não se faz operações diretamente na memória. A figura abaixo ilustra um processador com as estruturas de registradores de uso geral, e uma memória com seus endereços, e um respectivo programa que calcula o fatorial de 5. Ao final, esse resultado estará armazenado no registrador A.

Só faltou falar que por "mova" deve-se entender "copiar dados daqui palí". No primeiro uso dele, coloca-se valores 5 no registrador A e 0 no B. Decrementar C quer dizer "diminuir C em 1". Usamos uma instrução de salto na 7ª e 8ª instruções. Elas fazem o fluxo do programa saltar para o endereço de memória o qual indicam.

Enfim, isto é um pouco de
programação de baixo nível para computadores. Espera-se que tenha dado pra se entender. Se uma hora eu estiver com mais disposição, pego essa figura daí de cima e faço um gif animado pra mostrar o funcionamento passo a passo do negócio.
A propósito, à essa linguagem de programação de baixo nível, chama-se assembly. Existem também as linguagens de programação de alto nível, que servem pra fazer coisas com menor trabalho. Outra hora explicaremos isso.

Nenhum comentário: