Unidade de Controlo. Unidade Aritmética e Lógica - PDF Free Download
Download "Unidade de Controlo. Unidade Aritmética e Lógica"
Olívia Castro Carmona
1 Métodos de Programação I Departamento de Matemática, FCTUC 8 Modelo de Organização de um Computador Digital - Modelo de Von Neumann Neste modelo esquemático de organização de um computador digital tradicional encontramos 3 unidades básicas principais: Unidade Central de Processamento (CPU, Central Processing Unit) onde, não só se executam as operações aritméticas e lógicas elementares estipuladas pelo programa, como também é efectuado todo o controlo do sistema informático. Assim, esta unidade central aparece dividida em 2 secções principais: a unidade de controlo e a unidade aritmética e lógica. Unidades de Entrada e Saída (Input/Output): são estas unidades que permitem a comunicação com o exterior. Memória Central : onde são armazenados os programas, dados e resultados necessários à prossecução e finalização da tarefa em curso. Unidade Processadora Central Unidade de Controlo C C controlo I instruções D dados R - resultados C R Unidade Aritmética e Lógica R C Unidades de Entrada e Saída D D R D Figura 10: Modelo de Von Neumann. Memória Central A unidade de controlo é a mais importante de todas as unidades. É ela que controla todo o funcionamento do sistema: retira, uma a uma, as intruções de execução da memória, analisa-as e transforma-as em sinais de comando a serem obedecidas pelas diversas partes físicas do computador. Comanda a entrada de dados e saída de resultados entre todas as restantes unidades e sincroniza todas as operações a serem efectuadas, a velocidades muito elevadas. Esta sincronização é feita usando um relógio interno que emite milhões de impulsos por segundo - MegaHertz (MHz)- e cada instrução toma uns tantos impulsos desses milhões para se poder realizar. A unidade aritmética e lógica apenas executa as operações elementares de cálculo ou transformação que lhe são indicadas pela unidade de controlo, na ordem por esta última sinalizada e sobre os dados por ela indicados. A memória central serve, obviamente, para armazenar dados, resultados e programas, tendo, basicamente, 4 funções diferentes durante o processamento e que, portanto, podemos descrever como estando dividida em quatro áreas diferentes de armazenamento:
2 Métodos de Programação I Departamento de Matemática, FCTUC 9 área de armazenamento de dados de entrada (que conterá os dados exteriores que o programa necessita para a sua execução) área funcional (serve para anotar resultados intermédios do processamento) área de armazenamento de programas (guarda as instruções de processamento do programa a correr no momento) área de armazenamento de saída (guarda resultados finais do processamento até que possam sair da memória central) Esta separação é apenas funcional, isto é, não é física nem permanente, variando de programa para programa. Existem também diferentes tipos de memória para além da central. Esta última tem que ser afecta ao computador para que este possa trabalhar mas podemos estender a capacidade de memória de um computador usando as chamadas memórias auxiliares. Estas unidades não são essenciais ao funcionamento do computador por si só e, por isso, quando existem, são identificadas como unidades periféricas. Dentro dos diferentes tipos de memória, podemos agrupá-los em dois grupos principais: Memórias de acesso sequencial (para recolher uma informação específica, temos de passar toda a informação que seja anterior a esta, desde o ínicio da memória, até encontrar a informação desejada) - fita magnética (cartuchos, bobinas, cassetes ); Memórias de acesso directo (podemos recolher a informação desejada directamente, através do uso de endereços para localização) - discos magnéticos (disco duro, disquetes, ), discos ópticos (CD/DVD). Claramente, estas diferenças aparecem devido a custos de construção das diferentes memórias e, mesmo dentro da memória central, teremos memórias mais rápidas e mais lentas para o trabalho do computador. De facto, não só a velocidade de processamento é importante num computador mas, também, a velocidade de acesso à informação é extremamente importante. Que interesse tem um processador muito rápido se tivermos que estar à espera enquanto ele recolhe informação em memória? Os diferentes tipos de memórias que existem são fabricados em materiais diferentes que têm, obviamente, capacidades diferentes (de armazenamento, de propagação de sinais eléctricos, etc) e são uns mais caros que outros. Podemos, portanto, falar de uma hierarquia de memória, em termos dos diferentes tipos de memória e em função da sua capacidade, tempo de acesso e custo, que se encontra esquematizada na figura seguinte: - + memórias capacidade/tempo de acesso centrais custo memórias auxiliares directas memórias auxiliares sequenciais + - Figura 11: Hierarquia de memória. As unidades de entrada e saída, que servem para efectuar a comunicação com o exterior, são constituídas por todos os periféricos de comunicação com o exterior como, por exemplo: monitor teclado rato
3 Métodos de Programação I Departamento de Matemática, FCTUC 10 impressoras unidades de leitura óptica ou magnética (leitores de CD/DVD, disquetes, ) modems (unidades de comunicação digital entre computadores) scanners (unidades de leitura digitalizadoras) câmaras de video microfones joystick 1.4. HARDWARE VERSUS SOFTWARE Vimos já quais as componentes físicas básicas de um computador digital. O conjunto destes dispositivos toma a designação geral de hardware (equipamento físico: dispositivos mecânicos, magnéticos, eléctricos e electrónicos). A parte lógica, com a qual podemos tirar partido e fazer funcionar o hardware, designa-se por software (aspecto lógico, domínio da programação: conjunto de programas, métodos, regras e documentação necessárias ao perfeito funcionamento do sistema informático). Tal como não é possível conceber a existência de um computador sem a sua parte física, também o seu funcionamento é inconcebível sem o software, por muito poderoso e sofisticado que seja o sistema. Um programa é, basicamente, um conjunto de instruções, escritas numa linguagem específica, destinadas a orientar o sistema informático na execução de vários passos elementares que, no seu conjunto conduzem a um determinado objectivo. Assim, e consoante as características desse objectivo, podemos dividir o software em 3 categorias principais: Software do Sistema (Sistema Operativo) - fornecido com cada computador, permite a gestão do funcionamento integrado de todas as componentes Software de Suporte - fornecido pelos fabricantes, permite a gravação, aperfeiçoamento e utilização dos programas de aplicação (tradutores, compiladores, editores, ) Software de Aplicação - programas escritos pelos utilizadores e programas que usam subrotinas das duas classes anteriores (programas de cálculo matemático, traçadores de gráficos, processadores de texto, ) Antes de qualquer outro, o software mais importante e que é o primeiro a ser introduzido num computador é o sistema operativo. É com este conjunto de rotinas que a parte física pode funcionar e é graças a ele que podemos comunicar com o computador. Assim, um sistema operativo (SO) é um conjunto integrado de rotinas especializadas para controlar todo o sistema básico. Fica residente em memória central e parte dos comandos de um sistema operativo ficam armazenados numa zona especial de memória (dita, área apenas para leitura - ROM, Read Only Memory), não precisando de ser activamente invocados para funcionar, basta, para tal, ligar o computador. De facto, são estes comandos que tornam possível a primeira ligação com o utilizador, testando a operacionalidade de todos os componentes e permitindo ao utilizador comandar o sistema. Podemos visualizar as categorias de software como encapsulando todo o sistema computacional de acordo com o esquema seguinte:
4 Métodos de Programação I Departamento de Matemática, FCTUC 11 Utilizador Aplicações Sistema Operativo Hardware Sistema Operativo Aplicações Funções gerais de um sistema operativo Figura 12: Hardware/Software/Utilizador controlar operações de entrada e saída controlar o fluxo de dados entre memórias centrais e auxiliares fornecer as instruções necessárias para que as diferentes partes do sistema cooperem entre si fazer a distribuição do tempo por diferentes tarefas ou utilizadores chamar outros programas sempre que necessário É, portanto, o sistema operativo que controla a CPU e permite a ligação com o utilizador. Como exemplos de sistemas operativos mais vulgares temos: UNIX / LINUX - inicialmente destinado a grandes computadores, vulgarizou-se para todos os tipos de computadores, sendo já utilizado em computadores pessoais (LINUX). Serviu de exemplo para a maior parte dos outros SO. DOS - nos primeiros computadores pessoais, o SO começou por ser armazenado num disco flexível, daí o seu nome, que deriva do inglês, Disk Operating System. Linguagens de Programação O computador, ou a sua CPU, só entende uma linguagem especial, dita linguagem máquina, constituída apenas por zeros (0) e uns (1). Mais ainda, qualquer comando directo, tem que ser o mais simples possível, porque a CPU só trabalha com ordens e operações muito elementares. É também necessário conhecer muito bem os componentes físicos e o modo como são interligados (a arquitectura do sistema), o que pode variar muito de máquina para máquina. Daí ser extremamente difícil e moroso programar neste código. Uma vez que se pretende, com o computador, tornar o trabalho mais eficiente, mais rápido e mais rentável, foram criadas linguagens mais próximas do entendimento humano e das linguagens naturais. Vejamos uma tabela com alguns exemplos de linguagens de programação: Linguagens de baixo nível: mais próximas da parte física e do funcionamento próprio do computador, logo, produzindo programas longos e de muito difícil leitura/correcção para um utilizador humano Linguagem máquina - Reflecte a estrutura interna de cada computador; Constituída por combinações numéricas de zeros e uns ( ) dito código binário; Assembler - Substitui pequenos arranjos de combinações numéricas em código binário por instruções básicas descritas por mnemónicas (SUM A1, A2); Dependente do computador;
5 Métodos de Programação I Departamento de Matemática, FCTUC 12 Linguagens de alto nível: mais próximas dos conceitos humanos e pouco ou nada dependentes da máquina em questão. Cada instrução corresponde a muitas instruções de código máquina, o que torna os programas mais curtos, legíveis e mais facilmente alteráveis por utilizadores humanos. LINGUAGEM FORTRAN LISP PASCAL C Modula ADA C++ Prolog Haskell PHP Java TIPO Cálculo intensivo Simbólica e lógica Genérica Genérica Genérica ( sucessora do Pascal) Defesa e espionagem Genérica, com tipos abstractos de dados e orientação a objectos Lógica Funcional Processamento de Hipertexto Hipertexto com gráficos e video INICIADA EM Tabela 1: Alguns (poucos) exemplos de linguagens de programação de alto nível 1.5. REPRESENTAÇÃO DIGITAL: NOÇÕES BÁSICAS A informação pode ser agrupada em dois tipos distintos conforme a sua variação: Informação analógica a variação é contínua (como, por exemplo, com um metro, podemos medir continuamente uma superfície, e indicar esta medição o mais precisamente possível); Informação digital a variação é discreta (como, por exemplo, num relógio digital, que salta de segundo para segundo, minuto para minuto, etc) Os computadores actuais são sistemas de informação digital, logo, toda a variação é discreta (e finita). Os computadores usam a informação digital mais simples possível: a informação digital binária. A unidade elementar que constitui este tipo de informação é o digito de informação binária e denomina-se bit (de binary information digit). Obviamente que este digito pode representar (apenas!) dois estados distintos: o 1 ou o 0, verdadeiro ou falso, ligado ou desligado. Isto significa que, se queremos maior quantidade de informação, temos de juntar vários bits para obter muito mais estados distintos. Prova-se facilmente, usando o método de indução matemática, que: Teorema: Uma sequência de n bits pode representar 2 n estados distintos. Assim, a memória de um computador digital é constituída por uma sequência enumerada de células, cada uma permitindo o armazenamento de uma palavra. Por sua vez, uma palavra é uma sequência formatada de k (fixo) bits. É a palavra de cada computador que permite representar a (menor) quantidade de informação completa, manipulável por esse computador. Por exemplo, um byte * é uma palavra de 8 bits. Internamente, a memória de um computador organiza-se pelo endereçamento da sequência de palavras, de modo a associar várias palavras a uma informação completa (por exemplo, a um programa) ou a isolar vários pedaços de informação. Quer isto dizer que, cada palavra (ou célula) em memória tem um endereço, que permite identificar cada uma delas individualmente, por forma a permitir o acesso à palavra * A palavra byte vem do inglês, binary term.
6 Métodos de Programação I Departamento de Matemática, FCTUC 13 aí registada. Por acesso queremos significar que pode ser feita uma leitura, ou um registo, ou um teste, à palavra armazenada num dado endereço. Obviamente, cada computador tem uma capacidade limitada de memória, que é quantificada pelo número de palavras que consegue armazenar. Daí os valores que estamos habituados a ver (ler) quando queremos saber quais as especificações de um computador e que significam o seguinte (de acordo com o teorema anterior): 2 10 = 1024 = 1K 2 16 = 2 10 x 2 6 = 64K 2 20 = 2 10 x 2 10 = 1M (1 Mega) 2 30 = 2 10 x 2 20 = 1G (1 Giga) Mas o que sinifica uma informação completa ocupar uma palavra da memória? E quando é que é necessário ocupar mais células? Para responder a estas e outras questões vamos conhecer um pouco melhor a representação de informações elementares em memória de um computador digital. Representação de Números Inteiros Como vimos atrás, o computador só entende a linguagem máquina, que é um subconjunto da linguagem binária, ou seja, sequências de zeros (0) e uns (1). Um byte é uma sequência de oito bits em binário e, por exemplo, um inteiro pode ser representado por uma palavra de um byte de acordo com a figura 13. Figura 13: Palavra de um byte Como é óbvio, um qualquer número natural é escrito usando uma base para representação numérica. Habitualmente, escrevemos os naturais usando uma representação de base 10, como, por exemplo, em 2, 45 ou 1024, onde o indíce (10) indica em que base estão os numeros representados (escritos). No (10) (10) (10) caso de usarmos binário, isto significa que vamos escrever os números usando representação em base 2, ou seja, k num (2) = Σ b i 2 i, i=0 onde k indica a quantidade máxima de índices de b usados, sendo b um vector que guarda os coeficientes da representação de num em base 2. Quer isto dizer, que o número representado pela palavra na figura 13 é, em base decimal, 51 (10), senão vejamos: (2) = 1x x x x x2 7 = 179 (10) Claramente, o maior inteiro representável num computador depende do tamanho da célula desse computador que o vai guardar. Por exemplo, no caso de usarmos palavras de 1 byte para representar naturais num computador, o maior inteiro será (2). A questão que se segue será, obviamente, a da representação de números inteiros, ou seja, números naturais com sinal. Para estes, usa-se a notação em sinal e valor absoluto, o que significa que vamos fixar um dos bits da palavra para representar o sinal (por exemplo, o zero (0) representará um sinal positivo e o um (1) um sinal negativo), e apenas os restantes bits servirão para representar o valor numérico, em módulo, do inteiro em causa. Por exemplo, o número -123 (10) será representado pelo seguinte byte:
7 Métodos de Programação I Departamento de Matemática, FCTUC 14 Figura 14: Representação do número -123 (10) em binário. Assim, e usando palavras de 1 byte para representar inteiros, sobram apenas 7 bits para representar a grandeza do número inteiro. Qual será, agora, o maior inteiro representável por palavras de 1 byte? E o menor? E se usarmos um computador com palavras de 16 bits? Esta forma de representar tem a desejável propriedade de que cada operação aritmética é exacta, só havendo situação de erro no caso de o resultado exceder o maior (ou menor) inteiro representável caso em que se diz ter ocorrido erro de transbordo (do inglês, overflow). Representação de Números Reais Para representar os números reais, vamos usar a representação em vírgula flutuante normalizada, ou seja, usando uma mantissa, base e expoente: onde M, representa a mantissa, ou seja, um real pertencente ao intervalo [0.1, 1[, B representa a base de representação pretendida e k é um expoente inteiro. Por exemplo, usando a notação decimal temos: = - 0,4567 x ,0038 = + 0,38 x 10-2 Mas com guardar esta informação em células binárias de memória? A representação interna em código binário estará de acordo com a figura 15 (onde o número de bits reservados para a mantissa (M) e para o expoente (k) podem ser diferentes de computador para computador), usando valores binários quer para a mantissa, quer para o expoente. (1 bit) (8 bits) (23 bits) Sinal Expoente Mantissa Figura 15: Representação digital de um número real em memória. Obviamente que isto implica que a representação de números reais não é, em geral, exacta pois depende do número de bits reservados para representar a mantissa. Tal como para os números inteiros, a grandeza de representação possível é limitada, neste caso, pelo número de bits reservados para o expoente. Mas, enquanto que, no caso dos inteiros, que são números discretos, logo, representáveis em memória digital por um subconjunto completo de Z, para os reais não é possível representar uma variação contínua, logo, não é possível representar intervalos reais: ou seja, a representação digital de reais é discreta e limitada. Representação de Caracteres Para representar valores não numéricos, ou seja, caracteres, é necessário usar um código de representação, de modo a fazer corresponder, a cada caracter, um número binário. Existem vários códigos deste tipo mas
8 Métodos de Programação I Departamento de Matemática, FCTUC 15 o mais vulgar é o código ASCII (do inglês, American Standard Code for Information Interchange). Este código usa 7 dígitos binários para representar um caracter, o que permite uma gama de representação de 128 caracteres (ou seja, 2 7 ). No ASCII, temos 2 grupos principais de caracteres: um primeiro grupo de cerca de 33 caracteres que são usados para controlar a parte física de um sistema computacional, ou seja, o hardware, e que, em geral, não são visíveis num terminal de utilização humana. O grupo restante inclui os caracteres visíveis num terminal de utilização humana.