Olá, estudante! Para esta lição, convido-o(a) a verificar detalhes de como a máquina que mais modificou o comportamento do Homem funciona. Você terá oportunidade de conhecer uma execução básica de um computador e analisar os conceitos por detrás disso. Vamos lá!
Você já parou para pensar como um computador consegue armazenar dados e instruções na memória? Já falamos aqui que o modelo foi criado por Von Neumann, está lembrado(a)?
Mas como a “mágica” acontece? Por exemplo, de que maneira os dados são introduzidos e, depois, acessados ou retirados? Bom, para entendermos, é preciso lembrar de dois conceitos importantíssimos em computação: software e hardware. Por meio deles, fica mais fácil compreendermos o conceito de Entrada, Processamento e Saída.
Assim, a computação foi definida, por meio de fluxos que ocorrem por meio da interação entre software e hardware. Mas como uma memória trabalha e como uma unidade central opera? É exatamente isso que entenderemos nesta lição!
Pode ser que, no decorrer de sua carreira profissional, você se depare com a necessidade de fazer aquilo que, na computação, chamamos de “escovar bits”. Já ouviu essa expressão? Se não ouviu, provavelmente, ainda ouvirá. Ela se refere a projetos e desenvolvimento de trabalhos que envolvem não somente programar, mas ter que realizar alguma interação ou montagem que envolva o hardware da máquina. O crescimento da internet das coisas, ou IOT, e de softwares embarcados, com certeza, levará a essa experiência.
No passado, quando me confrontei com problemas ou oportunidades assim, foi vital pensar em como estruturar esse tipo de projeto mais abrangente. Tive a oportunidade de atuar em um projeto em uma empresa de Taiwan, e a ideia era construir um controlador de logística e estoque. Não deu outra, tivemos que produzir o nosso próprio produto, o aparelho que realizaria a leitura de etiquetas via RFID. Para isso, algo que me ajudou foi pensar em alguns preceitos, como:
Quantos bits serão necessários?
Quantos dispositivos serão controlados?
Quais interações acontecerão de entrada?
Quais interações acontecerão de saída?
Quais dados ficarão armazenados e por quanto tempo?
Quais requisitos de velocidade?
Essas perguntas devem ser pensadas e deve-se buscar as respostas. Perceba que o projeto que envolve hardware precisa ter maiores preocupações que um projeto somente de desenvolvimento de software.
Tocci, Widmer e Moss (2007) explicam que há alguns princípios que se aplicam, praticamente, a todo tipo de memória e, além disso, dizem que os sistemas de memória precisam ter diferentes linhas de entrada e saída. Os princípios realizam as funções de:
Ao efetuar uma operação de leitura ou de escrita, é necessário selecionar o endereço da memória para acesso.
A operação de escrita ou de leitura necessita ser escolhida.
Se a operação for de escrita, deve-se fornecer os dados de entrada que serão armazenados na memória.
Se a operação for de saída, deve-se manter os dados selecionados durante a operação.
Se houver entradas de endereço e os comandos de leitura ou escrita, deve-se habilitar ou desabilitar a memória .
Para facilitar o nosso entendimento, imagine uma memória com capacidade de armazenar 32 palavras. Isso significa que ela tem 32 posições diferentes para realizar isso. Em outras palavras, seria o mesmo que dizer que ela tem 32 endereços (binários) diferentes. Vamos representar isso? Veja a tabela a seguir:
Tabela 1 - Tabela Células de Memória x Endereços de Memória / Fonte: adaptada de Tocci, Widmer e Moss (2007).
#PraCegoVer: a tabela apresenta nove colunas e nove linhas e dois cabeçalhos. O cabeçalho da esquerda se chama “Células de Memória”, com fundo branco, e seu conteúdo está entre as colunas um e quatro. O cabeçalho da direita se chama “Endereços de Memória” e tem fundo azul. O seu conteúdo está entre as colunas cinco e nove. A linha duas possui os seguintes conteúdos, a partir da coluna um até a coluna nove: “0, 1, 1, 0, 0, 0, 0, 0 e 0”. A linha três possui: “1, 0, 0, 1, 0, 0, 0, 0 e 1”. A linha quatro possui: “1, 1, 1, 1, 0, 0, 0, 1 e 0”. A linha cinco possui: “1, 0, 0, 0, 0, 0, 0, 1 e 1”. A linha seis possui: “0, 0, 0, 0, 0, 0, 1, 0 e 0”. A linha sete possui: “0, 0, 0, 0, 0, 0, 1, 0 e 1”. A linha 8 possui “·, ·, ·, ·, ·, ·, ·, · e ·”. A linha 9 possui: 1, 1, 0, 1, 1, 1, 1, 1, 1.
Conforme a Tabela 1, é possível perceber que a memória de exemplo teria 32 endereços binários diferentes (de 00000 até 11111, ou seja, de 0 a 31 em decimal). Isso, então, dar-nos-ia a possibilidade de trabalhar com até cinco entradas de endereço. Dessa maneira, se você desejasse acessar uma posição de memória para uma operação (que poderia ser tanto de leitura como de escrita), precisaria do código de endereço, que, em nosso exemplo, possui cinco bits. Assim, a palavra 1101 está armazenada no endereço 11111. Sabendo disso, podemos, agora, pensar em um modelo da memória que teria sempre:
Entrada de Endereço.
Entrada de Dados.
Comandos de Leitura.
Comandos de Escrita.
Habilitador da Memória.
Saída de Dados .
Com certeza, ficou bem mais fácil para você entender o funcionamento desse dispositivo que precisamos tanto, não é mesmo?
Agora você entende a razão pela qual, quando utiliza uma calculadora comum, há um limite de números a ser digitado? Isso tem a ver com a capacidade de entrada de dados que ela possui.
A Unidade Central de Processamento (UCP ou CPU) de um computador, de acordo com Guimarães e Lages (2005), é dividida em duas partes para melhor compreensão: Unidade de Controle (UC) e Unidade Lógica e Aritmética (ULA).
A Unidade Central de Processamento funciona por meio de um conjunto de padrões que são adotados para que ela saiba quais operações devem ser realizadas, onde está o dado necessário e os passos para efetuá-la. Esse padrão é chamado, na computação, de Instrução, e ela é uma configuração de binários, os quais são compostos por:
Código de Operação: identifica a operação que será executada.
Campo de Operandos: especifica onde estão os dados necessários (endereços das posições de memória).
Temos três tipos de Campo de Operandos, quais são:
3 Operandos: endereços dos dados a serem operados e o endereço onde o resultado será alocado.
2 Operandos: endereços dos dados a serem operados e o resultado é colocado em um dos dois endereços.
1 Operando: endereço de um dos operandos e outro já está definido como registrador da CPU, chamado Acumulador .
Para nos ajudar a entender, veja a figura a seguir:
Figura 2 - Formato das Instruções da CPU
Fonte: o autor.
#PraCegoVer: a figura apresenta nove retângulos com fundo azul, dispostos em três níveis. O primeiro nível possui quatro retângulos dispostos em sequência horizontal. Da esquerda para direita, com os nomes: “Código da Operação”, “Endereço do Operando”, “Endereço do Operando” e “Endereço do Resultado ou de Instrução”. O segundo nível possui três retângulos dispostos em sequência horizontal. Da esquerda para a direita com os nomes: “Código da Operação”, “Endereço do Operando” e “Endereço do Operando ou de Instrução”. O terceiro nível possui dois retângulos dispostos em sequência horizontal. Da esquerda para a direita com os nomes: “Código da Operação” e “Endereço do Operando ou de Instrução".
Dessa maneira, a CPU precisa saber qual a instrução que será executada e decodificar o código de operação. Além disso, ela ainda precisa acessar a memória e retirar de lá os dados que o campo de operandos solicitou e, depois, acionar a ULA para executar a operação. Para que tudo isso aconteça, Guimarães e Lages (2005) explicam que a UC testa somente a validade do código de operação de cada instrução e que, para que os dados e as instruções armazenados na memória fiquem acessíveis para a CPU, ela precisa da seguinte estrutura de registradores:
Contador de Instruções (CI): endereço da próxima instrução para execução.
Registrador de Endereços (RE): endereço da palavra a ser retirada ou colocada na memória.
Registrador de Dados (RD): dado a ser retirado ou colocado na memória no endereço que o RE indicou.
Registrador de Instruções (RI): contém a instrução que foi retirada para ser executada.
Acumulador (AC): operandos para as operações lógicas e aritméticas. Também usado como registrador (entrada e saída de dados) .
Conforme pudemos ver, o trabalho da memória com a CPU é fundamental para que toda a computação aconteça. É muito importante percebermos como o computador é organizado em termos de sua arquitetura, pois isso pode fazer muita diferença no nível de confiabilidade e processamento que a máquina pode executar.
Uma vez que entendemos o funcionamento da memória e da CPU, podemos simular uma operação de escrita:
CPU fornece o endereço binário da posição da memória em que o dado será armazenado.
CPU coloca o endereço nas linhas de barramento de endereço.
CPU coloca os dados a serem armazenados no barramento de dados.
CPU ativa as linhas de sinal de controle para escrever na memória.
O endereço binário é decodificado para determinar a posição que está sendo selecionada para a operação de armazenamento.
Os dados no barramento de dados são transferidos para a posição de memória que foi selecionada .
Portanto, toda vez que o computador está executando as instruções de um programa a CPU lê, continuamente, as informações das posições de memória. Consegue perceber como o trabalho do computador é árduo?! Assim, sempre que for desenvolver alguma solução, pense em como otimizar o uso do processamento por meio de operações lógicas que, realmente, possam utilizar os recursos computacionais da melhor maneira possível!
GUIMARÃES, A. M.; LAGES, N. A. Introdução à Ciência da Computação. Rio de Janeiro: LTC, 2005.
TOCCI, R. J.; WIDMER, N. S.; MOSS, G. L. Sistemas Digitais: princípios e aplicações. São Paulo: Pearson Prentice Hal, 2007.