SEO ou Search Engine Optimization.

SEO Search Engine Optimization

É o processo que usamos para melhorar a visibilidade de um site... Mais informações »

Dicas Para Blog

Dicas Para Blog

Aqui você encotra tudo sobre personalização de blog... Mais informações »

Ganhado Dinheiro

Ganhado Dinheiro

Diversas formas de ganhar dinheiro com seu site ou blog... Mais informações »

Anuncie Aqui

Anuncie Aqui

Banner aleatório fica exposto de forma dinâmica, intercalando a divulgação com outro anunciante do site... Saiba Como »

Envie sua sugestão

Envie sua sugestão

Deixe sua sugestão para que possamos melhorar ainda mais a qualidade do nosso serviço... Envie sua sugestão »

Arquitetura de computadores

O conceito de Máquina Virtual está, exatamente, associado à questão das máquinas multinível, ou seja, para uma máquina multinível dizemos que existirá uma máquina virtual associada à cada nível. Na realidade, quando escrevemos um programa em uma linguagem de alto nível como PASCAL, FORTRAN, COBOL, DELPHI e outras devemos ter em mente que o computador não entenderá aquelas instruções, uma vez que, elas foram desenvolvidas com o objetivo de facilitar o trabalho do programador.
Este programa em alto nível deverá ser traduzido tantas vezes quantas forem necessárias para que os circuitos lógicos (hardware), que são os receptadores finais, possam “entender” e executar tais programas. É importante ressaltar que a cada nível de tradução existirá uma linguagem específica sendo executada e a cada linguagem é como se existisse uma máquina cuja linguagem de programação dela fosse a daquele nível.
Índice:


Se você Gostou clique no botão de +1 Abaixo e ajude a divulgar esse post.


Capitulo 1 - Conceitos básicos
Conceito de Máquina Virtual03 Hardware, Software e Máquina Virtual05
Capitulo 2 - Unidade Central de Processamento (UCP)
Organização interna 07 Ciclo de instrução11 Execução paralela de instruções12
Capitulo 3 - Memória Principal


Organização 20 Endereçamento 26 Armazenamento 26 Detecção e correção de erros28 Comunicação serial 3
Capitulo 4 - Memória Secundária
Discos magnéticos Discos óticos Fitas magnéticas
Capitulo 5 - Hierarquia de memória Memória virtual39
Capitulo 6 - Controle de entrada e saída
Programada 4 Por interrupção44 Por DMA45 Por canais de I/O46
Capitulo 7 - Arquiteturas avançadas RISC x CISC47
Capitulo 8 - Microprocessadores e barramentos
Pastilhas microprocessadas 50 Barramentos síncronos 5 Barramentos assíncronos 57
Arbitragem de barramento59 Microprocessadores INTEL 62 Barramento IBM-PC e barramento VME64
Capitulo 9 - Formatos e endereçamento de instruções
Formato de instruções68 Tipos de endereçamento71 Tipos de instruções77
Capitulo 10 - Linguagem de montagem
Conceito 78 Formato genérico78
Capitulo 1- Assembler 80C31 (Intel)
Características gerais 79 Conjunto de instruções91 Exemplos de programas91
Capitulo 1 - Conceitos básicos
Conceito de Máquina Virtual
No início dos sistemas computacionais, a forma, de programação representava um grande problema a ser solucionado. Na realidade a programação era feita diretamente no hardware por técnicos e engenheiros em eletrônica, ou seja, para programar um computador nesta época era necessário conhecer profundamente o hardware. Esta característica limitava o número de pessoas que podiam ter acesso a esta tecnologia e obviamente interferia no desenvolvimento destas máquinas.
M. V. Wilkes projetou, na Inglaterra, a primeira máquina com três níveis com o objetivo de simplificar o hardware e o processo de programação. Esta máquina deveria ter um interpretador embutido e fixo e o nível de lógica digital (hardware) deveria executar, somente, instruções de um microprograma que representa um conjunto de instruções bem menor e com isto teremos hardware mais simplificado.
O conceito de Máquina Virtual está, exatamente, associado à questão das máquinas multinível, ou seja, para uma máquina multinível dizemos que existirá uma máquina virtual associada à cada nível. Na realidade, quando escrevemos um programa em uma linguagem de alto nível como PASCAL, FORTRAN, COBOL, DELPHI e outras devemos ter em mente que o computador não entenderá aquelas instruções, uma vez que, elas foram desenvolvidas com o objetivo de facilitar o trabalho do programador. Este programa em alto nível deverá ser traduzido tantas vezes quantas forem necessárias para que os circuitos lógicos (hardware), que são os receptadores finais, possam “entender” e executar tais programas. É importante ressaltar que a cada nível de tradução existirá uma linguagem específica sendo executada e a cada linguagem é como se existisse uma máquina cuja linguagem de programação dela fosse a daquele nível.
Por exemplo: Podemos imaginar o Hardware de uma máquina cuja linguagem de programação dela fosse o DELPHI ?
Do ponto de vista técnico, esta máquina seria possível de ser criada e implementada, uma vez que, (todo software pode ser implementado em hardware e todo hardware pode ser simulado em software), porém, do ponto de vista comercial esta máquina seria inviável sobre vários aspectos:
Circuitos eletrônicos altamente complexos. (funções muito complicadas)
Restrições na programação. (somente uma linguagem de programação) Custo elevado para implementação do hardware.
Por estes aspectos apresentados observamos que, embora possível, uma máquina com estas características não seria viável de ser implementada.
Cada máquina possui uma linguagem própria que esta associada ao processador utilizado para confecção do hardware. Esta linguagem é denominada linguagem de máquina e iremos chama-la de L1. Por serem instruções muito simples (composta por números) elas se tornam muito complicadas de serem utilizadas diretamente pelos programadores. Existe então a necessidade de utilização de uma outra linguagem de melhor entendimento e que facilite o trabalho de desenvolvimento dos programas. Esta nova linguagem chamaremos de L2. Na realidade as máquinas são capazes de executar, somente, programas escritos em L1, logo, é necessário que os programas escritos em L2 sejam convertidos em L1. Isto poderá ser feito de duas formas:
Tradução
Nesta técnica o programa escrito em L2 é totalmente convertido, instrução por instrução, em um novo programa formado por apenas instruções em L1 que será então executado.
Interpretação
Neste caso existirá um programa escrito em L1 que terá a função de receber o programa escrito em L2 como dados de entrada, instrução por instrução, converte-las em instruções L1 e executa-las sem gerar um novo programa em L1.
Como a linguagem L1 pode ser executada diretamente pelos circuito lógicos e para facilitar o processo de conversão de L2 em L1 estas duas linguagens são muito parecidas o que torna o trabalho de programação ainda complicado. Existe então a necessidade de uma nova linguagem que se aproxime ao máximo da linguagem humana e que iremos chamar de L3. Desta maneira quando escrevemos um programa em L3 estaremos escrevendo um programa para uma máquina virtual cuja linguagem de programação dela é, naquele momento, L3.
A maioria das máquinas multinível possuem 6 níveis. O nível mais baixo (nível 0) é o nível do hardware, dos circuitos lógicos digitais que executam efetivamente as tarefas estabelecidas pelo programa de nível 1 imediatamente superior. No nível 1, nível de linguagem de máquina, observamos, efetivamente, o conceito de programa onde teremos um microprograma interpretando as instruções do nível 2. O nível 2 é um nível de transição presente em todas as máquinas no qual podemos observar mais semelhanças do que diferenças, até mesmo entre máquinas de diferentes fabricantes. Em algumas máquinas que não possuem o nível de microprogramação as instruções do nível 2 são diretamente executas pelo hardware do nível 0. O nível 3 é denominado nível de Sistema Operacional pois existirá um interpretador que controlará a execução das instruções deste nível. Algumas destas instruções serão executadas com o controle do Sistema Operacional e outras serão executadas diretamente pelo microprograma o que classifica este nível com sendo um nível híbrido. O nível 4 é o primeiro nível desenvolvido para ser utilizado pelos programadores comuns, neste nível teremos a presença de uma linguagem simbólica que permitirá uma maior facilidade na programação. Este nível é denominado nível de linguagem de montagem. Outra característica que difere este nível e o próximo superior dos demais descritos é a presença de um tradutor como elemento responsável pela conversão dos programas escritos neste nível para o próximo inferior. O tradutor é na realidade um compilador que se encarregará de gerar um novo programa para poder ser interpretado pelo nível de máquina virtual inferior. O nível 5 é o nível de linguagem de alto nível no qual encontraremos diversas linguagens de programação que são desenvolvidas com o objetivo de permitir a implementação de programas para solucionar problemas diversos. Neste nível encontraremos linguagens como: FORTRAN, PASCAL, DELPHI, CLIPPER e outras.
Hardware, Software e máquinas multinível
Não existe uma regra rígida que determine quais instruções devem ser implementadas em hardware ou software, uma vez que, as operações executadas em software podem ser implementadas em hardware e as executadas pelo hardware podem ser simuladas em software, entretanto, algumas particularidades devem ser observadas quanto a decisão de implementar funções em hardware ou software. Por exemplo, as tarefas que sabidamente não sofrerão alterações podem ser implementadas em hardware e receberão a denominação de FIRMWARE.
Exemplos:
Um programa que controla o funcionamento de uma máquina de lavar. O microprograma de um computador Equipamentos microprocessados para aplicações específicas. Instruções mais utilizadas tais como:
Somar dois números Multiplicar e etc. Podem ser implementadas diretamente no hardware visando um melhor desempenho do sistema computacional.
Capitulo 2 - Unidade Central de Processamento (UCP)
A UCP é o elemento principal dentro de um sistema computacional. É através deste dispositivo que os programas serão executados de forma ordenada e de acordo com uma seqüência lógica definida. Além de gerenciar a execução dos programas a UCP terá também como finalidade gerenciar os outros dispositivos que compõem o sistema computacional, tais como: memória, dispositivos de I/O, periféricos e etc.
Organização interna
Uma CPU é, fisicamente, um dispositivo (componente) eletrônico formado por microcircuitos digitais todos encapsulados em uma única pastilha. Estes microcircuitos formam a organização interna de uma CPU. A maioria dos processadores possui uma arquitetura interna muito parecida, porém, cada fabricante irá incorporar no seu novo projeto de CPU características que diferem umas das outras e que normalmente tragam benefícios para o desempenho dos sistemas.
Os principais elementos internos encontrados em uma CPU são:
ULA - Unidade lógica e aritmética
Como o próprio nome sugere, a ULA é o circuito interno à CPU responsável pela execução das operações lógicas (AND, OR, XOR, etc.) e também das operações aritméticas (soma, subtração, multiplicação, etc.).
As operações executadas pela ULA, normalmente, envolvem dois operandos (dados) que “tratados” por uma lógica combinacional irão gerar como resultado um valor (operando) que representa uma das operações possíveis de serem executadas por uma determinada ULA.
Existem diversas formas e configurações possíveis para as ULA’s, porém, o critério usado para definição do tipo de ULA a ser implementada em uma CPU estará diretamente a associado ao nível de desempenho necessário para o dispositivo, ao tipo de tecnologia utilizada para a construção do dispositivo e outras.
Registradores
Os registradores são pequenas áreas de memória de alta velocidade utilizadas pela CPU para armazenar dados temporariamente para que as instruções possam ser executadas pelos elementos internos da CPU. Os registradores armazenam dados que serão utilizados pela ULA nas operações lógicas e aritméticas e ainda serão utilizados para armazenar os resultados gerados por estas operações.
Os processadores, de uma forma geral, não possuem muitos registradores, entretanto, alguns registradores especiais a maioria das CPU’s deverá possuir tais como: (CI ou PC contador de instruções), (ACC acumulador), (REM registrador de endereços de memória), (RDM registrador de dados de memória), (RI registrador de instrução) e etc.
Decodificador
Em uma CPU toda instrução irá possuir um código de operação associado. Este código será utilizado pelo decodificador para identificar a instrução que deverá ser executada pela CPU. O código de operação é uma seqüência binária que compõe o formato geral da instrução. Este código poderá ter tamanho variável nas diversas CPU’s existentes no mercado o que também definirá a quantidade de instruções possíveis em uma determinada CPU.
UC - Unidade de controle
Na realidade, no momento em que uma CPU está executando uma instrução, um ciclo de seqüência definida deverá ser executado. Este ciclo irá gerar uma série de sinais elétricos ordenados dentro de um intervalo de tempo que utilizará como base de temporização o relógio da CPU. Estes sinais elétricos gerados pela UC irão permitir que a ULA execute suas tarefas de forma correta e com os operandos definidos na instrução. Outra função da UC será a de controlar a busca dos operandos (dados), na memória, necessários à execução da instrução. De uma forma conclusiva, a UC terá como função básica receber uma informação do decodificador que irá identificar a instrução que será executada e então gerar os sinais elétricos internos e externos para que esta execução ocorra.
Relógio
Este componente da UCP será o responsável pela geração da base de tempo utilizada pelo processador para executar as instruções de um determinado programa em execução. Na realidade uma instrução será uma seqüência de sinais elétricos executados de forma ordenada e controlada pela UC. Cada ciclo gerado pelo relógio irá determinar à UC que um novo estágio do ciclo de execução da instrução corrente está sendo iniciado. O relógio é um sinal elétrico pulsado que será utilizado para excitar os circuitos elétricos da UC para que a mesma possa gerar os sinais elétricos necessários para execução das instruções. Por estes motivos o sinal de relógio deve ter uma precisão muito grande que será obtida com a implementação de circuitos osciladores à cristal de quartzo. O cristal permite a geração de um sinal de relógio (clock) com uma grande simetria entre semi-ciclo positivo e semi-ciclo negativo além de uma grande repetibilidade. A freqüência do sinal de clock irá determinar a velocidade de operação da CPU e desta maneira quanto maior a freqüência maior será a velocidade do processador. Na maioria dos computadores atuais encontramos CPU’s que operam em freqüências bastante grandes, na ordem de milhões de hertz. O HERTZ é a unidade de medida de freqüência e desta maneira, por exemplo, uma máquina que opere a 233 MHz significa dizer que a sua UC irá iniciar um novo estágio dentro do ciclo de execução de uma instrução a cada 4,291 ns (nano segundos) ou 4,291 x 10-9 s, uma vez que, o período é o inverso da freqüência.
Onde T é o período de um ciclo de clock que é medido em s (segundos) e pode ser calculado como sendo T = 1 / f, onde f é a freqüência expressa em Hz (Hertz). No eixo de coordenadas observamos V e t onde V representa a amplitude do sinal (tensão) representada no gráfico pelo “1” lógico e t representa o tempo em segundos.
Dentro dos elementos que compõem, internamente, uma CPU devemos classifica-los como elementos de controle ou de processamento dependendo de suna função.
Elementos de controle:
. Unidade de Controle (UC) . Decodificador . Registradores especiais RI e CI . Relógio . Registradores RDM e REM
Elementos de processamento:
. Unidade Lógica e aritmética (ULA) . Registradores de uso geral
Ciclo de instrução
O conjunto de instruções associado a um determinado processador define de maneira única as operações que poderão ser diretamente realizadas pelos circuitos da UCP, ou seja, a definição do conjunto de instruções de um determinado processador é parte integrante do projeto de desenvolvimento deste processador (hardware).
Para que a CPU possa executar uma única instrução serão necessários diversos passos (etapas) a serem executadas pelos circuitos internos. Estas etapas definem o que é chamado de ciclo de instrução ou ciclo de execução. A designação de ciclo vem do fato de que, na realidade, um processador está permanentemente executando alguma ou algumas instruções e raramente estará “parado” sem nenhuma execução em andamento.
O ciclo de instrução será subdividido em diversas etapas a saber:
Atualiza o registrador de instruções com a próxima instrução. Incrementa o contador de programas para o endereço da próxima instrução. Decodifica o código da instrução Verifica se a instrução utiliza operandos na memória Busca estes operandos para os registradores internos, se for o caso. Executa a instrução Armazena os resultados Retorna ao primeiro passo do ciclo.
Este ciclo, descrito de forma detalhada, é muitas vezes identificado pelo termo “BUSCA-DECODIFICA e EXECUTA” que, na verdade, resume de forma bem definida os passos necessários a execução de uma instrução. Todos estes passos serão executados a cada nova instrução do programa sempre retornando ao passo inicial fechando, desta maneira, um ciclo de instrução.
Execução paralela de instruções
O grande objetivo da industria de computadores, desde o início, é construir máquinas cada vez mais rápidas com o objetivo de melhorar o desempenho e a performance final dos sistemas computacionais. Na maioria dos casos uma simples elevação da velocidade do hardware (clock) torna possível um ganho significativo em termos de desempenho, entretanto, limites físicos dos materiais envolvidos na construção de componentes e placas de circuitos impressos limitam a aceleração do clock de maneira descontrolada. Um dos maiores obstáculos é a questão da geração de calor por chaveamento em altas freqüências, ou seja, quanto maior for a freqüência de comutação dos circuitos integrados e outros componentes em uma placa maior será a dissipação de calor gerado por estes elementos trazendo dificuldades na elaboração e construção do hardware.
Uma outra forma para obter melhorias em termos de desempenho e velocidade de processamento dos sistemas computacionais é o emprego do paralelismo na execução de instruções pela CPU. O paralelismo permitirá e execução “simultânea” de instruções permitindo, desta maneira, um melhor aproveitamento do hardware da CPU. A implementação de paralelismo vem sendo aplicada em grande escala pela indústria, pois, é uma forma mais econômica de obter um grande potencial de processamento.
Existem basicamente três técnicas de implementação de máquinas paralelas a saber:
1a) SISD - (Single Instruction, Single data) ou (fluxo simples de instruções e dados).
2a) SIMD - (Single Instruction, Multiple data) ou (fluxo simples de instruções e múltiplos dados).
3a) MIMD - (Multiple Instruction, Multiple data) ou (fluxo múltiplo de instruções e dados).
Uma máquina SISD é, na verdade, uma máquina com uma única
CPU que estará executando um único programa e com os dados armazenados na memória. Quando falamos em paralelismo temos em mente que uma instrução deverá ser executada ao mesmo tempo que uma outra instrução, entretanto, como isto poderá ser possível em uma máquina com uma organização SISD ?
Realmente não observamos um paralelismo real em uma máquina
SISD, porém, existirá um certo paralelismo devido a forma com que são executadas as instruções por esta máquina. Neste caso o paralelismo será obtido com o recurso de iniciar uma nova instrução antes do término do ciclo da anterior. Na realidade, como o ciclo de execução da instrução é formado por uma série de passos (etapas), o paralelismo será obtido dividindo-se o ciclo da instrução em estágios de forma que uma instrução possa ter seu ciclo iniciado antes do final do ciclo da instrução anterior.
A esta técnica é dado o nome de máquina pipeline.
O diagrama abaixo ilustra a forma de execução de uma máquina pipeline de cinco estágios.
Como montar um blog
Em um sistema que empregue o pipeline a subdivisão em estágios do ciclo de execução terá grande importância no desempenho final, uma vez que, quanto maior for o número de estágios existentes maior será o aproveitamento do tempo de processamento. Outro aspecto importante é o tempo gasto na execução de cada estágio que deverá ser o mais próximo possível um do outro evitando, desta maneira, um atraso na comutação de um estágio para outro.
Instruções de desvio
Existirá um problema sério a ser resolvido em um sistema que utilize pipeline. Este problema está associado as instruções de desvio condicional. Quando um desvio condicional está sendo executado a CPU não pode saber previamente qual o endereço da instrução seguinte, uma vez que, poderão existir dois endereços de desvio (verdadeiro ou falso). O endereço só será determinado no estágio de execução o que causará um atraso em todo o pipeline.
Os sistemas que empregam o pipeline buscam alternativas para contornar estas dificuldades dentre as quais podemos citar:
Busca antecipada de ambas as instruções (“pre-fetch”)
Neste caso o sistema ao identificar uma instrução de desvio irá buscar a instrução seguinte à atual e também a instrução no caso do desvio. Desta maneira ao determinar o resultado da condição de desvio a CPU já terá as duas instruções iniciadas e bastará abandonar uma delas.
Uma outra forma de implementação de uma arquitetura SISD poderá ser através da utilização de ULAS funcionais. A idéia de implementar ULAS funcionais baseia-se na construção de diversas pequenas ULAS, cada uma com uma função lógica ou aritmética específica, ao invés de implementar uma única ULA com a capacidade de atender a todas as funções necessárias ao processamento.
Esta forma de implementação é interessante, pois, é possível implementar uma quantidade maior de uma determinada função para que o processamento possa fluir de uma maneira mais adequada ao sistema.
Um sistema que apresenta uma configuração SIMD como forma de execução paralela de suas instruções será, na verdade, uma máquina que apresentará uma aplicação muito específica, ou seja, como estas máquinas são utilizadas em situações onde existirá somente um programa sendo executado (fluxo simples de instruções), porém, com uma grande quantidade de dados repetitivos (fluxo múltiplos de dados) estas máquinas encontrarão aplicações em sistemas tais como:
Sistemas para previsão de tempo
Vários cálculos repetitivos com fonte de dados diferentes, ou seja, médias de umidade, temperatura, velocidade do vento e outras obtidas de diversos pontos diferentes de uma cidade.
Sistemas de controle de processos
Cálculo da temperatura média de um forno industrial obtida a partir da leitura da temperatura de vários pontos diferentes no interior do forno.
Na realidade, a característica de hardware, que permitirá a estas máquinas tratar de maneira mais satisfatória os dados durante o processamento em relação a outros tipos de paralelismo, está relacionada a forma de construção de sua unidade lógica e aritmética ULA que é, na verdade, uma unidade vetorial de processamento. Uma ULA vetorial é um circuito combinacional (da mesma forma que uma ULA convencional) que tem como característica básica poder receber em seus canais de entradas múltiplos dados e da mesma maneira fornecer em sua saída um canal também de múltiplos dados. Isto significa dizer que uma ULA vetorial é capaz de realizar operações aritméticas e ou lógicas sobre valores vetoriais processando todo o vetor em uma única instrução.
A figura abaixo irá ilustrar uma ULA vetorial.
Um exemplo de uma instrução que será bem executada por uma ULA vetorial é a soma entre os elementos de dois vetor:
Uma outra forma de implementação de uma estrutura SIMD é a utilização de um ARRAY PROCESSOR que é uma grade de processadores e memória com uma única unidade de controle que terá, entre outras, a finalidade de canalizar as instruções a serem executadas para o processador que estiver disponível em um determinado instante. Devemos observar que, mesmo neste caso, teremos um único programa sendo executado.
Array Processor do ILLIAC IV (Universidade de Illinois)
Neste caso, cada conjunto processador/memória funcionará como um bloco independente, porém, sobre o controle da mesma UC. Ao identificar uma determinada instrução a UC determinará qual bloco irá executa-la.
A técnica MIMD para obtenção de paralelismo na execução de instruções é, na realidade, a única onde podemos afirmar que existirá o paralelismo real. As categorias apresentadas anteriormente utilizam recursos que permitem a CPU iniciar uma instrução antes do término de uma outra, entretanto, os problemas começam a aparecer quando trata-se de uma instrução de desvio condicional ou se a próxima instrução depende do resultado da anterior. Dentro deste enfoque observamos que em todos os casos as instruções podem ser sobrepostas, porém, não existirá uma instrução sendo executada paralelamente a outra de fato, uma vez que, sempre existirá um único programa sendo executado.
A única forma de obtermos um paralelismo de fato é através da utilização de um conjunto de processadores executando programas diferentes e utilizando, ou não, a mesma memória ( compartilhamento de memória). Isto é o que ocorre nos sistemas que empregam o paralelismo MIMD, visto que teremos um fluxo múltiplo de instruções (vários programas) e um fluxo múltiplo de dados (dados compartilhados ou não). Os sistemas que utilizam esta técnica de paralelismo são, normalmente, sistemas multiprocessados, e encontram aplicações em sistemas compartilhados que necessitam atender a diversos clientes simultaneamente com grande velocidade de processamento.
Um primeiro modelo de sistema multiprocessado foi implementado e posteriormente melhorado em virtude de apresentar problemas de desempenho no que dizia respeito a acesso aos dados da memória. O sistema mencionado faz uso de um único barramento para atender a todos os processadores com uma única memória compartilhada por todos. Como em um sistema multitarefa e multiusuário a quantidade de acessos à memória é infinitamente maior que em um sistema monousuário os conflitos e esperas geradas para utilização do barramento (meio de comunicação comum a todos os dispositivos) são muito freqüentes.
Um esquema alternativo ao anterior solucionou, em parte, os conflitos e “roubos” dos ciclos de barramento em sistemas multiprocessados. Este novo esquema promove a colocação de uma memória local para cada processador de forma que um não tenha acesso a memória local do outro e irá utilizar esta memória para armazenar código do programa a ser executado pelo processador e os dados que não são compartilhados para execução do referido programa.
Esta implementação trouxe basicamente maior velocidade para o sistema pois os acessos à memória compartilhada foram reduzidos de forma significativa.
Capitulo 3 - Memória principal Subsistemas de memória
Antes de iniciarmos o assunto memória principal devemos observar o posicionamento da mesma dentro da hierarquia dos diversos tipos de memória em um sistema computacional. Existem diversos parâmetros que estabelecem a hierarquia através de características que podem ou não serem comuns aos diversos tipos de memória. Esta hierarquia pode ser representada por uma pirâmide apresentada abaixo:
Como já foi dito, o que determina o posicionamento de um tipo de memória nesta hierarquia é um conjunto de parâmetros que quando analisados permitem classifica-las desta maneira. Os parâmetros são:
Tempo de acesso
Esta característica está diretamente ligada ao dispositivo de memória que está sendo utilizado para armazenamento. O tempo de acesso é o tempo gasto pelo dispositivo de memória para colocar no barramento de dados a informação que se deseja ler de um endereço qualquer. Esta característica estará diretamente associada à velocidade do dispositivo de armazenamento, visto que, para memória principal (memória do tipo DRAM ou RAM dinâmica) o tempo de acesso é da ordem de nanossegundos (ηs) e para dispositivos de memória secundária (discos magnéticos) este tempo será da ordem de milissegundos (ms).
Capacidade
Esta característica determina a quantidade de informação que um sistema de memória poderá armazenar. A nível hierárquico observamos apenas a capacidade em termos de ordem de grandeza e não em termos de valores absolutos, ou seja, leva-se em conta apenas uma grande capacidade de armazenamento e uma pequena capacidade de armazenamento. Com isto podemos observar que os subsistemas que ocupam o topo da pirâmide são os subsistemas de menor capacidade enquanto a base guarda os subsistemas de maior capacidade representando de forma clara que a base de um sistema de memória está na memória secundária ou memória de massa.
Volatilidade
Um outro parâmetro levado em conta para estabelecer a hierarquia entre os subsistemas de memória é a volatilidade que representa a capacidade ou não de reter informações no caso de corte da energia elétrica seja por um desligamento normal do sistema ou por uma falta de fornecimento de energia. Em outras palavras as memória não-voláteis são aquelas que possuem a capacidade de reter os seus dados com a ausência de alimentação elétrica. As principais representantes das memórias voláteis são as memórias SRAM (memória cache) e DRAM (memória principal) enquanto que podemos citar como memórias não-voláteis as memórias do tipo ROM, EPROM e EEPROM.
Tecnologia de fabricação
Dentro deste parâmetro encontraremos, basicamente, dois tipos de memória utilizadas em sistemas computacionais. A primeira são as memórias de meio magnético, que representam basicamente a memória secundária de um sistema (discos, HD’s, fitas magnéticas etc...) e possuem como principais características a alta capacidade de armazenamento e a baixa velocidade. A segunda são as memórias a semicondutores que são construídas com componentes eletrônicos que por sua vez são implementados com semicondutores possuindo como principais características a alta velocidade, baixa capacidade de armazenamento e o alto custo de implementação.
Temporariedade
Este parâmetro define o tempo que uma determinada informação fica armazenada em um subsistema de memória, ou seja, os dados podem permanecer pouco ou muito tempo em uma determinada memória o que levará a classifica-la como uma memória permanente ou transitória. A permanente é aquela que tenderá a reter uma informação por um longo período de tempo enquanto que a transitória irá reter esta informação por apenas alguns instantes.
Organização da memória principal
Em qualquer sistema computacional a organização da memória principal será dada por um sistema de armazenamento formado por um conjunto de N células organizadas de forma seqüencial, tendo, cada uma delas, um endereço associado começando no endereço 0 até o endereço N - 1. Cada um dessas células poderá armazenar um número limitado de M bits que determinará o tamanho da palavra ou o tamanho da informação que pode ser armazenada em uma célula.
Em uma memória cuja célula pode armazenar M bits podemos dizer que esta célula poderá armazenar 2M combinações de valores, observamos então, que o tamanho ou largura da célula é de grande importância pois determina o valor máximo que podemos armazenar em um sistema. Atualmente, a maioria dos sistemas de memória principal, utilizam dispositivos de memória (CI’s) com células capazes de armazenar 8 bits de dados.
Podemos “tratar” uma memória principal como um arranjo de linhas (endereços) e colunas (células) e observarmos que memórias com diferentes organizações internas podem, na realidade, terem a mesma capacidade total T de armazenamento de bits.
Para uma dada memória com N células de armazenamento cada uma com M bits, podemos calcular a sua capacidade total de armazenamento T como sendo:
T = N x M
O número total de células também define o tamanho ou largura do barramento de endereços pois:
N = 2E onde E é a largura (em bits) do barramento de endereços.
EXEMPLO 1:
Uma memória RAM tem um espaço máximo de endereçamento de 2 K células. Cada célula pode armazenar 16 bits. Qual o valor total em bits e bytes que podem ser armazenados nesta memória ? E qual o tamanho de cada endereço ?
EXEMPLO 2:
Uma memória RAM é fabricada com a capacidade máxima de 256
K bits. Cada célula pode armazenar 8 bits. Qual o tamanho total de cada endereço e qual é o número máximo de células desta memória ?
Outra maneira de determinarmos características da memória principal de um sistema computacional para determinarmos sua capacidade de armazenamento é através da observação dos registradores REM e RDM (registrador de endereços de memória e registrador de dadso da memória respectivamente) que nos darão a largura dos barramentos de endereços (N) e dados (M) respectivamente.
Exercícios:
1) Um computador possui uma memória com capacidade para armazenar palavras de 16 bits em cada uma de suas N células. O barramento de endereços tem 12 bits. Quantos bytes poderão ser armazenados nesta memória ?
2) Qual a diferença, em termos de endereço, conteúdo e total de bits, entre as seguintes organizações de MP.
a) 32K células de 8 bits cada b) 16K células de 16 bits cada c) 16K células de 8 bits cada
3) Um determinado sistema possui um RDM com 16 bits e um
REM com capacidade para armazenar números com 20 bits. Sabe-se que a célula de memória deste sistema armazena dados com 8 bits e que ele possui uma quantidade N de células igual a capacidade máxima de armazenamento. Pergunta-se:
a) Qual é o tamanho do barramento de endereços ? b) Quantas células de memória são lidas em uma única operação de leitura ? c) Quantos bytes tem a memória principal ?
4) Um computador possui uma memória principal com 32K células, cada uma capaz de armazenar uma palavra de 8 bits. Pergunta-se:
a) Qual é o maior endereço, em decimal, desta memória ? b) Qual é o tamanho do barramento de endereços deste sistema ? c) Quantos bits podem ser armazenados no RDM e no REM? d) Qual é o total de bits que podem ser armazenados nesta memória ?
5) Considere uma célula de uma memória principal cujo endereço é, em exadecimal, 2C81 e que tem armazenado em seu conteúdo um valor igual a, em hexadecimal, F5ª Pergunta-se:
a) Qual deve ser o tamanho do REM e do RDM deste sistema ? b) Qual deve ser a quantidade máxima de bits que podem ser armazenados nesta memória ?
6) Considere uma memória com capacidade de armazenamento de 64K bytes; cada célula pode armazenar 1 byte de informação e cada caracter é codificado com 8 bits. Resolveu-se armazenar na memória deste sistema um conjunto de caracteres do seguinte modo: A partir do endereço (hexadecimal) 27FA, foram escritos sucessivos grupos de 128 caracteres iguais, iniciando pelo grupo dos A’s , seguido do grupo dos B’s e assim por diante. Qual deverá ser o endereço correspondente ao local onde estará armazenado o 1o J ?
Endereçamento e armazenamento
Existem duas formas de endereçamento em uma memória quanto a sua organização interna. Sabemos que uma memória é uma coleção de bits dispostos de forma organizada em grupos de células. A forma de endereçar uma célula, pelos circuitos internos da memória, é diferente entre as diversas memórias existentes no mercado. As distribuições das células podem ser então de duas formas unidimensional ou bidimensional.
Distribuição unidimensional:
Vamos supor nos dois casos uma memória com dezesseis células de memória cada uma com bit. Em uma organização unidimensional o único decodificador existente apresenta uma forma linear, ou seja, todas as células são endereçadas pelo mesmo decodificador conforme diagrama abaixo:
Notamos que neste tipo de estrutura o decodificador recebe o endereço de 4 bits A0 até A3 e identifica uma única célula de memória. Neste caso a célula é composta por um único bit porém se fosse uma célula de n bits o que teríamos seria uma repetição da estrutura exceto o decodificador.
No desenho acima EM representa um Elemento de Memória que poderá ser um Flip-Flop, no caso de uma RAM estática, ou um elemento capacitivo, no caso de uma RAM dinâmica.
Uma outra maneira de construção interna do decodificador de endereços é a disposição bidimencional ou matricial dos elementos de memória, sendo esta organização preferencial em função do gasto minimizado para implementação do dispositivo de memória.
No caso de uma estrutura bidimensional, teremos, no lugar de um único decodificador dois decodificadores sendo um para cada dimensão da estrutura, ou seja, as células estarão arrumadas em forma de linhas e colunas e teremos um decodificador para linhas e um para colunas conforme diagrama abaixo:
Observamos nesta estrutura a presença dos dois decodificadores, onde, um receberá a parte alta do endereço e identificará uma única linha e o outro receberá a parte baixa do endereço e identificará uma única coluna e a interseção da linha com a coluna identifica a célula de memória desejada. Mais uma vez se fosse uma memória com células de n bits cada uma teríamos uma repetição da estrutura para cada bit da célula.
Detecção e correção de erros
Em qualquer sistema onde é necessário transmitir dados binários entre dispositivos, seja de forma remota ou local, é possível que durante a transmissão ocorram erros que danifiquem parte ou integralmente a informação transportada. Em comunicação remota, via modem quando utilizamos a linha telefônica, é simples entender as prováveis fontes geradoras de erros. Vamos imaginar o cabo telefônico que conduz a informação através de sinais elétricos. Este cabo está, normalmente, fixado como uma via aérea exposta a todas as ações do tempo (calor, umidade, ventos, gases e etc.) e também vulnerável a possíveis acidentes. Outro fator que contribui para o aparecimento de erros em transmissões é causado por interferências eletromagnéticas provenientes de diversas fontes tais como: cabos e alta tensão, rede elétrica na mesma tubulação da telefonia, raios e etc.). Por todos estes motivos os sistemas computacionais necessitam de dispositivos capazes de tratar prováveis erros e se possível corrigir estes erros.
Quando falamos em transmissão de dados estamos falando de toda e qualquer transferência de informações em qualquer meio, ou seja, a transferência de dados entre a MP e a CPU também caracteriza uma transmissão, porém, como o ambiente onde esta transmissão ocorre é um ambiente protegido a possibilidade de prováveis erros fica bem reduzida, porém, ainda existente. Em função desta pequena, mais desastrosa possibilidade, é que os sistemas computacionais aplicam algumas técnicas para prevenir erros na transferência de dados. Estas técnicas se baseiam em um artifício de lógica binária para determinar a quantidade de bits iguais a “1” ou iguais a “0” em uma palavra binária a ser transmitida. Estamos falando da paridade. A paridade irá acrescentar à palavra transmitida um ou mais BITS de verificação que servirão para determinar através da quantidade, par ou ímpar de bits “1”, o valor do bit de paridade da seguinte maneira:
O bit de paridade será UM caso exista um número par de bits “1” na informação.
O bit de paridade será ZERO caso exista um número ímpar de bits “1” na informação.
Quando é acrescentado apenas um bit de paridade os sistemas são capazes, apenas, de dizer se houve ou não algum erro e desta maneira a transmissão deve ser refeita, porém, alguns códigos geradores de paridade permitem a determinação da posição do erro, ou seja, em qual bit ocorreu o erro durante a transferência. Um dos códigos mais conhecidos é o código de Hamming que, na realidade, é capaz de detectar a existência e a posição de erros simples, ou seja, erros ocorridos em apenas um bit.
Código de Hamming para detecção e correção de erros
Vamos supor uma palavra de 16 bits que necessita ser transferida entre dispositivos com a seguinte formação:
E vamos supor que esta palavra chegou ao seu destino com a seguinte formação:
Notamos na parte em destaque que um erro ocorreu no 6o bit da palavra de 16 bits.
O código de Hamming, na verdade, irá transmitir uma palavra de 21 bits que é a palavra original de 16 bits mais 5 bits de paridade que serão posicionados de forma estratégica para permitir ao sistema determinar a posição do erro.
Palavra que será realmente transmitida:
Palavra que será recebida:
Os bits em azul são os bits de paridade introduzidos pelo código de
Hamming na palavra original. O valor destes bits é calculado conforme um determinado critério a saber:
Repare que os bits de paridade são colocados nas posições que representam os pesos dos bits em uma palavra binária qualquer, ou seja, da esquerda para direita o primeiro bit ocupa a posição “1”, o segundo a posição “2”, o terceiro a posição “4”, o quarto ocupa a posição “8” e o quinto e último bit ocupa a posição “16” da palavra de 21 bits. Cada uma destas posições dos bits de paridade ficará responsável por um determinado conjunto de posições do restante da palavra para totalizar a quantidade de bits “1”, ou seja:
O bit de paridade da posição 1 irá verificar as seguintes posições da palavra de 21 bits.
O bit de paridade da posição 2 irá verificar as seguintes posições da palavra de 21 bits.
O bit de paridade da posição 4 irá verificar as seguintes posições da palavra de 21 bits.
O bit de paridade da posição 8 irá verificar as seguintes posições da palavra de 21 bits.
O bit de paridade da posição 16 irá verificar as seguintes posições da palavra de 21 bits.
Estas verificações tem o objetivo de contar a quantidade de bits com valor um que existem em cada um destes universos para determinar o valor do bit de paridade associado. Então desta maneira teremos:
Para palavra transmitida
Para palavra recebida
Comparativamente observamos que somente os BITS 2 e 8 apresentaram diferenças entre a transmissão e a recepção e neste caso, o código de Hamming, para determinar a posição do erro, efetua a soma dos pesos que deram diferentes, ou seja, 8 + 2 = 10 que é a posição do erro na palavra de 21 bits.
O motivo pelo qual a soma dos pesos dos BIT’s de paridade errados determina a posição do erro não é mera coincidência pois, por eliminações, podemos chegar ao mesmo resultado. Observe:
Os BIT’s 2 e 8 estão errados indicando que o erro só pode estar localizado no universo de posições de verificação comuns à este 2 bits logo ficamos com as posições:
entretanto, pelos outros BIT’s, as posições 1 (BIT 1), 14 (BIT 4) e 15
(BIT’s 1 e 4) estão corretas eliminando-as do grupo de posições com erros ficando somente a posição 10.
Exercício:
1)Determinar os BIT’s de paridade para as palavras transmitidas e recebidas abaixo e determinar a posição do erro através do código de Hamming.
Palavra transmitida 1 1 0 1 0 0 0 1
2) Compare memória CACHE e memória PRINCIPAL em termos de tempo de acesso, capacidade e temporariedade.
3) Em uma arquitetura que utiliza a técnica de paralelismo SIMD observamos o paralelismo real. Esta afirmativa está correta ? Explique.
4) O que entende por máquina virtual ?
5) Quais as diferentes formas de converter um programa escrito em uma linguagem para uma linguagem de outro nível destacando as características de cada processo.
6) O que entende por REM, RDM, CP, RI e SP ?
7) Entre outros fatores, existe um elemento na arquitetura de uma CPU que é responsável pela velocidade de suas operações. Que elemento é este e porque simplesmente não se atua neste elemento para melhorar a performance dos processadores ?
8) Quais as etapas desenvolvidas por uma CPU no ciclo de execução de uma instrução ?
9) Quais os elementos que compõem uma CPU internamente destacando suas funções quanto a processamento ou controle ?
10) Diga o que entende por FIRMWARE dando um exemplo.
Comunicação serial
Em diversas situações, durante o processamento de dados, é necessário o envio de informações para locais remotos posicionados em longas distâncias do local origem. Estas informações podem ser enviadas por rádio, via satélite ou através da linha telefônica. Neste último caso o meio de transmissão utilizado possui apenas dois condutores elétricos e a questão é como transmitir palavras binárias de 8, 16 ou 32 bits por apenas dois condutores ?
Quando falamos em comunicação através da linha telefônica estamos nos referindo a uma forma de comunicação serial na qual existirá um dispositivo origem e um dispositivo destino ambos conectados ao sistema telefônico através de um modem, que, na realidade, é um dispositivo capaz de "transformar " os sinais binários em sinais próprios para serem transmitidos pela linha telefônica. Devemos observar também que a comunicação serial não se dá somente de forma remota podendo existir dispositivos locais que se comuniquem de forma serial com sistema. Um bom exemplo destes dispositivos é o mouse que apesar de ser um dispositivo serial é um dispositivo local, ou seja, no caso do PC, todo e qualquer dispositivo que se comunicar através de uma das portas COM1, COM2, COM3 e etc será um dispositivo serial.
O computador PC é equipado com uma porta serial padrão (normalmente a COM1) que possui uma padronização elétrica denominada RS232C que permite conectar somente um dispositivo serial à uma distância máxima de 15 m. O padrão RS232C é uma convenção internacional que estabelece os níveis elétricos de corrente e tensão que devem estar presente no conector serial padrão DB9 (no caso do mouse) ou DB25 (no caso de outros dispositivos).
É importante também ressaltar que não existe somente o padrão
RS232C. Um outro padrão muito utilizado para comunicação serial é o padrão RS485 que, na realidade, especifica uma outra padronagem elétrica internacional para dispositivos seriais. Este padrão é largamente utilizado em aplicações industriais pois, dentre outras, suas principais características são: Distâncias de até 1.200 m e possibilidade de conectar vários dispositivos à mesma linha.
Como é feita a comunicação
A comunicação serial pode ser síncrona ou assíncrona. No primeiro caso (menos comum) deverá existir, no cabo de interligação, um sinal de clock para sincronizar o dispositivo com o computador. Podemos observar, então, que no caso de uma comunicação via linha telefônica este sinal de clock não poderá estar presente e portanto, neste caso, a comunicação será do tipo assíncrona. Na comunicação assíncrona não existe o sinal de sincronismo, porém, algum outro recurso deve ser utilizado para coordenar a troca de informações entre os dispositivos. Este recurso é a implementação de um protocolo de comunicação no qual são criados diversos códigos de controle que os dispositivos inserem nas informações a serem transmitidas que servirão para coordenar a transferência dos dados.
Quando a comunicação é assíncrona local (via cabo) o protocolo é determinado por um conjunto de sinais elétricos que coordenam a transferência das informações. Para um melhor entendimento vamos observar as conexões em um cabo serial padrão RS232C para uma conexão entre dispositivos via cabo.
Sinais elétricos e suas funções
Este sinal é utilizado em comunicação via modem e servirá para informar ao modem local a presença da portadora.
É através deste sinal que o dispositivo irá receber os dados na forma de um "pacote" de bits de maneira serial.
Em oposição ao sinal RXD o sinal TXD será utilizado pelo dispositivo para enviar as informações também em forma de um "pacote" de bits seriais.
Este par de sinais servem para que os dispositivos conectados possam saber se existe uma conexão física presente.
Estes dois sinais serão utilizados pelos dispositivos para um informar ao outro quando está pronto para enviar e/ou receber dados.
Transmissão serial via modem
No caso de uma transmissão remota, via linha telefônica, os dados precisam ser tratados antes de serem colocados na linha e também quando são recebidos no seu destino. O processo de "tratar" estes sinais é necessário pois as informações binárias não são informações "boas" (do ponto de vista elétrico) para serem transmitidas pela linha telefônica. O processo conhecido como modulação (na origem) e demodulação (no destino) é executado pelo dispositivo denominado modem. Existem diversas formas de modulação cada uma associada a um padrão internacional. Iremos ver, somente, de uma maneira genérica, a modulação em amplitude e a modulação em freqüência.
Basicamente o processo de modulação consiste em "misturar" a informação binária com um sinal elétrico de freqüência conhecida que possa ser facilmente transmitido pela linha telefônica. Este sinal recebe o nome de portadora. Já o processo inverso de demodulação consiste em retirar do sinal misturado somente a informação binária.
Modulação em amplitude
A modulação em amplitude é a mais comum e fácil de ser implementada e consiste em modular o sinal da portadora em amplitude conforme a informação digital que precisa ser transmitida. O diagrama abaixo ilustra este tipo de modulação.
Demodulação
A demodulação consiste em retirar do sinal modulado a informação digital, ou seja, é processo inverso à modulação. Este processo poderá ser feito por um circuito denominado detetor de portadora ou simplesmente detetor de tons. Na verdade o detetor de tons (tone decoder) é um circuito híbrido (analógico/digital) capaz de receber em sua entrada um sinal analógico e determinar em sua saída um sinal digital de acordo com a freqüência do sinal de entrada.
Parâmetros na comunicação serial
Já mencionamos que as informações são transferidas em "pacotes" de dados em uma transmissão serial. Este "pacote" atende a determinadas regras de formação e será diferente em cada caso. O formato do "pacote" de transmissão está diretamente associado à configuração determinada para um sistema. Desta maneira observamos as seguintes características (parâmetros) em uma conexão serial.
É um bit de controle colocado no início do "pacote" e será utilizado pelo dispositivo destino para identificar o início de uma transmissão.
Este parâmetro determina o tamanho do pacote a ser transmitido, ou seja, especifica qual o tamanho da palavra de dados que será trasmitida e/ou recebida. Normalmente estes bits são em número de 7 ou 8 bits.
É um bit de parada e será utilizado pelo dispositivo destino para identificar o final de um "pacote" de dados. Dependendo do sistema podemos ter configurações com 1 ou 2 STOP BITS.
É um bit opcional utilizado para determinar a existência ou não de erros nos dados transmitidos e recebidos. Como já foi visto o bit de paridade receberá um valor 0 ou 1 dependendo da quantidade e do tipo de paridade (par ou ímpar) utilizada na transmissão.
Velocidade (baunds b/s)
Este parâmetro determina a taxa ou freqüência com que os bits são colocados na linha TXD pelo dispositivo origem. É importante ressaltar que se o dispositivo origem estiver trabalhando a 9600 baunds o dispositivo destino deverá também operar a 9600 baunds para que a comunicação possa ser estabelecida.
Exemplo:
Vamos supor uma conexão serial com a seguinte configuração:
Velocidade: 9600 baunds Palavra:8 bits STOP BIT:1 Paridade: Par
Qual o tempo de duração de cada bit ? Qual o tempo total gasto na transmissão de um pacote ?
Capitulo 5 - Hierarquia de memória Memória Virtual
Conceito:
É uma técnica de gerenciamento de memória que permite aos sistemas computacionais executar aplicações maiores que a memória diretamente endereçável (Memória real). Estas aplicações são executadas como se a memória real fosse suficientemente grande para armazena-las. As primeiras técnicas de memória virtual recebiam o nome de overlays e tinham que ser gerenciadas pelo programador, ou seja, o programador é quem decidia sobre o tamanho e conteúdo de cada arquivo de overlay necessário à sua aplicação. Com a evolução dos processos de gerenciamento o controle dos arquivos de overlay foi retirado dos programadores e passou a ser responsabilidade do sistema operacional passando a receber a denominação de memória virtual e utilizando os recursos disponíveis em um determinado processador que permita o gerenciamento de memória virtual.
Existem basicamente duas técnicas de gerenciamento de memória virtual:
Paginação:
Nesta técnica, tanto o espaço de endereçamento virtual (M.S) como o espaço de endereçamento real (M.P) são divididos em pedaços de tamanho fixo e iguais. No caso de haver a necessidade de utilizar alguma posição de memória secundária que não esteja carregada na memória principal a página correspondente será carregada e executada. Caso a memória principal esteja totalmente ocupada por outras páginas uma delas terá que ser retirada para a nova página ser carregada. O critério para selecionar a página a ser retirada da memória principal é um assunto a ser tratado pelos algoritmos de substituição de páginas.
Neste caso observamos algum desperdício de memória, uma vez que, ao ser dividido em tamanhos fixos os espaços de endereçamento real e virtual, este último poderá ter a sua última página de tamanho inferior ao tamanho da página especificado, porém, será gasta uma página inteira para armazena-lo.
Segmentação:
A segmentação apresenta um critério similar ao da paginação, a diferença básica é que na segmentação os espaços de endereçamento são divididos em segmentos que não possuem tamanho fixo, porém, possuem um tamanho máximo, ou seja, os segmentos podem aumentar ou diminuir de tamanho durante a execução das aplicações porém sempre observando um limite máximo a ser respeitado. Este limite máximo é determinado basicamente a partir do tamanho da memória principal disponível. Se por um lado a paginação pode gerar algum desperdício de memória, a segmentação (mal implementada) também poderá causar um efeito na memória denominado tabuleiro de xadrez.
Neste caso observamos que ao promover a substituição dos segmentos dentro da memória principal irão surgir falhas de ocupação da memória em função dos tamanhos diferentes dos segmentos. Estas falhas se não forem removidas pelo sistema poderão causar um desperdício ainda maior que no caso da paginação. O sistema deverá ser sofisticado o bastante para poder remover o tabuleiro de xadrez da memória realizando o deslocamento dos segmentos na memória para próximo do endereço 0 juntando todas as falhas em uma única falha que poderá ser utilizada por um novo segmento.
Técnicas de substituição de páginas:
Durante o gerenciamento da memória virtual um dos problemas a ser contornado pelo sistema operacional é a troca de páginas, ou seja, a substituição dos dados da memória real por um novo segmento de memória virtual (secundária). Isto irá ocorrer sempre que for detectada uma falha de página pela aplicação que estiver sendo executada. Uma falha de página ocorre quando a aplicação necessita usar dados ou instruções que ainda não foram carregadas na memória principal e não existem páginas disponíveis na memória real. Existem basicamente 2 técnicas de substituição de páginas:
LRU (least recently used) - Página menos recentemente usada
Este algoritmo se baseia no critério de que a página menos usada recentemente será, teoricamente, a página com menos probabilidade de ser necessária. Na maioria dos casos isto é verdade e o algoritmo LRU apresentará um bom desempenho, entretanto, em alguns casos ele poderá ser ineficiente como no exemplo abaixo:
Imagine um LOOP (laço de repetição) que ocupa 9 páginas virtuais, sendo executado por um programa em um sistema de gerenciamento de memória virtual com 8 páginas de memória real.
Durante a execução quando o programa atingir a página 7 toda a memória estará ocupada. Ao solicitar a execução de uma instrução que se encontra na página 8 irá ocorrer uma falha de página. Neste momento o LRU retirará da memória a página 0 e a substituirá pela página 8. Ao final da execução do código da página 8 o programa retornará a execução para página 0 o que irá causar uma nova falha de página e assim sucessivamente até recompor todo o espaço de endereçamento real (M.P).
FIFO (first in - first out) - Primeiro a entrar será o primeiro a sair
Este algoritmo utiliza um critério arbitrário para determinar a página que será retirada da memória principal. Este critério independe da última referência feita a uma determinada página, ou seja, mesmo que uma página tenha sido referenciada recentemente, porém, ter sido a primeira página a ser carregada ela será eliminada do espaço de endereçamento real.
O algoritmo FIFO associa à cada página um contador que receberá valor ZERO assim que a página for carregada na M.P. A cada falha de página que for observada todos os contadores de todas as páginas da memória são incrementados de 1. A página que tiver o contador mais elevado será a página a ser retirada da M.P para dar espaço a uma nova página. Observamos, desta maneira, que o critério utilizado está relacionado, somente, ao valor do contador de cada página.
Critérios para regravação de páginas:
Um outro problema a ser contornado pelo S.O no gerenciamento de memória virtual está relacionado a necessidade ou não de regravar na memória secundária uma página que estiver sendo retirada da memória principal. O S.O necessita saber se o conteúdo de uma página qualquer é formado por apenas códigos de instruções ou se existe também algum dado. No primeiro caso não haverá a necessidade de regravar a página quando ela for retirada, porém, no segundo caso o S.O terá que detectar se os dados sofreram ou não alterações durante o tempo que a página permaneceu na M.P. Para que o S.O possa determinar isto ele fará uso de algumas características do hardware, tais como:
Ao carregar uma página na M.P o hardware associa a esta página um BIT denominado dirty bit ou bit de alteração com valor ZERO. Durante o tempo que a página permanecer na M.P, caso alguma informação seja gravada na mesma, o hardware irá trocar condição do drty bit para 1. No momento que o S.O for retirar esta página da memória ele irá verificar o valor deste BIT e estando em ZERO a página não é regravada caso contrário ela será regravada na M.S.
Capitulo 6 - Controle de entrada e saída
Existem, basicamente, 4 tipos de controle de I/O.
E/S programada com espera ocupada E/S por interrupções E/S por acesso direto à memória (DMA) E/S utilizando canais de dados
E/S programada com espera ocupada.
Neste tipo de controle, o fluxo de informações entre dispositivos é estabelecido byte a byte, e o processador executará uma instrução específica para cada byte que tiver que ser enviado (saida) ou recebido (entrada), ou seja, todo o controle fica subordinado à CPU. A principal desvantagem neste método relaciona-se ao fato da CPU perder um tempo muito elevado esperando um dispositivo ficar pronto para receber ou enviar uma informação, uma vez que, os dispositivos de I/O são bem mais lentos que a CPU. Este tempo de espera da CPU está relacionado ao fato das instruções de I/O neste tipo de controle colocarem a CPU em um estado de LOOP até que aquela operação de I/O seja integralmente concluída, não permitindo que a CPU execute outras tarefas enquanto aguarda um dispositivo mais lento.
E/S por interrupções
De maneira contrária ao método anterior, o sistema de interrupções permitirá à CPU executar outras tarefas enquanto o dispositivo lento executa a sua operação. Isto será possível pois, neste tipo de controle, a CPU inicia um dispositivo qualquer que, ao final da sua tarefa, irá gerar um sinal de interrupção para CPU indicando que está pronto para receber ou enviar novos dados. Após a inicialização dos dispositivos a CPU ficará liberada para efetuar outra tarefa, ou seja, não entrará em um LOOP de espera como no caso anterior. Embora seja um método bem mais eficiente que o anterior, a E/S por interrupções simples ainda apresenta um inconveniente que é o número elevado de interrupções que podem ser gerados dependendo do dispositivo acessado. Por exemplo: vamos supor que um processador necessita enviar dados para um terminal que possui um buffer de recepção muito pequeno (1Kb), neste caso a cada 1Kb enviado para este dispositivo a CPU teria que parar a operação de I/O e esperar o próximo sinal de interrupção para poder enviar o restante dos dados. Com isto, podemos notar que caso a informação a ser enviada seja muito grande, o número de interrupções gerados para CPU será elevado.
E/S por DMA
Nos dois casos anteriores, o controle da operação de I/O está sempre subordinado à CPU. No caso da utilização do DMA, existirá a presença de uma pastilha denominada controlador de DMA cuja função será a de liberar a CPU do controle das operações de I/O.
Na maioria dos casos, o controlador de DMA possui 4 registradores internos que chamaremos genericamente de:
R1 - Armazena o endereço inicial de memória a ser lido ou escrito. R2 - Armazena quantos bytes devem ser transferidos. R3 - Determina o dispositivo de E/S que deverá ser acessado. R4 - Informa se é uma operação de leitura ou escrita.
Quando a CPU identifica uma instrução de I/O, ela passa para pastilha controladora de DMA, através dos barramentos do sistema, os dados a serem armazenados nos registradores R1, R2, R3 e R4. Com estas informações, o DMA tem condições de gerenciar toda a transferência dos dados sem a intervenção da CPU durante o processo. A CPU será informada somente no final quando o controlador de DMA gera um sinal de interrupção para a CPU informando que a operação de I/O foi concluída. Podemos resumir o funcionamento do DMA em um fluxograma:
É importante destacar que a implementação do DMA representa um avanço e um ganho de desempenho extraordinário nos sistemas computacionais de pequeno e médio porte, em função de, a CPU ficar inteiramente liberada para outras atividades enquanto o DMA gerencia as transferências de dados. Entretanto, em sistemas mais complexos, o DMA representaria um fator complicante pois utiliza os mesmos barramentos que a CPU para realizar as suas tarefas, e como as operações de I/O são prioritárias, ele sempre realiza o chamado "roubo do barramento".
E/S por canais de dados
Este tipo de controle de I/O é utilizado em sistemas de grande porte em função do elevado número de operações de E/S necessárias nestes sistemas, nos quais o sistema de DMA causaria um grande congestionamento nos barramentos em função do "roubo do barramento".
Neste caso existem processadores especiais de E/S que trabalham em conjunto com o processador principal para executar as transferências de dados. Os processadores de E/S recebem da CPU principal as instruções de I/O e passam a executá-las sem a intervenção de CPU e através de barramentos próprios. Ao final da operação de I/O, o canal de dados interrompe a CPU para informar a conclusão da tarefa.
Embora a CPU continue sendo interrompida ao final de cada operação de I/O, os blocos de dados a serem transferidos podem ser maiores e não ocorrerá o "roubo do barramento".
Capitulo 7 - Arquiteturas avançadas RISC x CISC
Em função de apresentarem características diferentes de construção, é difícil afirmar quais das duas arquiteturas é superior, porém, alguns testes de desempenho podem ser implementados para estabelecer um comparativo entre processadores RISC e CISC.
Os primeiros processadores construídos possuíam muito mais características RISC do que CISC, pois eram processadores muito básicos. Com a necessidade da fabricação de computadores mais complexos para atenderem a softwares cada vez mais "pesados", os fabricantes de processadores começaram a implementar pastilhas mais "completas" e complicadas e, desta maneira, surgia o conceito da arquitetura CISC. Por outro lado, a questão do desempenho é fundamental em qualquer sistema computacional e os processadores CISC, em alguns casos, apresentam dificuldades de desempenho, quando comparados com máquinas RISC, em função de operarem com instruções mais "completas".
Características dos processadores RISC
RISC significa Reduced instruction set computer ou processador com conjunto reduzido de instruções.
É importante não confundir "conjunto reduzido" com um conjunto formado por poucas instruções de máquina. O termo "reduzido" está associado à simplicidade das instruções que integram um processador RISC, ou seja, o seu conjunto de instruções é, em sua grande parte, formado por instruções bem simples com poucos operandos e poucos modos de endereçamento e que, como conseqüência, gastam um tempo bem pequeno para serem executadas.
De uma maneira comparativa, se fosse possível avaliar os processadores por instruções específicas, poderíamos dizer que uma pastilha RISC é mais veloz, uma vez que, a maioria das suas instruções são executadas em apenas 1 ciclo de clock devido a sua grande simplicidade, entretanto, como já foi dito anteriormente não podemos comparar processadores diferentes de uma maneira tão simples.
Os processadores RISC apresentam uma facilidade importante em função de seu conjunto reduzido de instruções que é a maior facilidade de implementação de paralelismo via PIPELINE e unidades superescalares de execução, ou seja, dentro do seu conjunto de instruções um número maior delas poderá ser executada facilmente via PIPELINE, o que pode representar uma grande vantagem em termos de velocidade.
Características dos processadores CISC
Os processadores CISC (Complex instruction set computer), como o próprio nome já diz, possui um conjunto de instruções mais complexo ou mais "completo". Mas o que vem a ser uma instrução mais complexa ? Uma instrução mais complexa é aquela em que existem vários operandos sendo manipulados, cada um podendo apresentar um modo de endereçamento diferente além de operandos extensos de 16, 32 ou 64 bits que tornam as operações de busca e identificação de operandos muito lentas. A idéia básica dos processadores CISC era a de criar máquinas com um conjunto poderoso de instruções visando economizar ao máximo o gasto de memória com armazenamento de programas (um dos problemas de máquinas com arquitetura RISC), entretanto, não se pode economizar memória e comprometer o desempenho, portanto, é necessário buscar um ponto de equilíbrio entre os dois extremos.
Os processadores atuais da INTEL (família X86) como 486 e o
Pentium apresentam características híbridas, ou seja, possuem algumas características CISC (instruções que reduzem a necessidade de memória) e algumas características RISC, tais como, canalização de instruções e unidades de execução superescalares.
Medidas de desempenho
Como já foi dito, é complicado estabelecer uma forma de comparação entre processadores RISC e CISC. Para poder comparar estas duas arquiteturas é necessário encontrar alguma operação em comum para que então possa existir a possibilidade confrontar resultados.
Basicamente existem duas formas de medir desempenho de sistemas computacionais que são MIPS (milhões de instruções por segundo) e MFLOPS (milhões de instruções de ponto flutuante por segundo). No primeiro caso, os programas de teste medem quantas instruções de qualquer tipo são realizadas em um segundo. E, no segundo caso, são consideradas somente instruções que operam em ponto flutuante. Desta maneira, podemos observar que o segundo caso caracteriza a melhor maneira de comparar duas arquiteturas com um conjunto de instruções tão diferentes.
Capitulo 8 - Microprocessadores e barramentos
Pastilhas microprocessadas

Um microprocessador, embora possua muitas vezes o poder de processamento muito elevado, recebe esta denominação em função de seu encapsulamento, uma vez que, todos os seus circuitos e componentes são agrupados em uma mesma pastilha.
A forma de comunicação entre a CPU e os dispositivos externos à mesma, tais como dispositivos de I/O, memória e etc., é feita através de sinais elétricos que saem ou chegam aos seus pinos (terminações elétricas).
Dependendo do microprocessador utilizado estes sinais elétricos irão assumir valores diferentes para operações diferentes ou para operações similares, ou seja, quando queremos dizer que um sinal está atuando dizemos que este sinal está ativo, entretanto, isto não significa que o sinal em questão esteja em valor lógico “1”.
Um exemplo disto e o sinal WR existente em todos os microprocessadores e que na maioria deles está ativo em nível lógico
CPU genérica
vi no 



Viu algum erro ou gostaria de adicionar uma sugestão para atualizarmos esta matéria?
Colabore com o autor clicando aqui!




 
Related Posts Plugin for WordPress, Blogger...