Você está na página 1de 35

SISTEMAS OPERACIONAIS – NOTAS DE AULA

INTRODUÇÃO

ÍNDICE:

1. Introdução ........................................................................................................ 2

2. O que é um Sistema Operacional .................................................................. 4

3. Histórico dos Sistemas Operacionais ........................................................... 6

4. Tipos de Sistemas Operacionais ................................................................. 13

5. Softwares Utilitários ...................................................................................... 20

6. Estrutura dos Sistemas Operacionais ........................................................ 24

7. Arquitetura de Sistemas Operacionais ....................................................... 28

8. Projeto ............................................................................................................ 31

8. Bibliografia ..................................................................................................... 32

9. Lista de Exercícios ........................................................................................ 33

1 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

1. INTRODUÇÃO

Um computador sem seu software nada mais é do que um pedaço inútil de metal. No
entanto, quando equipado com o software adequado, ele é capaz de armazenar e
recuperar informação, encontrar erros de sintaxe em textos, executar uma imensa
variedade de jogos eletrônicos e de engajar seu usuário em muitas atividades produtivas.
O software de um computador pode ser dividido, grosso modo, em duas categorias: os
programas de sistemas, que gerenciam a operação do próprio computador, e os programas
de aplicação, que resolvem problemas para o usuário. O mais importante dos programas
de sistema é o sistema operacional, que controla todos os recursos do computador, e
fornece a base sobre a qual os programas aplicativos são escritos.
Um sistema de computador moderno é composto por um ou mais processadores,
uma certa quantidade de memória principal, terminais, discos magnéticos, interfaces de
rede e um conjunto de dispositivos de entrada e saída. Escrever programas que tomem
conta de todos esses componentes, fazendo-os trabalhar corretamente e de maneira
otimizada é uma tarefa bastante difícil de realizar. Se todo programador tivesse que se
preocupar como o disco magnético trabalha e com as dezenas de coisas que podem dar
errado quando da realização de uma leitura, é muito provável que muitos programas hoje
em operação simplesmente não tivessem sido escritos ou não estivessem funcionando a
contento.
Há muitos anos, ficou claro que dever-se-ia encontrar uma maneira de afastar o
usuário da complexidade do hardware. A forma encontrada, que evoluiu gradativamente,
foi a de colocar uma camada de software em cima do hardware, para gerenciar todos os
componentes do sistema, apresentando-o ao usuário com uma interface muito simples de
entender e de programar. Tal interface é conhecida como máquina virtual. A camada de
software construída sobre o hardware nada mais é do que o sistema operacional.
Esta situação é mostrada na figura 1. Na parte de baixo está o hardware, o qual
em muitos casos é composto de duas ou mais camadas. A mais baixa delas contém os
dispositivos físicos, representados por chips de circuitos integrados, fios, fontes de
alimentação, e assim por diante. A seguir, vem uma camada composta por um tipo de
software bastante primitivo, que controla diretamente os dispositivos anteriormente citados,
fornecendo uma interface bastante simples para a próxima camada. Tal software,
denominado microcódigo, composto de microprogramas, usualmente está gravado numa
memória do tipo read-only. Ele na verdade é um interpretador, que busca as instruções de
máquina na memória principal (add, move, jump, etc.), gerando o conjunto de sinais de
controle necessários à execução de tais instruções pelo hardware. Para executar uma
instrução de ADD, por exemplo, o microprograma específico precisa determinar onde estão
2 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

armazenados os valores a serem adicionados, buscá-los na memória, adicioná-los e


armazenar o resultado em um registrador ou na própria memória. O conjunto de instruções
que o microcódigo interpreta é denominado linguagem de máquina do processador. A
linguagem de máquina é composta por um conjunto de 50 a 300 instruções, a maioria das
quais movimenta dados dentro da máquina, realiza operações aritméticas e compara
valores. Nesta camada, os dispositivos de entrada/saída são controlados pela carga de
valores em registradores especiais, denominados registradores de dispositivos. Por
exemplo, podemos comandar um disco, carregando em seus registradores os valores do
endereço inicial no disco e na memória principal e um bloco de informações a ser
movimentado entre estes meios de armazenamento, o valor de um contador de bytes a
serem transferidos, e a direção da transferência das informações. A questão da
temporização das operações de entrada/saída também é muito importante na programação
de tais dispositivos.
A principal função do sistema operacional é a de esconder toda esta
complexidade, oferecendo ao programador um conjunto de instruções mais convenientes
para o desenvolvimento de seu trabalho. Por exemplo, READ BLOCK FROM FILE é
conceitualmente mais simples do que se preocupar com o movimento das cabeças do
disco.
Acima do sistema operacional, estão os demais softwares do sistema, usualmente
conhecidos como interpretadores de comando (shell), compiladores, editores, etc. É
importante observar que tais programas não fazem parte do sistema operacional, apesar
de serem normalmente fornecidos pelo fabricante do computador. Este ponto é crucial em
nossa análise. O sistema operacional é a porção de software que roda no modo kernel ou
modo supervisor, com o objetivo de proteger o hardware da ação direta do usuário final
da máquina, ação esta que pode vir a ser desastrosa.
Os demais componentes do software do sistema, tal como os compiladores e
editores, rodam no modo usuário. Caso um determinado usuário não simpatize com um
compilador, ele pode escrever o seu próprio, no entanto, ele não pode escrever o programa
de tratamento de interrupções de disco, que faz parte integrante do sistema operacional,
geralmente protegido contra tentativas do usuário de modificá-lo.
Finalmente, acima dos programas do sistema, encontram-se os programas de
aplicação. Tais programas são escritos pelos usuários para resolver problemas específicos,
que envolvem o processamento de informações, cálculos científicos, jogos, etc.

3 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Sistema bancário Sistema de reserva de Jogos


passagens aéreas
Compiladores Editores de texto Interpretador de
comandos
Sistema operacional
Linguagem de máquina
Microcódigo
Dispositivos físicos
Figura 1: Níveis de máquina

2. O QUE É UM SISTEMA OPERACIONAL

Na década de 1960 a definição de um sistema operacional como o software que


controla o hardware estava de acordo com aquela realidade, contudo, desde então, o
panorama dos sistemas de computador evoluiu significativamente, exigindo uma descrição
mais rica.
Hoje, o hardware executa uma grande variedade de aplicações de software. Para
aumentar a utilização do hardware, as aplicações são projetadas para ser executadas
concorrentemente. Se elas não forem cuidadosamente programadas poderão interferir
umas nas outras. Isso resultou na existência de uma camada de software, denominada
sistema operacional, que separa as aplicações do hardware que elas acessam e fornece
serviços que permitem que cada aplicação seja executada com segurança e efetivamente.
Sistema operacional é um software que habilita as aplicações a interagir com o
hardware de um computador. O software que contém os componentes centrais do sistema
operacional é denominado núcleo.
O sistema operacional realiza duas funções que não possuem nenhuma relação uma
com a outra, e dependendo de quem está tentando passar a idéia, poderá dar um colorido
maior a uma ou a outra função. Vamos dar uma olhada em ambas as funções do sistema
operacional.

2.1 O Sistema Operacional visto como uma Máquina Estendida


A arquitetura (conjunto de instruções, organização da memória, estrutura de
entrada/saída e estrutura do barramento) da maioria dos computadores é bastante
primitiva e difícil de programar, em especial a entrada/saída. Para tornar este ponto
mais claro, vamos examinar rapidamente como é feita a entrada/saída em uma
unidade de disco flexível, usando o chip controlador NEC PD765, que é utilizado no
IBM PC. O PD765 tem 16 comandos, cada um deles especificado pela carga de entre
um e nove bytes no registrador do dispositivo. Tais comandos são para leitura/escrita

4 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

de dados, movimento da cabeça, formatação de trilhas e inicialização, sensoreamento,


reinicialização e calibração do controlador e do driver do disquete.
Os comandos mais básicos são o READ e o WRITE, cada um dos quais
requerendo 13 parâmetros, acondicionados em 9 bytes. Tais parâmetros especificam o
endereço do bloco a ser lido do disco, o número de setores por trilha, o modo de
gravação no meio físico, o espaçamento entre setores, entre outras coisas. Quando a
operação se completa, o chip controlador retorna ao processador, 23 campos de
estado, acondicionados em 7 bytes. Como se isto não bastasse, o programador da
unidade de disco flexível tem de se preocupar com o fato do motor do disco estar
ligado ou desligado. Se o motor estiver desligado, ele precisa ser ligado antes que o
dado possa ser lido ou gravado. O motor não pode permanecer ligado por muito tempo
sob pena de danificar o disquete. Desta forma, o programador é forçado a optar entre
desligar/ligar constantemente o motor, com um consumo excessivo de tempo, e a
possibilidade de danificar o disquete, com a conseqüente perda das informações nele
armazenadas. Fica claro que o programador não quer ou não pode envolver-se com
detalhes da programação das unidades de disco flexível. O programador deseja lidar
com uma abstração de alto nível e bastante simples. No caso dos discos, uma
abstração típica poderia fazer com que o disco fosse visto como uma coleção de
arquivos identificados por nome. Cada arquivo deve ser aberto para leitura ou escrita,
em seguida deve ser lido ou escrito e finalmente deve ser fechado. Detalhes a respeito
do tipo de modulação a ser usado no processo de gravação ou a respeito do estado
corrente do motor não devem aparecer na abstração apresentada ao usuário.
O programa que esconde o verdadeiro hardware do usuário e apresenta-lhes um
esquema simples de arquivos identificados que podem ser lidos ou escritos é o
sistema operacional. Da mesma forma que o sistema operacional isola o usuário dos
detalhes da operação do disco, ele também trata de uma série de outras questões tais
como interrupções, os temporizadores, a gerência da memória e outras. Em cada
caso, a abstração apresentada ao usuário do sistema operacional é mais simples e
mais fácil de utilizar que o próprio hardware.
Neste aspecto, a função do sistema operacional é a de apresentar ao usuário uma
máquina estendida ou máquina virtual equivalente ao hardware, porém muito mais
simples de programar.

2.2 O Sistema Operacional visto como um Gerente de Recursos


O conceito do sistema operacional como fornecedor de uma interface conveniente a
seus usuários é uma visão top-down. Uma visão alternativa, bottom-up, mostra o
sistema operacional como um gerente de recursos de hardware disponíveis na
máquina. Os computadores modernos são compostos de processadores, memórias,

5 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

temporizadores, discos, terminais, dispositivos de fita magnética, interfaces de rede,


impressoras e outros dispositivos. Nesta visão, a função do sistema operacional é a de
fornecer um esquema de alocação dos processadores, das memórias e dos
dispositivos de entrada/saída entre os vários processos que competem pela utilização
de tais recursos.
Imagine o que poderia acontecer se três processos, rodando em um dado
computador, resolvessem imprimir suas saídas simultaneamente na mesma
impressora. As três primeiras linhas da listagem poderiam ser do processo 1, as
seguintes do processo 2 e assim por diante, até que os três terminassem a impressão.
Fica claro que tal situação não é admissível em nenhum sistema que se preze. O
sistema operacional tem por função colocar ordem neste caos potencial, armazenando
em disco todas as saídas destinadas à impressora, durante a execução dos
processos.
No caso do computador possuir múltiplos usuários, a necessidade de gerência e
proteção da memória, dos dispositivos de entrada/saída e dos demais recursos do
sistema fica ainda mais aparente.
Pelo exposto acima, esta outra visão da função de um sistema operacional mostra
que sua tarefa principal é a de gerenciar os usuários de cada um dos recursos da
máquina, contabilizando o tempo de uso de cada um e garantindo o acesso ordenado
de usuários a recursos através da mediação dos conflitos entre as requisições dos
diversos processos usuários do sistema.

3. HISTÓRICO DOS SISTEMAS OPERACIONAIS

3.1 A Primeira Geração (1945-1955): Válvulas e Painéis


Após infrutíferos esforços desenvolvidos por Babbage, quase não houve progresso
nessa área até o início da Segunda Guerra Mundial. Em torno de 1940, Howard Aiken
em Harvard, John Von Neumann no Instituto de Estudos Avançados de Princeton, J.
Presper Eckert e William Mauchley na Universidade da Pennsylvania e Konrad Zuse
na Alemanha, tiveram sucesso na construção de computadores primitivos, baseados
em válvulas. Tais máquinas eram enormes, ocupavam salas imensas e empregavam
dezenas de milhares de válvulas em sua construção.
Nesta época, um único grupo de pessoas era responsável pelo projeto, construção,
programação, operação e manutenção de cada máquina. Toda a programação era
feita em código absoluto, muitas vezes através da fiação de painéis para controlar as
funções básicas da máquina. O conceito de linguagem de programação ainda não
existia e os sistemas operacionais também não. O acesso ao computador por parte do
6 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

usuário era feito através da reserva antecipada de tempo de máquina. Ao chegar sua
vez de usar o computador, o usuário fazia sua própria programação nos painéis da
máquina e passava a torcer para que nenhuma das 20.000 válvulas do computador
viesse a queimar enquanto ele estivesse trabalhando. Nessa época, os programas
processados pelos computadores eram constituídos essencialmente por cálculos
numéricos repetitivos.
No início dos anos 50, houve uma sensível melhora no uso de tais máquinas com o
advento do cartão perfurado que tornou possível a codificação de programas em
cartões e sua leitura pela máquina, dispensando a programação através de painéis. Os
demais procedimentos não tiveram qualquer modificação.

3.2 A Segunda Geração (1955-1965): Transistores e Sistemas Batch


O desenvolvimento do transistor em meados de 1950 veio a alterar
substancialmente o quadro acima. Com o emprego desta nova tecnologia, os
computadores tornaram-se confiáveis a ponto de serem comercializados. Nesta época,
passou a haver uma distinção entre as pessoas envolvidas no projeto, na construção,
na operação e na manutenção dos computadores. Eles eram instalados em salas
isoladas e operados por pessoal especializado. Somente as grandes empresas e
órgãos governamentais ou universidades podiam pagar os muitos milhões de dólares
necessários à aquisição destas máquinas. Para executar um job, o programador
primeiro escrevia seu programa em uma folha de papel (em FORTRAN ou em
linguagem de montagem), para depois perfurá-los em cartão. Depois disso, ele
entregava a massa de cartões a um dos operadores da máquina para que a mesma
fosse processada.
Ao final do processamento do programa corrente, um dos operadores ia até a
impressora e retirava o relatório emitido. Então o operador escolhia uma outra massa
de cartões e providenciava os recursos necessários ao processamento do novo job.
Grande parte do tempo da máquina era gasto pelos operadores providenciando
recursos necessários ao processamento de determinada tarefa.
Em vista do alto custo de tais equipamentos, encontrou-se uma solução para
reduzir o tempo de máquina desperdiçado. A solução encontrada, denominada de
sistema batch (lote), consistia em coletar um conjunto de jobs e fazer a leitura dos
mesmos para uma fita magnética empregando um computador pequeno e
relativamente barato, tal como o IBM 1401, que era muito bom na leitura de cartões, na
cópia destes cartões em fita e na impressão de resultados. Outras máquinas mais
sofisticadas e mais caras, tal como o IBM 7094, eram empregadas no processamento.
Após cerca de uma hora de coleta de jobs, a fita gravada era rebobinada e levada a
sala do computador, onde era montada em sua unidade de fita. O operador então

7 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

carregava um programa especial que lia e processava o primeiro job da fita. A saída
era gravada numa segunda fita, em vez de ser diretamente impressa. Após o término
de cada um dos jobs, o sistema operacional lia e processava automaticamente o
próximo. Quando todo o lote tivesse sido processado, o operador removia as fitas de
entrada e de saída, levando a fita de saída para ser impressa off line, com auxílio do
1401.
Os computadores da segunda geração eram utilizados na realização de cálculos
científicos e de engenharia. Eles eram normalmente programados em linguagem
FORTRAN. Os sistemas operacionais típicos da época eram o FMS (Fortran Monitor
System) e o IBSYS, ambos desenvolvidos pela IBM para rodar no 7094.

Figura 2: Sistemas batch

3.3 A Terceira Geração (1965-1980): CIs e Multiprogramação


No início dos anos 60, a maioria dos fabricantes de computador tinha duas linhas de
produtos distintas e totalmente incompatíveis. De um lado estavam as imensas e
poderosas máquinas orientadas a palavra, adequadas ao processamento científico
pesado, como o IBM 7094. Do outro lado, estavam as máquinas comerciais,
orientadas a caractere, como o IBM 1401, utilizado pelos bancos e companhias
seguradoras para pesquisar arquivos em fita e para impressão de extensos relatórios.
O desenvolvimento e a manutenção de duas linhas de produtos completamente
independentes representava uma carga bastante pesada para os fabricantes. Além do
mais, muitos de seus clientes precisavam inicialmente de uma máquina pequena, mas

8 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

com o passar do tempo vinham a necessitar de uma máquina maior, capaz de


armazenar uma quantidade maior de informações e de processar com mais rapidez.
A IBM conseguiu solucionar ambos os problemas com a introdução do Sistema 360.
Tal sistema era composto de uma série de máquinas, todas elas compatíveis em nível
de software, abrangendo a faixa que começava no 1401 e chegava até a do 7094.
Estes computadores só diferiam no preço e na performance. Uma vez que todas estas
máquinas tinham a mesma arquitetura e o mesmo conjunto de instruções básicas, os
programas escritos para qualquer uma delas rodavam em qualquer outra. Além do
mais, a série 360 foi projetada com características para suportar tanto o
processamento científico quanto o comercial.
A série 360 foi a primeira família de máquinas a usar circuitos integrados em sua
fabricação, conseguindo uma relação preço/performance muito melhor do que as
máquinas da segunda geração. A idéia de família de máquinas compatíveis foi logo
adotada por outros fabricantes.
Esta idéia criou um sério problema. A intenção era de que qualquer software,
incluindo o sistema operacional, rodasse em todos os membros da família. Ele deveria
ser adequado tanto para sistemas com poucos periféricos quanto para sistemas com
um grande número de periféricos. Deveria funcionar tanto em ambientes para
processamento comercial quanto para processamento científico. Além disso, o sistema
operacional deveria ser eficiente em todas as aplicações onde fosse utilizado.
O resultado da tentativa foi um sistema operacional enorme e extremamente
complexo, duas a três vezes maior que o FMS. Este sistema era composto de milhões
de linhas de código em linguagem de montagem, programado por milhares de pessoas
e continha um sem-número de bugs que originaram uma série incontável de novos
releases na tentativa de corrigi-los. Este sistema operacional foi chamado de OS360.
Apesar do seu tamanho e dos problemas que surgiram em seu desenvolvimento, o
OS360 e os sistemas operacionais similares de terceira geração produzidos por outros
fabricantes atenderam relativamente bem à grande maioria de seus usuários. Tais
sistemas vieram a popularizar várias técnicas, dentre elas a multiprogramação.
Nas operações comerciais, o tempo de espera por entrada/saída pode chegar a 80
ou 90 por cento do tempo total de processamento, de maneira que algo precisava ser
feito para evitar desperdício do tempo do processador. A solução inicial foi dividir a
memória em diversas partes, com um job alocado a cada uma delas. Enquanto um job
esperava a conclusão de sua operação de entrada/saída, um outro job poderia estar
utilizando o processador. O fato de se manter na memória vários jobs ao mesmo
tempo tornou necessária a utilização de um hardware especial para proteger cada job
contra acessos indevidos. O 360 e os demais sistemas de terceira geração estavam

9 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

equipados com este hardware. Com o passar dos anos, a IBM desenvolve sua
arquitetura 360 passando para a série 370 e para a 390.
Outra característica importante dos sistemas operacionais de terceira geração era
sua capacidade de ler jobs de cartão direto para o disco. Desta forma, assim que um
job ativo terminasse, o sistema operacional carregava um novo job na partição livre da
memória, proveniente do disco. Esta técnica foi denominada de SPOOL (Simultaneous
Peripheral Operation On Line) e era também empregada para as operações de saída.
Com o SPOOL, o 1401 deixou de ser necessário.
Apesar dos sistemas operacionais de terceira geração serem adequados para
processamento científico e comercial, eles ainda eram sistemas batch. Com estes
sistemas, o tempo entre a submissão do job e a disponibilização de sua saída passou
a ser medido em horas, de maneira que o simples esquecimento de uma vírgula
poderia fazer com que o programador viesse a perder a metade do dia.
A necessidade de obter bons tempos de resposta levou ao desenvolvimento dos
sistemas com compartilhamento de tempo (timesharing), uma variação dos sistemas
multiprogramados, onde cada usuário tinha um terminal on-line à sua disposição. Em
tais sistemas, se existissem 20 usuários ativos, com 17 deles parados, o processador
seria alocado ciclicamente a cada um dos três jobs que lhe estão requisitando serviço.
O primeiro sistema de compartilhamento de tempo, o CTSS (Compatible Time-Sharing
System), foi desenvolvido no MIT para um 7094 especialmente modificado.
Após o desenvolvimento do CTSS, o MIT, o Bell Labs e a GE decidiram
desenvolver um projeto de um computador que suportasse centenas de usuários
simultaneamente, em regime de compartilhamento de tempo. Este projeto foi
denominado de MULTICS (Multiplexed Information and Computing Service). Devido à
rápida evolução tecnológica dos parâmetros que foram tomados como base no projeto
e com o desenvolvimento de técnicas de integração de circuitos, o projeto fracassou.
Apesar disso, o MULTICS teve uma grande influência nos sistemas operacionais
construídos depois dele. Outros sistemas operacionais de tempo compartilhado
desenvolvidos foram os TSS (Time Sharing System) e o CP/CMS (Control
Program/Conversational Monitor System), ambos da IBM.
Um outro fato ocorrido durante a terceira geração de sistemas foi o fenomenal
crescimento dos minicomputadores, iniciado com o EC PDP-1, lançado em 1961. O
PDP tinha somente 4K palavras de 18 bits, mas custava 5% do valor do 7094. Para
algumas aplicações não numéricas, sua performance era muitas vezes tão boa quanto
a do 7094.
Um dos cientistas da Bell Labs que trabalhou no projeto MULTICS, Ken Thompson,
encontrou um pequeno PDP-7 e escreveu para ele uma versão monousuário do
MULTICS. Este trabalho foi o início do projeto que resultou no desenvolvimento do

10 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

sistema operacional UNIX que hoje domina o mercado para minicomputadores e


estações de trabalho.

3.4 A Quarta Geração: Computadores Pessoais


Com o desenvolvimento da integração de circuitos em grande escala (LSI),
apareceram chips com milhares de transistores encapsulados em um centímetro
quadrado de silício, nascendo daí a idéia de computador pessoal. Em termos de
arquitetura, os computadores pessoais não eram diferentes dos minicomputadores. A
grande diferença estava no preço. Da mesma forma que os minicomputadores
tornaram possível que um departamento de uma empresa ou de uma universidade
adquirisse seu próprio computador, o chip microprocessador tornou isto possível para
pessoas físicas.
A grande disponibilidade de poder computacional levou ao crescimento de uma
indústria voltada para a produção de software para estas máquinas. A maioria desses
softwares é user-friendly, significando que eles são voltados para pessoas que não
têm nenhum conhecimento de computadores. Foi uma grande mudança no
desenvolvimento dos sistemas operacionais.
Atualmente dois sistemas operacionais vêm dominando o mercado de
computadores pessoais e de estações de trabalho: o Windows da Microsoft e o Unix.
O Windows foi derivado do MS-DOS que dominou as máquinas baseadas nos
processadores da Intel, mais precisamente o 8088 e seus sucessores, 80286, 80386 e
80486. Apesar da primeira versão do MS-DOS ter sido um tanto primitiva, as versões
que se seguiram incorporaram uma série de características avançadas, inclusive
algumas disponíveis no Unix.
O Unix é o líder no mercado de sistemas para máquinas que não foram
desenvolvidas com processadores Intel, especialmente aquelas projetadas com os
poderosos processadores RISC. Tais máquinas têm hoje o poder computacional de
um minicomputador, apesar de serem máquinas dedicadas a um único usuário, sendo
lógico que elas estejam equipadas com um sistema operacional desenvolvido
inicialmente para rodar em minicomputadores.
Um desenvolvimento interessante que começou a tomar corpo em meados dos
anos 80 foi o dos sistemas operacionais para redes e dos sistemas operacionais
distribuídos.
Em uma rede de computadores, os usuários estão conscientes da existência de um
conjunto de máquinas conectadas à rede, podendo, portanto ligar-se a máquinas
remotas e solicitar serviços das mesmas. Cada uma destas máquinas roda seu próprio
sistema operacional e tem seu próprio usuário.

11 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Em contraste, um sistema distribuído faz com que um conjunto de máquinas


interligadas apareça para seus usuários como se fosse uma única máquina com um só
processador. Em tais sistemas, os usuários não tomam conhecimento de onde seus
programas estão sendo processados ou mesmo onde seus arquivos estão
armazenados, pois tudo é manipulado automaticamente e eficientemente pelo sistema
operacional.
Os sistemas operacionais de rede não diferem fundamentalmente daqueles usados
em máquinas monoprocessadoras. Obviamente, eles precisam de uma interface
controladora de rede e de um software específico para gerenciar tal interface, além de
programas que permitam a ligação de usuários a máquinas remotas e seu acesso a
arquivos remotos. Tais características não chegam a alterar a estrutura do sistema
operacional usado para máquinas com um único processador.
Já os sistemas operacionais distribuídos precisam de mais do que a simples adição
de poucas linhas de código a um sistema usado em máquinas monoprocessadoras,
pois os sistemas distribuídos diferem dos centralizados em pontos bastante críticos.
Por exemplo, os sistemas distribuídos permitem que programas rodem em vários
processadores ao mesmo tempo, necessitando, portanto de algoritmos de
escalonamento de processador bem mais elaborados, de forma a otimizar o grau de
paralelismo disponível no sistema.
Ainda no caso dos sistemas distribuídos, os retardos de comunicação na rede
podem vir a fazer com que algoritmos do sistema operacional venham a rodar com
informações incompletas, desatualizadas ou até incorretas. Tal situação difere
substancialmente dos sistemas com um único processador nos quais o sistema
operacional tem o domínio completo e total do estado de todos os componentes do
sistema.

3.5 A Década de 1990


No decorrer da década de 90, a demanda avassaladora por recursos de Internet
resultou na proliferação das configurações em rede. Hoje, acesso a web e correio
eletrônico são recursos comuns a quase todos os sistemas operacionais. A Microsoft
Corporation tornou-se dominante na década de 90. O sistema operacional Windows
tornou-se popular após o lançamento em 1993 o Windows 3.1, cujos sucessores
Windows 95 e Windows 98 praticamente dominaram o mercado de sistemas
operacionais para computadores de mesa no final da década de 90. Esses sistemas
operacionais, que tomavam emprestado muitos conceitos popularizados pelos
primeiros sistemas operacionais Macintosh, habilitavam os usuários a executar
múltiplas aplicações concorrentes com facilidade. A Microsoft também entrou no
mercado de sistemas operacionais corporativos com o lançamento do Windows NT em

12 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

1993, que rapidamente tornou-se o sistema operacional preferido para estações de


trabalho corporativas.

4. TIPOS DE SISTEMAS OPERACIONAIS

Os tipos de sistemas operacionais e sua evolução estão relacionados diretamente


com a evolução do hardware e das aplicações por ele suportadas. Os sistemas
operacionais podem ser classificados conforme a figura abaixo:

Tipos de Sistemas
Operacionais

Sistemas Sistemas Sistemas


Monoprogramáveis/ Multiprogramáveis/ com Múltiplos
Monotarefa Multitarefa Processadores

Figura 3: Tipos de Sistemas Operacionais

4.1 Sistemas Monoprogramáveis / Monotarefa


Os primeiros sistemas operacionais eram tipicamente voltados para a execução de
um único programa. Qualquer outra aplicação, para ser executada, deveria aguardar o
término do programa corrente. Os sistemas monoprogramáveis se caracterizam por
permitir que o processador, a memória e os periféricos permaneçam exclusivamente
dedicados à execução de um único programa.
Os sistemas monoprogramáveis estão tipicamente relacionados ao surgimento dos
primeiros computadores na década de 1960.
Neste tipo de sistema, enquanto um programa aguarda por um evento, como a
digitação de um dado, o processador permanece ocioso, sem realizar qualquer tipo de
processamento. A memória é subutilizada caso o programa não a preencha totalmente
e os periféricos estão dedicados a um único usuário, nem sempre utilizados de forma
integral.

13 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Figura 4: Sistemas Monoprogramáveis

Comparados a outros sistemas, os sistemas monoprogramáveis são de simples


implementação, não existindo muita preocupação com problemas decorrentes do
compartilhamento de recursos.

4.2 Sistemas Multiprogramáveis / Multitarefa


Os sistemas multiprogramáveis são uma evolução dos sistemas
monoprogramáveis. Neste tipo de sistema, os recursos computacionais são
compartilhados entre os diversos usuários e aplicações.
Neste tipo de sistema, enquanto um programa espera por uma operação de leitura
ou gravação em disco, outros programas podem estar sendo processados neste
mesmo intervalo de tempo. Neste caso, podemos observar o compartilhamento de
processador e de memória. O sistema operacional se preocupa em gerenciar o acesso
concorrente aos seus diversos recursos, como memória, processador e periféricos, de
forma ordenada e protegida, entre os diversos programas.

14 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Figura 5: Sistemas Multiprogramáveis

As vantagens do uso de sistemas multiprogramáveis são a redução do tempo de


resposta das aplicações processadas no ambiente e de custos, a partir do
compartilhamento dos diversos recursos do sistema entre as diferentes aplicações. Os
sistemas multiprogramáveis, apesar de mais eficientes que os monoprogramáveis, são
de implementação muito mais complexa.
A partir do número de usuários que interagem com o sistema, podemos classificar
os sistemas multiprogramáveis como monousuário ou multiusuário. Sistemas
monousuário são encontrados em computadores pessoais e estações de trabalho,
onde há apenas um único usuário interagindo com o sistema. Neste caso existe a
possibilidade da execução de diversas tarefas ao mesmo tempo como a edição de um
texto, uma impressão e o acesso à Internet. Sistemas multiusuário são ambientes
interativos que possibilitam diversos usuários conectarem-se ao sistema
simultaneamente.
Os sistemas multiprogramáveis 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.

15 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Sistemas
Multiprogramáveis/
Multitarefa

Sistemas Sistemas Sistemas


Batch de tempo de tempo real
compartilhado

Figura 6: Tipos de Sistemas Multiprogramáveis

A. Sistemas Batch
Os sistemas batch foram os primeiros tipos de sistemas operacionais
multiprogramáveis a serem implementados na década de 1960. Os programas,
também chamados de jobs, eram submetidos para execução através de cartões
perfurados e armazenados em disco ou fita, onde aguardavam para serem
processados. Posteriormente, em função da disponibilidade de espaço na memória
principal, os jobs eram executados, produzindo uma saída em disco ou fita.
O processamento batch tem a característica de não exigir a interação do usuário
com a aplicação. Todas as entradas e saídas de dados são implementadas por
algum tipo de memória secundária, geralmente arquivos em disco.
Esses sistemas, quando bem projetados, podem ser bastante eficientes, devido à
melhor utilização do processador.

B. Sistemas de Tempo Compartilhado


Os sistemas de tempo compartilhado (time-sharing), permitem que diversos
programas sejam executados a partir da divisão do tempo do processador em
pequenos intervalos, denominados fatia de tempo (time-slice). Caso a fatia de
tempo não seja suficiente para a conclusão do programa, esse é interrompido pelo
sistema operacional e substituído por um outro, enquanto fica aguardando por uma
nova fatia de tempo. O sistema cria um ambiente de trabalho próprio, dando a
impressão de que todo o sistema está dedicado, exclusivamente, para cada
usuário.
Geralmente, sistemas de tempo compartilhado permitem a interação dos usuários
com o sistema através de terminais que incluem vídeo, teclado e mouse. Devido a
esse tipo de interação, os sistemas de tempo compartilhado também ficaram
conhecidos como sistemas on-line.

16 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

C. Sistemas de Tempo Real


Os sistemas de tempo real (real-time) são implementados de forma semelhante à
dos sistemas de tempo compartilhado. O que caracteriza a diferença entre os dois
tipos de sistemas é o tempo de resposta exigido no processamento das aplicações.
Enquanto nos sistemas de tempo compartilhado o tempo de resposta pode variar
sem comprometer as aplicações em execução, nos sistemas de tempo real os
tempos de resposta devem estar dentro de limites rígidos, que devem ser
obedecidos, quando bem projetados, podem ser bastante eficientes, devido à
melhor caso contrário poderão ocorrer problemas irreparáveis.
Nestes sistemas não existe a idéia de fatia de tempo. Um programa utiliza o
processador o tempo que for necessário ou até que apareça outro mais prioritário.
Esses sistemas normalmente estão presentes em aplicações de controle de
processos, como no monitoramento de refinarias de petróleo ou controle de tráfego
aéreo.

4.3 Sistemas com Múltiplos Processadores


Os sistemas com múltiplos processadores caracterizam-se por possuir duas ou
mais CPUs interligadas e trabalhando em conjunto. A vantagem desse tipo de sistema
é permitir que vários programas sejam executados ao mesmo tempo ou que um
mesmo programa seja subdividido em partes para serem executadas simultaneamente
em mais de um processador.
Com múltiplos processadores foi possível a criação de sistemas computacionais
voltados principalmente para o processamento científico aplicado, por exemplo, no
desenvolvimento aeroespacial, metereologia, simulações, etc.
Os conceitos aplicados ao projeto de sistemas com múltiplos processadores
incorporam os mesmos princípios básicos e benefícios apresentados na
multiprogramação, além de outras características e vantagens específicas como
escalabilidade, disponibilidade e balanceamento de carga.
Um fator chave no desenvolvimento de sistemas operacionais com múltiplos
processadores é a forma de comunicação entre as CPUs e o grau de
compartilhamento da memória e dos dispositivos de E/S. Em função desses fatores,
podemos classificar os sistemas com múltiplos processadores em fortemente
acoplados e fracamente acoplados.

17 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Sistemas
com Múltiplos
Processadores

Sistemas Sistemas
Fortemente Fracamente
Acoplados Acoplados

Figura 7: Tipos de Sistemas com Múltiplos Processadores

A grande diferença entre os dois tipos de sistemas é que em sistemas fortemente


acoplados existe apenas uma memória principal sendo compartilhada por todos os
processadores, enquanto nos fracamente acoplados cada sistema tem sua própria
memória individual. Além disso, a taxa de transferência entre processadores e
memória em sistemas fortemente acoplados é muito maior que nos fracamente
acoplados.

A. Sistemas Fortemente Acoplados


Nos sistemas fortemente acoplados (tightly coupled) existem vários processadores
compartilhando uma única memória física (shared memory) e dispositivos de
entrada/saída, sendo gerenciados por apenas um sistema operacional. Em função
destas características, os sistemas fortemente acoplados também são conhecidos
como multiprocessadores.

Memória
CPU Principal CPU

Dispositivos Dispositivos
de E/S de E/S

Figura 8: Sistemas Fortemente Acoplados

18 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Os sistemas fortemente acoplados podem ser divididos em SMP (Symetric


Multiprocessors) e NUMA (Non-Uniform Memory Access). Os sistemas SMP
caracterizam-se pelo tempo uniforme de acesso à memória principal pelos diversos
processadores. Os sistemas NUMA apresentam diversos conjuntos reunindo
processadores e memória principal, sendo que cada conjunto é conectado aos
outros através de uma rede de interconexão. O tempo de acesso à memória pelos
processadores varia em função da sua localização física.

B. Sistemas Fracamente Acoplados


Os sistemas fracamente acoplados (loosely-coupled) caracterizam-se por possuir
dois ou mais sistemas computacionais conectados através de linhas de
comunicação. Cada sistema funciona de forma independente, possuindo seu
próprio sistema operacional e gerenciando seus próprios recursos. Em função
destas características, os sistemas fracamente acoplados também são conhecidos
como multicomputadores.

link de comunicação

CPU CPU

Memória Dispositivos Memória Dispositivos


Principal de E/S Principal de E/S

Figura 9: Sistemas Fortemente Acoplados

Com base no grau de integração dos hosts da rede, podemos dividir os sistemas
fracamente acoplados em sistemas operacionais de rede e sistemas distribuídos. A
grande diferença entre os dois é a capacidade do sistema operacional em criar uma
imagem única dos serviços disponibilizados pela rede.
Os sistemas operacionais de rede (SORs) permitem que um host compartilhe seus
recursos com os demais hosts da rede. Além disso, os usuários têm o
conhecimento dos hosts e seus serviços.
Já, nos sistemas distribuídos, o sistema operacional esconde os detalhes dos hosts
individuais e passa a tratá-los como um conjunto único, como se fosse um sistema
fortemente acoplado. Os sistemas distribuídos permitem que uma aplicação seja

19 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

dividida em partes e que cada parte seja executada por hosts diferentes da rede de
computadores. Para o usuário e suas aplicações é como se não existisse a rede de
computadores, mas sim um único sistema centralizado.
Outro exemplo de sistemas distribuídos são os clusters. Em um cluster existem dois
ou mais servidores ligados por algum tipo de conexão de alto desempenho. O
usuário não conhece os nomes dos membros do cluster e não sabe quantos são.
Quando ele precisa de algum serviço, basta solicitar ao cluster para obtê-lo.
Atualmente sistemas em cluster são utilizados para serviços de banco de dados e
Web, garantindo alta disponibilidade, escalabilidade e balanceamento de carga à
solução.

5. SOFTWARES UTILITÁRIOS

Para que o hardware tenha utilidade prática, deve existir 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 torna o trabalho dos
usuários muito mais simples e eficiente.
Utilitários são softwares relacionados mais diretamente com serviços
complementares do sistema operacional. Os softwares desenvolvidos pelos usuários são
denominados aplicativos.

5.1 Tradutor
Nos primeiros sistemas computacionais, os 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 ou assembly e das
linguagens de alto nível, o programador deixou de se preocupar com muitos aspectos
pertinentes ao hardware. A utilização dessas linguagens facilitou a construção de
programas, a documentação e a manutenção.
Apesar das inúmeras vantagens proporcionadas pelas linguagens de montagem e
de alto nível, os programas escritos nessas linguagens não estão prontos para ser
diretamente executados pelo processador. Para isso, eles têm de passar por uma
etapa de conversão, onde toda a representação simbólica das instruções é traduzida
para código de máquina. Esta conversão é realizada por um utilitário denominado
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

20 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

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.
Dependendo do tipo de programa-fonte, existem dois tipos distintos de tradutores
que geram módulo-objeto: montador e compilador.

Figura 10: Tradutor

O montador (assembler) é o utilitário responsável por traduzir um programa-fonte


em linguagem de montagem em um programa-objeto não executável. A linguagem de
montagem é particular para cada processador, assim como a linguagem de máquina, o
que não permite que programas assembly possam ser portados entre máquinas
diferentes.
O compilador é o utilitário responsável por gerar, a partir de um programa escrito
em linguagem de alto nível, um programa em linguagem de máquina não executável.
Os programas-fonte podem ser portados entre computadores de diversos fabricantes,
desde que existam padrões para a sintaxe da linguagem. Isso permite o
desenvolvimento de aplicações independentes do equipamento.

5.2 Interpretador
O interpretador é considerado um tradutor que não gera módulo-objeto. A partir de
um programa-fonte escrito em linguagem de alto nível, o interpretador, durante a
execução do programa, traduz cada instrução e a executa imediatamente. Algumas
linguagens tipicamente interpretadas são o Basic e o Perl.
A maior desvantagem na 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.

21 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

5.3 Linker (Ligador)


O linker ou editor de ligação é o utilitário responsável por gerar, a partir de um ou
mais módulos-objeto, um único programa executável. Suas funções básicas são
resolver todas as referências simbólicas existentes entre os módulos e reservar
memória para a execução do programa.

Figura 11: Linker

Para resolver todas as referências a símbolos, o linker também pode pesquisar em


bibliotecas do sistema. Bibliotecas são arquivos que contêm diversos módulos-objeto
e/ou definições de símbolos.
Outra função do linker é a relocação, que determina a região de memória na qual o
programa será carregado para execução.

5.4 Loader
O loader ou carregador é o utilitário responsável por carregar na memória principal
um programa para ser executado. O procedimento de carga varia com o código gerado
pelo linker; em função deste, o loader é classificado como 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.
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.

5.5 Depurador
O desenvolvimento de programas está sujeito a erros de lógica, independentemente
da metodologia utilizada pelo programador. A depuração é um dos estágios desse

22 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

desenvolvimento e a utilização de ferramentas adequadas é essencial para acelerar o


processo de correção de programas.
O depurador é o utilitário que permite ao usuário acompanhar toda a execução de
um programa a fim de detectar erros na sua lógica. Este utilitário oferece recursos
como:
- acompanhar a execução de um programa instrução por instrução;
- possibilitar a alteração e visualização do conteúdo das 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).

5.6 Interpretador de Comandos


O interpretador de comandos ou shell permite que o usuário se comunique com o
sistema operacional. Quando digitados pelo usuário, os comandos são interpretados
pelo shell, que, ao reconhecer a linha de comando, verifica sua sintaxe, envia
mensagem de aviso ou erro e faz chamadas a rotinas do sistema. Em geral, o
interpretador de comandos não faz parte do sistema operacional.
O conjunto de comandos disponíveis pelo interpretador é conhecido como
linguagem de controle ou linguagem de comandos. As linguagens de controle evoluem
no sentido de permitir a interação mais amigável com os usuários, utilizando interfaces
gráficas como janelas e ícones.

5.7 Ativação / Desativação do Sistema


Inicialmente, todo o código do sistema operacional reside na memória secundária.
Toda vez que o computador é ligado, o sistema operacional tem que ser carregado da
memória secundária para a memória principal. Esse procedimento, denominado
ativação do sistema (boot), é realizado por um programa localizado em um bloco
específico do disco (boot block).

Figura 12: Ativação do sistema

23 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

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 customizaçã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 operacional
sejam desativados de forma ordenada, garantindo sua integridade.

6. ESTRUTURA DOS SISTEMAS OPERACIONAIS

O sistema operacional é formado por um conjunto de rotinas que oferecem serviços


aos usuários, às suas aplicações e ao próprio sistema. Esse conjunto de rotinas é
chamado de núcleo do sistema operacional.
É importante não confundir o núcleo do sistema operacional com aplicações,
utilitários ou o interpretador de comandos, que acompanham o sistema operacional. As
aplicações são utilizadas pelos usuários e escondem todos os detalhes da interação com o
sistema. Os utilitários, como compiladores e editores de texto, e interpretadores de
comandos permitem aos usuários, desenvolvedores e administradores, uma interface
amigável com o sistema.

Aplicações

Utilitários

Núcleo do
Sistema Operacional

Hardware

Figura 13: Sistema computacional

Existe uma grande dificuldade em compreender a estrutura e o


funcionamento de um sistema operacional, pois ele não é executado como uma aplicação
tipicamente seqüencial. Os procedimentos do sistema são executados concorrentemente
sem uma ordem predefinida, com base em eventos dissociados do tempo (eventos

24 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

assíncronos). Muitos desses eventos estão relacionados ao hardware e a tarefas internas


do próprio sistema operacional.
Todas as operações envolvendo processos são controladas por uma parte do
sistema operacional chamada núcleo ou kernel. O núcleo representa somente uma
pequena parte do código do S.O., mas está entre os códigos mais intensamente usados.
Por esta razão, o núcleo permanece na memória principal, enquanto outras partes do S.O.
são encontradas na memória secundária.
As principais funções do núcleo encontradas nos sistemas operacionais
são as seguintes:
- tratamento das interrupções e exceções;
- criação e eliminação de processos e threads;
- sincronização e comunicação entre processos e threads;
- escalonamento e controle dos processos e threads;
- gerência de memória;
- gerência do sistema de arquivos;
- gerência dos dispositivos de entrada/saída;
- suporte a redes locais e distribuídas;
- contabilização do uso do sistema;
- auditoria e segurança do sistema.

A estrutura do sistema operacional, ou seja, a maneira como o código do sistema é


organizado e o inter-relacionamento entre seus diversos componentes, pode variar
conforme a concepção do projeto.

6.1 System Calls


Uma preocupação que surge nos projetos de sistemas operacionais é a
implementação de mecanismos de proteção ao núcleo do sistema e de acesso aos
seus serviços. Caso uma aplicação que tenha acesso ao núcleo realize uma operação
que altere sua integridade, todo o sistema poderá ficar comprometido e inoperante.
As system calls podem ser entendidas como uma porta de entrada para o
acesso ao núcleo do sistema e a seus serviços. Sempre que um usuário ou aplicação
desejar algum serviço do sistema, é realizada uma chamada a uma de suas rotinas
através de uma system call.
Este termo é usado em sistemas Unix, porém em outros sistemas ele é
apresentado com outros nomes, como system services no OpenVMS e Application
Program Interface (API) no Windows.
Para cada serviço disponível existe uma system call associada e cada
sistema operacional tem seu próprio conjunto de chamadas, com nomes, parâmetros e

25 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

formas de ativação específicos. Isto explica por que uma aplicação desenvolvida
utilizando serviços de um determinado sistema operacional não pode ser portada
diretamente para um outro sistema.

Figura 14: System call

Uma tentativa de criar uma biblioteca de chamadas padronizadas foi


proposta pelos institutos ISO e IEEE. O padrão POSIX (Portable System Interface for
Unix) permitiu que uma aplicação desenvolvida seguindo este conjunto de chamadas
pudesse ser executada em qualquer sistema operacional que oferecesse suporte ao
padrão. Este padrão foi incorporado pela maioria dos sistemas operacionais modernos.
Através dos parâmetros fornecidos na system call, a solicitação é
processada e uma resposta é retornada à aplicação juntamente com um estado de
conclusão indicando se houve algum erro.
As system calls podem ser divididas por grupos de função, conforme a tabela
abaixo:

Funções System calls


Gerência de processos e threads Criação e eliminação de processos e threads
Alteração das características de processos e threads
Sincronização e comunicação entre processos e threads
Obtenção de informações sobre processos e threads

Gerência de memória Alocação e desalocação de memória

Gerência de sistema de arquivos Criação e eliminação de arquivos e diretórios


Abrir e fechar arquivos
Alteração das características de arquivos e diretórios
Leitura e gravação de arquivos
Obtenção de informações sobre arquivos e diretórios

Gerência de dispositivos Alocação e desalocação de dispositivos


Operações de entrada/saída em dispositivos
Obtenção de informações sobre dispositivos

De forma simplificada, o comando da linguagem de alto nível é convertido pelo


compilador para uma chamada a uma system call específica, que, quando executada,

26 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

verifica a ocorrência de erros e retorna os dados ao programa de forma transparente


ao usuário.

6.2 Modos de Acesso


Existem certas instruções que não podem ser colocadas diretamente à disposição
das aplicações, pois sua utilização indevida ocasionaria sérios problemas à integridade
do sistema. As instruções que têm o poder de comprometer o sistema são conhecidas
como instruções privilegiadas, enquanto as instruções não-privilegiadas são as que
não oferecem risco ao sistema.
Para que uma aplicação possa utilizar uma instrução privilegiada, é necessário que
no processador seja implementado o mecanismo de proteção conhecido como modos
de acesso. Existem dois modos de acesso implementados pelos processadores: modo
usuário e modo kernel.
Quando o processador trabalha no modo usuário, uma aplicação só pode executar
instruções não-privilegiadas, tendo acesso a um número reduzido de instruções,
enquanto no modo kernel, a aplicação pode ter acesso ao conjunto total de instruções
do processador.
O modo de acesso de uma aplicação é determinado por um conjunto de bits,
localizados no registrador de status do processador, ou PSW, que indica o modo de
acesso corrente. Através desse registrador, o hardware verifica se a instrução pode ou
não ser executada pela aplicação.
A melhor maneira de controlar o acesso às instruções privilegiadas é permitir que o
sistema operacional tenha acesso a elas. Sempre que uma aplicação necessita
executar uma instrução privilegiada, a solicitação deve ser realizada através de uma
chamada a uma system call, que altera o modo de acesso do processador do modo
usuário para o modo kernel. Caso uma aplicação tente executar uma instrução
privilegiada diretamente em modo usuário, o processador sinalizará um erro, uma
exceção é gerada e a execução do programa é interrompida.

27 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Figura 15: Chamada a uma rotina do sistema

7. ARQUITETURA DE SISTEMAS OPERACIONAIS

7.1 Arquitetura Monolítica


A arquitetura monolítica pode ser comparada com uma aplicação formada por
vários módulos que são compilados separadamente e depois linkados, formando um
grande e único programa executável, onde os módulos podem interagir livremente.

Figura 16: Arquitetura monolítica

28 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Os primeiros sistemas operacionais foram desenvolvidos com base nesse modelo,


o que tornava seu desenvolvimento e, principalmente, sua manutenção bastante
difíceis. Foi adotada no MS-DOS e nos primeiros Unix.

7.2 Arquitetura de Camadas


Com o aumento da complexidade e do tamanho do código dos sistemas
operacionais, técnicas de programação estruturada e modular foram incorporadas ao
seu projeto. Na arquitetura de camadas, o sistema é dividido em níveis sobrepostos.
Cada camada oferece um conjunto de funções que podem ser utilizadas apenas pelas
camadas superiores. O primeiro sistema a adotar esta abordagem foi o THE e
posteriormente o MULTICS e o OpenVMS.
A vantagem da estruturação em camadas é isolar as funções do sistema
operacional, facilitando sua manutenção e depuração, além de criar uma hierarquia de
níveis de modos de acesso, protegendo as camadas mais internas. Uma desvantagem
para o modelo é o desempenho. Cada nova camada implica uma mudança no modo
de acesso.

Figura 17: Arquitetura em camadas do OpenVMS

Atualmente, a maioria dos sistemas operacionais utiliza o modelo de duas camadas,


onde existem os modos de acesso usuário (não-privilegiado) e kernel (privilegiado).

7.3 Arquitetura Microkernel


Uma tendência nos sistemas operacionais modernos é tornar o núcleo do sistema
operacional o menor e mais simples possível. Para implementar esta idéia, os serviços
de sistema são disponibilizados através de processos, onde cada um é responsável
por oferecer um conjunto específico de funções, como gerência de arquivos, gerência
de processos, gerência de memória e escalonamento.

29 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Sempre que uma aplicação deseja algum serviço, é realizada uma solicitação ao
processo responsável. Neste caso, a aplicação que solicita o serviço é chamada de
cliente, enquanto o processo que responde à solicitação é chamado de servidor.
Um cliente solicita um serviço enviando uma mensagem para o servidor e este
responde ao cliente através de uma outra mensagem. A principal função do núcleo é
realizar a comunicação, ou seja, a troca de mensagens entre cliente e servidor.
O conceito de arquitetura microkernel surgiu no sistema operacional Mach, na
década de 1980.
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 executa no modo kernel. Como conseqüência, se ocorrer um erro em um
servidor, este poderá parar, mas o sistema não ficará inteiramente comprometido,
aumentando assim a sua disponibilidade.

Figura 18: Arquitetura Microkernel

Como os servidores se comunicam através de troca de mensagens, não importa se


os clientes e servidores são processados em um sistema com um único processador,
com múltiplos processadores ou em ambientes distribuídos.
Além disso, a arquitetura microkernel permite isolar as funções do sistema
operacional por diversos processos servidores pequenos e dedicados a serviços
específicos, tornando o núcleo menor, mais fácil de depurar, aumentando sua
confiabilidade.
Apesar de todas as vantagens, sua implementação é muito difícil. Primeiro existe o
problema do desempenho devido à necessidade de mudança de modo de acesso a
cada troca de mensagem. Outro problema é que certas funções do sistema
operacional exigem acesso direto ao hardware, como operações de E/S.

30 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

Na realidade, o que é implementado mais usualmente é uma combinação do


modelo de camadas com a arquitetura microkernel. O núcleo do sistema, além de ser
responsável pela comunicação, passa a incorporar outras funções críticas, como
escalonamento, tratamento de interrupções e gerência de dispositivos.

8. PROJETO DO SISTEMA

O projeto de um sistema operacional é bastante complexo e deve atender a diversos


requisitos, algumas vezes conflitantes, como confiabilidade, portabilidade,
manutenibilidade, flexibilidade e desempenho. O projeto do sistema irá depender muito da
arquitetura do hardware a ser utilizado e do tipo de sistema que se deseja construir.
Os primeiros sistemas foram desenvolvidos integralmente em Assembly e o código
possuía cerca de um milhão de instruções. Com a evolução dos sistemas e o aumento do
número de linhas de código para algo perto de 20 milhões, técnicas de programação
modular foram incorporadas ao projeto, além de linguagens de alto nível, como PL/1 e
Algol. Nos sistemas operacionais atuais, o número de linhas de código pode chegar a mais
de 40 milhões, sendo grande parte do código escrita em linguagem C/C++, utilizando em
alguns casos programação orientada a objetos.
Uma desvantagem do uso de linguagens de alto nível em relação à programação
Assembly é a perda de desempenho. Por isto, as partes críticas do sistema, como os
device-drivers, o escalonador e as rotinas de tratamento de interrupções, são
desenvolvidas em Assembly.
Um importante princípio no projeto de sistemas operacionais é a separação no
projeto do sistema das políticas e dos mecanismos. Uma política define o que deve ser
feito, enquanto o mecanismo define como implementar uma determinada política.

31 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

9. BIBLIOGRAFIA

TANENBAUM, Andrew S., Sistemas Operacionais Modernos, 6ª edição, Rio de Janeiro:


Prentice Hall, 2003

MACHADO, F. B., MAIA, L. P., Arquitetura de Sistemas Operacionais, 3a edição, Rio de


Janeiro: Ed. LTC, 2002

FLYNN, Ida M., McHOES, Ann M., Introdução aos Sistemas Operacionais, São Paulo:
Pioneira Thomson Learning, 2002

32 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

10. LISTA DE EXERCÍCIOS

1. Como seria utilizar um computador sem um sistema operacional? Quais são suas
duas principais funções?

2. Explique o conceito de máquina virtual. Qual a grande vantagem em utilizar este


conceito?

3. Defina o conceito de uma máquina de níveis ou camadas.

4. Quais os tipos de sistemas operacionais existentes?

5. Por que dizemos que existe uma subutilização de recursos em sistemas


monoprogramáveis?

6. Qual a grande diferença entre sistemas monoprogramáveis e sistemas


multiprogramáveis?

7. Quais as vantagens dos sistemas multiprogramáveis?

8. Um sistema monousuário pode ser um sistema multiprogramável? Dê um exemplo.

9. Quais os tipos de sistemas multiprogramáveis?

10. O que caracteriza o processamento batch? Quais aplicações podem ser processadas
neste tipo de ambiente?

11. Como funcionam os sistemas de tempo compartilhado? Quais as vantagens em


utilizá-los?

12. Qual a diferença entre sistemas de tempo compartilhado e de tempo real? Quais
aplicações são indicadas para sistemas de tempo real?

13. O que são sistemas com múltiplos processadores e quais as vantagens em utilizá-
los?

14. Qual a grande diferença entre sistemas fortemente acoplados e fracamente


acoplados?

15. O que é um sistema SMP? Qual a diferença para um sistema NUMA?

33 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

16. O que é um sistema fracamente acoplado? Qual a diferença entre sistemas


operacionais de rede e sistemas operacionais distribuídos?
17. Por que o código-objeto gerado pelo tradutor ainda não pode ser executado?

18. Por que a execução de programas interpretados é mais lenta que a de programas
compilados?

19. Quais as funções do linker?

20. Qual a principal função do loader?

21. Quais as facilidades oferecidas pelo depurador?

22. Pesquise comandos disponíveis em linguagens de controle de sistemas


operacionais.

23. Explique o processo de ativação (boot) do sistema operacional.

24. O que é núcleo do sistema e quais são suas principais funções?

25. O que é um system call e qual sua importância para a segurança do sistema? Como
as system calls são utilizadas por um programa?

26. O que são instruções privilegiadas e não-privilegiadas? Qual a relação dessas


instruções com os modos de acesso?

27. Quais das instruções a seguir devem ser executadas apenas no modo kernel?
Desabilitar todas as interrupções;
Consultar a data e hora do sistema;
Alterar a data e hora do sistema;
Alterar informações residentes no núcleo do sistema;
Somar duas variáveis declaradas dentro do sistema;
Realizar um desvio para uma instrução dentro do próprio programa;
Acessar diretamente posições no disco.

28. Explique como funciona a mudança de modos de acesso e dê um exemplo de como


um programa faz uso desse mecanismo.

29. Como o kernel do sistema operacional pode ser protegido pelo mecanismo de
acesso?

34 de 35
SISTEMAS OPERACIONAIS – NOTAS DE AULA

30. Compare as arquiteturas monolítica e de camadas. Quais as vantagens e


desvantagens de cada arquitetura?

31. Quais as vantagens do modelo de máquina virtual?

32. Como funciona o modelo cliente-servidor na arquitetura microkernel? Quais são as


vantagens e desvantagens dessa arquitetura?

33. Por que a utilização da programação orientada a objetos é um caminho natural para
o projeto de sistemas operacionais?

35 de 35

Você também pode gostar