1. ÍNDICE
1 - HISTÓRIA E FUNÇÕES DOS SISTEMAS OPERACIONAIS 1
1.1 – O QUE É UM SISTEMA OPERACIONAL? 1
1.2 – CARACTERÍSTICAS PRINCIPAIS. 1
1.3 – CLASSIFICAÇÃO. 2
1.3.1 - QUANTO AO TIPO DE SERVIÇOS OFERECIDOS AO USUÁRIO 2
1.3.2 - QUANTO AO NÚMERO DE USUÁRIOS 2
1.3.3 - QUANTO AO TIPO DE INTERAÇÃO 2
1.3.4 - QUANTO A APLICAÇÃO 2
1.4 – HISTÓRIA DOS SISTEMAS OPERACIONAIS. 3
1.4.1 - (DÉCADA DE 40): 3
1.4.2 - 1ª GERAÇÃO (DÉCADA DE 50): 3
1.4.3 - 2ª GERAÇÃO (INÍCIO DA DÉCADA DE 60): 4
1.4.4 - 3ª GERAÇÃO (MEIO DE 1960 ATÉ MEIO DE 1970): 4
1.4.5 - 4ª GERAÇÃO (MEIO DE 1970 ATÉ 1990): 4
1.4.6 - 5ª GERAÇÃO (1990 EM DIANTE): 5
1.5 – CONCEITOS DE HARDWARE E SOFTWARE. 5
1.5.1 - HARDWARE: 5
1.5.1.1 - Unidade Central de Processamento (UCP): 5
1.5.1.2 - Clock: 6
1.5.1.3 - Registradores: 6
1.5.1.4 - Memória principal: 6
1.5.1.5 - Memória cache: 6
1.5.1.6 - Memória Secundária: 7
1.5.1.7 – Dispositivos de entrada e saída: 7
1.5.1.8 – Barramento: 7
1.5.1.9 - Pipelining: 7
1.5.1.10 – Ativação/Desativação do sistema: 8
1.5.2 - SOFTWARE: 8
1.5.2.1 – Tradutor: 8
1.5.2.2 – Interpretador: 9
1.5.2.3 – Linker (Ligador): 9
1.5.2.4 – Loader (Carregador): 10
1.5.2.5 – Depurador (debugger): 10
1.5.2.6 – Linguagem de Controle: 11
1.5.2.7 – Linguagem de Máquina: 11
2. 1 - História e Funções dos Sistemas Operacionais
1.1 – O que é um Sistema Operacional?
Hardware e software compõem um sistema de computação, um não é útil sem o outro. O hardware em
parceria com o software é capaz de armazenar, recuperar, tratar, transportar dados, bem como, encontrar
erros de sintaxe em textos, produzir e reproduzir imagens e sons, e etc.
O software divide-se em duas categorias:
Os programas do sistema: que são os gerenciadores do computador;
Os programas de aplicação: que resolvem os problemas de seus usuários.
Dos programas de sistema o mais importante é Sistema Operacional que é o controlador de todos os
recursos do computador e que propicia a base sobre a qual os programas de aplicação (também chamado de
Aplicativos) são escritos.
Em poucas palavras, pode-se dizer que um Sistema Operacional é um conjunto de programas que
gerenciam todos os recursos do computador: processador, memória, dispositivos de E/S (Entrada/Saída),
execução dos programas dos usuários, etc. É ele que controla a utilização desses recursos.
Quando se diz que um programa está sendo executado, uma série de instruções está sendo executada pelo
processador e dados estão sendo manipulados na memória principal e ou secundária. Mas, "quem coloca o
programa para que ele seja executado? Quem fornece a memória necessária ao programa? Quando ele
precisa acessar algum dispositivo, o vídeo por exemplo, como isso acontece?"
Imagine que o próprio usuário devesse se preocupar com tais problemas. Ele teria de programar o acesso a
todos os recursos que ele pretende utilizar. Para colocar o programa para executar seria necessário
desenvolver as rotinas apropriadas para que o programa fosse carregado na memória e executado. O acesso a
uma impressora, por exemplo, deveria ser programado pelo usuário, e assim por diante. Agora imagine que o
usuário desejasse executar outros programas simultaneamente, como ele coordenaria a execução desses
programas?
Mas para resolver esses e outros problemas existem os sistemas operacionais. Portanto, basicamente o
Sistema Operacional gerencia os seguintes recursos:
Processador (es);
Memória;
Dispositivos de E/S.
Pode-se dizer que alguns objetivos de um Sistema Operacional são:
Executar os programas do usuário e resolver os problemas do usuário mais facilmente;
Diminuir ao máximo a interação e a dependência do programador para com a máquina;
Tornar o computador conveniente e eficaz para o uso;
Utilizar o hardware de uma maneira eficiente.
1.2 – Características Principais.
Dentre as características mais gerais desejáveis em um Sistema Operacional podemos destacar:
Concorrência: é a existência de várias atividades ocorrendo em paralelo (ou simultaneamente) no
sistema. Ex.: A existência de entrada e saída em paralelo ao processamento.
Compartilhamento: a concorrência implica no uso coordenado e compartilhado dos recursos (sejam
de Software, sejam de Hardware). As principais motivações para o compartilhamento são:
1
3. - custo dos equipamentos;
- reutilização de programas;
- cooperação no uso de dados; e
- redução de redundâncias.
Armazenamento de dados a longo prazo: permissão de armazenar dados e programas por longo
tempo no sistema de computação (discos, fitas, etc), sem que seja preciso proceder sua entrada de
veículos externos a cada seção de processamento.
Não determinismo: um Sistema Operacional deve ser determinístico no sentido de que ele execute
um certo programa em duas épocas diferentes e, para o mesmo conjunto de dados, os resultados
sejam os mesmos. Entretanto, deve ser indeterminado no sentido de atender a eventos que ocorram
no sistema, na ordem em que ocorrerem.
São características desejáveis num Sistema Operacional:
Eficiência: baixo tempo de resposta, pouca ociosidade da UCP, e alta taxa de processamento;
Confiabilidade: pouca incidência de falhas, ou seja, exatidão dos dados manipulados;
Manutenibilidade: facilidade de correção ou ajuste do sistema;
Pequena Dimensão: simplicidade e pequena dimensão ou baixa ocupação de memória.
1.3 – Classificação.
1.3.1 - Quanto ao Tipo de Serviços Oferecidos ao Usuário
Sistema de Processamento de Lotes (BATCH): nesses sistemas, um lote de várias tarefas a serem
executadas é organizado num dispositivo de entrada. Estas são lidas e processadas em ordem
seqüencial de leitura. Ao finalizar a última tarefa o sistema está novamente pronto para ler e
processar mais tarefas.
Sistema de Tempo Compartilhado (TIME_SHARING): trabalha em multiprogramação, isto é,
aceita várias tarefas residentes na memória ao mesmo tempo, para serem processados
concorrentemente, através de um mecanismo de divisão do tempo de UCP entre os processos.
Sistema de Tempo Real (REAL-TIME): são, em geral, sistemas dedicados a um tipo determinado
de aplicação. Seus módulos são construídos de forma a atender requisitos de tempo (ex.: controle de
uma caldeira, de um míssil, do metrô, bolsa de valores, etc.).
1.3.2 - Quanto ao Número de Usuários
Mono Usuário: apenas um usuário utiliza todo o sistema de cada vez.
Multi-Usuário: vários usuários podem estar utilizando o sistema de modo compartilhado num dado
instante.
1.3.3 - Quanto ao Tipo de Interação
Batch: por submissão de tarefas (jobs) em lotes, através de uma linguagem de controle de jobs
(JCL), sem interação Usuário X Computador.
Interativo: pela interação direta do usuário com o sistema, via terminal de entrada e saída (do tipo
teleimpressora ou teclado e display).
Transacional: pela chegada de uma transação (ou comando, ou mensagem) que "acorda" um
módulo, de tratamento ou execução apropriado.
1.3.4 - Quanto a Aplicação
Dedicado: tem uso restrito a determinada aplicação (ex.: controle de processos);
De Uso Geral: tem uso indeterminado para qualquer aplicação, isto é, executa todo tipo de
programas;
Híbrido: combina os demais tipos.
2
4. 1.4 – História dos Sistemas Operacionais.
Tal como nas arquiteturas de hardware, os sistemas operacionais também passam por um processo evolutivo
classificado em gerações. Seu surgimento data da segunda geração de computadores, na década de 50:
1.4.1 - (Década de 40):
Sistemas de computação sem Sistema Operacional. Os usuários tinham completo acesso ao hardware e as
instruções eram introduzidas manualmente uma a uma em linguagem de máquina (nas primeiras máquinas, a
introdução das instruções era por meio de chaveamento de circuitos através de cabos, como nas mesas
telefônicas mais antigas).
As primeiras máquinas que surgiram (1ª geração de hardware) foram:
- Z3 : construído por Zuze na Alemanha em 1941.
- MARK1 : construído por Aiken em Harvard em 1944.
- ENIAC : por Eckert, Mauchy e Presper, na Pensylvania em 1943/1946 - empregava 18000 válvulas e relés.
- EDVAC : por John Von Neumam em 1945, empregava memórias de linhas de atraso de 1K bits.
- IAS : por Whirlwind, no MIT em 1946/1950, empregava memória de tubos de raios catódicos. Marcou a
mudança para a segunda geração de hardware.
1.4.2 - 1ª GERAÇÃO (Década de 50):
Os sistemas operacionais dessa década eram projetados para permitir transição mais fácil entre os jobs a
serem executados. Antes de terem surgido, muito tempo era gasto entre o término de um job e o início de
outro. Era o início dos sistemas de processamento de lotes.
Quando em execução, um job detinha todo o controle da máquina. Após seu encerramento, o controle era
retornado ao Sistema Operacional que procedia a um "clear" total e procedia a leitura do próximo job.
As funções de um Sistema Operacional de primeira geração evoluíram da necessidade de liberar o
programador dos aspectos físicos da máquina. Dentre as funções incorporadas por esses sistemas podemos
citar:
- Montador (assembler): cuja função era traduzir linguagem assembly para linguagem de máquina em código
absoluto (código executável).
- Execução Automática de um job: através de carregamento do endereço absoluto da primeira instrução do
contador de instruções e um comando de início.
- Controle de execução de lotes: através de um programa Monitor capaz, de controlar a transição entre dois
jobs, através da leitura e interpretação de cartões de controle inseridos entre os jobs (cartões de JCL).
- Rotinas de Entrada e Saída: para facilitar o processo de E/S do job de usuário e permitir o conceito de
unidades lógicas.
- Rotinas para tratamento de condições de erro.
Considerado que os processos de E/S são muito lentos em relação a UCP, alternativas foram criadas visando
separar essas funções uma vez que as máquinas eram muito caras. Dessas alternativas surgiu o Monitor de
Lotes: Pequenos computadores satélites eram utilizados apenas com funções de preparação de lotes e seu
armazenamento em meios mais rápidos, para depois serem transportados e executados nos sistemas centrais.
Os produtores de sistemas da época ofereciam a seus clientes as seguintes inovações:
- Processamento em lotes de fluxo único.
- Rotinas de E/S padrão com referência lógica aos dispositivos.
- Capacidade de transição job-para-job, sem intervenção do operador.
- Técnicas de recuperação automática de erros com limpeza da memória antes do início do próximo job, após
um término anormal.
- JCL mais flexível.
As máquinas dessa geração (2ª geração de hardware) tinham circuitos transistorizados e as mais conhecidas
eram:
- IAS: já mencionado.
3
5. - ATLAS: pela universidade de Mancheste (Ingl.) introduziu memória de núcleo de ferrite, memória virtual e
registradores de dados de uso geral.
- IBM 701: pela IBM em 1956/1962, usava memória principal de tubos de raios catódicos e memória
secundária de tambor e fita magnética.
1.4.3 - 2ª GERAÇÃO (início da década de 60):
Caracterizou-se pelo desenvolvimento dos primeiros sistemas multiprogramados e hardware com
multiprocessamento. As máquinas dessa época (2ª geração) usavam circuitos integrados em pequena e média
escala e memória de estado sólido.
Apareceram as primeiras propostas independentes de dispositivos de E/S e os primeiros sistemas interativos
ou conversacionais através de terminais de teletipo.
Também surgiram as primeiras propostas de sistemas de tempo real para fins militares e industriais.
Sistemas da época:
- MCP (Master Control Program) - 1963: implementava multiprogramação, multiprocessamento, memória
virtual, Sistema Operacional em linguagem de alto nível e debugger em linguagem fonte. (Para o Burroughs
5000).
- DOS360 - 1964: suporte de usuário + emulação de sistemas anteriores. Versões:
DOS/360 para computadores pequenos
OS/MFT para computadores médios
OS/MVT para computadores grandes
CP-67/CMS para os grandes 360/67.
- CTSS (Compatible Time Sharing System): para o IBM 7094, desenvolvido no MIT.
1.4.4 - 3ª GERAÇÃO (meio de 1960 até meio de 1970):
Foi marcada pela introdução no mercado das máquinas IBM/360, em 1964. Essa geração caracterizou-se
pelo surgimento dos sistemas de propósito geral e dos sistemas multímodo. Alguns suportando ao mesmo
tempo o processamento em lotes, multiprocessamento com atendimento de terminais interativos e também,
aplicações de tempo real.
Esses sistemas eram grandes e caros e alguns já rodando com multiprocessamento. Uma das poucas exceções
foi o sistema Unix dos laboratórios Bell, derivado do sistema Multics.
Vários sistemas foram desenvolvidos nesse período, dentre eles podemos citar:
- MULTICS - para os computadores GE.645 (hoje Honeywell).
- IBM TSS (Time Sharing System) - para o 360/67.
- IBM CP-67/CMS - para o 360/67.
- RCA VMOS - para máquinas RCA.
- CDC KRONOS - para o CDC 6000.
Nessa geração o hardware já era construído com tecnologia VLSI.
1.4.5 - 4ª GERAÇÃO (meio de 1970 até 1990):
Caracterizou-se pelo desenvolvimento dos grandes sistemas para ambientes de multiprocessamento, redes de
computadores, supercomputadores, e dos computadores pessoais ou microcomputadores. Também pela
interligação de microcomputadores ligados a um MAIN-FRAME, comportando-se como um terminal
inteligente com capacidade de processamento local, tal como nos sistemas satélites da primeira geração.
Problemas ligados à proteção de informações forçaram o aprimoramento de técnicas de criptografia (técnica
de proteção da informação através do emprego de um código diferente do normalmente utilizado para sua
representação no computador e de difícil interpretação).
Com as redes de computadores surgiu o processamento remoto e distribuído e os sistemas de bancos de
dados distribuídos.
4
6. As grandes máquinas foram equipadas com capacidade de emulação, oferecendo aos usuários os sistemas de
máquina virtual.
Muitas das funções foram embutidas no hardware através da microprogramação (hardware atual é VLSI,
ULSI, Firmware: suporte lógico de microprogramação, ou programação de funções lógicas de hardware num
nível inferior ao da linguagem de máquina).
Dentre os sistemas dessa fase podemos citar:
- para os IBM 370: sistemas TSS, DOS, OS/VS/MVS, MTS, ETC.
- para os Burroughs B6700 e 7700: sistema MCP.
- para os Digital: PDP11/8, 35, 45, 70: sistemas RSTS, RT11, RSX11M e UNIX.
DECK 10: sistema TOPS 10.
VAX11/750, 760, 780 e microvax: sistemas VMS e UNIX.
1.4.6 - 5ª GERAÇÃO (1990 em diante):
Nesta década têm se consolidado os Sistemas Operacionais baseados em interfaces gráficas, para sistemas de
desktop, acrescidos de características antes só encontradas em Sistemas Operacionais de máquinas de grande
porte. Dentre estes pode-se citar o Windows NT, OS/2, e Unix.
Do meio para cá da década tem sido forte também a tendência de máquinas multiplataforma apoiadas por
linguagens que abstraiam o uso do Sistema Operacional nativo, como é o caso das máquinas JAVA.
As características de interfaceamento desses sistemas vêm evoluindo e apontam para novas tecnologias
como, por exemplo, o reconhecimento linguagem natural e a maior sofisticação de imagens gráficas.
A proposta do futuro próximo é a de sistemas baseados em máquinas de inferência e bancos de
conhecimentos, construídos sobre arquiteturas distribuídas e com ênfase nos aspectos de comunicação visual,
vozes e robótica.
As ferramentas que têm sido mais exploradas para esse projeto compreendem, Inteligência Artificial,
programação lógica, bancos de dados, métodos heurísticos, estatística, computação gráfica, etc.
1.5 – Conceitos de Hardware e Software.
1.5.1 - Hardware:
Um computador digital é constituído por um conjunto de componentes interligados, compostos por
processadores, memórias, terminais, impressoras, e outros dispositivos físicos, aos quais chamamos de
hardware. Tais dispositivos manipulam dados na forma digital, proporcionando mais confiabilidade.
Todos os dispositivos físicos de um computador são agrupados em três subsistemas básicos: unidade central
de processamento, memória principal e dispositivos de entrada/saída. Estes subsistemas também são
chamados de unidades funcionais.
1.5.1.1 - Unidade Central de Processamento (UCP):
Também chamado de processador, tem como função principal unificar todo o sistema, controlando as ações
de cada unidade funcional. A UCP também é responsável pela execução de todos os programas do sistema e
tais programas deverão estar armazenados na memória principal e são compostos por uma série de instruções
que são executadas seqüencialmente pela UCP, através de operações básicas de somar, subtrair, comparar e
movimentar dados.
A UCP é composta por dois componentes básicos: Unidade de Controle (UC) e Unidade Lógica e Aritmética
(ULA). A UC é responsável por controlar as atividades de todos os componentes do computador, através da
emissão de pulsos elétricos, também chamados de sinais de controle, gerados por um dispositivo chamado
Clock. A ULA é responsável pela execução de operações de lógica (AND, OR,etc.) e de aritmética (somas e
subtrações).
5
7. 1.5.1.2 - Clock:
É dispositivo, localizado na UCP, que gera pulsos elétricos síncronos em um determinado intervalo de
tempo. A quantidade de vezes que este pulso se repete em um segundo define a freqüência do clock. O sinal
do clock é utilizado pela UC para a execução das instruções.
A freqüência do clock de uma UCP é medida em Hertz (Hz), sendo o número de pulsos em um segundo de
tempo. E também é a unidade de desempenho da UCP, isto é quanto mais vezes os pulsos do clock se
repetem, mais instruções a UCP poderá executar no mesmo segundo de tempo.
1.5.1.3 - Registradores:
Em um sistema de computação, o destino final do conteúdo de qualquer tipo de memória é a UCP. Isto é, o
objetivo final de cada uma das memórias é armazenar informações destinadas a serem, em algum momento
utilizadas pela UCP. As ações operativas da UCP são realizadas na ULA, como já foi dito. Entretanto, antes
que as instruções sejam interpretadas e as unidades da UCP sejam acionadas, o processador necessita buscar
as instruções onde elas estiverem armazenadas (memória cache ou principal) e armazená-la em seu próprio
interior, em um dispositivo de memória denominado registrador.
Em seguida a este armazenamento da instrução, a UCP deverá, na maioria das vezes, buscar dados da
memória (cache, principal ou mesmo da memória secundária) para serem manipulados pela ULA. Esses
dados também necessitam ser armazenados em algum local do processador até serem efetivamente
utilizados. Os resultados de um processamento também precisam (às vezes) ser armazenados
temporariamente na UCP, ou para serem novamente manipulados pela ULA por uma outra instrução, ou para
serem transferidos para uma memória externa ao processador.
1.5.1.4 - 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. É composta por unidades de acesso chamada célula, sendo cada célula composta por um
determinado número de bits. Podemos concluir que a memória é formada por um conjunto de células, onde
cada uma possui um determinado número de bits.
O acesso ao conteúdo de uma célula é realizado através da especificação de um número chamado endereço.
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 da
memória (REM). 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 (RDM). Este é 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.
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 elétrica. As memórias chamadas voláteis se
caracterizam por poderem ser lidas ou gravadas, como o tipo RAM (random acess memory), que constitui
quase a totalidade da memória principal de um computador. O outro tipo de memória, conhecido como ROM
(read-only memory), já vem gravada de fábrica, geralmente com algum programa, e seu conteúdo é
preservado mesmo quando a alimentação é desligada. Uma variação da ROM é a EPROM (erasable
programnmable ROM), onde podemos gravar e regravar a memória através da exposição de luz ultravioleta.
1.5.1.5 - Memória cache:
Nos computadores mais antigos os registradores eram diretamente ligados a memória principal, na execução
de instruções a UCP acessava diretamente a memória principal pelo menos uma vez para buscá-las e
transferi-las para um registrador interno ao processador. Considerando-se que atualmente o ciclo de memória
é bem mais demorado que o período de tempo que a UCP gasta para realizar uma operação na ULA, fica
evidente que a duração da execução de um ciclo de instrução é bastante afetada pela demora dos ciclos de
memória.
6
8. Na tentativa de melhorar o desempenho dos computadores, os projetistas de UCPs vêm obtendo
constantemente velocidades cada vez maiores na operação dessas unidades, o que não acontece na mesma
proporção com a memória principal. Assim atualmente a diferença de velocidade entre a UCP e a memória
principal é muito grande.
Na busca pela minimização dessa diferença foi desenvolvida uma técnica que consiste na inclusão de um
dispositivo entre a UCP e a memória principal, denominado memória cache, cuja função é acelerar a
velocidade de transferência entre esses dois dispositivos, e com isso melhorar o desempenho dos
computadores.
Para isso, a memória cache é fabricada com tecnologia semelhante àquela empregada na UCP, e
conseqüentemente apresenta tempos de acesso compatíveis, resultando numa considerável redução da espera
da UCP para receber dados e instruções da cache.
1.5.1.6 - Memória Secundária:
Em geral é o tipo de memória que tem maior capacidade de armazenamento que os outros tipos
anteriormente descritos, menor custo por "byte" armazenado e tempo de acesso superior. Conhecida como
memória secundária ou memória auxiliar, ou ainda memória de massa, tem por objetivo garantir um
armazenamento mais permanente aos programas e estruturas de dados, razão pela qual deve possuir maior
capacidade de armazenamento que a memória principal.
A memória secundária de um computador pode ser constituída por diferentes tipos de dispositivos, alguns
diretamente ligados ao sistema por acesso imediato, e outros que podem ser conectados quando desejado.
A maior característica desse tipo de memória é a sua não volatilidade.
1.5.1.7 - Dispositivos de entrada e saída:
São utilizados para permitir a comunicação entre o computador e o mundo externo. Através desses
dispositivos, a UCP e a memória principal podem se comunicar, tanto com usuários quanto memórias
secundárias, a fim de realizar qualquer tipo de processamento.
Os dispositivos de entrada/saída 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 de três a quatro vezes mais informações que a memória principal. Seu custo é relativamente
baixo, porém o tempo de acesso à memória secundária é quatro a seis vezes maior que o acesso à memória
principal.
Alguns dispositivos servem para a comunicação homem-máquina, como teclados, monitores de vídeo,
impressoras, plotters, entre outros.
1.5.1.8 - Barramento:
A UCP, a memória principal e os dispositivos de entrada/saída 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.
Ele pode ser classificado como unidirecional (transmissão em um só sentido) ou bidirecional (transmissão
em ambos os sentidos).
Na ligação entre UCP 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
UCP. O barramento de endereços é utilizado pela UCP para especificar o endereço da célula de memória
que será acessada. Finalmente, o barramento de controle é por onde a UCP envia os pulsos de controle
relativo às operações de leitura e gravação.
1.5.1.9 - Pipelining:
O conceito de processamento pipeline se assemelha muito a uma linha de montagem, onde uma tarefa é
dividida em uma a seqüência de subtarefas, executadas em diferentes estágios, dentro da linha de produção.
7
9. 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 encontre na fase de execução, outra instrução possa estar na fase de busca
simultaneamente.
A técnica de pipelining 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 computação.
1.5.1.10 - Ativação/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 (boot block), geralmente o primeiro bloco. 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.
Além da carga do Sistema Operacional, a ativação também consiste na execução de arquivos de
inicialização. Nestes arquivos são especificados procedimentos de inicialização e configuraçã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.
1.5.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
software adequado às diversas tarefas e aplicações torna o trabalho do usuário muito mais simples e
eficiente.
1.5.2.1 - Tradutor:
Nos sistemas operacionais antigos, o ato de programar era bastante complicado, já que o programador
deveria possuir conhecimento de hardware e programar em painéis através de fios. Esses programas eram
desenvolvidos em linguagem de máquina e carregados diretamente na memória principal para execução.
Com o surgimento das primeiras linguagens de montagem (assembly languages) e das linguagens de alto
nível, o programador deixou de se preocupar com muitos aspectos pertinentes ao hardware, como em qual
região da memória principal o programa deveria ser carregado ou quais endereços de memória principal
seriam reservados para as variáveis. A utilização dessas linguagens facilitou a construção de programas em
muitos aspectos. Desse modo, um programa poderia ser escrito de uma forma bem documentada e com
facilidades para realizar alterações.
Apesar das inúmeras vantagens proporcionadas pelas linguagens de montagens e alto nível, os programas
escritos nessas linguagens (programa-fonte) não estão prontos para ser diretamente executados pela UCP.
Para isso, eles têm de passar por uma etapa de conversão, onde toda representação simbólica dos programas
é traduzida para código de máquina. Esta conversão é realizada por um software chamado tradutor.
O módulo gerado pelo tradutor é denominado módulo-objeto, que, apesar de estar em código de máquina, na
maioria das vezes não pode ser ainda executado. Isso ocorre em função de um programa poder chamar sub-
rotinas externas, e, neste caso, o tradutor não tem como associar o programa principal às sub-rotinas
chamadas. Esta função é realizada por um utilitário denominado linker e será visto adiante.
8
10. O tradutor pelo tipo de linguagem de programação utilizada, pode ser chamado de montador ou compilador,
veja Fig. 1.1.
A linguagem de montagem é um conjunto de símbolos (mnemônicos) associados às instruções de linguagem
de máquina do processador. Apesar das facilidades, como instruções simbólicas e possibilidade de
documentação, a programação em linguagem, de montagem está diretamente ligada às características da
arquitetura do processador. Em função disto, este tipo de linguagem é diferente para cada computador, pois a
linguagem de máquina e, conseqüentemente, a de montagem são características específicas do processador.
O compilador é o utilitário responsável por gerar, a partir de um programa escrito em uma
linguagem de alto nível, um programa em linguagem de máquina não executável (módulo-objeto).
As linguagens de alto nível não têm nenhuma relação direta com a máquina, ficando essa preocupação
exclusivamente com o compilador.os programadores de alto nível devem se preocupar apenas com o
desenvolvimento de suas aplicações, não tendo que se envolver com detalhes sobre a arquitetura do
processador. Assim, os programas-fonte podem ser transportados entre computadores de diversos
fabricantes, desde que existam regras de definição para a linguagem. Isso permite o desenvolvimento de
aplicações independentes do equipamento.
Programa-Fonte Tradutor Programa-Objeto
Linguagem de Montador Módulo-objeto
Montagem
Linguagem de Compilador Módulo-objeto
Alto Nível
Fig. 1.1 – Tradutor.
Um compilador é um utilitário que opera de modo integrado aos componentes do sistema de programação
disponível, sob a supervisão do Sistema Operacional. Podemos visualizar, então, o compilador como uma
interface entre o Sistema Operacional e o usuário, de maneira que é possível acessar diversos serviços do
sistema sem a necessidade da utilização de linguagem de controle ou de outros utilitários.
1.5.2.2 - Interpretador:
É considerado um tradutor que não gera código-objeto. A partir de um programa-fonte, escrito em linguagem
de alto nível, o interpretado, no momento da execução do programa, traduz cada instrução e a executa em
seguida.
A maior desvantagem da utilização de interpretadores é o tempo gasto na tradução das instruções de um
programa toda vez que este for executado, já que não existe a geração de um código executável. A vantagem
é permitir a implementação de tipos de dados dinâmicos, ou seja, que podem mudar de tipo durante a
execução do programa, aumentando, assim, sua flexibilidade.
1.5.2.3 - Linker (Ligador):
É o utilitário responsável por gerar, a partir de um ou mais módulos-objeto, um único programa executável,
veja Fig. 1.2. Suas funções básicas são resolver todas as referências simbólicas existente entre os módulos e
reservar memória para a execução do programa.
Módulo-objeto
9
Programa
Módulo-objeto Linker executável
11. Fig. 1.2 – Linker.
Para resolver todas as referências a símbolos, o linker também pode pesquisar em bibliotecas do sistema ou
do próprio usuário. Bibliotecas são arquivos que contém diversos módulos-objeto e/ou definições de
símbolos.
Outra função importante do linker é determinar uma região de memória na qual o programa será carregado
para ser executado. Esta operação é denominada relocação.
Em sistemas operacionais antigos, a relocação era realizada somente uma vez, na etapa de linkedição. Todos
os endereços simbólicos do programa eram traduzidos para endereços físicos, e o programa executável
gerado podia ser carregado a partir de uma posição prefixada na memória (código absoluto). Nesse tipo de
relocação, o programa poderia ser carregado, apenas, a partir de uma única posição na memória.
Em sistemas multiprogramáveis esse tipo de relocação é inviável, já que a memória é compartilhada entre
diversos programas, e é pouco provável que, no momento em que o sistema carrega um programa, sua área
de memória prefixada esteja disponível. A solução para este problema é permitir que o programa seja
carregado em regiões diferentes toda vez que for trazido para memória (código relocável). Esse tipo de
relocação não é realizado pelo linker, mas sim por outro utilitário denominado loader, responsável por
carregar os programas na memória.
1.5.2.4 - Loader (Carregador):
É o utilitário responsável por colocar fisicamente na memória um programa para execução. O procedimento
de carga varia com o código gerado pelo linker e, em função deste, o loader é classificado como sendo do
tipo absoluto ou relocável.
Se o código executável for do tipo absoluto, o loader só necessita conhecer o endereço de memória inicial e o
tamanho do módulo para realizar o carregamento. Então, o loader transfere o programa da memória
secundária para a memória principal e inicia sua execução (loader absoluto).
No caso do código relocável, o programa pode ser carregado em qualquer posição de memória, e o loader é
responsável pela relocação no momento do carregamento (loader relocável).
1.5.2.5 - Depurador (debugger):
É o utilitário que permite ao usuário controlar toda a execução de um programa a fim de detectar erros na sua
estrutura. Este utilitário oferece ao usuário recursos como:
- acompanhar a execução de um programa instrução por instrução;
- possibilitar a alteração e visualização do conteúdo de variáveis;
- implementar pontos de parada dentro do programa (breakpoint), de forma que, durante a execução, o
programa pare nesses pontos;
- especificar que, toda vez que o conteúdo de uma variável for modificado, o programa envie uma mensagem
(watchpoint).
10
12. 1.5.2.6 - Linguagem de Controle:
Também chamada de linguagem de comando, é a forma mais direta de um usuário se comunicar com o
Sistema Operacional. Esta linguagem é oferecida por cada Sistema Operacional para que, através de
comandos simples, o usuário possa ter acesso a rotinas específicas do sistema.
Esses comandos quando digitados pelos usuários, são interpretados por um utilitário chamado interpretador
de comandos ou Shell. O interpretador reconhece a linha de comando, verifica sua sintaxe, envia mensagens
de erro e faz chamada a rotinas do sistema.
1.5.2.7 - Linguagem de Máquina:
É a linguagem, de programação que o processador realmente consegue entender. Cada processador possui
um conjunto único de instruções de máquina, definido pelo próprio fabricante. As instruções especificam
detalhes, como registradores, modos de endereçamento e tipos de dados, que caracterizam um processador e
suas potencialidades.
Um programa em linguagem de máquina é totalmente codificado em formato binário, o que torna o
entendimento confuso para o usuário. Essa linguagem é muito mais voltada para a máquina do que para o
usuário, o que gera inconveniências, como programas longos e com maiores chances de erro.
O programa em linguagem de máquina pode ser diretamente processado pela UCP, não requerendo qualquer
tipo de tradução ou relocação. Quando escrito em linguagem de máquina de um computador, um programa
não pode ser executado em outra máquina de modelo diferente. Isso porque o conjunto de instruções de uma
máquina é característica específica de cada processador.
11