Sistemas Operacionais I
Sistemas Operacionais I
Sistemas Operacionais I
SISTEMAS
OPERACIONAIS I
Tubarão - 2000
1. Conceitos Básicos
1.1 Introdução
Antes de começarmos a estudar os conceitos e os principais componentes de um sistema
operacional, devemos saber primeiramente quais são suas funções básicas.
Por mais complexo que possa parecer, um sistema operacional e apenas um conjunto de rotinas
executado pelo processador, da mesma forma que qualquer outro programa.. Sua principal função e
controlar o funcionamento do computador, como um gerente dos diversos recursos disponíveis no
sistema.
O nome sistema operacional não e único para designar esse conjunto de programas. Nomes
como monitor, executivo, supervisor ou controlador possuem, normalmente, o mesmo significado.
Um sistema operacional possui inúmeras funções e resumimos essas funções, basicamente, em
duas, descritas a seguir:
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 permitir 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 possa utilizar as mesmas facilidades concorrentemente, como discos, impressoras,
linhas de comunicação etc.
Não é apenas em sistemas multiusuário que o sistema operacional é imporntate. 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 concorrentes de todas essas tarefas.
Hardware
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
desse 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, podendo conter
mais ou menos camadas. A linguagem utilizada em cada um desses níveis é diferente, variando da mais
elementar (baixo nível) à mais sofisticada (alto nível).
Aplicativos
Utilitários
Sistema Operacional
Linguagem de Máquina
Microprogramação Hadware
Dispositivos Físicos
1.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 custos baixos, e à necessidade de aproveitamento e
controle desses recursos.
Neste histórico dividimos essa evolução em fases, once destacamos, em cada uma, sues
principals características de hardware, software, interação com o sistema e aspectos de conectividade.
Fase Primeira (1945- Segunda (1956- Terceira (1966- Quarta (1981- Quinta (1991-
1955) 1965) 1980) 1990) )
Computad ENIAC NCR IBM 360, 370 Cray XMP IBM 3090
EDVAC IMB 7094 PDP-11 IBM 308 Alpha AXP
ores UNIVAK CDC-6600 Cray 1 VAX-11 Pentium
Cyber-205 IBM-PC Sun SPARC
Telecomu Telefone Transmissão Digital Comunicação via Redes Locais (LAN) Redes Locais
Teletipo satélite Internet estendidas(ELAN)
nicações Microondas Redes sem fio
Redes Modelo cliente-
distribuídas(WAN) servidor
Fibra óptica
2.1 Hardware
Um computador digital é constituído por um conjunto de componentes interligados, composto
por processadores, memória principal e dispositivos físicos (hardware). Esses dispositivos manipulam
dados na forma digital, o que proporciona uma maneira confiável de representação.
Todos os componentes de um computador são agrupados em três subsistemas básicos: unidade
central de processamento (UCP), memória principal, e dispositivos de entrada e saída (Figura 5. 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. Neste item descrevemos os conceitos básicos dos principais
componentes desses sistema.
Registradores
Dispositivos de
Entrada e Saída
A UCP é composta por dois componentes básicos: unidade de controle e 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 da 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 UCP é determinada pelo número de
instruções que o processador executa por unidade de tempo, normalmente segundo. Alguns fabricantes
Prof. Alessandro Zanini 8
utilizam unidade 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 mostra alguns processadores e suas respectivas velocidades de
processamento.
2.1.2 Clock
O clock e um dispositivo, localizado na UCP, que gera pulsos elétricos síncronos 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 e utilizado pela unidade de controle pare a
execução, das instruções.
A freqüência do clock de um processador e medida em Hertz (Hz), que significa o número de
pulsos elétricos gerados em um segundo de tempo. A freqüência também pode ser utilizada como
unidade de desempenho entre diferentes processadores, pods quanto major a freqüência, mais instruções
podem ser executadas pela UCP em um mesmo intervalo de tempo.
2.1.3 Registradores
Os registradores são dispositivos de alta velocidade, localizados fisicamente na UCP, pare
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) e o registrador responsável pelo
armazenamento do endereço da próxima instrução que a UCP deverá executar. Toda vez que a UCP
execute uma instrução, o PC e atualizado com um novo endereço;
• o apontador da pilha (AP) ou stack pointer (SP) e o registrador que contémemóriam o endereço de
memória do topo da pilha, que e 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;
• o registrador de estado, também chamado em alguns equipamentos de program status word (PSW),
e 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 e alterado
conforme o resultado gerado pela instrução.
Endereços
M-1
Célula = n bits
Registradores
Memória Secundária
2.1.8 Barramento
A UCP, a memória principal e os dispositivos de E/S são interligados através de linhas de
comunicação denominadas barramentos, barras ou vias. Um barramento (bus) e 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 pare 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 e utilizado pela UCP pare especificar o endereço,
o da célula de memória que será acessada. Finalmente , o barramento de controle e por onde a UCP envia
os pulsos de controle relativos as operações de leitura e gravação.
Na Fig. 2.5, podemos observar dois tipos de configuracões, onde UCP, memória principal e
dispositivos de E/S são interligados de maneira diferente.
2.1.9 Pipelining
O conceito de processamento pipeline se assemelha muito a uma linha de montagem, onde uma
tarefa e dividida em uma seqüência de subtarefas, executadas em diferentes estágios, dentro da linha de
produção.
Dispositivos Memória
UCP de E/S Principal
UCP
Memória
Principal
Dispositivos
de E/S
Disco Memória
Principal
Boot
Sistema
Operacional
2.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 do usuários muito mais simples e eficiente.
Prof. Alessandro Zanini 13
2.2.1 Tradutor
Nos sistemas operacionais antigos, o ato de programar era bastante complicado, já que o
programador deveria possuir conhecimento do 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 o programa deveria ser carregado ou quais endereços de
memória 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.
O tradutor, pelo tipo de linguagem de programação utilizada, pode ser chamado de montador ou
compilador (Figura 11).
Linguagem de
Montagem Montador Módulo-Objeto
Linguagem de
Alto Nível Módulo-Objeto
Compilador
Figura 11 - Tradutor
2.2.2 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.
As linguagens de alto nível, como pascal, fortran, cobol não tem nenhuma relação direta com a
máquina, ficando essa preocupação exclusivamente com o compilador.
2.2.3 Interpretador
O 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 interpretador, no momento da execução do programa, traduz
cada instrução e a executa em seguida.
2.2.4 Linker
O linker (ligador), também chamado de linkagem, é o utilitário responsável por gerar, a partir de
um ou mais módulos-objetos, um único programa executável.
Módulo Módulo
Fonte Compilador Objeto
Figura 12 - Linker.
2.2.5 Loader
Também chamado 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.
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, ele transfere o programa da memória secundária para a
memória principal e inicia sua execução.
No caso de 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.
2.2.6 Depurador
O desenvolvimento de programas está sujeito a erros de lógica, independentemente de
metodologias utilizadas pelo programador. A depuração é um dos estágios desse desenvolvimento, e a
utilização de ferramentas adequadas é essencial para acelerar o processo de correção de programas.
O depurador (debbuger) é o utilitário que permite ao usuário controlar 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 (break-point), 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).
2.2.10 Microprogramação
Um programa em linguagem de máquina é executado diretamente pelo hardware em
processadores de arquitetura RISC, porém em máquinas CISC isto não acontece. Neste caso, como
podemos observar na Figura 3, entre os níveis de linguagem de máquina e do hardware, existem ainda o
da microprogramação.
Os microprogramas definem a linguagem de máquina de cada computador. Apesar de cada
computador possui níveis de microprogramação diferentes, existem muitas semelhanças nessa camada se
compararmos os diversos equipamentos. Uma máquina possui, aproximadamente 25 microintruções
básicas, que são interpretadas pelos circuitos eletrônicos.
2.2.11 Processos
Um conceito chave da teoria dos sistemas operacionais é o conceito de processo. Um processo é
basicamente um programa em execução, sendo constituído do código executável, dos dados referentes ao
código.
2.2.13 Arquivos
Arquivos são mecanismos de abstração que fornece uma forma de armazenar recuperar
informações em disco. Isto deve ser feito de uma forma que mantenha o usuário isolado dos detalhes a
respeito de como as informações são armazenadas, e de como os discos efetivamente trabalha.
3.1 Introdução
Tipos de sistemas operacionais e sua evolução estão intimamente relacionados com a evolução
do hardware e das aplicações por ele suportadas.
Muitos termos inicialmente introduzidos para definir conceitos e técnicas forma substituídos por
outros, na tentativa de refletir uma nova maneira de interaçã ou ou processamento. Isto fica muito claro
quanto tratamos da unidade de execução do processador. Inicialmente, os termos programa ou job eram
os mais utilizados, depois surgiu o conceito de processo e subprocesso e, mais recentemente, os conceitos
de tarefa e de thread.
A evolução dos sistemas operacionais para computadores pessoais e estações de trabalho
popularizou vários conceitos e técnicas, antes só conhecidos em ambientes de grande porte. A
nomenclatura, no entanto, não se manteve a mesma. Surgiram novos termos para conceitos já conhecidos,
que foram apenas adaptados para uma nova realidade.
Tipos de Sistemas
Operacionais
Programa/
UCP Tarefa
Memória
Dispositivos
de E/S
Os sistemas multiprogramáveis/multitarefa podem ser classificados pela forma com que suas
aplicações são gerenciadas, podendo ser divididos em sistemas batch, de tempo compartilhado ou de
tempo real. Um sistema operacional pode suportar um ou mais desses tipos de processamento.
Memória
UCP UCP
Dispositivos Dispositivos
de E/S de E/S
UCP UCP
Se o processador falhar, todo o sistema ficará incapaz de continuar o processamento. Neste caso,
o sistema deve ser reconfigurado, fazendo um dos processadores escravos assumir o papel do mestre.
Mesmo sendo uma organização simples de implementar e quase um extensão dos sistemas
multiprogramáveis, esse tipo de sistema não utiliza eficientemente o hardware, devido à assimetria dos
processadores, que não realizam as mesmas funções.
Dispositivos Usuários
de E/S S.O
3.5.3 Multiprocessamento
Desde sua criação, os computadores têm sido vistos como máquinas seqüências, onde a UCP
executa a instruções de um programa, uma de cada vez. Na realidade, essa visão não é totalmente
verdadeira, pois, em nível de hardware, múltiplos sinais estão ativos simultaneamente, o que pode ser
entendido como uma forma de paralelismo.
Com a implementação de sistemas com múltiplos processadores, o conceito de simultaneidade
ou paralelismo pode ser expandido a um nível mais amplo, denominado multiprocessamento, onde uma
tarefa pode ser dividida e executada, ao mesmo tempo, por mais de um processador.
Nó
Nó
Nó
Rede
Nó Nó
Rede
Usuário
COMP 1 COMP 2
Figura 24 - Cluster.
Suponha, por exemplo, uma configuração de dois computadores (COMP 1 e COMP 2),
formando um cluster. Qualquer usuário conectado ao cluster poderá ter acesso aos dispositivos
compartilhados, que permitem a ele imprimir uma listagem ou copiar um arquivo. Nesse tipo de
configuração, se um dos sistemas falhar, o acesso aos dispositivos não será interrompido.
Prof. Alessandro Zanini 24
Os sistemas distribuídos podem ser considerados como uma evolução dos sistemas fortemente
acoplados, onde uma aplicação pode ser executada por qualquer processador. Os sistemas distribuídos
permitem que uma aplicação seja dividida em diferentes partes (aplicações distribuídas), que se
comunicam através de linhas de comunicação, podendo cada parte ser processada em um sistema
independente.
3.6.3.1 Barramento
Na organização de barramento, os sistemas são conectados a uma única linha de comunicação e
todos compartilham o mesmo meio, tanto para receber como para enviar mensagens. Esse tipo de
organização é utilizada geralmente em redes locais (Figura 25).
Neste tipo de topologia, caso haja algum problema com o meio de transmissão, todos os nós da
rede ficarão incomunicáveis.
tempo tempo
Sistema Nomoprogramável (a) Sistema Multiprogramável (b)
Monoprogramação Multiprogramação
Utilização da UCP 17 % 33%
Utilização da memória 30 % 67%
Utilização do disco 33 % 67%
Utilização da impressora 33 % 67 %
Tempo total para execução dos programas 30 min. 15 min.
Taxa de execução de programas 6 prog./hora 12 prog./hora
Tabela 7 - Comparação entre monoprogramação x multiprogramação
Programa
Salva os
. registradores
.
Identifica a origem
. da interrupção
. Rotina de
. Obtém o endereço da Tratamento
Interrupção . rotina de tratamento
. :
. :
. :
.
Restaura
. os registradores
Memória
UCP Controlador
Principal
:
:
:
:
Figura 29 - Controlador.
Memória
UCP Principal
Cana de
E/S
Controlador Controlador
..... .....
4.3 Buffering
A técnica de buffering consiste na utilização de uma área de memória para a transferência de
dados entre os periféricos e a memória principal denominada buffer. O buffering veio permitir que,
quando um dado fosse transferido para o buffer após uma operação de leitura, o dispositivo de entrada
pudesse iniciar uma nova leitura. Neste caso, enquanto a UCP manipula o dado localizado no buffer, o
dispositivo de entrada pudesse iniciar uma nova leitura. Neste caso, enquanto a UCP manipula o dado
localizado no buffer, o dispositivo realiza outra operação de leitura no mesmo instante. O mesmo
raciocínio pode ser aplicado para operações de gravação, onde a UCP coloca o dado no buffer para um
dispositivo de saída manipular.
Memória Principal
Controlador
UCP Gravação Buffer Gravação
de E/S
Leitura Leitura
4.4 Spooling
A técnica de spooling (simultaneous peripheral operation on-line) foi introduzida no final dos
anos 50 para aumentar a produtividade e a eficiência dos sistemas operacionais.
Naquela época, os programas dos usuários eram submetidos um a um para processamento pelo
operador. Como a velocidade de operação dos dispositivos de entrada/saída é muito lenta se comparada à
do processador, era comum que a UCP ficasse ociosa à espera de programas e dados de entrada ou pelo
término de uma impressão.
A solução foi armazenar os vários programas e seus dados, também chamados de jobs, em uma
fita magnética e, em seguida, submetê-los a processamento. Desta forma, a UCP poderia processar
seqüencialmente cada job, diminuindo o tempo de execução dos jobs e o tempo de transição entre eles.
Da mesma forma, em vez de um job gravar suas saídas diretamente na impressora, poderia direcioná-las
para uma outra fita, que depois seria impressa integralmente. Esta forma de processamento é chamada de
spooling e foi a base dos sistemas batch.
A utilização de fitas magnéticas obrigava o processamento a ser estritamente seqüência, ou seja,
o primeiro job a ser gravado era o primeiro a ser processado. Assim, se um job que levasse várias horas
antecedesse pequenos jobs, seus tempos de resposta ficariam seriamente comprometidos. Com o
surgimento de dispositivos de acesso direto, como discos, foi possível tornar o spooling muito mais
eficiente, e principalmente, permitir a eliminação do processamento estritamente seqüencial, com a
atribuição de prioridade aos jobs.
A técnica de buffering, como já apresentamos, permite que um job utilize um buffer
concorrentemente com um dispositivo de E/S. O spooling, basicamente, utiliza o disco como um grande
buffer, permitindo que dados sejam lidos e gravados em disco, enquanto outros jobs são processados.
Um exemplo dessa técnica está presente quanto impressora são utilizadas. No momento em que
um comando de impressão é executado por um programa, as informações que serão impressas são
gravadas em um arquivo em disco (arquivo de spool), para ser impresso posteriormente pelo sistema
Figura 32. Dessa forma, situações como a de um programa reservar a impressora, imprimir uma linha e
ficar horas para continuar a impressão não acontecerão. Essa implementação permite maior grau de
conpartilhamento na utilização de impressoras.
Sistema
Programa Operacional
Arquivo de Spool
Impressão
System
Aplicação Núcleo Hardware
Call
* Gerência de processos
Criação e eliminação de processos
Alteração das características do processo
Sincronização e comunicação entre processos
* Gerência de memória
Alocação e desalocação de memória
*Gerência de entrada/saída
Operações de entrada/saída
Prof. Alessandro Zanini 34
Manipulação de arquivos e diretórios
5 Operador
4 Programas de Usuário
3 Entrada/Saída
2 Comunicação
1 Gerência de memória
0 Multiprogramação
Executivo
Kernel
Servidor Servidor
de arquivo de processo
Modo usuário
Modo kernel
Núcleo
Hardware
A utilização deste modelo permite que os servidores executem em modo usuário, ou seja, não
tenham acesso direto a certos componentes do sistema. Apenas o núcleo do sistema, responsável pela
comunicação entre clientes e servidores, executa no modo kernel. Como conseqüência, se um erro ocorrer
em um servidor, este servidor pode parar, mas o sistema não ficará inteiramente comprometido. Além
disso, a implementação de sistemas cliente-servidor permite isolar as funções do sistema operacional por
diversos processos (servidores) pequenos e dedicados a serviços específicos. Como conseqüência, os
sistema operacional passa a ser de mais fácil manutenção.
Como os servidores se comunicam através de trocas de mensagens, não importa se os clientes e
servidores estão sendo processados em um sistema com um único processador, com múltiplos
processadores (fortemente acoplado) ou ainda em um ambiente de sistema distribuído (fracamente
acoplado). A implementação de sistemas cliente-servidor em um ambiente distribuído permite que um
cliente solicite um serviço e a resposta seja processada remotamente.
Apesar de todas as vantagens deste modelo, sua implementação, na prática, é muito difícil
devido a certas funções do sistema operacional exigirem acesso direto ao hardware, como operações de
entrada e saída. Na realidade, o que é implementado mais usualmente é uma combinação do modelo de
camadas com o modelo cliente-servidor. O núcleo do sistema, além de ser responsável pela comunicação
entre cliente e servidor, passa a incorporar outras funções críticas do sistema, como escalonamento e
gerência de memória, além das funções dos device drivers.