Fundamentos de
Informática
1 – PROCESSAMENTO DE DADOS...3
2 – OS 3 PILARES DA INFORMÁTICA...3
2.1 – E
SQUEMAB
ÁSICODOE
LEMENTOH
ARDWARE...3
2.2 – E
SQUEMAB
ÁSICODOE
LEMENTOS
OFTWARE...4
3 – REPRESENTAÇÃO DAS INFORMAÇÕES...4
4 – SISTEMAS DE NUMERAÇÃO...6
4.1 – C
ONVERSÃODEB
ASES...9
4.1.1 – Conversão entre Bases Potência de 2...9
4.1.1.1 – Entre as Bases 2 e 8...9
4.1.1.2 – Entre as Bases 2 e 16...10
4.1.1.3 – Entre as Bases 8 e 16...10
5 - CONCEITOS BÁSICOS DE SISTEMAS OPERACIONAIS...11
5.1 - I
NTRODUÇÃO...11
5.1.1 - Facilidade de acesso aos recursos do sistema...11
5.1.2 - Compartilhamento de recursos de forma organizada e protegida...12
5.2 - M
ÁQUINASDEN
ÍVEIS...13
5.3 - H
ISTÓRICO...14
5.3.1 - Primeira Fase (1945-1955)...14
5.3.2 - Segunda Fase (1956-1965)...14
5.3.3 - Terceira Fase (1966-1980)...16
5.3.4 - Quarta Fase (1981-1990)...16
5.3.5 - Quinta Fase (1991- ????)...17
6 – CONCEITOS DE HARDWARE E SOFTWARE...18
6.1 - H
ARDWARE...18
6.1.1 - Unidade Central de Processamento...19
6.1.2 - Clock...20
6.1.3 – Registradores...20
6.1.4 - Memória Principal...20
6.1.5 - Memória Cache...22
6.1.6 - Memória Secundária...22
6.1.7 - Dispositivos de I/O...22
6.1.8 – Barramento...23
6.1.9 – Pipeline...23
6.1.10 - Ativação e desativação do Sistema...24
6.1.11 - Arquiteturas RISC e CISC...24
6.2 - S
OFTWARE...25
6.2.1 – Linguagens de Programação...25
6.2.2 - Depurador...31
6.2.3 - Linguagem de Controle...31
6.2.5 - Microprogramação...31
6.2.6 - Processos...31
6.2.7 - Chamadas de Sistema...31
6.2.8 – Arquivos...32
7 - TIPOS DE SISTEMAS OPERACIONAIS...32
7.1 - I
NTRODUÇÃO...32
7.2 - S
ISTEMASM
ONOPROGRAMÁVEIS/M
ONOTAREFA...32
7.3 - S
ISTEMASM
ULTIPROGRAMÁVEIS/M
ULTITAREFA...32
7.3.1 - Sistemas Batch...33
7.3.2 - Sistemas de Tempo Compartilhado...33
7.3.3 - Sistemas de Tempo Real...34
7.4 - S
ISTEMASCOMM
ÚLTIPLOSP
ROCESSADORES...34
7.4.1 - Sistemas Fortemente Acoplados...34
7.4.1.1 - Sistemas Assimétricos...35
7.4.1.2 - Sistemas Simétricos...35
7.4.2 - Sistemas Fracamente Acoplados...36
7.4.2.1 - Sistemas Operacionais de Rede...37
7.4.2.2 - Sistemas Operacionais distribuídos...37
8 - ESTRUTURA DOS SISTEMAS OPERACIONAIS...39
8.1 – C
HAMADASDOS
ISTEMA...39
8.2- M
ODOSDEA
CESSO...40
8.3- T
IPOSDEE
STRUTURADES
ISTEMASO
PERACIONAIS...40
8.3.1- Sistemas Monolíticos...40
8.3.2- Sistemas em Camadas...41
8.3.3-Máquinas Virtuais...42
8.3.4-Modelo Cliente Servidor...42
1 – Processamento de Dados
Um computador é uma máquina (conjunto de partes mecânicas e eletrônicas) capaz de sistematicamente coletar, manipular e fornecer os resultados da manipulação de informações para um ou mais objetivos.
Processamento de Dados pode ser definido como sendo um conjunto de atividades ordenadamente realizadas, com o objetivo de produzir um arranjo determinado de informações a partir de outras obtidas inicialmente.
A partir dos dados iniciais passados para o computador (entrada) são realizadas determinadas atividades (processamento) para que se possa chegar a um resultado com alguma utilidade (saída)
2 – Os 3 Pilares da Informática
A informática se sustenta em três pilares: hardware, software e peopleware. Hardware é a parte física dos computadores. Placas, drives, teclados, mouse, etc. Software é a parte lógica, abstrata. São os programas.
Peopleware são as pessoas que estão direta ou indiretamente ligadas aos computadores. É o principal elemento da informática.
2.1 – Esquema Básico do Elemento Hardware
Unidades de Entrada Também conhecidas como “Periféricos de Entrada” são responsáveis pela coleta, tradução (transformação dos dados coletados para uma linguagem que o computador entenda) e inserção dos dados coletados no sistema. Exemplos: teclado, mouse, scanner, etc.
CPU UCP – Unidade Central de Processamento. Sua função consiste em coordenar, controlar e executar todas as operações do sistema.
Processador:
Unidade de Controle é a unidade responsável por comandar o resto das unidades. Interpreta as instruções, controla sua execução e a sequência em que estas devem ser executadas.
Unidade Aritmético-Lógica é a parte da CPU encarregada de realizar as operações elementares de tipo aritmético e lógico.
Memória Principal é o elemento encarregado de armazenar os programas e dados necessários para que o sistema realize um determinado trabalho.
Entrad
a
(dados)
Processamento
Saída
(informação)
U n i d a d e s d e
E n t r a d a
M e m ó r i a P r i n c i p a l
M e m ó r i a A u x i l i a r
U n i d a d e d e C o n t r o l e
+
U n i d a d e A r i t m é t i c o
-L ó g i c a
P r o c e s s a d o r
C P U
U n i d a d e s d e
S a í d a
Memória Auxiliar ou memória securndária, são dispositivos de armazenamento de grande quantidade de informação e sua característica principal é reter tal informação durante o tempo que se desejar, recurepando-a quando lhe for requerido.
Unidades de Saída Também conhecidas como “ Periféricos de Saída”, têm a função de recolher e enviar para fora os dados de saída de cada um dos trabalhos realizados no sistema.
2.2 – Esquema Básico do Elemento Software
O software de um sistema é o conjunto de elementos lógicos necessários à realização de tarefas requeridas a ele.
Podemos defini-lo da seguinte maneira: o software é a parte lógica que dota o equipamento físico de capacidade para realizar todo tipo de trabalho.
O software origina-se de idéias do elemento humano registradas sobre um determinado suporte do elemento hardware e sob cuja direção o computador sempre trabalha.
Atualmente, num sistema informático, o software tem peso específico maior que o hardware por ir adquirindo dia-a-dia maior importância em todos os aspectos (custo, manutenção, etc).
Os softwares dividem-se em duas categorias: sistemas operacionais e aplicativos.
Um sistema operacional é um conjunto de programas que permitem obter o máximo rendimento do computador. É responsável por controlar o hardware e serve como interface entre os aplicativos e o hardware.
Os aplicativos são softwares especializados em uma tarefa específica. Por exemplo, edição de textos, planilhas eletrônicas, editor de imagens, bancos de dados, etc.
3 – Representação das Informações
Para entendermos como realmente um computador funciona, devemos, antes de tudo, estudar como os circuitos eletrônicos usados nos computadores funcionam, ou melhor, como se comunicam.
Os computadores e seus componentes são sistemas eletrônicos digitais, funcionando e comunicando-se através de números binários.
Na natureza, todo tipo de informação pode assumir qualquer valor compreendido entre -∞ e +∞. Você consegue distinguir, por exemplo, uma cor vermelha que esteja um pouco mais clara que outro tom de vermelho, um som que seja mais alto que outro, consegue perceber o quanto um ambiente está mais claro que outro. Todos esses tipos de informação são conhecidos como INFORMAÇÃO ANALÓGICA. A construção de circuitos eletrônicos, teoricamente, deveria seguir os mesmos moldes da natureza a fim de se tornar o mais real possível. No entanto, na hora da construção de circuitos eletrônicos para o processamento de informações, a utilização de informações analógicas tornou-se um grande problema. Imagine um determinado circuito eletrônico comunicando-se com outro a uma certa distância. Vamos dizer que os dois dispositivos permitam informações analógicas. Se um dispositivo enviar um determinado valor e, durante o percurso, houver um problema qualquer, tal informação chegará alterada. O grande problema, no entanto, estará no fato de que o dispositivo receptor não terá meios para verificar se a informação era verdadeira ou não. Como aceita qualquer valor, se, em vez de “70”, chegar o valor “71”, o dispositivo terá que aceita-lo como verdadeiro. Dessa forma, nenhum dispositivo eletrônico conseguiria funcionar corretamente.
Dispositivos eletrônicos para o processamento de informações trabalham com um outro sistema numérico: o sistema binário. No sistema binário, ao contrário do sistema decimal, só há dois algarismos: “0” e “1”. No entanto, há uma grande vantagem: qualquer valor diferente desses será completamente desprezado pelo circuito eletrônico, gerando confiabilidade e funcionalidade. Dessa forma, os computadores digitais são totalmente binários. Toda informação introduzida em um computador é convertida para a forma binária, através de um código de armazenamento.
A menor unidade de Informação armazenável em um computador é o algarismo binário ou dígito binário, conhecido como BIT (contração das palavras inglesas binary digit). O bit pode ter, então, somente dois valores: 0 ou 1.
Evidentemente, com possibilidades tão limitadas, o bit pouco pode representar isoladamente; por essa razão, as informações manipuladas por um computador são codificadas em grupos ordenados de bits, de modo a terem um significado útil.
O menor número ordenado de bits representando uma informação útil e inteligível para o ser humano é o caractere.
Qualquer caractere a ser armazenado em um sistema de computação é convertido em um conjunto de bits previamente definido para o referido sistema.
A primeira definição formal atribuída a um grupo ordenado de bits, para efeito de manipulação interna mais eficiente, foi instituída pela IBM e é, atualmente, utilizada por praticamente todos os fabricantes de computadores. Trata-se do BYTE, definido como um grupo ordenado de oito bits, tratados de forma individual, como unidade de armazenamento e transferência.
Para facilitar a expressão de grandes quantidades de bytes, utilizamos abreviaturas que obedecem à tabela de conversão abaixo:
8 bits 1 byte
1.024 Kilobytes 1 Megabyte 220 = 1.048.576 1.024 Megabytes 1 Gigabyte 230 = 1.073.741.824 1.024 Gigabytes 1 Terabyte 240 = 1.099.511.627.776 1.024 Terabytes 1 Petabyte 250 = 1.125.899.906.843.624 1.024 Petabytes 1 Exabyte 260 = 1.152.921.504.607.870.976 1.024 Exabytes 1 Zetabyte 270 = 1.180.591.620.718.458.879.424 1.024 Zetabytes 1 Yottabyte 280 = 1.208.925.819.615.701.892.530.176
Como os computadores são binários, todas as indicações numéricas referem-se a potências de 2, e, por essa razão, o K representa 1.024 unidades (décima potência de 2 ou 210).
Devemos tomar alguns pequenos cuidados na hora de representar a abreviação de byte, a fim de que não haja confusão com a abreviação de bit. Enquanto abreviamos bit com b (minúsculo), abreviamos byte com B (maiúsculo). Assim, 1 KB é a representação de um kilobyte (1.024 bytes = 8.192 bits), enquanto 1 Kb é a representação de um kilobit (1.024 bits).
Todo processamento em um computador consiste na manipulação de dados segundo um conjunto de instruções.
Para que seja possível individualizar grupos diferentes de informações (o conjunto de dados de um programa constitui um grupo diferente do conjunto de dados de outro programa, por exemplo), os sistemas operacionais estruturam esses grupos de dados sob uma forma denominada arquivo.
Um arquivo de informações (ou dados) é um conjunto formado por dados (ou informações) de um mesmo tipo ou para uma mesma aplicação. Por exemplo, podemos ter um arquivo contendo um texto ou um arquivo contendo as instruções de um programa.
Os arquivos são identificados através de um nome que, dependendo do sistema operacional utilizado, possui algumas regras. Por exemplo, no DOS, os arquivos devem possuir nomes de, no máximo, 8 caracteres mais uma extensão, composta por 3 caracteres e, separada do nome por um ponto (.) . Espaços em branco e alguns símbolos especiais não são aceitos. A extensão determina o tipo de dados que o arquivo contém (.exe arquivo de executável – programa-, .doc normalmente um documento do Word, .dbf arquivo de banco de dados, etc).
4 – Sistemas de Numeração
Desde os primórdios da civilização o homem vem adotando formas e métodos específicos para representar números, tornando possível, com eles, contar objetos e efetuar operações aritméticas.
A forma mais empregada de representação numérica é a chamada NOTAÇÃO POSICIONAL. Nela, os algarismos componentes de um número assumem valores diferentes, dependendo de sua posição relativa no número. O valor total do número é a soma dos valores relativos de cada algarismo. Desse modo, é a posição do algarismo ou dígito que determina seu valor.
A formação de números e as operações com eles efetuadas dependem, nos sistemas posicionais, da quantidade de algarismos diferentes disponíveis no referido sistema. Há muito tempo a cultura ocidental adotou um sistema de numeração que possui dez diferentes algarismo – 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 – e, por essa razão, foi chamado de SISTEMA DECIMAL.
A quantidade de algarismo disponíveis em um dado sistema de numeração é chamada de BASE. A base serve para contarmos grandezas maiores, indicando a noção de grupamento. O sistema de dez algarismo, acima mencionado, tem base 10; um outro sistema que possua apenas dois algarismos diferentes (0 e 1) é de base 2, e assim por diante.
Vamos exemplificar o conceito de sistema posicional. Seja o número 1303, representado na base 10, escrito da seguinte forma:
130310
Em base decimal, por ser a mais usual, costumamos dispensar o indicador da base, escrevendo-se apenas o número: 1303.
Neste exemplo, o número é composto de quatro algarismo: 1, 3, 0 e 3 e cada algarismo possui um valor correspondente à sua posição no número.
Assim, o primeiro 3 (algarismo mais à direita) representa 3 unidades. Neste caso, o valor absoluto do algarismo (que é 3) é igual ao seu valor relativo (que também é 3), por se tratar da 1a posição (posição mais à direita, que é a ordem das unidades). Considerando-se o aspecto três vezes a potência 0 da base 10 ou
3 x 100 = 3
enquanto o segundo 3 vale três vezes a potência 2 da base 10 ou 3 x 102 = 300
O valor total do número seria então:
1 x 103 + 3 x 102 + 0 x 101 + 3 x 100 = (1000 + 300 + 0 + 3) = 1303 10
Generalizando, num sistema qualquer de numeração posicional, um número N é expresso da seguinte forma:
N = (dn-1 dn-2 dn–3 ... d1 d0 ) b Onde:
d indica cada algarismo do número;
n-1, n-2, 1, 0 indicam a posição de cada algarismo; b indica a base de numeração;
n indica o número de dígitos inteiros.
O valor do número pode ser obtido do seguinte somatório:
N = (dn-1 x b n-1) + (dn-2 x bn-2)+ (dn–3 x bn-3) + ... +(d1 x b1) + (d0 x b0) Desse modo, na base 10, podemos representar um número:
N = 3748 Onde:
n = 4 (quatro dígitos inteiros)
Utilizando a fórmula anteriormente mostrada temos: dn-1 = 3 ou d3 = 3
dn-2 = 7 ou d2 = 7 dn-3 = 4 ou d1 = 4 dn-4 = 8 ou d0 = 8
Ou, obtendo seu valor de acordo com a fórmula mostrada: N = 3 x 103 + 7 x 102 + 4 x 101 + 8 x 100
N = 3000 + 70 + 40 + 8 N = 374810
Entre as bases diferentes da 10, consideramos apenas as bases 2 e potências de 2, visto que todo computador digital representa internamente as informações em algarismos binários, ou seja, trabalha em base 2. Como os números representados na base 2 são muito extensos (quanto menor a base de numeração, maior é a quantidade de algarismos necessários para indicar um dado valor) e, portanto, de difícil manipulação visual, costuma-se representar externamente os valores binários em outras bases de valor mais elevado. Isso permite maior compactação de algarismos e melhor visualização dos valores. Em geral, usam-se as bases octal ou hexadecimal, em vez da base decimal, por ser mais simples e rápido converter valores binários (base 2) para valores em bases múltiplas de 2.
Utilizando-se a notação posicional, representam-se números em qualquer base: 10112 na base 2
3425 na base 5 2578 na base 8
No entanto, nas bases diferentes de 10, o valor relativo dos algarismos (valor dependente de sua posição no número) é normalmente calculado usando-se os valores resultantes de operações aritméticas em base 10 e não na base do número e, portanto, o valor total do número na base usada.
Por exemplo:
Seja o número na base 2: 10112
Aplicando a expressão mostrada anteriormente temos:
1 x 23 + 0 x 22 + 1 x 21 + 1 x 20 8 + 0 + 2 + 1 = 1110
Este valor 11 está expresso na base 10 e será, portanto, 1110 e não na base 2.
A base do sistema binário é 2 e, conseqüentemente, qualquer número, quando representado nesse sistema, consiste exclusivamente em dígitos 0 e 1. O termo dígito binário é chamado bit, contração do termo inglês binary digit.
Por exemplo, o número binário 11011 possui cinco dígitos, ou algarismos binários. Diz-se que o referido número é constituído de 5 bits.
Em bases de valor superior a 10, usam-se letras do alfabeto para a representação de algarismos maiores que 9. Uma dessas bases é especialmente importante em computação; trata-se da base 16 ou hexadecimal, por ser de valor múltiplo de 2 (como a base 8).
Nessa base, os “algarismos” A, B, C, D, E e F representam, respectivamente, os valores (da base 10): 10, 11, 12, 13, 14 e 15.
Na base 16 (hexadecimal), dispomos de 16 algarismo (não números) diferentes: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E e F.
Um número nessa base é representado na forma da expressão: 1A7B16
O seu valor na base 10 será obtido usando-se a expressão:
1 x 163 + 10 x 162 + 7 x 161 + 11 x 160 4096 + 2560 + 112 + 11 = 6779
Observe que na fórmula acima foram usados os valores 10 para o algarismo A e 11 para o algarismo B, para multiplicar as potências de 16. Por isso, obtivemos o valor do número na base 10.
Em outras palavras, utilizamos valores e regras de aritmética da base 10 e, por isso, o resultado encontrado é um valor decimal. A tabela a seguir mostra a representação de números nas bases 2, 8, 10 e 16.
Base 2 Base 8 Base 10 Base 16
0 0 0 0 1 1 1 1 10 2 2 2 11 3 3 3 100 4 4 4 101 5 5 5 110 6 6 6 111 7 7 7 1000 10 8 8 1001 11 9 9 1010 12 10 A 1011 13 11 B 1100 14 12 C 1101 15 13 D 1110 16 14 E 1111 17 15 F 10000 20 16 10 10001 21 17 11 10010 22 18 12 10011 23 19 13 10100 24 20 14 10101 25 21 15 10110 26 22 16
Pela tabela, podemos observar que os dígitos octais e hexadecimais correspondem a combinações de 3 (octais) e 4 (hexadecimais) bits (algarismos binários). Sendo a base desses sistemas de valor maior que a base 2 e tendo em vista essa particularidade na representação de números nas bases 8 e 16 em relação à base 2, verifica-se que é possível converter rapidamente números da base 2 para as bases 8 ou 16, ou vice-versa.
Por exemplo, o número 1011110111012 , na base 2, possui 12 algarismos (bits), mas pode ser representado com quatro algarismos octais ou apenas três algarismos hexadecimais.
1011110111012 = 57358
porque: 101 = 5; 111 = 7; 011 = 3 e 101 = 5 1011110111012 = BDD16
porque: 1011 = B; 1101 = D; 1101 = D
4.1 – Conversão de Bases
Uma vez entendido como representar números em notação posicional, e como esta notação é aplicável em qualquer base inteira, podemos exercitar a conversão de números de uma base para outra.
Interessa-nos, principalmente, verificar o processo de conversão entre bases múltiplas de 2, e entre estas e a base 10, e vice-versa.
4.1.1 – Conversão entre Bases Potência de 2
4.1.1.1 – Entre as Bases 2 e 8
Como 8 = 23, um número binário (base 2) pode ser facilmente convertido para o seu valor equivalente na base 8 (octal). Se o número binário for inteiro, basta dividi-lo, da direita para a esquerda, em grupos de 3 bits (o último grupo não sendo múltiplo de 3, preenche-se com zeros à esquerda). Então, para cada grupo, acha-se o algarismo octal equivalente.
A conversão de números da base 8 para a 2 é realizada de forma semelhante, no sentido inverso; substitui-se cada algarismo octal pelos seus 3 bits correspondentes.
Exemplos:
4.1.1.2 – Entre as Bases 2 e 16
O procedimento de conversão entre números binários e hexadecimais (base 16) é idêntico ao da conversão entre as bases 2 e 8, exceto que, neste caso, a relação é 16 = 24.
Desse modo, um algarismo hexadecimal é representado por 4 bits; converte-se um número binário em hexadecimal, dividindo-se este número em grupos de 4 bits da direita para a esquerda.
A conversão de hexadecimal para binário é obtida substituindo-se o algarismo hexadecimal pelos 4 bits correspondentes.
Exemplos:
4.1.1.3 – Entre as Bases 8 e 16
O processo de conversão utiliza os mesmos princípios antes apresentados. No entanto, como a base de referência para as substituições de valores é a base 2, esta deve ser empregada como intermediária no processo. Ou seja, convertendo-se da base 8 para a 16, deve-se primeiro efetuar a conversão para a base 2 (como mostrado nos subitens anteriores) e depois para a base 16. E o mesmo ocorre se a conversão for da base 16 para a base 8. Por exemplo:
1110101112 = X8 (111) (010) (111)2 = 7278 7 2 7 10100111112 = X8 (001) (010) (011) (111)2 = 12378 1 2 3 7 3278 = X2 3 2 7 (011) (010) (111)2 = 110101112 6732 = X8 6 7 3 (110) (111) (011)2 = 1101110112 10110110112 = X16 (0010) (1101) (1011)2 = 2DB16
2 D B
100111001011012 = X16 (0010) (0111) (0010) (1101)2 = 272D162 7 2 D
30616 = X2 (0011) (0000) (0110)2 = 110000011023 0 6
F5016 = X2 (1111) (0101) (0000)2 = 1111010100002F 5 0
31748 = X16 (011) (001) (111) (100)2 = 110011111002(0110) (0111) (1100)
2= 67C
165 - Conceitos Básicos de
Sistemas Operacionais
5.1 - Introdução
Sem o software, um computador não passa de um amontoado de metal e plástico sem utilidade. A partir do momento em que o hardware passa a ter um software, o computador passa a poder armazenar, processar e recuperar informações.
O software de computador pode ser dividido em dois grandes grupos: os sistemas operacionais, que são responsáveis por gerenciar as operações do hardware, e os programas aplicativos, responsáveis por resolver problemas específicos para os usuários. O mais fundamental de todos os programas são os sistemas operacionais, os quais controlam todos os recursos do computador e proporcionam uma base sobre a qual os programas aplicativos podem ser escritos.
Um sistema computacional moderno é composto por um ou mais processadores, memória principal, sincronizadores, terminais, discos, placas de rede e outros dispositivos de entrada e saída. No final das contas, um sistema bastante complexo.
Os sistemas operacionais são softwares ou programas composto por um grande conjunto de rotinas executadas pelo processador, da mesma forma que qualquer outro programa. Porém, sua principal função é controlar o funcionamento do computador, como um gerente dos diversos recursos disponíveis no sistema.
Um sistema operacional possui inúmeras funções e resumimos essas funções, basicamente, em duas, descritas a seguir:
5.1.1 - Facilidade de acesso aos recursos do sistema
Um sistema de computação possui, normalmente, diversos componentes, como monitores de vídeo, teclados, impressoras, discos, fitas, etc. Quando utilizamos um desses dispositivos, não nos preocupamos com a maneira como é realizada esta comunicação e com os inúmeros detalhes envolvidos.
Para a maioria de nós uma operação cotidiana, como, por exemplo, a leitura de um arquivo em disquete, pode parecer simples. Na realidade, existe um conjunto de rotinas específicas, controladas pelo sistema operacional, responsável por acionar a cabeça de leitura e gravação da unidade de disco, posicionar na trilha e setor onde estão os dados, transferir os dados do disco para a memória e, finalmente, informar ao programa a chegada dos dados.
Há vários anos atrás, ficou muito claro que era necessário se encontrar um meio de isolar os programadores da complexidade do hardware. A solução encontrada foi adicionar uma “camada” de software sobre o hardware para gerenciá-lo e proporcionar ao programador uma interface ou “máquina virtual” (virtual machine) que o tornaria mais fácil de entender e programar.
O sistema operacional, então, serve de interface entre os usuários e os recursos de hardware disponíveis no sistema, tornando esta comunicação transparente e permitindo ao usuário um trabalho mais eficiente e com menores chances de erros.
2548 = X16 (010) (101) (100)2 = 101011002
(1010) (1100)
2= AC
162E7A16 = X8 (0010) (1110) (0111) (1010)2 = 00101110011110102
(010) (111) (001) (111) (010)
2= 27172
83C716 = X8 (0011) (1100) (0111)2 = 0011110001112
(001) (111) (000) (111)
2= 1707
8É comum pensar que compiladores, linkers, bibliotecas, depuradores e outras ferramentas fazem parte do sistema operacional, mas, na realidade, estas facilidades são apenas utilitários, destinados a ajudar a interação do usuário com o computador.
5.1.2 - Compartilhamento de recursos de forma organizada e protegida
Quando pensamos em sistemas multiusuário, onde vários usuários podem estar compartilhando os mesmos recursos, como, por exemplo, memória e discos, é necessário que todos tenham oportunidade de ter acesso a esses recursos, de forma que um usuário não interfira no trabalho do outro. Se imaginarmos, por exemplo, que uma impressora possa ser utilizada por vários usuários do sistema, deverá existir algum controle para impedir que a impressão de um usuário interrompa a impressão de outro. Novamente, o sistema operacional é responsável por permiti
r o acesso concorrente a esse e a outros recursos, de forma organizada e protegida, dando ao usuário a impressão de ser o único a utilizá-los.
O compartilhamento de recursos permite, também, a diminuição de custos, na medida em que mais de um usuário pode utilizar as mesmas facilidades concorrentemente, como discos, impressoras, linhas de comunicação, etc.
Não é apenas em sistemas multiusuário que o sistema operacional é importante. Se pensarmos que um computador pessoal nos permite executar várias tarefas, como imprimir um documento, copiar um arquivo pela Internet ou processar uma planilha, o sistema operacional deve ser capaz de controlar a execução concorrente de todas essas tarefas.
5.2 - Máquinas de Níveis
Um computador visto somente como um gabinete composto de circuitos eletrônicos, cabos e fontes de alimentação (hardware), não tem nenhuma utilidade. É através de programas (software) que o computador consegue armazenar dados em discos, imprimir relatórios, gerar gráficos, realizar cálculos, entre outras funções. O hardware é o responsável pela execução das instruções de um programa, com a finalidade de se realizar alguma tarefa.
Uma operação efetuada pelo software pode ser implementada em hardware, enquanto uma instrução executada pelo hardware pode ser simulada via software. Esta decisão fica a cargo do projetista do computador em função de aspectos como custo, confiabilidade e desempenho. Tanto o
hardware como o software são logicamente equivalentes, interagindo de uma forma única para o usuário.
Nos primeiros computadores, a programação era realizada em painéis, através de fios, exigindo um grande conhecimento do hardware e de sua linguagem de máquina. Isso era uma grande dificuldade para os programadores da época.
A solução para esse problema foi o surgimento do sistema operacional, que tornou a interação entre usuário e computador mais simples, confiável e eficiente. A partir desse acontecimento, não existia mais a necessidade de o programador se envolver com a complexidade do hardware para poder trabalhar; ou seja, a parte física do computador tornou-se transparente para o usuário.
Figura 1 - Visão modular do computador pelo usuário.
Partindo desse princípio, podemos considerar o computador como uma máquina de níveis ou camadas, onde inicialmente existem dois níveis: o nível 0 (hardware) e o nível 1 (sistema operacional). Desta forma, o usuário pode enxergar a máquina como sendo apenas o sistema operacional, ou seja, como se o hardware não existisse. Esta visão modular e abstrata é chamada máquina virtual.
Na realidade, um computador não possui apenas dois níveis, e sim tantos níveis quanto forem necessários para adequar o usuário às suas diversas aplicações. Quando o usuário está trabalhando em um desses níveis, não necessita da existência das outras camadas, acima ou abaixo de sua máquina virtual.
Atualmente, a maioria dos computadores possui a estrutura mostrada na figura 2, podendo conter mais ou menos camadas. A linguagem utilizada em cada um desses níveis é diferente, variando da mais elementar (baixo nível) até a mais sofisticada (alto nível).
Figura 2 - Máquina de níveis.
5.3 - Histórico
A evolução dos sistemas operacionais está, em grande parte, relacionada ao desenvolvimento de equipamentos cada vez mais velozes, compactos e de baixo custo, e à necessidade de aproveitamento e controle desses recursos.
Neste histórico dividimos essa evolução em fases, onde destacamos, em cada uma, suas principais características de hardware, software, interação com o sistema e aspectos de conectividade.
Sistema
Operacional
Hardware
Aplicativos
Utilitários
Sistema Operacional
Linguagem de Máquina
Hadware
Dispositivos Físicos
Microprogramação
5.3.1 - Primeira Fase (1945-1955)
No início da Segunda Guerra Mundial, surgiram os primeiros computadores digitais, formados por milhares de válvulas, que ocupavam áreas enormes, sendo de funcionamento lento e duvidoso.
O ENIAC (Electronic Numerical Integrator and Computer) foi o primeiro computador digital de propósito geral. Criado para a realização de cálculos balísticos, sua estrutura possuía 18 mil válvulas, 10 mil capacitores, 70 mil resistores e pesava 30 toneladas. Quando em operação, consumia cerca de 140 quilowatts e era capaz de realizar 5 mil adições por segundo.
Para trabalhar nessas máquinas, era necessário conhecer profundamente o funcionamento do hardware, pois a programação era feita em painéis, através de fios, utilizando linguagem de máquina. Nessa fase, ainda não existia o conceito de sistema operacional.
Outros computadores foram construídos nessa mesma época, como o EDVAC (Electronic Discrete Variable Automatic Computer) e o IAS (Princeton Institute for Advanced Studies), mas eram utilizados apenas nas universidades e nos órgãos militares.
Com o desenvolvimento da indústria de computadores, muitas empresas foram fundadas ou investiram no setor, como a Sperry e a IBM, o que levou à criação dos primeiros computadores para aplicações comerciais. A primeira máquina fabricada com esse propósito e bem-sucedida foi o UNIVAC I (Universal Automatic Computer), criado especialmente para o censo americano de 1950.
5.3.2 - Segunda Fase (1956-1965)
A criação do transistor e das memórias magnéticas contribuiu para o enorme avanço dos computadores da época. O transistor permitiu o aumento da velocidade e da confiabilidade do processamento, e as memórias magnéticas permitiram o acesso mais rápido aos dados, maior capacidade de armazenamento e computadores menores.
Com o surgimento das primeiras linguagens de programação, como Assembler e Fortran, os programas deixaram de ser feitos diretamente no hardware, o que facilitou enormemente o processo de desenvolvimento de programas.
Já não era mais possível conviver com tantos procedimentos manuais como os anteriores, que não permitiam o uso eficiente do computador e de seus recursos. Os primeiros sistemas operacionais surgiram, justamente, para tentar automatizar as tarefas manuais.
Inicialmente, os programas passaram a ser perfurados em cartões, que, submetidos a uma leitora, eram gravados em uma fita de entrada (Figura 3a). A fita, então, era lida pelo computador, que executava um programa de cada vez, gravando o resultado do processamento em uma fita de saída (Figura 3b). Ao terminar a execução de todos os programas, a fita de saída era lida e impressa (Figura 3c). A esse tipo de processamento, onde um lote (batch) de programas era submetido ao computador, deu-se o nome de processamento batch.
Pode não parecer um avanço, mas anteriormente os programas eram submetidos pelo operador, um a um, fazendo com que o processador ficasse ocioso entre a execução de um programa e outro. Com o processamento batch, um grupo de programas era submetido de uma só vez, o que diminuía o tempo existente entre a execução dos programas, permitindo, assim, melhor uso do processador.
Os sistemas operacionais passaram a ter seu próprio conjunto de rotinas para operações de entrada/saída (Input/Output Control System—IOCS), que veio facilitar bastante o processo de programação. O IOCS eliminou a necessidade de os programadores desenvolverem suas próprias rotinas de leitura/gravação específicas para cada dispositivo periférico. Essa facilidade de comunicação criou o conceito de independência de dispositivos.
Importantes avanços, no que se refere ao hardware, foram implementados no final dessa fase, principalmente na linha 7094 da IBM. Entre eles, destacamos o conceito de canal, que veio permitir a transferência de dados entre dispositivos de entrada/saída e memória principal de forma independente da UCP. Ainda nessa fase, destacamos os sistemas FMS (Fortran Monitor System) e IBSYS.
5.3.3 - Terceira Fase (1966-1980)
Através dos circuitos integrados (CIs) e, posteriormente, dos microprocessadores, foi possível viabilizar e difundir o uso de sistemas computacionais por empresas, devido a diminuição de seus custos de aquisição. Além disso, houve grande aumento do poder de processamento e diminuição no tamanho dos equipamentos.
Com base nessa nova tecnologia, a IBM lançou em 1964 a Série 360. Esse lançamento causou uma revolução na indústria de informática, pois introduzia uma linha (família) de computadores pequena, poderosa e, principalmente, compatível. Isso permitiu que uma empresa adquirisse um modelo mais simples e barato e, conforme suas necessidades, mudasse para modelos com mais recursos, sem comprometer suas aplicações já existentes. Para essa série, foi desenvolvido o sistema operacional OS/360, que tentava atender todos os tipos de aplicações e periféricos. Apesar de todos os problemas desse equipamento e de seu tamanho físico, a série 360 introduziu novas técnicas, utilizadas até hoje.
Na mesma época, a DEC lançou a linha PDP-8, também revolucionária, pois apresentava uma linha de computadores de porte pequeno e baixo custo, se comparada aos mainframes ate então comercializados, criando um novo mercado, o de minicomputadores.
A evolução dos processadores de entrada/saída permitiu que, enquanto um programa esperasse por uma operação de leitura/gravação, o processador executasse um outro programa. Para tal, a memória foi dividida em partições, onde cada programa esperava sua vez para ser processado. A essa técnica de compartilhamento da memória principal e processador deu-se o nome de multiprogramação.
Com a substituição das fitas por discos no processo de submissão dos programas, o processamento batch tornou-se mais eficiente, pois permitia a alteração na ordem de execução das tarefas, até então puramente seqüencial. A essa técnica de submissão de programas chamou-se spooling, que, mais tarde, também viria a ser utilizada no processo de impressão.
Os sistemas operacionais, mesmo implementando o processamento batch e a multiprogramação, ainda estavam limitados a processamentos que não exigiam comunicação com o usuário. Para permitir a interação rápida entre o usuário e o computador, foram adicionados terminais de vídeo e teclado (interação on-line).
A multiprogramação evoluiu preocupada em oferecer aos usuários tempos de respostas razoáveis e uma interface cada vez mais amigável. Para tal, cada programa na memória utilizaria o processador em pequenos intervalos de tempo. A esse sistema de divisão de tempo do processador chamou-se time-sharing (compartilhamento de tempo).
Outro fato importante nessa fase foi o surgimento do sistema operacional Unix (1969). Concebido inicialmente em um minicomputador PDP-7, baseado no sistema MULTICS (Multiplexed Information and Computing Service), o Unix foi depois reescrito em uma linguagem de alto nível (linguagem C), tornando-se conhecido por sua portabilidade.
No final dessa fase, com a evolução dos microprocessadores, surgiram os primeiros microcomputadores, muito mais baratos que qualquer um dos computadores ate então comercializados. Entre eles, destacamos os micros de 8 bits da Apple e o sistema operacional CP/M (Control Program Monitor).
5.3.4 - Quarta Fase (1981-1990)
A integração em larga escala (Large Scale Integration-LSI) e a integração em altíssima escala (Very Large Scale Integration-VLSI) levaram adiante o projeto de miniaturização e barateamento dos equipamentos. Os mini e superminicomputadores se firmaram no mercado e os microcomputadores ganharam um grande impulso.
Nesse quadro surgiram os microcomputadores PC (Personal Computer) de 16 bits da IBM e o sistema operacional DOS (Disk Operation System), criando a filosofia dos computadores pessoais. Na área dos minis e superminicomputadores ganharam impulso os sistemas multiusuário, com destaque para os sistemas compatíveis com o Unix (Unix-like) e o VMS (Virtual Memory System) da DEC.
Surgem as estações de trabalho (workstations) que, apesar de monousuárias, permitem que se executem diversas tarefas concorrentemente, criando o conceito de multitarefa.
No final dos anos 80, os computadores tiveram um grande avanço, decorrente de aplicações que exigiam um enorme volume de cálculos. Para acelerar o processamento, foram adicionados outros processadores, exigindo dos sistemas operacionais novos mecanismos de controle e sincronismo. Com o
multiprocessamento, foi possível a execução de mais de um programa simultaneamente, ou até de um mesmo programa por mais de um processador.
As redes distribuídas (Wide Area Network- WANs) se difundiram por todo o mundo, permitindo o acesso a outros sistemas de computação, independentemente de sua localização geográfica e, até mesmo, sistemas de outros fabricantes. Nesse contexto são desenvolvidos inúmeros protocolos de rede, alguns proprietários, como o DECnet da DEC e o SNA (System Network Architecture) da IBM, e outros de domínio público, como o TCP/IP e o CCITT X.25.
Surgem as primeiras redes locals (Local Area Network—LANs) interligando pequenas áreas. Os softwares de rede passaram a estar intimamente relacionados ao sistema operacional e surgem os sistemas operacionais de rede.
5.3.5 - Quinta Fase (1991- ????)
Grandes avanços em termos de hardware, software e telecomunicações podem ser esperados. Essas mudanças são conseqüência da evolução das aplicações, que necessitam cada vez mais de capacidade de processamento e armazenamento de dados. Sistemas especialistas, sistemas multimídia, banco de dados distribuídos, inteligência artificial e redes neurais são apenas alguns exemplos da necessidade cada vez maior de sistemas com grande capacidade de processamento.
A evolução da microeletrônica permitirá o desenvolvimento de processadores e memórias cada vez mais velozes e baratos, Além de dispositivos menores, mais rápidos e com maior capacidade de armazenamento. Os componentes baseados em tecnologia VLSI (Very Large Scale Integration) evoluem rapidamente para o ULSI (Ultra Large Scale Integration).
Os computadores da próxima geração têm de ser muito mais eficientes que os atuais, pare atender o volume cada vez maior de processamento. Para isso, está ocorrendo uma mudança radical na filosofia de projeto de computadores. Arquiteturas paralelas, baseadas em organizações de multiprocessadores não convencionais, já se encontram em desenvolvimento em várias universidades e centros de pesquisa do mundo.
A evolução do hardware encadeará modificações profundas nas disciplinas de programação para fazer melhor uso das arquiteturas paralelas. Assim, novas linguagens e metodologias de programação concorrentes estão sendo desenvolvidas, em particular, fazendo uso extensivo de inteligência artificial e CAD (Computer-Aided Design).
O conceito de processamento distribuído será explorado nos sistemas operacionais, de forma que suas funções estejam espalhadas por vários processadores através de redes de computadores. Isso só será possível devido à redução dos custos de comunicação e ao aumento na taxa de transmissão de dados.
A arquitetura cliente-servidor aplicada basicamente a redes locais passa a ser oferecida em redes distribuídas, permitindo que qualquer pessoa tenha acesso a todo tipo de informação, independentemente de onde esteja armazenada. Problemas de segurança, gerência e desempenho tornam-se fatores importantes relacionados ao sistema operacional e a rede.
A década de 90 foi definitiva para a consolidação dos sistemas operacionais baseados em interfaces gráficas. Apesar da evolução da interface, a forma de interação com os computadores sofrerá, talvez, uma das modificações mais visíveis. Novas interfaces homem-máquina serão utilizadas, como linguagens naturais, sons e imagens, fazendo essa comunicação mais inteligente, simples e eficiente.
Os conceitos e implementações só vistos em sistemas considerados de grande porte estão sendo introduzidos na maioria dos sistemas desktop, como na família Windows da Microsoft, no Unix e no OS/2 da IBM. Fa se Características Primeira (1945-1955) Segunda
(1956-1965) (1966-1980)Terceira (1981-1990)Quarta (1991- ????)Quinta
Computadores
EDVACENIACUNIVAK NCR IMB 7094 CDC-6600 IBM 360, 370 PDP-11 Cray 1 Cyber-205 Cray XMP IBM 308 VAX-11 IBM-PC IBM 3090 Alpha AXP Pentium Sun SPARC
Hardware
Válvulas Tambor Magnético Tubos de raios catódicos Transistor Memória Magnética Circuito Integrado Disco Magnético Minicomputador Microprocessador LSI ou VLSI Disco óptico Microcomputador Ultra-LSI Arquiteturas Paralelas Circuto Integrado 3-DSoftware
LinguagemLinguagem
assembler Processamen-to Batch
Multiprogramaçã o Time-Sharing Computação Gráfica Sistemas Especialistas Linguagens orientadas a objetos Linguagens concorrentes Programação funcional Linguagens naturais
Telecomunicações
TelefoneTeletipo TransmissãoDigitalComunicação via satélite Microondas Redes distribuídas(WAN ) Fibra óptica Redes Locais (LAN) Internet Redes Locais estendidas (ELAN) Redes sem fio
Modelo cliente-servidor
Desempenho
10 ips 200.000 ips 5 Mips 30 Mips 1 Gflops1 Tflops6 – Conceitos de Hardware e Software
6.1 - Hardware
Um computador é constituído por um conjunto de componentes físicos (hadware) interligados. Esses dispositivos manipulam dados na forma digital, o que proporciona uma maneira confiável de representação das informações.
Todos os componentes de um computador são agrupados em três subsistemas básicos: Unidade central de processamento (CPU)
Memória principal Unidades de I/O
Estes subsistemas, também chamados de unidades funcionais, estão presentes em todo computador digital, apesar de suas implementações variarem nas diferentes arquiteturas existentes e comercializadas pelos diversos fabricantes de computadores.
Unidade Lógica
e Aritmética
(ULA)
Unidade
de Controle
(UC)
Registradores
Dispositivos de
Entrada e Saída
Memória Principal (MP)
6.1.1 - Unidade Central de Processamento
A unidade central de processamento (CPU), ou processador, tem como função principal unificar todo o sistema, controlando as funções realizadas por cada unidade funcional. A CPU também é responsável pela execução de todos os programas do sistema, que obrigatoriamente deverão estar armazenados na memória principal.
Um programa é composto por uma série de instruções que são executadas seqüencialmente pela CPU, através de operações básicas como somar, subtrair, comparar e movimentar dados. Desta forma, a CPU busca cada instrução na memória principal e a interpreta para sua execução.
A CPU é composta por dois componentes básicos: unidade de controle
unidade lógica aritmética
A Unidade de Controle (UC) é responsável por controlar as atividades de todos os componentes do computador, mediante a emissão de pulsos elétricos (sinais de controle) gerados por um dispositivo denominado clock. Este controle pode ser a gravação de um dado no disco ou a busca de uma instrução na memória.
A unidade lógica e aritmética (ULA), como o nome indica, é responsável pela realização de operações lógicas (testes e comparações) e aritméticas (somas e subtrações).
A especificação da velocidade de processamento de uma CPU é determinada pelo número de instruções que o processador executa por unidade de tempo (normalmente em segundos). Alguns fabricantes utilizam unidades de processamento próprias, já que não existe uma padronização, sendo as mais comuns o MIPS (milhões de instruções por segundo) e o MFLOPS/GFLOPS (milhões/bilhões de instruções de ponto flutuante por segundo). A tabela a seguir mostra alguns processadores e suas respectivas velocidades de processamento.
Intel 80386 Intel 80486 Intel Pentium Intel Pentium Pro Velocidade de
Processamento 5 MIPS 20 MIPS 100 MIPS 250 MIPS
6.1.2 - Clock
O clock é um sinal de controle (pulsos elétricos), sincronizado em um determinado intervalo de tempo (sinal de clock). A quantidade de vezes que este pulso se repete em um segundo define a freqüência do clock. O sinal de clock é utilizado pela unidade de controle para a execução das instruções e também para sincronizar a comunicação entre dispositivos que utilizam a transmissão paralela de bits externamente ao processador, só que para cada comunicação entre dois dispositivos existe um sinal de clock independente.
A freqüência do clock de um processador é medida em Hertz (Hz), que significa o número de pulsos elétricos gerados em um segundo. A freqüência também pode ser utilizada como unidade de desempenho entre diferentes processadores, portanto quanto maior a freqüência, mais instruções podem ser executadas pela CPu em um mesmo intervalo de tempo.
6.1.3 – Registradores
Os registradores são dispositivos de alta velocidade, localizados fisicamente na CPU, para armazenamento temporário de dados. O número de registradores varia em função da arquitetura de cada processador. Alguns registradores são de uso específico e têm propósitos especiais, enquanto outros são ditos de uso geral.
Entre os registradores de uso específico, merecem destaque:
Contador de Instruções (CI) ou program counter (PC) é o registrador responsável pelo armazenamento do endereço da próxima instrução que a CPU deverá executar. Toda vez que a CPU executa uma instrução, o contador de instruções é atualizado com um novo endereço;
Apontador da Pilha (AP) ou stack pointer (SP) é o registrador que contém o endereço de memória do topo da pilha, que é a estrutura de dados onde o sistema mantém informações sobre tarefas que estavam sendo processadas e tiveram que ser interrompidas por algum motivo;
Registrador de Estado ou program status word (PSW) é o registrador responsável por armazenar informações sobre a execução do programa, como a ocorrência de carry e overflow. A cada instrução executada, o registrador de estado é alterado conforme o resultado gerado pela instrução.
6.1.4 - Memória Principal
A memória principal, também conhecida como memória primária ou real, é a parte do computador onde são armazenados instruções e dados. Ela é composta por unidades de acesso chamadas endereços ou células, sendo cada célula composta por um determinado número de bits (binary digit). O bit é a unidade básica de memória, podendo assumir o valor 0 ou 1. Atualmente, a grande maioria dos computadores utiliza o byte (8 bits) como tamanho de célula, porém encontramos computadores de gerações passadas com células de 16, 32 e até mesmo 60 bits. Podemos concluir, então, que a memória, é formada por um conjunto de células, onde cada célula possui um determinado número de bits.
0 1 2 M - 1 Célula = n bits Endereços
O acesso ao conteúdo de uma célula é realizado através da especificação de um número chamado endereço. O endereço é uma referência única, que podemos fazer a uma célula de memória. Quando um programa deseja ler ou escrever um dado em uma célula, deve primeiro especificar qual o endereço de memória desejado, para depois realizar a operação.
A especificação do endereço é realizada através de um registrador denominado registrador de endereço de memória (memory register address - MAR). Através do conteúdo deste registrador, a unidade de controle sabe qual a célula de memória que será acessada. Outro registrador usado em operações com a memória é o registrador de dados da memória (memory buffer register—MBR). Este registrador é utilizado para guardar o conteúdo de uma ou mais células de memória após uma operação de leitura, ou para guardar o dado que será transferido para a memória em uma operação de gravação. Este ciclo de leitura e gravação e mostrado na tabela a seguir:
Operação de Leitura Operação de gravação
1. A CPU armazena no MAR, o endereço da célula a ser lida.
2. A CPU gera um sinal de controle para a memória principal, indicando que uma operação de leitura deve ser realizada.
3. 0 conteúdo da(s) célula(s), identificada(s) pelo endereço contido no MAR, é transferido para o MBR.
1. A CPU armazena no MAR, o endereço da célula que será gravada.
2. A CPU armazena no MBR, a informação que deverá ser gravada.
3. A CPU gera um sinal de controle para a memória principal, indicando que uma operação de gravação deve ser realizada.
4. A informação contida no MBR é transferida para a célula de memória endereçada pelo MAR.
A capacidade de uma memória é limitada pelo tamanho do MAR. No caso de o registrador possuir n bits, a memória principal poderá no máximo endereçar 2n células, isto é, do endereço 0 ao 2n-1. A memória principal pode ser classificada em função de sua volatilidade, que é a capacidade de a memória preservar o seu conteúdo mesmo sem uma fonte de alimentação ativa. As memórias chamadas voláteis se caracterizam por poderem ser lidas ou gravadas, como o tipo RAM (random access memory), que constitui quase que a totalidade da memória principal de um computador. O outro tipo, chamado de não volátil, não permite alterar ou apagar seu conteúdo. Este tipo de memória conhecido como ROM (read-only memory), já vem pré-gravado do fabricante, geralmente com algum programa, e seu conteúdo é preservado mesmo quando a alimentação é desligada.
Uma variação da ROM é a Flash ROM, que pode ser regravada.
Atualmente, uma série de memórias com diferentes características existem para diversas aplicações, como a EEPROM, EAROM, EAPROM, NOVRAM entre outras.
6.1.5 - Memória Cache
A memória cache é uma memória volátil de alta velocidade. O tempo de acesso a um dado nela contido é muito menor que se o mesmo estivesse na memória principal.
Toda vez que o processador faz referência a um dado armazenado na memória principal, ele "olha" antes na memória cache. Se o processador encontrar o dado na cache, não há necessidade do acesso a memória principal; do contrário, o acesso é obrigatório. Neste último caso, o processador, a
partir do dado referenciado, transfere um bloco de dados para a cache. O tempo de transferência entre as memórias é pequeno, se comparado com o aumento do desempenho obtido com a utilização desse tipo de memória. Apesar de ser uma memória de acesso rápido, seu uso é limitado em função do alto custo.
6.1.6 - Memória Secundária
A memória secundária é um meio permanente (não volátil) de armazenamento de programas e dados. Enquanto a memória principal precisa estar sempre energizada para manter suas informações, a memória secundária não precisa de alimentação.
O acesso à memória secundária é lento, se comparado com o acesso a memória cache ou à principal, porém seu custo é baixo e sua capacidade de armazenamento é bem superior ao da memória principal. Enquanto a unidade de acesso à memória secundária é da ordem de milissegundos, o acesso a memória principal é de nanossegundos. Podemos citar, como exemplos de memórias secundárias, a fita magnética, o disco magnético e o disco óptico.
A figura a seguir mostra a relação entre os diversos tipos de dispositivos de armazenamento apresentados, comparando custo, velocidade e capacidade de armazenamento.
Registradores
Memória Cache
Memória Principal
Memória Secundária
Maior Custo e
Maior Velocidade
de Acesso
Maior Capacidade
de armazenamento
6.1.7 - Dispositivos de I/O
Os dispositivos de entrada e saída (I/O) são utilizados para permitir a comunicação entre o computador e o meio externo. Através desses dispositivos, a CPU e a memória principal podem se comunicar, tanto com usuários quanto com memórias secundárias, a fim de realizar qualquer tipo de processamento.
Os dispositivos de I/O podem ser divididos em duas categorias: os que são utilizados como memória secundária e os que servem para a interface homem-máquina.
Os dispositivos utilizados como memória secundária, como discos e fitas magnéticas se caracterizam por armazenar muito mais informações que a memória principal. Seu custo é relativamente baixo, porém o tempo de acesso a memória secundária é de quatro a seis vezes maior que o acesso a memória principal.
Alguns dispositivos servem para a comunicação homem-máquina, como teclados, monitores de vídeo, impressoras, plotters, entre outros. Com o avanço no desenvolvimento de aplicações de uso cada vez mais geral, procura-se aumentar a facilidade de comunicação entre o usuário e o computador. A implementação, de interfaces mais amigáveis permite, cada vez mais, que pessoas sem conhecimento específico sobre informática possam utilizar o computador. Scanner, caneta ótica, mouse, dispositivos sensíveis à voz humana e ao calor do corpo são alguns exemplos desses tipos de dispositivos.
6.1.8 – Barramento
A CPU, a memória principal e os dispositivos de I/O são interligados através de linhas de comunicação denominadas barramentos, barras ou vias. Um barramento (bus) é um conjunto de fios paralelos (linhas de transmissão), onde trafegam informações, como dados, endereços ou sinais de controle.
Na ligação entre CPU e memória principal, podemos observar que três barramentos são necessários para que a comunicação seja realizada:
O barramento de dados transmite informações entre a memória principal e a CPU O barramento de endereços é utilizado pela CPU para especificar o endereço da célula
de memória que será acessada
O barramento de controle é por onde a CPU envia os pulsos de controle relativos as operações de leitura e gravação.
6.1.9 – Pipeline
Genericamente, os passos seguidos para a execução de uma instrução internamente ao processador são ilustrados na figura a seguir:
Cada passo ilustrado na figura é feito por uma unidade
diferente. A princípio, as unidades que não estiverem
envolvidas em um determinado momento do processo de execução
da instrução ficam ociosas.
Dessa forma, foi
introduzida uma técnica chamada
PIPELINE. Esta técnica consiste em manter todas as unidades ocupadas, ou seja, enquanto uma instrução
está sendo executada, a próxima instrução já estará na fase de decodificação e a próxima já estará sendo
buscada na memória RAM. Assim, conseguimos usar toda a capacidade de processamento do
processador.
O conceito de processamento pipeline se assemelha muito a uma linha de montagem, onde uma tarefa é dividida em uma seqüência de subtarefas, executadas em diferentes estágios, dentro da linha de produção. Da mesma forma que em uma linha de montagem, a execução de uma instrução pode ser dividida em subtarefas, como as fases de busca da instrução e dos operandos, execução e armazenamento dos resultados. O processador, através de suas várias unidades funcionais pipeline, funciona de forma a permitir que, enquanto uma instrução se encontra na fase de execução uma outra instrução possa estar na fase de busca simultaneamente.
A técnica de pipeline pode ser empregada em sistemas com um ou mais processadores, em diversos níveis, e tem sido a técnica de paralelismo mais utilizada para maior desempenho dos sistemas de computadores.
6.1.10 - Ativação e desativação do Sistema
O sistema operacional é essencial para o funcionamento de um computador. Sem ele, grande parte dos recursos do sistema não estaria disponível, ou se apresentaria de uma forma complexa para utilização pelos usuários.
Toda vez que um computador é ligado é necessário que o sistema operacional seja carregado da memória secundária para a memória principal. Esse processo, denominado ativação do sistema (boot), é realizado por um programa localizado em uma posição específica do disco, geralmente o primeiro bloco (MBR – Master Boot Record). O procedimento de ativação varia em função do equipamento, podendo ser realizado através do teclado, de um terminal ou por manipulação de chaves de um painel.
Busca de Instrução
Decodificação da Instrução
Busca de Dados
Disco
Memória
Principal
Sistema
Operacional
Boot
Além da carga do sistema operacional, a ativação do sistema também consiste na execução de arquivos de inicialização. Nestes arquivos são especificados procedimentos de inicialização de hardware e software específicos para cada ambiente.
Na maioria dos sistemas, também existe o processo de desativação (shutdown). Este procedimento permite que as aplicações e componentes do sistema sejam desativados de forma ordenada. Garantindo a integridade do sistema.
6.1.11 - Arquiteturas RISC e CISC
Um processador com arquitetura RISC (Reduced Instruction Set Computer) se caracteriza por possuir poucas instruções de máquina, em geral bastante simples, que são executadas diretamente pelo hardware. Na sua maioria, estas instruções não acessam a memória principal, trabalhando principalmente com registradores que, neste tipo de processador, se apresentam em grande número. Estas características, além de ajudar a executar as instruções em alta velocidade, facilitam a implementação do pipeline. Como exemplos de processadores RISC podemos citar o Sparc (SUN), RS-6000 (IBM), PA-RISC (HP), Alpha AXP (DEC) e Rx000 (MIPS).
Por sua vez, os processadores CISC (Complex Instruction Set computers) possuem instruções complexas que são interpretadas por microprogramas. O número de registradores é pequeno e qualquer instrução pode acessar a memória principal. Neste tipo de arquitetura, a implementação do pipeline é mais difícil. São exemplos de processadores CISC o VAX (DEC), 80x86 e o Pentium (Intel), e o 68xx (Motorola).
6.2 - Software
O Hardware, por si só, não tem a menor utilidade. Para torná-lo útil existe um conjunto de programas, utilizado como interface entre as necessidades do usuário e as capacidades do hardware. A utilização de softwares adequados às diversas tarefas e aplicações (conceitos de camadas) torna o trabalho dos usuários muito mais simples e eficiente.
Um computador, para realizar uma tarefa específica, como, por exemplo, somar 10 números em seqüência, requer que seja instruído (programado), passo a passo, para efetivamente realizar a tarefa. Necessita, pois, que seja projetado com a capacidade de realizar (interpretar e executar) um determinado conjunto de operações, cada uma sendo constituída de uma instrução específica (instrução de máquina). O conjunto de instruções ou comandos organizados em uma certa seqüência, para obter o resultado da soma dos 10 números, compõe o que denominamos programa de computador.
6.2.1 – Linguagens de Programação
Uma linguagem de programação é uma linguagem criada para instruir um computador a realizar suas tarefas. Um programa completo, escrito em uma linguagem de programação, é freqüentemente denominado de código. Deste modo, codificar um algoritmo significa converter suas declarações em um comando ou instrução específico de uma certa linguagem de programação.
O tipo mais primitivo de linguagem de programação é a linguagem que o computador entende diretamente, isto é, as instruções que podem ser diretamente executadas pelo hardware, isto é, pelo processador. É a linguagem de máquina, que foi utilizada pela primeira geração de programadores.
Uma instrução de máquina é um conjunto de bits, dividido em subconjuntos, com funções determinadas: um subconjunto estabelece o código de operação e o outro define a localização dos dados. Um programa em linguagem de máquina é, em conseqüência, uma longa seqüência de números, alguns dos quais representam instruções e outros, os dados a serem manipulados pelas instruções. A seguir temos um exemplo de um programa em linguagem de máquina, na sua forma binária pura e uma representação, mais compacta e um pouco mais simples, em linguagem hexadecimal:
Representação Binária Pura Representação Hexadecimal 0010 0100 1001 0001 2 4 9 1
0100 0100 1001 1111 4 4 9 7 0100 0100 1001 0011 4 4 9 3
0001 0100 1001 0010 1 4 9 2 1000 0100 1001 1000 8 4 9 8 1110 0100 1001 1001 E 4 9 9 0011 0100 1001 0101 3 4 9 5 0100 0100 1001 1110 4 4 9 E 1111 0100 1001 1010 F 4 9 A 0000 0000 0000 0000 0 0 0 0
Para escrever um programa em linguagem de máquina, o programador deve conhecer todas as instruções disponíveis para aquela máquina e seus respectivos códigos de operação e formatos, assim como os registradores da CPU disponíveis e os endereços de células de memória onde serão armazenadas as instruções e os dados. Um programa real, em linguagem de máquina, pode conter milhares de instruções, o que é uma tarefa extremamente tediosa e difícil, pelos detalhes que precisam ser observados pelo programador.
Para tentar minimizar esta ineficiência (dificuldade de entendimento do significado dos números, todos semelhantes), foi desenvolvida, ainda para a primeira geração de computadores, uma linguagem que representasse as instruções por símbolos e não por números. Esta linguagem simbólica foi denominada Linguagem de Montagem ( Assembly Language ).
Códigos de operação, como 0101, são mais fáceis de serem lembrados se representados como ADD (somar) do que pelo número binário 01012. Além disso, o programador, ao escrever um programa em linguagem de montagem (Assembly), não precisa mais guardar os endereços reais de memória onde dados e instruções estarão armazenados. Ele pode usar símbolos (caracteres alfabéticos ou alfanuméricos para indicar endereços ou dados), como MATRICULA, NOME, SALARIO, para indicar os dados que são usados em um programa.
Uma instrução em linguagem de máquina do tipo 0100010010011001 ou E499 pode ser mais facilmente representada e entendida como ADD SALARIO. Abaixo temos o mesmo programa mostrado anteriormente em linguagem de máquina só que agora em linguagem Assembly:
ORG ORIGEM LDA SALARIO – 1 ADD SALARIO – 2 ADD SALARIO – 3 SUB ENCARGO STA TOTAL HLT DAD SALARIO – 1 DAD SALARIO – 2 DAD SALARIO - 3
Para disponibilizarmos a linguagem de montagem em um computador, é necessário que haja um meio de converter os símbolos alfabéticos utilizados no programa em código de máquina, de modo a poder ser compreendido pelo processador. O processo de conversão (também denominado tradução) é chamado de montagem e é realizado por um programa denominado montador (Assembler). O montador lê cada instrução em linguagem de montagem e cria uma instrução equivalente em linguagem de máquina.
Embora escrever um programa em linguagem de montagem ainda seja uma tarefa árdua, tediosa e complexa, ainda é bem mais atraente do que escrever o mesmo programa em linguagem de máquina.
O desenvolvimento de linguagens que melhor refletissem os procedimentos utilizados na solução de um problema, sem preocupação com o tipo de processador ou de memória onde o programa será executado foi um passo significativo no sentido de criar uma linguagem de comunicação com o computador, mais simples e com menos instruções do que a linguagem de montagem. Tais linguagens, por serem estruturadas de acordo com a compreensão e a intenção do programador, são usualmente denominadas linguagens de alto nível (nível afastado da máquina).
Uma linguagem de alto nível, ou orientada ao problema, permite que o programador especifique a realização de ações do computador com muito menos instruções (comandos).
Desde o aparecimento de linguagens como FORTRAN e ALGOL, na década de 50, dezenas de outras linguagens de alto nível foram desenvolvidas, seja para uso geral ou para resolver tipos mais específicos de problemas. A tabela abaixo apresenta algumas das mais conhecidas linguagens de programação de alto nível, indicando-se a época de seu surgimento no mercado:
Linguagem Data Observações
FORTRAN 1957 FORmula TRANslation – Linguagem utilizada para cálculos
numéricos
ALGOL 1958 ALGOrithm Language
COBOL 1959 COmmon Business Oriented Language – linguagem para uso