Você está na página 1de 74

Sistemas Operacionais

Objetivo
Ementa
História e funções dos Sistemas Operacionais. Estrutura dos Sistemas Operacionais.
Gerência de processos. Gerência de memória. Gerência de E/S. Sistemas de Arquivos.
Estudo de Caso (Linux e Windows).

Objetivos

Objetivo Geral:
Ao final do semestre, o aluno deverá compreender o que é e como funcionam os
Sistemas Operacionais, como são suas estruturas, o gerenciamento de processos,
memória e dispositivos de entrada e saída, além das implementações mais conhecidas
(Linux e Windows).

Objetivos Específicos:
 compreender os tipos de sistemas operacionais existentes e como estão
estruturados;
 estudar o que são processos e o que são threads, sendo capaz de diferenciá-los;
 perceber os aspectos associados à comunicação interprocessos, em especial as
questões associadas a sincronismo;
 entender o funcionamento da memória, em especial swapping, paginação e
segmentação;
 entender o funcionamento dos sistemas de entrada e saída, além do
armazenamento em disco e em mídias removíveis;
 visualizar o que são sistemas de arquivos e seus princípios de funcionamento; e
 reconhecer os aspectos principais associados aos sistemas operacionais Linux e
Windows.

Contextualização
Há alguns anos, os sistemas operacionais estavam restritos aos grandes e caros
computadores, tais como mainframes. Operados por uma quantidade limitada de
empresas, que os utilizavam em seus negócios, esses sistemas poderiam ir desde rodar
a folha de pagamento, executar o sistema de vendas ou controle de estoque, até a
execução de cálculos e simulações (químicas, biológicas, geológicas, meteorológicas,
aeroespaciais etc.).
Atualmente os sistemas operacionais estão cada vez mais presentes em nosso
cotidiano. Pessoalmente, você os utiliza em uma grande variedade de equipamentos,
seja por necessidade, lazer ou ambos. Como exemplo, podemos citar: telefones
celulares e consoles de videogames. Profissionalmente, o uso se dá por meio de
computadores ou equipamentos específicos que auxiliam as atividades no ambiente
empresarial, como equipamentos de rastreamento. Para onde quer que você olhe, os
equipamentos eletrônicos necessitam desses sistemas para executar seus programas,
estando estes presentes desde em um pequeno PDA até em uma grande aeronave.

A miniaturização dos equipamentos, associada a outros fenômenos, tais como a


proliferação da Internet e de redes sem fio, possibilita uma participação cada vez maior
de equipamentos eletrônicos em nossa vida. Esses equipamentos interagem, por meio
de seus programas, entre si e com seus usuários, o que é sempre possibilitado pelos
sistemas operacionais neles presentes.

Tais sistemas controlam o acesso desses programas ao hardware, seja pela permissão
de utilização do processador ou dos dispositivos de entrada e saída, promovendo uma
utilização que deve sempre levar em consideração aspectos de: desempenho, consumo
de energia, segurança e usabilidade, entre outros.

Desse modo, o funcionamento adequado da solução utilizada, seja para uso pessoal ou
profissional, depende desses sistemas. Logo, entender como funcionam, suas vantagens
e limitações permitirá que o aluno possa obter o máximo de seu equipamento e dos
programas utilizados. O que, em última instância, refletirá no cumprimento adequado
da tarefa, a um custo razoável.

Introdução
Conteúdo
Aula 1 – História e Funções dos Sistemas Operacionais
 História dos Sistemas Operacionais
 Os Diversos Tipos de Sistemas Operacionais
 Alguns Conceitos Comuns aos Sistemas Operacionais
Aula 2 – Estrutura dos Sistemas Operacionais
 System Calls
 Modos de Acesso
 Arquitetura
 Monolítica
 Em Camadas
 Microkernel
 Máquina virtual
Aula 3 – Gerência de processos
 Processos
 Conceito de Processos
 Escalonamento
 Processos Cooperativos
 Processos Independentes, Subprocessos
 Threads
 Conceito de  Threads
 Múltiplas  Threads
 Threads no Windows e Linux
 Comunicação Interprocessos
 Segundo Plano
 Seção Crítica
 Semáforos
 Problemas Típicos de Sincronismo
 Monitores
 Transações Atômicas
 Deadlocks
 Conceito de  Deadlock
 Prevenção de  Deadlock
 Detecção de  Deadlock
 Recuperação de  Deadlock
Aula 4 – Gerência de Memória
 Conceitos Iniciais de Gerência de Memória
 Troca de Processos (Swapping)
 Alocação de Memória Contígua
 Alocação de Memória
 Fragmentação de Memória
 Memória Virtual
 Paginação
 Substituição de Página
 Segmentação
Aula 5 – Gerência de E/S
 Conceitos de Entrada e Saída
 Subsistema de Entrada e Saída
 Drivers
 Controladores
 Dispositivos de Entrada e Saída
 Discos
Aula 6 – Sistemas de Arquivos
 Visão do Usuário
 Conceitos de Arquivo
 Estrutura de Diretório
 Métodos de Acesso
 Montagem
 Compartilhamento
 Proteção
 Visão do Implementador
 Estrutura do Sistema de Arquivos
 Implementação
Aula 7 – Estudo de Caso (Linux)
 Histórico do Linux
 Visão Geral do Linux
 Arquitetura
 O Kernel do Linux
 Distribuições Linux
 Gerenciamento de Processos
 Gerenciamento de Memória
 Gerenciamento do Sistema de Arquivos
 Entrada e Saída
 Segurança
Aula 8 – Estudo de Caso (Windows)
 Histórico do Windows
 Visão Geral do Windows
 Estrutura do Sistema
 Gerenciamento de Processos
 Gerenciamento de Memória
 Gerenciamento do Sistema de Arquivos
 Entrada e Saída
 Segurança

Aula 01 - História e Funções dos Sistemas


Operacionais
Entender a origem e a cronologia da evolução dos sistemas operacionais ajudará
bastante na compreensão desse importante assunto dentro da computação. Desse
modo, faremos um rápido estudo dessa evolução, o que nos permitirá perceber como
foram sendo utilizados, à medida que evoluíam.
Estudaremos ainda seu relacionamento com o hardware, além de conceitos importantes
que utilizaremos ao longo da disciplina.
Esta aula é, portanto, um ponto de partida para o entendimento das características,
funcionamento e possibilidades na utilização dos sistemas operacionais.

Ao iniciar o estudo dos sistemas operacionais devemos procurar respostas para duas
questões bem importantes: qual a função do sistema operacional? Como esse sistema
operacional se relaciona com o hardware?
O objetivo do usuário é executar programas que irão auxiliá-lo no cumprimento de suas
tarefas. Esses programas podem ter as finalidades mais diversas possíveis. Logo, ao
sistema operacional cabe a tarefa de facilitar e coordenar o acesso aos recursos
computacionais disponíveis.

Mas quais são esses recursos?

Podemos classificar esses recursos em três grupos: de entrada/saída; de


armazenamento; de processamento. O primeiro tem a função de fornecer ao
computador os dados a serem processados e de externar o resultado desse
processamento. O segundo tem por função armazenar, de modo permanente ou
temporário, os dados utilizados. Por último, aos recursos de processamento, cabe a
função de executar as rotinas necessárias ao cumprimento das tarefas.

Figura 1.1 – Visão do Sistema


Operacional.

Mas, e a relação do sistema operacional com o hardware?

Para responder essa questão, vamos considerar a sua experiência com computadores.
Em geral, você utiliza algum programa – editor de textos, planilha eletrônica,
navegador, aplicativo de uso empresarial etc. Todos esses programas estão instalados
em um sistema operacional e este, por sua vez, foi instalado previamente no
computador.
A Figura 1.2 permite uma visão geral do que está sendo mencionado. Nela, podemos
ver os usuários interagindo com os aplicativos que, por seu turno, estão apoiados no
sistema operacional, executado em um hardware.

O detalhamento do sistema operacional, seu relacionamento com os aplicativos e o


hardware serão vistos ao longo das próximas aulas.

Figura 1.2 – Visão


dos Componentes de um Computador.

Uma outra visão completa é mostrada na Figura 1.3, onde podemos visualizar os
programas em uso, o sistema operacional e os elementos de hardware nos quais este
se apóia.

Figura
1.3 – Sistema Computacional Consistindo em Hardware, Sistema e Aplicações.
História dos Sistemas Operacionais
Os sistemas operacionais foram evoluindo na medida em que os computadores foram se
desenvolvendo; junto com estes, foram adquirindo características associadas à evolução
do hardware e de conectividade.

Período anterior aos anos de 1940


Em 1642, Blaise Pascal inventou uma máquina de somar, visando auxiliar seu pai, que
trabalhava com arrecadação de impostos. Em 1673, Gottfried Leibnizcriou uma máquina
que somava e multiplicava. Em 1820, Charles Colmar inventou uma máquina que
realizava as quatro operações.
O primeiro computador de que se tem notícia foi projetado por Charles Babbage, em
1822. Era puramente mecânico, com engrenagens, polias e correias. Esse computador
não possuía sistema operacional, sendo considerado uma máquina analítica.
Em 1854, George Boole criou a lógica booleana, na qual se baseia todo modelo de
computação digital.
Em 1890, Herman Hollerith criou o mecanismo de cartões perfurados para ajudar o
processamento do censo dos EUA. Hollerith fundou, em 1896, a empresa que
posteriormente se tornou a IBM.
Década dos anos de 1940
Nessa década, surgiu o que é chamado de primeira geração de computadores, onde
eram utilizados válvulas e painéis de programação. Nessa época foi criado o Electronic
Numerical Integrator and Calculator (ENIAC), criado na Universidade da Pensilvânia e
utilizado em cálculos balísticos e, posteriormente, no desenvolvimento da bomba de
hidrogênio.
Década dos anos de 1950
Nos anos de 1950 surgiu a segunda geração, com a utilização de transistores e de
sistemas em lote (ou batch).
O processamento em lote consistia em uma maneira de otimizar a utilização dos
computadores até então disponíveis, os denominados mainframes. Nesse tipo de
processamento, o programa a ser executado era preparado previamente. Inicialmente
por meio de cartões perfurados e, em evoluções posteriores, previamente digitados.
O mainframe processava um a um os programas. Essa era uma forma de otimizar a
utilização desse caro recurso.
Figura 1.4 – Processamento em Lote.

Década dos anos de 1960


Na década dos anos de 1960, chegou-se à terceira geração de computadores, com a
disseminação dos circuitos integrados e da multiprogramação.

Nessa época ocorreu um problema, pois existiam duas linhas de produtos totalmente
incompatíveis. Os computadores de grande porte – utilizados em cálculos de engenharia
e ciência, tal como o 7094 – e os orientados a caracteres, como o 1401, utilizados por
bancos e demais instituições financeiras. A IBM lançou então o System/360, que cobria
desde máquinas menores até as de grande porte. Nessa época, a empresa lançou séries
subseqüentes, denominadas 370, 4300, 3080 e 3090.

A multiprogramação surgiu nesse momento, para diminuir a ociosidade da CPU, a partir


da qual a memória era dividida em partes, onde, em cada uma, colocava-se
um job (trabalho) a ser executado. Desse modo, vários jobs poderiam ser preparados
para que fossem utilizados em seqüência pela CPU.
A seguir (Figura 1.5), pode ser visto um mainframe da série 4.300, o IBM 4341,
fabricado entre os anos de 1979 e 1986.
Figura 1.5
– Mainframe da Série 4.300

Outras imagens podem ser vistas no IBM – Mainframe Photo Álbum.


Década dos anos de 1970
Nessa década surgiram os minicomputadores, tais como o PDP-11. Em 1971, a Intel
produziu o processador Intel 4004 e, em 1974, o Intel 8080. Estes foram seguidos pela
Zilog, que lançou o Z80. Com a evolução dos processadores, surgiram então os
microcomputadores. Em 1976, Steve Jobs e Steve Wozniak produziram o Apple II que,
rapidamente, se tornou um sucesso. O sistema operacional utilizado
predominantemente, nesses computadores, é o CP/M (Control Program Monitor),
da Digital Research. Na outra extremidade do mercado, o de grande porte, era lançado
o supercomputador Cray-1 capaz de realizar 100 milhões de operações de ponto
flutuante por segundo (100 MFLOPS).
Década dos anos de 1980
Foi o início da quarta geração, marcada pela entrada da IBM no mercado de
microcomputadores que, em 1981, lançou o IBM PC. Esse primeiro microcomputador
utilizava processador Intel 8088 de 16 bits e sistema operacional Microsoft DOS (Disk
Operating System). Em 1982, foi fundada a Sun Microsystems, que lançou as estações
de trabalho SUN, que se utilizavam do SunOS (posteriormente, Sun Solaris).

Nessa década a Universidade de Berkeley criou sua própria versão de Unix, o BSD,
introduzindo várias melhorias, em especial, associadas ao TCP/IP.

Ao longo dessa década, surgiram os sistemas operacionais com interface gráfica, tais
como o Microsoft Windows e OS/2.

Década dos anos de 1990


Nessa década se consolidaram os sistemas operacionais com interface gráfica. Com o
surgimento da Internet, a arquitetura cliente/servidor passou a ser utilizada também
fora de redes locais.

Surgiram ainda os softwares abertos (open source), com destaque para os sistemas
operacionais FreeBSD e o Linux.
Década dos anos de 2000
Essa década caracteriza-se por: demanda cada vez maior por processadores e sistemas
cada vez mais eficientes, surgimento de variadas interfaces de interação entre o usuário
e a máquina; miniaturização e mobilidade crescentes, o que, aliado às tecnologias de
redes sem fio, têm levado a computação a locais e atuações antes não utilizados, o que
tem possibilitado uma informatização sem precedentes. Os sistemas operacionais estão
cada vez mais presentes, sendo aplicados em dispositivos diversos, tais como PDA,
telefones celulares, eletrodomésticos etc.

Os Diversos Tipos de Sistemas Operacionais


Um sistema operacional pode ser aplicado nos mais diversos tipos de dispositivos
existentes. Nesse item, mencionamos os mais comuns e que fazem parte de nosso dia-
a-dia, desde sistemas de grande porte até pequenos cartões inteligentes (smart cards),
relacionados a seguir.
Sistemas operacionais para computadores de grande porte
Computadores de grande porte são utilizados por grandes empresas e centros de
pesquisa. A finalidade desses computadores é lidar com grandes volumes de
processamento, tais como análise de crédito por grandes bancos ou simulações como as
efetuadas para prospecção de petróleo e gás ou para fins meteorológicos.

Sistemas operacionais para computadores pessoais


Computadores pessoais visam oferecer ao usuário boas condições de interação na
realização de suas tarefas, sejam estas de trabalho ou lazer, sendo utilizados para uso
geral. Permitem: acesso à Internet – para fins diversos, inclusive interação com outras
pessoas, via mensageiros instantâneos; utilização de suítes de escritório - editores de
texto, planilha eletrônica etc.; uso de programas multimídia, como vídeos e músicas;
interagir com variados tipos de dispositivos de E/S – gravadores de mídias
diversas, joysticks para jogos etc.
Sistemas operacionais para servidores
Sistemas operacionais para servidores podem ser executados em servidores de grande
porte, servidores, estações de trabalho ou mesmo computadores pessoais. Podem
fornecer diversos serviços, podendo atuar como: servidores web; servidores de
arquivos; servidores de impressão, entre outros.

Sistemas operacionais para aplicações em tempo real


Sistemas operacionais para aplicações em tempo real têm o tempo como um fator
crítico. São aplicados em equipamentos que possuem prazos rígidos para a execução
das tarefas, tais como máquinas empregadas em processos industriais.

Sistemas operacionais embarcados


Sistemas operacionais embarcados têm seu uso associado a pequenos dispositivos.
Como exemplos, podem ser citados: PDA, telefones celulares e eletrodomésticos. Os
dispositivos que os utilizam geralmente têm sérias limitações quanto à capacidade de
processamento, memória e energia que podem utilizar.
Existem vários casos de sistemas operacionais embarcados que possuem também
características de tempo real.

Sistemas operacionais para cartões inteligentes


Os sistemas operacionais para cartões inteligentes são utililizados em dispositivos de
tamanho similar a um cartão de crédito. Esses dispositivos possuem uma restrição de
consumo de memória e energia bem menores que os do tipo embarcado. Em geral,
dedicam-se a uma única função como, por exemplo, executar pagamentos bancários.

Alguns Conceitos Comuns aos Sistemas Operacionais


As características de um sistema operacional estão associadas ao hardware em que é
executado. Desse modo, a maneira como gerenciam processos, memória,
entrada/saída, arquivos e a segurança, varia entre os sistemas. Apesar disso, os
conceitos básicos associados aos diversos sistemas operacionais existentes são os
mesmos. Neste item, começaremos abordando alguns desses conceitos, os quais serão
detalhados ao longo das próximas aulas.

Processos
Um processo é um programa que está sendo executado. Um sistema operacional deve
lidar com muitos processos, ou seja, deve executar vários deles, inclusive ao mesmo
tempo. O detalhamento de como isso é feito será visto na Aula 3.

Por enquanto, considere “fatias de tempo”; a cada fatia, um processo é executado.


Terminada uma fatia, o processador passa a executar outro processo, alternando, desse
modo, todos os processos a executar.

Quando um processo é interrompido, é posteriormente retomado a partir de onde havia


parado. A velocidade com que alterna todos os processos e retorna ao primeiro é tão
elevada que a impressão causada é que o sistema operacional está executando várias
tarefas ao mesmo tempo.

Um processo é composto de seu espaço de endereçamento e de uma entrada na tabela


de processos.

Deadlocks
Deadlock é uma situação que ocorre durante a execução de vários processos ao mesmo
tempo. Isso ocorre quando dois processos ficam bloqueados, um esperando pelo outro.
Considere, para isso, dois processos: o primeiro processo (P1) aloca um recurso A para
uso; enquanto isso, o segundo processo (P2) aloca um recurso B para uso.  Em um
dado momento, o processo P1 solicita acesso também ao recurso B, porém, sem ainda
liberar o recurso A. Nesse mesmo instante, o processo P2, por coincidência, solicita
acesso ao recurso A, sem liberar o uso de B. Ocorre então o deadlock. Nesse instante, o
processo P1 vai ficar esperando a liberação do recurso B, enquanto o processo P2 fica
aguardando o recurso A, sendo que nenhum deles liberou o recurso já em uso.
A prevenção, detecção e recuperação de deadlocks serão vistas na Aula 3.
Gerenciamento de memória
Todo computador utiliza uma memória para apoio aos programas que estão em
execução. Em um sistema operacional simples, somente um programa por vez pode
ocupar a memória. Logo, para alternância de um processo a outro, todas as
informações devem ser salvas e o processo removido da memória, sendo em seguida
colocado o próximo em memória.

Os sistemas operacionais que utilizamos na prática possuem a capacidade de manter


em memória vários processos ao mesmo tempo. Devem, portanto, controlar o acesso à
área de memória ocupada por cada um, prevenindo que outros acessem esses espaços
reservados.

É desejável que todo o espaço de endereçamento a ser utilizado pelos programas seja
menor do que a memória disponível, permitindo que todos sejam mantidos em
memória. Caso o espaço seja maior do que a memória disponível, será utilizada uma
técnica denominada de memória virtual (swap). Nesse caso, parte do espaço de
endereçamento será mantida em disco. Todo o assunto relativo à memória será visto
com mais detalhes na Aula 4.
Entrada e saída
Os computadores possuem dispositivos de entrada e saída. O primeiro é aquele por
meio do qual passamos ao computador as informações ou dados a serem processados
enquanto, pelo dispositivo de saída, o computador apresenta o resultado das operações
solicitadas.

O dispositivo de entrada mais comum é o teclado e o dispositivo de saída mais comum é


o monitor. Entretanto, existem muitos outros dispositivos, tais como: mouse;
impressora; unidades de disco ou fita; relógio; placa de rede; porta serial; porta
paralela etc. Esse assunto será abordado na Aula 5.

Arquivos
Sistema de arquivos é outro conceito muito importante no estudo dos sistemas
operacionais. Os arquivos guardam informações que são manipuladas pelos programas
e pelo próprio sistema.

Para que um arquivo possa ser lido, deve primeiramente ser localizado e, depois,
aberto. Após ser manipulado, podendo inclusive ter seu conteúdo alterado, deve ser
salvo e fechado.

Ao sistema operacional cabe a organização e manipulação desses arquivos. Uma forma


muito comum de os sistemas operacionais organizarem seus dados é sob a forma de
diretórios. Cada diretório (ou pasta) agrupa vários arquivos. Esse assunto será
abordado em detalhes na Aula 6.

Segurança
Uma vez que muitas informações estão armazenadas em um computador, é necessário
um controle quanto ao acesso e modificação dos dados. Isso é necessário tanto para
proteger o sistema operacional quanto os próprios dados dos usuários de acessos
indevidos, inclusive os causados por vírus e outras pragas virtuais. A forma de controle
de acesso aos dados será abordada nas Aulas 7 (Estudo de Caso Linux) e 8 (Estudo de
Caso Windows).

Shell
É função do sistema operacional a execução de chamadas ao sistema. Vários programas
que não fazem parte do sistema operacional, necessitam de acesso a variados recursos;
entre estes estão editores, compiladores, ligadores e interpretadores.  Analisando o
caso dos interpretadores, eles possuem algumas características.

Tomemos como exemplo o Shell do Unix/Linux. O usuário, quando se conecta, tem um


interpretador de comandos (Shell) iniciado; este se torna a entrada e saída padrão do
usuário. É por meio dele que o usuário digita seus comandos e recebe seus resultados,
podendo, se for o caso, modificar a entrada ou saída dos dados. Por exemplo: pode
utilizar como entrada um arquivo e como saída a impressora. A utilização desse tipo de
programa será abordada nos estudos de caso das Aulas 7 e 8.

Nesta aula, estudamos a história dos sistemas operacionais, podendo acompanhar sua
evolução e utilização ao longo do tempo. Vimos os diferentes tipos de aplicações para
os sistemas operacionais que podem ser utilizados desde em um pequeno dispositivo
móvel, até em um grande computador, incluindo sistemas de tempo real.
Em seguida, foram mencionados alguns conceitos importantes e comuns a todos os
sistemas operacionais, que serão estudados em detalhes mais adiante por enquanto,
estes conceitos nos permitirão avançar no estudo desta disciplina.
Os itens estudados serviram como preparo para o próximo conteúdo a ser estudado –
Estrutura dos Sistemas Operacionais – que, por sua vez, servirá de base para o estudo
do gerenciamento de processos, de memória e de entrada/saída, três conceitos
primordiais ao entendimento do funcionamento dos sistemas operacionais existentes.

Aplicando o Conhecimento
1. O que você entende por sistema operacional? Quais são suas principais funções?
2. Quais os principais componentes de um sistema operacional?
3. Quais os tipos principais de sistemas operacionais que você conhece? Onde
podem ser aplicados?

Para Refletir
a. Como seria um computador sem sistema operacional? Isso é possível?
b. Qual é o sistema operacional dos dispositivos a sua volta (computadores,
celulares, etc.)?
Aula 02 - Estrutura dos Sistemas
Operacionais
O sistema operacional provê uma série de serviços aos usuários e programas que o
utilizam. Para realizar essas ações, o sistema operacional precisa realizar várias
atividades internamente, bem como interagir adequadamente com o hardware no qual
se apóia.
Nesta aula, você verá quais são essas ações e como elas funcionam. O objetivo é que, a
partir dos tópicos aqui abordados, você já possa ter uma visão geral do funcionamento
dos sistemas operacionais.

Para que possamos estudar a arquitetura de um sistema operacional, é oportuno que


vejamos os principais elementos associados a ele.

Iniciando pelo ponto de vista do usuário, temos as aplicações. Ligados a estas temos os
utilitários, que permitem uma interação dos usuários e aplicações com o sistema
operacional. Em seguida, temos o próprio sistema operacional, que se apóia ainda sobre
o hardware. A Figura 2.1 apresenta esses elementos.

Figura 2.1 – Arquitetura de um Sistema Computacional.

Mas o que o sistema operacional faz realmente?

Para que você possa entender a real função do sistema operacional, é necessário
visualizar os elementos que interagem com ele.

Na aula anterior, você viu que o sistema operacional lida com o processador, os
dispositivos de entrada e saída, a memória e os dispositivos de armazenamento. O
funcionamento de todos esses elementos não é seqüencial, havendo momentos em que
existe disputa por recursos, ou mesmo enfileiramento. Logo, cabe ao sistema
operacional gerenciar tudo isso.

Entre as atividades gerenciadas pelo sistema operacional estão:

 criar e eliminar processos e threads;


 sincronizar a comunicação entre processos e threads;
 escalonar e controlar processos e threads;
 gerenciar a memória;
 gerenciar dispositivos de entrada e saída;
 gerenciar o sistema de arquivos;
 efetuar a segurança do sistema.
System Calls
Neste item, começaremos por um elemento presente em todo sistema operacional: as
“chamadas ao sistema”, denominadas System Calls, em ambiente Unix ou Application
Program Interface (API), em ambiente Windows.
As System Calls funcionam como uma interface para acesso ao núcleo do sistema
operacional. Desse modo, quando um usuário ou aplicação solicitam algum serviço, uma
chamada de sistema é realizada.

Cada serviço possui uma chamada de sistema associada. Cada sistema operacional
possui seu próprio conjunto de chamadas e formas de fazê-lo.

A figura a seguir mostra o esquema de interação entre aplicações, System Calls, núcleo


do sistema operacional e o hardware.

Figura 2.2 – Esquema de Interação das System Calls no Hardware.

Uma tentativa de padronização das chamadas, denominada POSIX, foi proposta. O


objetivo era permitir que aplicações desenvolvidas conforme as chamadas padronizadas
pudessem ser executadas em qualquer sistema operacional que suportasse POSIX.

Para que você possa entender adequadamente a localização e função dessas chamadas
ao sistema, considere o seguinte exemplo:

O programador, ao escrever o código de um programa, o faz utilizando uma linguagem


de programação alto nível (por exemplo: Pascal, C ou C++). O compilador então
converte esse código de alto nível em chamadas ao sistema apropriadas à arquitetura
do hardware onde será utilizado.
Existem muitas chamadas ao sistema que, como se disse, variam conforme o sistema
operacional. Todavia, podemos reuni-las em quatro grupos:

 Gerenciamento de processos e threads – criação, eliminação, sincronização,


comunicação e informações.
 Gerenciamento de memória - alocação e liberação de memória.
 Gerenciamento de arquivos – abrir, ler, gravar, fechar ou eliminar arquivos;
criar, alterar e eliminar diretórios; obter informações de arquivos e diretórios.
 Gerenciamento de dispositivos – alocar ou liberar operações de entrada ou
saída e obter informações sobre dispositivos.

Modos de Acesso
O acesso aos arquivos, a memória e aos dispositivos deve ser controlado. A razão para
isso é que um acesso indevido pode causar sérios problemas. Imagine se cada aplicação
resolve que vai acessar determinado setor do disco rígido, cada uma quando bem
entender. Quais problemas isso poderia causar?

Como os recursos do computador são todos compartilhados, faz-se necessário um


controle desse acesso. Esse controle pode ser efetuado de dois modos diferentes:

 No primeiro modo, algumas instruções mais críticas, ou privilegiadas, somente


podem ser executadas pelo sistema operacional. Nesse caso, os aplicativos devem
solicitar ao sistema que execute determinada operação. O sistema então a
executa, após verificar a validade de tal solicitação, encaminhado o resultado a
quem a solicitou. Evitam-se assim problemas de segurança ou de integridade dos
dados. É o denominado modo kernel (ou supervisor).
 No segundo modo, as instruções não críticas, ou não privilegiadas, somente
podem ser executadas se o usuário ou aplicação possuírem autorização para tal. É
o denominado modo usuário.

A melhor maneira de controle da segurança é permitir que somente o sistema


operacional tenha acesso às instruções encaminhadas. Desse modo, as chamadas de
sistema são todas encaminhadas ao sistema operacional. Essa abordagem vale tanto
para acesso ao processador quanto aos demais dispositivos.

Alguns sistemas operacionais permitem que a aplicação efetue uma chamada de


sistema ao kernel que, então, altera o acesso do modo usuário para o modo kernel; daí,
a aplicação ganha acesso ao recurso (por exemplo: processador). Após executada a
rotina, o modo usuário é reativado, retirando os privilégios de acesso.

O sistema operacional MS-DOS, por exemplo, não possuía esse recurso de utilização de
modo usuário ou modo kernel, uma vez que foi desenvolvido para a arquitetura Intel
8088. Já a arquitetura Intel x86 possui esse recurso, utilizado pelos sistemas
operacionais Windows 2000 e outros mais recentes, além do Linux e Solaris.
Arquitetura

Monolítica
A arquitetura monolítica se refere a um único programa que pode ter até sido compilado
em separado, mas foi unificado (linkado) em um programa executável. O
desenvolvimento ou manutenção desse tipo de código é complicado. O sistema
operacional DOS da Microsoft é monolítico.

Em Camadas
A arquitetura em camadas surgiu com a necessidade de melhorar o processo de
desenvolvimento e manutenção de um código mais complexo. Nessa abordagem, o
sistema é organizado em camadas, onde cada uma exerce um conjunto bem
determinado de funções.

Além de facilitar a escrita e manutenção do código, permite a organização de modos de


acesso associados às camadas.

Tanto o Unix quanto o Windows, em suas versões mais recentes, utilizam essa
arquitetura, que apresenta duas camadas: a primeira, como acesso não privilegiado
(modo usuário) e a segunda, com acesso privilegiado (modo kernel).

Microkernel
O conceito de microkernel surgiu em 1980, na Universidade Carnegie-Mellon. A idéia
era possuir um kernel (núcleo) menor. Atualmente essa é uma tendência na maior parte
dos sistemas operacionais.

Para isso, os serviços disponibilizados pelo sistema são executados como processos,
onde cada um coordena as funções de gerenciamento de arquivos, memória, processos
e escalonamento.

Os serviços, nesses casos, são todos executados no modo usuário, sem acesso direto ao
sistema. Os processos se comunicam entre si e com o microkernel, por meio de
mensagens. Quando determinado processo deseja acessar o hardware, ele o faz por
meio de uma mensagem ao microkernel.
Figura 2.3 –
Arquitetura Computacional e o Microkernel.

Essa abordagem propicia algumas vantagens. A primeira diz respeito à segurança


propiciada pelo acesso restrito, já que somente o microkernel possui acesso direto ao
hardware. Eventuais conflitos nos processos podem causar somente a parada dos
processos envolvidos, permanecendo então os demais processos e o servidor em
execução normal.

A utilização de microkernel facilita a utilização de múltiplos processadores, seja através


de uma única máquina com diversos processadores ou de um ambiente distribuído em
que as máquinas podem estar distantes umas das outras.

Porém, a implementação desse tipo de solução é difícil. Na prática, o que existe


atualmente é uma combinação entre o modelo em camadas e o de microkernel.

Máquina Virtual
Máquina virtual é um assunto bem atual. Possivelmente você já deve ter ouvido falar
sobre isso ou, então, lido algo a respeito.

Mas você sabe do que se trata? E como funciona?

Nos itens anteriores, você já pôde estudar que o sistema operacional funciona sobre um
hardware específico. Sabe também que, quando um programa é criado, é feito para um
determinado sistema operacional.
Ocorre que, atualmente, tem-se freqüentemente a necessidade de executar mais de um
sistema operacional, ao mesmo tempo, em um determinado computador ou servidor.
Qual a razão dessa necessidade?

Existem dois grandes motivos para isso. O primeiro pode ser a necessidade de
suportarmos em um dado servidor aplicações que foram feitas para sistemas
operacionais diferentes. Suponha, por exemplo, que você tenha dois aplicativos, um
desenvolvido para ambiente Windows e um outro desenvolvido para ambiente Linux.
Considere ainda que, por limitações diversas, você precise instalá-los no mesmo
computador.

A solução então é a utilização do recurso de máquinas virtuais.

Máquina virtual é um recurso que adiciona uma camada extra entre o sistema
operacional e o hardware. Essa camada adicional emula um hardware. Desse modo, o
sistema operacional instalado sobre a máquina virtual “pensa” que está interagindo
diretamente com o hardware.

Assim, podemos instalar mais de um sistema operacional sobre essa camada adicional.
Cada uma dessas instalações acessa a máquina virtual como se estivesse acessando o
hardware. Cabe a essa máquina virtual a interação com o hardware.

Figura 2.4 – Sistema com três Instâncias


de Máquina Virtual.
O segundo motivo diz respeito às questões de segurança e/ou gerenciamento de
ambientes complexos. Você pode ter várias instalações de um determinado sistema
operacional em execução em um dado computador. Cada uma desas instalações terá
somente o que for necessário para atender ao programa que for ser executado ali.
Pense nas vantagens de segurança e de gestão que pode oferecer.

Se sua empresa for um Datacenter, prestando serviços de hospedagem variados


(servidores web, email, ftp, banco de dados etc.) aos seus clientes, você pode alocar
cada cliente em um dos ambientes em execução.

Se, por outro lado, todos os serviços são hospedados em sua própria empresa, você
pode optar por colocá-los separadamente em máquinas virtuais diferentes. O impacto
dessa decisão é que um eventual problema de segurança em uma máquina (tal como
uma invasão) não compromete as outras. Além disso, você pode ligá-las e desligá-las
separadamente. Pode ainda efetuar uma cópia completa de uma instalação em poucos
minutos, colocando-a para executar no mesmo servidor ou em outro.

Máquinas virtuais podem ser utilizadas em computadores pessoais, em servidores ou


mesmo em mainframes. A única limitação é a capacidade de processamento e de
memória do hardware.

Existem atualmente soluções de virtualização que podem ser instaladas diretamente


sobre o hardware, sem a necessidade de instalar o sistema operacional previamente,
enquanto outras podem ser instaladas sobre o sistema operacional já presente no
computador.

Entre as soluções de virtualização existentes podemos citar: VirtualBox – solução de


virtualização de código livre (licença GPL) e disponível para instalação em ambientes
Windows, Linux e OpenBSD; VMWare – soluções diversas de virtualização para
instalação direta sobre o hardware e sobre os sistemas operacionais mais
utilizados; XEN – solução de virtualização para instalação em ambiente Linux; Virtual
PC – Solução de virtualização da Microsoft, criada pela mesma equipe do VirtualBox.
Outro exemplo de máquina virtual é a Java Virtual Machine (JVM), desenvolvida
pela Sun Microsystems. A idéia foi a criação de um ambiente que possibilitasse
aplicações desenvolvidas em Java de executar em qualquer sistema operacional que
possua a JVM instalada. Foram então criadas JVM para os sistemas operacionais mais
utilizados atualmente.

As características de portabilidade e segurança, entre outras, possibilitaram ao Java


uma grande inserção no mercado de soluções em software.
Figura 2.5 – Sistema com Máquina Virtual Java.

Nesta aula, você pôde estudar a estrutura de um sistema operacional, podendo


perceber como se relaciona com os usuários, seus aplicativos e com o hardware. Em
seguida, viu as funções que devem ser realizadas pelo sistema operacional, tais como
gerenciar a utilização do processador, da memória, dos dispositivos de entrada e saída
e do sistema de arquivos.
Na seqüência, abordou-se o tema “chamada de sistema” ou system calls e seu
funcionamento como uma interface entre o usuário, seus aplicativos e o sistema
operacional. Entre as chamadas existentes foram mencionadas algumas como:
manipulação de processo; alocação de memória; acesso a arquivos; gerenciamento de
dispositivos.
Então, você estudou o modo de acesso, por meio do qual se pode controlar melhor o
acesso ao sistema operacional e, em especial, ao hardware; isso é feito por meio do
acesso em modo usuário ou acesso em modo privilegiado (modo kernel), sendo que,
nesse último, as aplicações encaminham as solicitações ao sistema para que sejam
efetuadas. Assim, adiciona-se um recurso a mais de segurança ao sistema operacional.
Mencionaram-se ainda a arquitetura monolítica e a multicamada, com as vantagens
desta última. Ao conceito de multicamada acrescentou-se o conceito de microkerne,
possibilitando uma visão da estruturação dos sistemas operacionais atuais.
Por último, foram vistos os conceitos associados a máquinas virtuais, descrevendo-se
suas aplicações e vantagens.
A partir da próxima aula, você começará a estudar como são gerenciados os processos
e threads, passando em seguida ao gerenciamento de memória e ao gerenciamento de
entrada e saída.

Aplicando o Conhecimento
1. Quais os principais elementos na arquitetura de um sistema operacional? Qual a
função de cada um deles?
2. O que é uma system call? Qual o seu relacionamento com o núcleo do sistema
operacional?
3. O que significa modo kernel e modo usuário em um sistema operacional? Qual a
vantagem na utilização desses dois modos?
4. O que é uma máquina virtual? Qual a sua finalidade?
5. Quais são as camadas em uma solução que se utilize de máquina virtual?

Para Refletir
a. Considere os sistemas operacionais utilizados em dispositivos a sua volta, tais
como computadores, celulares etc. Quais são monolíticos? Quais são em camadas?
b. As soluções de virtualização mais comuns atualmente envolvem a instalação de
máquinas virtuais sobre um sistema operacional hospedeiro. É possível a
instalação de máquinas virtuais diretamente sobre o hardware sem a utilização de
um sistema operacional hospedeiro?

Aula 03 - Gerência de processos


Os primeiros dispositivos computacionais permitiam que somente um programa fosse
executado de cada vez. Esse programa, além dos cálculos que fazia, ainda tinha acesso
e controlava todo o dispositivo.
Atualmente, nos sistemas operacionais utilizados, vários programas são executados
simultaneamente. Desse modo, precisa haver um controle do acesso aos recursos de
processamento (processador) que são sempre limitados.
O controle do acesso ao processador pode se dar tanto para evitar conflitos quanto para
melhorar a utilização da capacidade de processamento, evitando-se a ociosidade do
processador. Assim, somente é disponibilizado o acesso ao processador para aquela
aplicação que já está pronta para utilizá-lo.
Nesta aula, você verá os conceitos associados a processos e threads. O objetivo é
compreender como é feita a alternância na utilização do processador, bem como tratar
dos problemas decorrentes.

Processos

Conceito de Processos
O que é um processo?

Inicialmente faz-se necessário definirmos o que é um processo. O entendimento que


você deve ter é que um processo nada mais é do que um programa em execução.

No computador que você possa estar utilizando, vários programas podem estar em
execução simultaneamente, como: editor de textos; planilha eletrônica; navegador;
mensageiro instantâneo; reprodutor de músicas ou vídeo. Além desses, outros
programas presentes no sistema operacional também podem estar em execução. Entre
esses, podemos citar os que controlam o relógio que aparece na tela; a otimização no
consumo de energia; e a interação com outros dispositivos que possam vir a ser
conectados pelo usuário.

Estado de um processo
Um processo passa por várias fases, também denominadas de estado, do momento em
que é criado até o momento em que se encerra. Os estados em que um processo pode
estar são:

 Criação – momento em que esta sendo criado.


 Execução – instruções do programa estão sendo executadas.
 Espera ou bloqueado – processo esperando a ocorrência de algum evento, por
exemplo, o retorno de um dispositivo de entrada ou saída.
 Pronto – processo pronto aguardando sua vez de ter acesso ao processador.
 Terminado – o processo encerrou a execução.
Estrutura de um processo
O processo, como vimos, é um programa em execução. Todavia, para que ele seja
executado adequadamente pelo sistema operacional, fazem-se necessários três
elementos: contexto de hardware; contexto de software; espaço de endereçamento. À
estrutura composta por esses três contextos é dado o nome de bloco de controle do
processo.

Figura 3.1 – Estrutura de um Processo.

O contexto de hardware armazena o conteúdo dos registradores da CPU, como:


contador de programas (program counter); pilha (stack pointer); status. Quando em
execução, o conteúdo do contexto de hardware está armazenado nos registradores do
processador. Assim que saem do processador, essas informações são salvas no
contexto de hardware.
O processador, ao trocar um processo pelo outro, está efetuando uma troca de
contexto. Isso se faz salvando as informações do processo que está saindo do
processador e carregando as relativas ao processo que está entrando.

O contexto de software consiste em informações relativas às características e limites de


recursos que podem ser alocados pelo processo. Entre as informações disponíveis
estão: nome; identificador de processo ou PID (Process Identifier); identificador de
grupo ou UID (User Identifier); prioridade de execução; data e hora de criação; tempo
de processador; quotas; e privilégios.
Os identificadores (PID ou UID) permitem ao sistema operacional ou outros processos
fazerem referência ao processo em questão. As quotas impõem um limite de uso, como:
a quantidade de arquivos que se pode abrir; número máximo de operações de entrada
ou saída; tamanho de buffers; número máximo de subprocessos que podem ser criados.

O espaço de endereçamento é a área de memória associada ao processo. Nesse espaço


são alocados os endereços de memória utilizados. Esse item será abordado na Aula 4 –
Gerência de Memória.

Escalonamento
No item anterior, foram apresentados os estados de um processo (criação, execução,
espera ou bloqueado, pronto e terminado).

O processo é dito “em execução” quando está sendo processado na CPU. Em


computadores com uma única CPU, somente um processo estará em execução. 

Quando está no estado “pronto”, um processo está apenas aguardando a liberação do


acesso ao processador. De maneira geral, muitos processos podem estar no estado
pronto. Esses processos ficam então em uma fila de espera denominada lista
encadeada. Nessa lista, os processos prioritários terão privilégio no acesso ao
processador.

Durante seu ciclo de vida um processo passa por várias mudanças de estado. São elas:

 Pronto -> execução – Após ser criado o processo fica na lista de processos
prontos, aguardando sua vez de ter acesso ao processador.
 Execução -> espera – Um processo em execução passa para o estado de espera
por vários motivos, entre eles, o aguardo de uma operação de entrada ou saída.
 Espera -> pronto – O processo retorna ao estado pronto após a operação
solicitada ser concluída (por exemplo: entrada ou saída).
 Execução -> pronto – Quando terminado o tempo a que tem direito de utilizar o
processador. Havendo ainda processamento a ser feito, é colocado na fila de
prontos.

Como já se disse, nos sistemas operacionais atuais temos muitos programas em


execução ao mesmo tempo. Vimos ainda que, se o computador possui somente uma
CPU, somente um processo estará em execução ao mesmo tempo. Desse modo faz-se
necessária essa alternância entre os processos, em que cada qual tem uma fatia de
tempo antes de passar a vez para outro processo.

Ocorre que, muitas vezes, ainda durante o tempo de processamento, um processo


necessita parar por algum tempo. Isso pode ser dar em razão de estar aguardando o
retorno de um dispositivo de entrada ou saída, ou de alguma solicitação feita a outro
processo. Logo, é necessário liberar o processador, um precioso recurso, enquanto não
estiver sendo utilizado. Para isso temos o escalonador de processos.

O objetivo do escalonamento é otimizar a utilização do processador, de modo que o


processador esteja em uso o máximo do tempo possível. A finalidade dele é escolher
entre os processos na fila, que ganhará o acesso ao processador.

Processos Cooperativos
Os processos nos sistemas operacionais atuais podem ser independentes ou
cooperativos. Independente é quando sua execução não depende de interação com
nenhum outro processo. Cooperativo é quando sua execução depende dessas
interações.

Existem vários motivos para um processo ser cooperativo:

 Compartilhar informações – Uma dada informação é compartilhada por vários


processos e essa informação pode estar sendo modificada com o tempo.
 Agilizar a execução de tarefas – Para completar uma tarefa mais rapidamente,
um determinado processo pode criar vários subprocessos, sendo que cada qual
executará uma parte da tarefa, que será então consolidada pelo processo original.
 Modularizar solução – Um programa pode fazer uso de modularização para o
cumprimento das tarefas que lhe são delegadas. Dessa forma podem existir
módulos que podem, em dado momento, ser criados para cumprir determinada
tarefa.

Processos Independentes, Subprocessos


O que são processos independentes, subprocessos? Qual a finalidade de utilizá-los?

Como se viu, podemos ter diversos processos em execução simultaneamente no


computador. Esses processos podem ser totalmente independentes ou cooperativos.
Lembre-se ainda de que cada processo possui três componentes: contexto de
hardware; contexto de software; e espaço de endereçamento.

Considere que você utiliza um programa que efetua várias atividades ao mesmo tempo.
Esse programa pode ser para gerenciar seus e-mails. Por exemplo,
oOutlook ou Evolution. Neles, você pode ao mesmo tempo enviar, receber ou escrever
mensagens.
Cada uma dessas atividades pode ser implementada como um processo independente
em separado (modo mais fácil) ou como processos cooperativos, que utilizam melhor os
recursos computacionais.

Um processo pode criar outros subprocessos para executar tarefas que lhe são
delegadas. Cada novo subprocesso criado demanda a criação de um novo bloco de
controle de processo (contexto de hardware, contexto de software e espaço de
endereçamento). Essa operação de criação de processos é dispendiosa, do ponto de
vista computacional.

A Figura 3.2 mostra o esquema da criação de alguns subprocessos:

Figura 3.2 –
Estrutura de um Processo e seus Subprocessos.

Existe ainda uma terceira opção, denominada threads, que será vista no tópico
seguinte.
Threads
Conceito de Threads
Como vimos no tópico anterior, o processo de criação de processos é uma atividade
onerosa do ponto de vista computacional. Pode então surgir a seguinte questão: existe
algum modo mais fácil e rápido de criação de subprocessos?

A resposta é sim. Temos um novo elemento, denominado thread, que implementa uma


solução menos onerosa.
O que é thread? Como utilizá-la?
Tomemos o servidor web Apache como exemplo. Como todo servidor web, ele tem de
ser capaz de atender a vários usuários diferentes que podem estar acessando-o ao
mesmo tempo. Temos aqui uma solução muito interessante de como isso é feito.
Nesse caso, o servidor web cria um processo para cada requisição web que chega, ou
seja, para cada usuário que acessa o servidor é criado um processo para atendê-lo.
Agora, veja que as páginas em geral possuem um texto acompanhado de imagens. Para
acelerar o atendimento, é criada uma thread para transferir cada imagem. Temos,
desse modo, para cada usuário, um processo e várias threads executadas
simultaneamente.
Em resumo, em um ambiente com múltiplas threads, o conceito de um programa
associado a cada processo não é verdadeiro. O que temos é que cada processo tem pelo
menos uma thread, criando quantas mais forem necessárias para cumprir as atividades.
Uma thread é, então, uma sub-rotina que, em um programa, é chamada para cumprir
uma determinada tarefa.
Qual a diferença entre processos e threads?

Um processo possui seu próprio contexto de hardware, de software e espaço de


endereçamento (bloco de controle de processo), onde os espaços de endereçamento
são individuais e protegidos.

Threads compartilham esses espaços dentro de um mesmo processo. Isso permite que


a criação de threads dentro de um processo seja mais rápida e eficiente.

Múltiplas Threads
Uma grande quantidade de programas que utilizamos faz uso do recurso
de multithreads. Como já se disse, a criação de threads para execução de determinadas
tarefas é mais rápida do que a criação de processos adicionais, uma vez que não
precisamos criar novos blocos de controle de processo.
As threads dentro de um mesmo processo compartilham o contexto de software e o
espaço de endereçamento, tendo somente seu espaço de hardware individual.
Figura 3.3 – Processo com uma Thread e com Múltiplas Threads.

Assim, como os processos disputam o acesso ao processador, o mesmo acontece


com threads dentro de um mesmo processo. Desse modo, enquanto
umathread aguarda um retorno de dispositivo de entrada ou saída, outra assume o
processador.
Dentro de um mesmo processo, as threads podem acessar o espaço de endereçamento
umas das outras sem restrições, facilitando o trabalho cooperativo.
A título de comparação, se tivéssemos vários processos fazendo a mesma atividade (ao
invés de um único processo com várias threads), os processos não acessariam os
contextos e espaços um do outro. A troca de informações e dados entre eles se dá por
comunicação entre processos, ou seja, um processo tem que parar o que está fazendo
para passar informações a outro processo.
Logo, os benefícios de utilização de multithreads são: aumento da responsividade –
uma vez que o programa continua em execução mesmo que uma parte esteja em
estado de espera; compartilhamento de recursos – as threads compartilham o contexto
de software e espaço de memória de um processo; economia – a criação de threads é
menos onerosa do que a criação de outros processos; utilização de arquiteturas
multiprocessadas – nesse caso, as threadspodem estar em execução em diferentes
processadores.
Threads no Windows e Linux
Os sistemas operacionais Windows (desde o Windows 95) e Linux
implementam threads.
No Windows, cada programa é executado em um processo, sendo que cada processo
pode conter uma ou mais threads. Cada thread possui: um identificador de thread, que
identifica cada uma unicamente; um conjunto de registradores; uma pilha de usuários,
quando a thread está sendo executada no modo usuário, ou uma pilha do kernel,
quando a thread está sendo executada no modo kernel; área de armazenamento
privada, usada por bibliotecas diversas em tempo de execução e bibliotecas de vínculo
dinâmico ou DLL (Dynamic Link Libraries).
No Linux não há uma distinção entre processos e threads. Isso se dá em razão de como
o Linux implementa um processo (ou tarefa). O compartilhamento do espaço de
endereços é permitido em virtude de como o processo é representado no Kernel do
Linux.

Cada processo no Linux possui uma estrutura de dados exclusiva para ele. Todavia, a
estrutura de dados, ao invés de armazenar os dados, possui ponteiros para outras
estruturas de dados, onde eles realmente estão. Essas estruturas representam a lista de
arquivos abertos, de memória virtual etc.

Existem sinalizadores (flags) que indicam quanto do processo (pai) pode ser
compartilhado com os subprocessos (processos filho). Se os sinalizadores estiverem
desligados, naquele processo pai não haverá compartilhamento; se estiverem ligados,
haverá o compartilhamento; se parte deles estiver ligada e parte desligada, haverá o
compartilhamento parcial dos recursos.

Comunicação Interprocessos

Segundo Plano
Um processo pode estar em execução de dois modos diferentes: primeiro plano
(ou foreground); segundo plano (ou background).

O que define se um processo é de primeiro plano ou de segundo é a interação com seus


canais de entrada e saída, que podem ser: teclado, mouse, monitor, impressoras,
arquivos ou outros processos.

O processo é dito de primeiro plano, quando permite a comunicação com o usuário


enquanto executa. Geralmente a entrada é por meio de um teclado ou mouse, enquanto
que a saída pode ser o monitor ou impressora. É o caso de um usuário que está
utilizando um editor de texto.

Um processo em segundo plano não possui comunicação com o usuário durante o


processamento. Como exemplo, podemos considerar o agendador de tarefas, no
Windows, ou o Cron, no Linux.

Seção Crítica
Um conceito importante é o de seção crítica. Ele diz respeito a um trecho de código em
execução pela thread, durante o qual não pode haver acessos por parte de
outras threads como, por exemplo, quando está escrevendo em um arquivo.
Assim, quando uma thread está executando uma seção crítica, nenhuma
outra thread pode executar sua própria seção crítica, o que é conhecido como exclusão
mútua. O grande problema é criar um algoritmo que permita que as threads possam
executar cooperativamente e sem conflitos, em razão dessas seções críticas.
Existem três considerações que devem ser feitas: somente uma thread pode estar em
sua seção crítica; escalonamento de qual thread poderá entrar em sua seção crítica,
quando mais de uma deseja fazê-lo; controle de quantas vezes uma
determinada thread fez uso de sua seção crítica, evitando-se assim que esse acesso
privilegie umas seções em detrimento de outras, causando o que é conhecido
por starvation.

Semáforos
A sincronização de processos é um assunto extremamente importante no estudo de
sistemas operacionais. O acesso aos recursos, controlado pelo sistema operacional,
pode cair em algumas armadilhas se a sincronização não for efetuada corretamente.

O conceito de semáforo foi proposto por Dijkstra, em 1965, com o objetivo de criar um


mecanismo de exclusão mútua e sincronização entre os processos. O recurso é utilizado
na maior parte dos sistemas operacionais atuais e em linguagens de programação.

Os semáforos podem ser: do tipo binário, quando podem assumir somente os valores 0
(zero) ou 1 (um); do tipo contador, no qual podem assumir qualquer valor positivo e 0
(zero). Aqui nos restringiremos ao funcionamento do semáforo binário.

Semáforo binário
O semáforo tem valor 0(zero) ou 1 (um). O valor 0 (zero) indica que algum processo
está acessando sua região crítica, enquanto o valor 1 (um) indica que nenhum processo
está em sua região crítica.

O semáforo é manipulado pelas instruções DOWN e UP. Caso um processo deseje entrar


em sua região crítica, este aciona a instrução DOWN.
A instrução DOWN decrementa a variável, enquanto a instrução UP incrementa uma
unidade à variável.
Assim, se o semáforo estiver com valor 1 (um) e um processo necessita entrar em sua
região crítica, este chama a instrução DOWN. O valor do semáforo é decrementado e o
processo executa sua região crítica.

Se, por outro lado, o valor do semáforo for 0 (zero), o processo fica impedido de entrar
na região crítica e fica em espera.

Quando o processo sai de sua região crítica, executa a instrução UP, tornando o valor
do semáforo 1 (um) e liberando o acesso a outros processos.

Problemas Típicos de Sincronismo


No item anterior, você pôde ver como o semáforo é utilizado para lidar com questões de
sincronismo. Todavia, existe um problema clássico de sincronização que você deve
compreender: é o problema dos filósofos.

Problema dos filósofos


O problema dos filósofos, também conhecido como “o jantar dos filósofos”, consiste na
seguinte situação:
Numa mesa de jantar, onde estão sentados cinco filósofos, estão disponíveis cinco
pratos e cinco garfos. No centro da mesa há uma tigela com arroz. Cada vez que um
filósofo pára de pensar e vai comer, necessitará de dois garfos. Se cada filósofo pegar
um garfo ninguém conseguirá comer, uma vez que são necessários dois garfos. Esse
problema é conhecido como deadlock (descrito brevemente na Aula 1).

Existem três possibilidades para permitir um funcionamento adequado do jantar, são


elas:

 limitar a quatro o número de filósofos na mesa. Todavia, isso resolve apenas


parcialmente o problema;
 o filósofo somente pode pegar um garfo se o outro estiver disponível;
 permitir que o filósofo ímpar pegue primeiro o garfo situado à esquerda e depois
o situado à direita, enquanto o filósofo par efetua o inverso.
Veja que, qualquer que seja a solução, não há um controle de escalonamento; logo, não
há nada que impeça um dos filósofos de morrer de fome (starvation).

Monitores
Monitores utilizam uma forma mais sofisticada de controle de sincronização do que o
semáforo. É considerado um mecanismo estruturado. A utilização de monitores no
desenvolvimento de programas é mais fácil do que semáforos, dando menos chances de
que o programador cometa um erro.

O monitor consiste em módulos; cada módulo é constituído de procedimentos e


variáveis; cada região crítica é definida como procedimento no monitor.

Nessa solução, somente um processo pode chamar um dos procedimentos do monitor.


Caso já exista algum acesso, os demais processos aguardam em uma fila.

Transações Atômicas
Transação atômica consiste em garantir que uma determinada operação seja executada
no seu todo ou que nenhuma parte seja executada.

Em muitos sistemas, a simples exclusão mútua de regiões críticas garante a coerência


dos resultados, não importando a ordem em que sejam executadas.

Todavia, a garantia de execução de ambas é essencial.

Um exemplo clássico disso é a transferência de recursos entre duas contas bancárias.


Essa operação consiste em duas operações básicas: efetuar o saque de uma das contas
e efetuar o depósito na outra.

Para que não haja problemas para o banco, as duas operações devem ser efetuadas.
Efetuar somente o saque de uma das contas ou simplesmente o depósito na outra, não
é uma opção.
Devem existir então técnicas para que caso ocorram problemas com uma das ações, a
outra seja automaticamente desfeita.

Deadlocks
Conceito de Deadlock
Deadlock pode ser definida como uma situação em que um processo aguarda por um
evento que não acontecerá. Isso se dá, sobretudo, em razão de problemas de
compartilhamento de recursos, em especial quando se usa exclusão mútua.
Na Aula 1, abordamos o conceito de deadlock, situação na qual dois processos ficam
bloqueados, um esperando pela liberação de um recurso alocado pelo outro. A seguir é
apresentada uma figura que ilustra um exemplo de deadlock.

Figura 3.4
– Deadlock – Espera Circular.

Para que uma deadlock aconteça são necessárias quatro condições. São elas:


 Problema com exclusão mútua – Nesse caso, um recurso já está alocado para
um processo.
 Espera por um recurso – Um processo que alocou um recurso aguarda outro
recurso sem liberar o primeiro recurso já em uso.
 Recurso não preemptivo – incapacidade do sistema operacional de alternar o uso
do recurso entre os processos que o necessitam, ou seja, um recurso já alocado
por um processo não pode ser alocado para outros que necessitam.
 Espera circular – um processo com um recurso já alocado espera pela liberação
do recurso alocado por outro processo, enquanto o outro processo aguarda a
liberação do recurso ocupado pelo primeiro processo.
Quanto mais são utilizados os recursos de processamento paralelo, maiores são as
chances de esse tipo de problema ocorrer. Nos itens a seguir, serão abordadas a
prevenção, detecção e recuperação de deadlocks.
Prevenção de Deadlock
A prevenção da ocorrência de deadlock passa por ações que impeçam uma das quatro
condições necessárias para uma deadlock ocorrer.
A eliminação da primeira condição citada – problema com exclusão mútua – impede que
uma deadlock ocorra. Isso se deve ao fato de que um processo não terá de aguardar
por um recurso alocado por outro processo.
Em relação à segunda condição – espera por recurso – o melhor modo de preveni-la é
garantir que um processo somente possa alocar todos os processos que necessitará ao
mesmo tempo. Porém, essa abordagem pode levar o processo ao problema
de starvation, ou seja, essa condição pode nunca ocorrer e o processo pode ficar parado
“eternamente”.
A terceira condição – recursos não preemptivos – pode ser eliminada se um processo
puder alocar um recurso já alocado por outro. Embora impeça o problema de não
preempção, pode levar alguns processos ao problema de starvation, pois um processo
pode liberar um recurso sem ter terminado seu uso e demorar a consegui-lo de volta.

A quarta condição – espera circular – pode ser evitada se for permitido que um
processo somente solicite um novo recurso se liberar o recurso já em uso.

Apesar de a proposta de impedir uma das quatro condições de ocorrer resolver


teoricamente o problema do deadlock, na prática, esse problema ainda pode ocorrer em
razão de situações adversas não previstas.
Detecção de Deadlock
O recurso de detecção de deadlock é utilizado em sistemas operacionais que não
tenham mecanismos de prevenção de deadlocks, permitindo que sejam identificados os
processos e recursos envolvidos no problema.

Funciona baseado em estruturas de dados capazes de identificar os recursos do


sistema, os processos que os alocaram e os processos que estão aguardando a
liberação de algum desses recursos já em uso.

O funcionamento desses recursos geralmente se baseia em detectar a ocorrência de


espera circular. Todavia, como o tempo de detecção varia conforme a implementação
desse algoritmo, deve-se ter cuidado ao utilizá-lo em sistemas operacionais baseados
em tempo real. Exemplo: sistemas utilizados em controle industriais, inclusive
indústrias químicas e nucleares, além de tráfego aéreo e outros.

Recuperação de Deadlock
A recuperação de um deadlock pode utilizar duas técnicas: eliminar um dos processos
na espera circular; suspender um dos processos na espera circular, liberando o recurso
do mesmo.
A primeira técnica – de eliminação de um dos processos – é sem dúvida a mais simples
e rápida. Todavia, pode causar problemas para a aplicação que o utiliza. Já a segunda
técnica – suspender o processo – embora mais trabalhosa, permite resolver o problema
sem provocar erros nos processos envolvidos. Nela, um dos processos é suspenso, seu
recurso liberado e, depois de utilizado pelo outro processo, é devolvido ao primeiro
processo, então reativado. Essa segunda técnica é denominada de rollback.
Nesta aula, você pôde estudar o gerenciamento de processos, cujo objetivo é
compreender e visualizar como é a manipulação dos mesmos pelo sistema operacional.
Inicialmente foram abordados os conceitos de processos e de escalonamento dos
mesmos e de seu funcionamento cooperativo. Na seqüência foi apresentado o conceito
de thread. Você pôde então perceber que uma thread é criada e iniciada mais
facilmente pelo sistema operacional. Nesse caso, um processo pode ter uma ou mais
threads que compartilham recursos no cumprimento de suas atividades.
Nos itens seguintes – associados à comunicação interprocessos e deadlocks – foram
apresentados conceitos e algumas situações-problema. Foram em seguida apresentadas
as soluções típicas para resolvê-los.
Com isso, espera-se que tenha sido cumprido o objetivo desta aula, que foi ensinar
sobre como melhorar a utilização do processador, permitindo que muitos processos (e
threads) possam compartilhá-lo, inclusive em ambientes multiprocessados.

Aplicando o Conhecimento
1. O que é um processo?
2. Por quais estados passa um processo? Explique cada um.
3. Quais as partes que compõem um processo?
4. O que são threads?
5. Em quais situações é vantajoso utilizar threads?
6. O que é um processamento em primeiro plano e em segundo plano?
7. Em que consiste uma seção crítica? Como a utilização de semáforos pode
ajudar?
8. O que é um deadlock? Quais as formas de prevenção?

Para Refletir
a. Como implementar concorrência em um ambiente monothread?
b. Qual a vantagem de compartilhamento do espaço de endereços entre
as threads de um mesmo processo?
c. O sistema operacional que você utiliza em seu computador utiliza processos
e threads? Quantos processos e threads estão em execução neste momento?

Aula 04 - Gerência de Memória


O gerenciamento de memória é um assunto sempre presente no estudo dos sistemas
operacionais. Sempre foi considerado um recurso escasso e caro e, mesmo com a
redução de preços que temos atualmente, ainda é um recurso disponível em quantidade
limitada na máquina.
Então, em razão dessas limitações, temos que ter um gerenciamento adequado de seu
uso. Esse fato se torna ainda mais importante à medida que os sistemas operacionais
atuais lidam com uma quantidade cada vez maior de programas em execução,
simultaneamente.
Na aula anterior, vimos que os processos precisam alocar áreas na memória para que
possam funcionar. Veremos agora como é feita essa alocação, além de outras ações,
tais como: swapping (troca), paginação, segmentação e memória virtual.
O objetivo é que, ao final desta aula, você compreenda a finalidade do gerenciamento
de memória, incluindo o princípio de funcionamento das ações citadas.

Conceitos Iniciais de Gerência de Memória


Em um sistema computacional existem dois tipos de memória: a principal – a ser
tratada nesta aula; a secundária – que cuida do armazenamento de dados em
dispositivos auxiliares como discos rígidos, memórias flash ou fitas.

Existem algumas características importantes que você deve saber neste momento. A
primeira é que o processador somente executa instruções que estejam armazenadas na
memória principal. A segunda é que o tempo de acesso à memória secundária é muito
mais alto do que o de acesso à memória principal.

Assim, é interessante que a memória principal seja suficiente para todos os processos
em execução. Caso contrário, o sistema terá que descarregar para a memória
secundária os dados referentes a um processo que não esteja mais em execução, de
modo a permitir que os dados de outro processo sejam carregados na memória
principal. Essa ação é denominada swapping (troca) e será abordada a seguir.

Desse modo, no gerenciamento da memória, o sistema operacional deve fazer o melhor


uso possível da memória principal, inclusive minimizando o número de operações de
entrada e saída de dados na memória secundária.

Troca de Processos (Swapping)


A técnica de troca de processos, ou swapping, disponível nos sistemas operacionais
atuais, permite que um sistema operacional utilize mais memória do que a disponível na
memória principal.

Conforme mencionado anteriormente, todos os processos em execução devem ter seus


espaços de endereçamento presentes na memória principal. Hoje em dia, com a
utilização da multiprogramação, temos em um dado sistema operacional dezenas ou
centenas de processos em execução. Em muitos casos a memória principal torna-se
insuficiente para lidar com todos eles.

Para lidar com esse problema surgiu a técnica de swapping. Por meio dessa técnica o
sistema decide qual processo será removido da memória principal e transferido para a
memória secundária que pode ser, por exemplo, um disco rígido. A essa operação é
dado o nome de swap out.
Figura 4.1 –
Utilização de Área de Troca (Swap).

Em outro momento, o processo removido para a memória secundária pode ser


transferido de volta para a memória principal; a isso se dá o nome de swap in.
Para que funcione adequadamente o swapping, deve utilizar-se um algoritmo que
priorize a transferência de processos menos sujeitos de serem executados em um
instante próximo. Com isso, evita-se que um processo recém-removido venha a ter que
ser recolocado imediatamente.
Sistemas operacionais que implementam essa troca de processos devem ter o recurso
de relocação dinâmica de programas. Isso é necessário porque, quando há o retorno à
memória principal, a posição já não é mais a mesma que ocupava anteriormente, sendo
então necessário que essa nova posição seja informada ao carregador (loader) que
efetua essa relocação.
Considere que, apesar de permitir a execução de mais processos do que a máquina
suportaria, introduz-se uma perda de desempenho considerável, que é tanto maior
quanto maior for a quantidade de memória secundária necessária ao processo de swap.
Quando a quantidade de memória principal é muito menor do que a necessária, pode-se
observar que a máquina fica sobrecarregada, efetuando operações de troca o tempo
todo. Isso ocasiona, como se disse, perda considerável de desempenho, o que pode
muitas vezes ser evidenciado pela quantidade excessiva de acessos (de leitura e
escrita) no disco rígido.

Alocação de Memória Contígua

Alocação de Memória
Para que você possa compreender como funciona a alocação de memória, é
interessante entender antes alguns conceitos: alocação contígua simples; overlay;
proteção de memória.

Na alocação contígua simples, presente nos primeiros sistemas operacionais, que eram
monoprogramáveis, a memória é dividida em duas partes. A primeira, dedicada ao
sistema operacional e a segunda, ao programa. Em geral, eram acompanhadas de um
registrador que limita o acesso do usuário à área para programa.

Figura 4.2 – Utilização de Memória Principal.

Em relação ao overlay, anteriormente, um programa estava limitado ao tamanho da


memória disponível, o que limitava muito o programador. O overlaypermitiu a utilização
de um recurso importante, que é o uso de um processo que necessite de uma área de
memória maior do que a disponível para ele.
Desse modo, o overlay permite que um processo carregue na memória apenas parte
das instruções e dos dados, justamente os que serão necessários naquele momento. À
medida que as primeiras instruções forem sendo utilizadas, elas vão sendo
descarregadas e substituídas pelas próximas. Logo, um processo que necessite de 200
KB pode ser utilizado quando o limite disponível para cada processo seja de 150 KB.

Figura 4.3 – Utilização


de Memória Principal – Técnica de Overlay.
A proteção de memória é outro conceito importante. Sua finalidade é a proteção do
sistema operacional contra o acesso indevido a processos do usuário, assim como
prevenir a interferência de um processo na memória de outro. Esse controle é feito pela
utilização de um registrador, que contém o menor endereço físico e o intervalo de
endereços lógicos. Desse modo, o endereço a ser utilizado está no intervalo entre esses
dois valores.

O controle do acesso aos endereços nesse intervalo é feito por um dispositivo


denominado Unidade de Gerenciamento de Memória (Memory ManagementUnity -
MMU). O MMU efetua um mapeamento entre o endereço lógico e o endereço físico
realmente utilizado para armazenar os dados na memória principal. A figura a seguir
ilustra esse funcionamento.

Figura 4.4 – Relocação


Dinâmica.

O processo do usuário não visualiza os endereços físicos utilizados, ele simplesmente


tem um ponteiro direcionado para um local cuja associação com a localização real
(física) é feita pelo MMU. O processo do usuário entende que está acessando endereços,
por exemplo, entre 0 (zero) até M (máximo), enquanto o MMU converte esses
endereços para algo do tipo: R+0 até R+M.

Fragmentação de Memória
Um aspecto importante em memória é o conceito de fragmentação. Mas o que é
fragmentação?

Lembre-se de que o sistema operacional mantém uma tabela com a alocação da


memória, ou seja, onde está o quê. Nesse conceito, o sistema tem as informações sobre
quais trechos da memória estão ocupados e quais estão livres.

Considere que um processo entra em execução; ele precisará de um espaço de


memória que possa utilizar. O sistema procura um espaço livre onde possa colocá-lo e
continua a fazer assim para cada processo que precisar de memória.
Em um dado momento, algum processo não mais necessitará da memória alocada e o
sistema a liberará. Perceba então que, aos poucos, começarão a surgir espaços
(buracos) na memória.

Outros processos que venham a surgir serão colocados pelo sistema operacional nesses
espaços. Nesse momento, o sistema procura por um espaço grande o suficiente para
alocar. Caso não haja um espaço grande o suficiente, o sistema alocará parte da
memória em um espaço e parte em outro espaço. Ocorre então o que chamamos de
“fragmentação de memória”.

Existe um meio de eliminar essa fragmentação?

Não, se a alocação de memória for estática. Porém, se a alocação de memória for


dinâmica, essa desfragmentação pode ser feita.

Utilizando a alocação dinâmica podemos fazer uso de um algoritmo que efetua a


movimentação dos processos para os espaços disponíveis em uma extremidade da
memória e a movimentação dos espaços (buracos) para a outra extremidade. A cada
movimentação de processo, o registrador é atualizado para refletir a nova posição.

Alternativas podem ser utilizadas com paginação ou segmentação. Esses dois conceitos
são abordados nos itens seguintes.

Memória Virtual
Como vimos, os programadores e os sistemas há muito lidam com programas maiores
do que a memória. Você viu as técnicas de swapping, que utiliza a memória secundária
como apoio, e a de overlay, que carrega partes do processo que necessitem de mais
espaço do que o estabelecido como tamanho de bloco.

A memória virtual se tornou uma técnica em que partes de um programa podem estar
em memória e o resto no disco. Você verá a seguir algumas técnicas adicionais que
visam otimizar o uso da memória fazendo uso desse recurso.

Paginação
A paginação consiste em permitir que o espaço de endereçamento seja não contíguo.
Ela resolve alguns problemas. Um deles é que a fragmentação ocorrida na memória se
dá também na memória secundária (por exemplo: disco). Logo, quando algum
fragmento de código ou dados da memória principal precisar ser retirado, esse espaço
precisará ser localizado também no armazenamento secundário. Ocorre que o acesso
nesse tipo de armazenamento é mais lento.

Como funciona a paginação?


A paginação divide a memória física em blocos de tamanho fixo, também denominados
quadros. Um processo que entre em execução tem suas páginas carregadas em quadros
disponíveis na memória.

Observe que o armazenamento secundário (disco) também é dividido em blocos que


possuem tamanho igual aos dos quadros de memória.

O funcionamento pode ser representado pela figura a seguir:

Figura
4.5 – Paginação.

Cada endereço gerado é dividido em duas partes: um número de página (p) e um


deslocamento de página (d). O primeiro é utilizado como um índice para a tabela de
páginas; o segundo é utilizado como deslocamento.

A tabela de páginas contém o endereço denominado “endereço de base” de cada


página. O endereço de base é combinado ao deslocamento para definir o endereço na
memória, em um sistema semelhante ao descrito anteriormente, no item “Alocação de
Memória” (R+0 e R+M).

Os tamanhos de página, sempre uma potência de 2, variam entre 512 bytes e 16 MB,
conforme a arquitetura do computador utilizado.

Em geral, o suporte à paginação é feito por hardware; entretanto, em alguns sistemas


operacionais, em especial os mais novos de 64 bits, possuem parte da paginação
implementada em software.
Considere o seguinte exemplo teórico (Figura 4.6):

 Tamanho de página – 4 bytes.


 Memória física – 32 bytes (equivalente a 8 páginas).

Figura 4.6 – Paginação


para uma Memória de 32 bytes e Páginas de 4 bytes.

Veja as seguintes situações:

Antes, atente para que:

 Os quadros (na memória lógica) estão numerados de 0 (zero) a 3 (três).


 Os quadros (na memória física) estão numerados de 0 (zero) a 7 (sete).
 A tabela de página efetua a associação entre a posição na memória lógica e
memória física.
Situação 1 - A página 0 (zero) está no quadro 5
 Logo, o endereço lógico 0 (zero) está mapeado para o endereço físico 20
(quadro 5). Ou então (5x4)+0 = 20.
 Já o endereço lógico 3 (três) está mapeado para o endereço físico 23 (quadro
5). Ou então (5x4)+3 = 23.
Situação 2 - A página 1 está no quadro 6
 O endereço lógico 4 está mapeado para o endereço físico 24 (quadro 6). Ou
então (6x4)+0 = 24.
Situação 3 - A página 2 está no quadro 1
 O endereço lógico 8 está mapeado para o endereço físico 4 (quadro 1). Ou então
(1x4)+0 = 4
 O endereço lógico 9 está mapeado para o endereço físico 5 (quadro 1). Ou então
(1x4)+1 = 5

Dedique um tempo a compreender o que está colocado nas situações anteriores. Assim
que você perceber que cada quadro da memória lógica foi colocado em um quadro da
memória física e que o mapa disso está na tabela de página, é sinal de que você está
compreendendo o significado de paginação.

Algumas considerações sobre paginação e fragmentação


No exemplo anterior, foram apresentados exemplos de paginação. Veja que as páginas
foram preenchidas completamente. Na prática podemos ver o que é chamado de
fragmentação interna.

Fragmentação interna significa um processo que dificilmente ocupa completamente


todas as páginas alocadas. Por exemplo: um processo que necessita de 102950 bytes;
considerando uma página de 4096 bytes, seriam necessárias 25 páginas completas e
mais 550 bytes, o que significam 26 páginas, sendo que a última teria ocupados
somente 550 dos 4096 bytes disponíveis; logo, na última página sobram 3546 bytes.

Desse modo, um processo pode alocar “n páginas + 1 byte”, o que significa que o
fragmento teria praticamente o tamanho da página.

Esse raciocínio leva a crer que, quanto menor a página, menores os fragmentos. Porém,
a tabela de páginas aumentaria, uma vez que a quantidade de páginas a gerenciar
aumentaria. Valores razoáveis para o tamanho de página atual variam de 4KB a 8KB.

Substituição de Página
A substituição de página consiste em uma técnica de substituição quando não houver
mais nenhuma página livre na memória principal.

O sistema operacional deve decidir quais páginas devem ser retiradas. Caso as páginas
a serem removidas não tenham sofrido alterações e estejam de acordo com a cópia na
memória secundária, elas são então removidas. Se houve modificações, estas têm que
ser salvas no disco antes de removidas da memória.
A identificação de quais páginas foram alteradas é feita através de um bit que identifica
se a página sofreu alteração.

Duas possibilidades podem ser utilizadas para decidir quais páginas serão removidas:
substituição local e substituição global. Na primeira, as páginas escolhidas estão entre
as utilizadas pelo processo que necessita de páginas adicionais. Na segunda, as páginas
escolhidas podem estar entre todas utilizadas pelo sistema operacional.

Segmentação
A segmentação é uma técnica de gerenciamento de memória em que os blocos de
memória possuem tamanhos diferentes.

Em geral, essa alocação é feita pelo compilador, o qual, a partir do código fonte, decide
o que cada bloco irá conter: procedimento, função, vetor ou pilha. Essa alocação pode
ser feita dinamicamente durante a execução. Isso permite que uma sub-rotina seja
modificada, sem a necessidade de se recompilar o programa todo.

O mapeamento do endereço é similar à paginação e utiliza um mapa que identifica os


blocos (ou segmentos) da memória virtual com os blocos da memória principal. O
sistema operacional mantém ainda uma tabela indicando as áreas livres e ocupadas.

Havendo um novo bloco a ser carregado, o sistema operacional aloca um espaço


suficiente para caber os dados em questão.

Enquanto na paginação ocorre o problema de fragmentação interna – dentro de cada


página, uma vez que a paginação divide os dados em blocos de tamanho fixo – na
segmentação se dá a fragmentação externa, já que não sobra espaço no bloco, uma vez
que os blocos são de tamanho variável.

Porém, podem sobrar espaços na memória principal e estes podem não ser suficientes
para alocar um novo processo. É necessário, então, realocar os segmentos na memória,
com a finalidade de reunir os vários pequenos espaços, o que pode vir a servir para
algum outro bloco a ser carregado.

A segmentação permite ainda o compartilhamento de dados da memória, pois permite


que mais de um processo aponte para um mesmo segmento na memória.

Nesta aula, você estudou como o sistema operacional efetua o gerenciamento da


memória. Foram abordados os conceitos mais importantes relativos ao tema, entre
eles: swapping, fragmentação, memória virtual, paginação e segmentação.
Cada um desses recursos permite ao sistema operacional um melhor uso dos recursos
da máquina, ou seja, tanto da memória principal, quanto da memória secundária.
Assim, procura-se fazer o melhor uso de técnicas que permitam que se utilize mais
memória do que a fisicamente existente em sua memória principal, permitindo aos
sistemas operacionais atuais lidarem com uma grande quantidade de processos em
execução simultaneamente na máquina. 
Até aqui, você já estudou, além dos conceitos básicos, a gerência de processos e de
memória, todos eles de fundamental importância no aprendizado de sistemas
operacionais.
Na próxima aula, serão vistos tópicos relativos ao gerenciamento de dispositivos de
entrada e saída. Então, você poderá relembrar alguns dos conceitos da disciplina de
Arquitetura de Computadores, que servirão de base para o estudo dos sistemas de
arquivos. Por fim, você passará aos estudos de caso em dois sistemas operacionais
muitos utilizados atualmente.

Aplicando o Conhecimento
1. Qual a função da gerência de memória?
2. O que é swapping? Explique swap out e swap in.
3. O que é endereço físico e endereço lógico?
4. O que é overlay?
5. O que é fragmentação interna e fragmentação externa?
6. O que é memória virtual?
7. O que é paginação? Qual a finalidade em utilizá-la?

Para Refletir
Verifique se o sistema operacional utilizado em seu computador utiliza os conceitos
apresentados nesta aula. Verifique:

a. Se utiliza área de troca. Se sim, qual o tamanho?


b. Se utiliza paginação. Se sim, qual o total de páginas utilizadas? Quanto de
espaço ocupa?

Aula 05 - Gerência de E/S


O gerenciamento de dispositivos de entrada e saída (E/S) é uma atividade bem
importante em um sistema operacional, pois cuida dos aspectos relacionados com os
dispositivos de E/S de um modo transparente ao usuário. Oferece, assim, uma interface
mais simples para o usuário.
Os equipamentos associados ao processo de E/S são os mais diversos possíveis, como
teclado, mouse, monitor, impressora, pendrive etc. Como você viu na disciplina de
Arquitetura de Computadores, têm características bem diversas – velocidade, formato
dos dados – porém, são todos muito mais lentos do que o processador e a memória.
Assim, o objetivo desta aula é fazer você compreender como o gerenciamento de
dispositivos de E/S lida com essas questões, permitindo ao sistema operacional não
perder tempo aguardando os dispositivos de E/S e, ao mesmo tempo, lidando com as
questões de diversidade entre eles.

Conceitos de Entrada e Saída


O gerenciamento de dispositivos de E/S, em razão de sua complexidade, é dividido em
camadas. Nas camadas inferiores é feito o controle dos dispositivos, enquanto que as
camadas superiores oferecem uma interface mais simples para que os usuário ou
aplicações possam interagir com os dispositivos.

De outro modo, pode-se raciocinar que as camadas inferiores dependem dos


dispositivos que controlam. Já as camadas superiores funcionam independentes dos
dispositivos.

Cabe ao sistema operacional facilitar o acesso a esses dispositivos. São utilizadas para
isso rotinas de entrada e saída, que permitem aos usuários e aplicações efetuar as
operações de entrada e saída independentemente do dispositivo que está sendo
acessado.

Figura 5.1 –
Gerenciamento de Dispositivos.

Assim, o usuário ou aplicativo pode ler ou gravar, em um dado dispositivo – por


exemplo um disco, um CDROM ou pendrive – sem se preocupar com detalhes do
dispositivo, como o local no disco em que isso será feito ou informações de formatação
(trilha, setor).
Têm-se então operações de E/S que, sendo independentes do dispositivo, podem ser
realizadas para qualquer um deles. A essas operações se dá o nome desystem calls, ou
chamadas de sistema.
A figura a seguir mostra como são organizadas as operações de E/S, desde a aplicação
até a chegada ao dispositivo.

Figura 5.2 – Operações de Entrada e Saída.

As chamadas de sistema eliminam a necessidade de incluir no código das aplicações as


instruções para acesso a cada um dos tipos de dispositivos. Cabe, então, ao sistema
operacional lidar com os detalhes associados a cada tipo.

Observe a Figura 5.1. Você perceberá elementos independentes do dispositivo,


implementados em software e já presentes no sistema operacional. Verá ainda alguns
elementos dependentes do dispositivo, sendo alguns implementados em software,
outros em hardware, geralmente incorporados ao sistema operacional na instalação
desses dispositivos.

As operações de E/S podem ser do tipo síncrona ou assíncrona. Na primeira, o processo


que solicitou a operação fica aguardando o seu término; já na segunda, o processo
continua o que estava fazendo enquanto aguarda uma sinalização de que a operação foi
concluída.

As operações relativas ao sistema de arquivos serão vistas na próxima aula, no estudo


do sistema de arquivos.

Os itens subseqüentes – device drivers, controladores e dispositivos de E/S – serão


abordados a seguir.
Subsistema de Entrada e Saída
O subsistema de entrada e saída, também denominado de módulo de entrada e saída, é
responsável por algumas atividades genéricas, ou comuns, a todos os dispositivos. Já as
atividades específicas ficam a cargo dos drivers ou device drivers.

Entre essas atividades estão: controle de temporização – tem por função compensar as
diferenças de velocidade entre o processador e o dispositivo; interligação do dispositivo
ao processador – objetiva prover um maior compartilhamento entre os usuários e um
mecanismo de proteção; armazenamento temporário de dados – agrupa os dados, em
geral lidos byte a byte (ou bit a bit), para serem transferidos em blocos para a
memória; detecção de erros – mecanismo de controle de acesso ao dispositivo, para
torná-lo mais seguro e confiável.

Assim, os subsistemas de E/S devem organizar o acesso ao dispositivo. Caso o


dispositivo seja compartilhado (exemplo: disco compartilhado) deve organizar o acesso,
procurando evitar conflitos durante as etapas de leitura ou escrita, solicitadas por
processos diversos. Caso o dispositivo seja de acesso exclusivo (exemplo: impressora)
deve prover um mecanismo de ordenação e controle de acesso.

Logo, o subsistema de E/S é o responsável por prover um mecanismo de proteção no


acesso aos dispositivos, verificando, por exemplo, a permissão de acesso.

Cabe ao subsistema padronizar a comunicação com os device drivers, ou programas,


que acompanham os dispositivos e são necessários para que funcionem corretamente.
No item a seguir, você obterá mais informações sobre eles.
Drivers
Você já deve ter, em algum momento, ouvido falar de drivers. Isso ocorre, geralmente,
quando vamos conectar um novo periférico ao computador. Entre esses equipamentos
estão: impressora; monitor; placa (de rede, vídeo ou outra); gravador de CD ou DVD.
Mas o que são drivers?
Drivers são programas que têm por função possibilitar a comunicação entre o
subsistema de E/S e o controlador do dispositivo. A figura a seguir ilustra a relação
entre eles.
Figura 5.3 – Interação entre Subsistema de
E/S, Drivers e Controladores.

Cabe aos drivers receber comandos de ações destinadas aos dispositivos e solicitações


de leitura ou escrita, convertendo-os em comandos específicos a serem executados pelo
controlador do dispositivo.

Figura
5.4 – Driver de Disco.

Um driver é específico para um tipo de dispositivo ou dispositivos semelhantes. Por


exemplo: podemos ter um driver para controlar o vídeo, outro para uma unidade de
CDROM, outro para uma determinada impressora ou grupo de impressoras similares.
A seqüência de funcionamento começa pelo processo, que encaminha a solicitação ao
subsistema de E/S. A seguir, o driver envia a instrução específica ao controlador do
dispositivo, que finalmente coordena seu funcionamento.
Considere que o dispositivo controlado seja um disco. Cabe ao driver receber do
subsistema de E/S a solicitação de leitura de um bloco. A seguir, o driverpassa ao
controlador a informação sobre qual disco, cilindro, trilha e setor. Nesse instante o
processo ou a thread associada, fica aguardando a interrupção que indica que a
operação foi executada ou, na ocorrência de falha, esta é informada ao subsistema de
E/S.
Como se viu na Figura 5.1, é grande a integração entre os drivers e o kernel (núcleo)
do sistema operacional. Desse modo, muitos drivers depois de instalados solicitam que
o sistema operacional seja reiniciado.

Controladores
Os controladores de dispositivos são elementos pertencentes ao hardware da máquina e
são responsáveis por receber a informação do driver e, em seguida, operar diretamente
o dispositivo.

Possuem memória e registradores e, ao receberem as instruções, liberam o processador


enquanto efetuam a transferência dos dados, informando ao processador (processo),
por meio de uma interrupção, que a operação foi concluída. Essa etapa é necessária
para liberar o processador, que tem que ficar aguardando a transferência dos dados,
pois, como vimos, o processador é muito mais rápido do que os dispositivos de E/S.

Um dos elementos presentes nos controladores que possibilita essa ação é o Acesso
Direto à Memória (DMA – Direct Memory Access).

Figura 5.5 –
Memória, Controladores e Dispositivos.

Dispositivos de Entrada e Saída


Os dispositivos, como já se disse, podem ser de entrada ou saída. Temos dispositivos
que são unicamente de entrada (teclado e mouse), os que são de saída (como monitor
e impressora) e, ainda, os que realizam as duas funções como uma unidade de leitura e
gravação de CDROM.

Outra classificação importante é se são dispositivos de bloco (block devices) ou de


caracteres (character devices). Os primeiros se caracterizam pela transferência da
informação em unidades denominadas blocos; é o caso dos discos rígidos. Nessas
situações, a informação está organizada no dispositivo (estruturada), podendo,
portanto, ser localizada a partir de um endereço.

Já nos de caracteres, a informação é transmitida em unidades menores, (caracteres).


Essas informações não estão organizadas (não estruturadas), não sendo, portanto,
endereçadas.

Discos
Os discos rígidos, também denominados de hard disk drive ou mesmo winchester, são
em muitos casos os dispositivos mais acessados. Isso ocorre por duas razões. Uma
delas é o armazenamento dos dados dos usuários e programas em virtude de seu
caráter não volátil. Outro motivo pelo qual é bastante acessado em alguns é quando
está atuando como área de troca (swapping). Essas duas atuações geram uma grande
quantidade de operações de leitura e escrita. São dispositivos estruturados, possuindo
cilindros, trilhas e setores, como você deve se lembrar de ter estudado na disciplina
Arquitetura de Computadores.
Nesta aula, você pôde estudar a atuação do gerenciamento de entrada e saída em um
computador. Foram abordados inicialmente alguns conceitos básicos sobre o assunto.
Em seguida, você teve acesso à organização em camadas, onde pôde visualizar que
alguns recursos são implementados em software, enquanto outros são implementados
em hardware.
Pôde perceber também que, na organização em camadas, os níveis mais elevados têm
funções genéricas, enquanto os níveis mais baixos têm funções são mais específicas.
As etapas, para que ocorra uma operação de leitura ou escrita, iniciam-se pelo processo
que as solicita, passam ao subsistema de E/S, que organiza o acesso ao dispositivo e
padroniza a comunicação com os device drivers. Estes, por sua vez, enviam instruções
ao controlador do dispositivo. Finalmente o controlador manobra o dispositivo para que
a operação de leitura ou escrita seja completada.
Nos tópicos seguintes, você estudou, com um pouco mais de detalhes, o princípio de
funcionamento dos drivers e dos controladores. Por fim, estudou a classificação dos
dispositivos em dispositivos de bloco ou de caractere.
Na próxima aula, você irá estudar os sistemas de arquivos, tendo a oportunidade de
compreender o princípio de funcionamento e sua aplicação prática. Em seguida, serão
abordados os estudos de caso de dois importantes sistemas operacionais: o Windows e
o Linux.

Aplicando o Conhecimento
1. Quais as funções do gerenciamento de E/S?
2. O que diferencia os dispositivos de E/S da memória e processador?
3. O gerenciamento de dispositivos de E/S é feito em camadas. Quais são essas
camadas? Descreva brevemente cada uma delas.
4. Qual a função do subsistema de E/S?
5. O que é driver? Como interage com os controladores do dispositivo?
6. O que é acesso direto à memória (DMA)? Qual sua finalidade?
7. Quais os tipos de dispositivos de E/S?
Para Refletir
Seria possível a utilização dos dispositivos de E/S sem o uso de drivers ou
controladores? Como seria o funcionamento nessa situação?

Aula 06 - Sistemas de Arquivos


O sistema de arquivos é um dos componentes do sistema operacional com que
interagimos; é ele que nos dá a visão de partições, pastas e arquivos que temos ao
manipular um sistema operacional. Desse modo, ao criar uma pasta, inserir arquivos e
movê-los de uma pasta a outra, você está na verdade se relacionando com o sistema
de arquivos.
O sistema de arquivos cuida ainda de outras tarefas não tão visíveis ao usuário, como
cuidar do relacionamento das aplicações com o sistema de arquivos lógico, com o
sistema de arquivos básico, com o controle de E/S (entrada/saída) e com os
dispositivos. Entre os dispositivos, podemos mencionar os discos rígidos,
leitores/gravadores de CDROM/DVD, pendrive etc.
O objetivo desta aula é que você veja como estas atividades são manipuladas, além dos
diferentes tipos de sistemas de arquivos existentes nos sistemas operacionais atuais.
Ao utilizar um computador o usuário manipula, através do sistema operacional, seus
programas e dados, armazenados na memória secundária: disco rígido, ótico, CD, DVD,
disquete e pendrive, entre outros.

Para que isso seja feito adequadamente, o sistema operacional implementa uma visão
lógica que mapeia os dados armazenados nesses dispositivos físicos. Assim, esta aula
está estruturada em duas partes. Na primeira, você verá como é esse mapeamento
lógico e como é acessado e manipulado. Na segunda, você verá como é essa interação
em um nível mais básico do computador.

Tenha em mente que os dados estão armazenados, considerando um disco rígido, em


cilindros, trilhas e setores. Você não sabe onde esses dados estão fisicamente no disco.
O que você e todos os usuários desejam é manipular seus arquivos e pastas conforme
você os organizou em sua área de trabalho no computador.

Cabe, então, ao sistema operacional fazer esse mapeamento lógico para o que,
fisicamente, ocorre no disco de uma maneira transparente para o usuário.

Visão do Usuário
Nesse item, começaremos pela visão que o usuário tem do sistema de arquivos e como
interage com ele, passando pelos conceitos de arquivos, diretórios, montagem de um
sistema de arquivos e compartilhamento.

Conceitos de Arquivo
Um arquivo é a representação, para o usuário, de um grupo de bytes (ou bits)
relacionados de alguma forma. Desse modo, um arquivo pode ser um conjunto de
dados alfanuméricos que tem um significado para seu criador ou usuário. Como
exemplo de arquivo, temos: um código fonte de um programa; um programa
executável; um texto; uma planilha; uma gravação de som ou áudio; animações etc.

Desse modo, tudo que temos armazenado no computador é um arquivo. Assim, um


arquivo é um arquivo, um programa é um arquivo, uma imagem é um arquivo e assim
por diante.

Um arquivo possui uma estrutura definida, sobre a qual temos vários atributos e
podemos realizar várias atividades.

Entre os atributos de um arquivo temos: nome – identifica o arquivo para o usuário;


identificador – identifica o arquivo dentro do sistema de arquivos; tipo – informação
para os sistemas de arquivos que identificam tipos; local – um ponteiro que indica uma
posição relativa do arquivo; tamanho – tamanho do arquivo, que pode ser em bytes,
palavras ou blocos; proteção – informação de controle de acesso; data e hora –
informação de data e hora de criação e /ou último acesso.

As atividades que podemos realizar sobre um arquivo envolvem: criar, escrever, ler,
alterar, movimentar e excluir.

Tipos de arquivo
Os sistemas operacionais, de modo geral, classificam os arquivos também por tipo.
Assim, temos arquivos que são executáveis, enquanto outros são reconhecidos como
bibliotecas pelo sistema operacional, além dos vários tipos de arquivos manipulados
pelo usuário e seus programas. Considere os seguintes exemplos de extensões para os
arquivos no ambiente Windows:

 Código fonte - c; .java.


 Objeto - obj; .o.
 Executável - .exe; .com; .bin.
 Lote - .bat; .sh.
 Texto - .txt; .doc; rtf.
 Biblioteca - .lib; .dll.
 Multimídia - .mpeg; .rm.
 Compressão - .tar; .zip.

Considere que a forma como os tipos de arquivos são manipulados variam entre os
sistemas operacionais. No sistema operacional Linux, por exemplo, as extensões não
são obrigatórias.

Estrutura de Diretório
O sistema de arquivos em um computador pode conter centenas de pastas, com
dezenas, centenas ou mesmo milhares de arquivos em cada uma. É essencial que haja
uma forma de organizá-los.
Inicialmente, temos o disco (rígido) utilizado pelo computador. Nesse disco, temos pelo
menos uma partição. Cada partição é organizada em uma estrutura que se chama
diretório.

Assim, para cada diretório, temos as pastas, com seus arquivos dentro de cada uma.
Considere, ainda, que um diretório possa conter vários níveis.

Figura 6.1 –
Organização de Pastas no Sistema Operacional Linux.

A essa estrutura podem ser aplicadas permissões de acesso. Pode-se permitir que
determinados usuários possam acessar somente algumas pastas. Outra forma de
restrição é quanto às operações que se pode fazer sobre determinados arquivos. Entre
essas operações estão: a leitura, modificação ou execução do arquivo.

Métodos de Acesso
Os métodos de acesso aos dados podem ser de dois tipos: seqüencial e direto. Nos
primeiros sistemas computacionais os dados eram armazenados em fitas. O que fazia
com que o acesso fosse seqüencial, ou seja, na ordem em que foram escritos. Com a
utilização de discos rígidos, que são dispositivos estruturados, os dados podem ser
acessados diretamente.

Logo, no acesso direto os dados podem ser acessados, como leitura ou escrita, em
qualquer ordem, independentemente da posição em que se encontram no disco rígido.
Lembre-se de que isso só é possível em dispositivos estruturados, ou seja, os registros
no disco possuem tamanho fixo.

O acesso direto pode contar ainda com o recurso da indexação. Nele, antes de acessar
os dados, é primeiro pesquisado no arquivo de índice sua posição, para então ser feito o
acesso direto. O objetivo dessa técnica é permitir um acesso mais rápido.

Montagem
Para que um arquivo possa ser visualizado é necessário que um sistema de arquivos
seja montado antes. A montagem consiste em associar um ponto do sistema de
arquivos com o dispositivo. Desse modo, o sistema operacional verifica se o dispositivo
contém um sistema de arquivos válido.

Consideremos o exemplo do Linux:


A unidade de disquete considera a mídia como /dev/df0. Ao montar esse dispositivo,
o /dev/fd0 é associado a um ponto no sistema de arquivos denominado /media/floppy.

Desse modo, o usuário acessa a pasta /media/floppy para visualizar o conteúdo do


disquete. Porém, os dados estão no /dev/fd0.

A propósito, o /dev é uma pasta que contém todos os dispositivos mapeados pelo
sistema (dev = device) e fd0 se refere à primeira unidade de disquete da máquina (fd0
= floppy disk 0).

Na montagem são consideradas, ainda, as permissões de acesso (leitura, modificação e


escrita), conforme se viu no item “Proteção”.

Compartilhamento
Muitas vezes, um usuário necessita compartilhar arquivos com outros usuários ou
mesmo permitir o acesso a sistemas remotos.

Assim, o desafio do compartilhamento é permitir que os usuários locais e mesmo


remotos, possam acessar esses arquivos de acordo com as permissões dadas. Deve-se,
ainda, evitar os conflitos associados à manipulação de um mesmo arquivo por vários
usuários ao mesmo tempo.

No Linux são considerados fatores como o proprietário do arquivo e grupos de usuários.


Podem-se estabelecer critérios baseados no proprietário (usuário) para outros usuários
do mesmo grupo e demais usuários. No Windows, há os identificadores de usuário
(user ID) ou ID de segurança (Security ID – SID).
Outro exemplo de compartilhamento é o NFS, utilizado em sistemas Linux.

Proteção
O controle do acesso aos arquivos visa permitir que somente usuários autorizados
tenham acesso ao arquivo. Esse controle pode ser implementado de duas maneiras:
listas de controle de acesso; controle em cada arquivo.

O controle feito através de listas de controle de acesso, ou ACL (Access Control List),


permite a elaboração de uma lista com regras de acesso tão sofisticadas quanto se
deseje, o que, à medida que o tempo passa, pode se tornar ainda mais complicado.

As técnicas mais recentes consideram três fatores: proprietário, grupo e outros. Assim,
todo o controle de acesso, seja de uma pasta ou dos arquivos, é baseado nesses
fatores. A cada um deles, podem-se associar três possíveis permissões: leitura, escrita
e execução.

Logo, ao proprietário, outros usuários do mesmo grupo ou demais usuários pode-se dar
permissões diferentes de leitura, escrita ou execução. A figura a seguir ilustra o
exposto.
Figura 6.2 – Permissões em um
Sistema de Arquivo Linux.

Veja os seguintes exemplos, presentes em ambientes Linux:

 1º. Caso: Proprietário (rwx), Grupo (rwx), Outros (rwx): rwxrwxrwx


 2º. Caso: Proprietário (rwx), Grupo (r-x), Outros (--x): rwxrw---x
 3º. Caso: Proprietário (rwx), Grupo (--x), Outros (---): rwx---x---
Considere que: R (read ou leitura), W (write ou escrita) e X (execute ou execução).

Assim, no primeiro caso temos permissão total (leitura, escrita e execução) a todos os
usuários do sistema, seja o proprietário, outros usuários (do mesmo grupo do
proprietário) ou demais usuários.

No segundo caso, o proprietário tem permissão total, enquanto os outros do mesmo


grupo podem ler e executar e, os demais, somente executar.

No terceiro caso, o proprietário pode tudo, outros do mesmo grupo podem executar e
os demais não podem fazer nada.

Visão do Implementador
Neste item você verá como o sistema de arquivos é relacionado ao dispositivo de
armazenamento secundário (disco). Abordaremos: as estruturas do disco e alguns
aspectos de particionamento e montagem.

Estrutura do Sistema de Arquivos


Como dissemos, os dados estão armazenados em dispositivo estruturado, no caso, um
disco rígido que possui cilindros, trilhas e setores. Você já viu, inclusive, quando
estudou arquitetura de computadores, que os dados podem ser lidos em blocos a partir
do disco rígido, podendo ser modificados e salvos no mesmo lugar.

Viu ainda que o acesso aos dados é direto, ou seja, o dispositivo é manipulado de modo
a permitir que esses dados sejam acessados diretamente de onde estejam, através do
deslocamento (giro) do disco e da movimentação das cabeças de leitura do disco. Isso
permite que os dados sejam recuperados a partir de cada bloco e seus setores.
Para efetuar essas operações corretamente, duas ações devem ser implementadas pelo
sistema de arquivos: definir como o sistema de arquivos aparecerá para o usuário;
mapear o sistema de arquivos lógico para o armazenamento no dispositivo físico.

O sistema de arquivos é então implementado em camadas, como mostra a figura.

Figura 6.3 – Sistema de Arquivos em Camadas.

No nível mais baixo, o controle de E/S manipula o dispositivo através dos drivers.


Os drivers informam ao controlador a posição no dispositivo e ações que devem ser
efetuadas para acesso aos dados.
No sistema de arquivos básico, são emitidos comandos genéricos, independentes de
dispositivos, os quais serão interpretados pelo driver de dispositivo, que tomará as
ações apropriadas.

O módulo de organização de arquivo relaciona os arquivos, blocos lógicos e blocos


físicos; pode traduzir os endereços de bloco lógico em endereços de bloco físico. Esse
módulo controla ainda os espaços livres e pode alocar esses blocos, quando necessário.

Já o sistema de arquivos lógico organiza os metadados. Os metadados são as


informações sobre os dados; incluem a estrutura do sistema de arquivos, mas não os
dados. Essas informações sobre propriedade, permissões e local do arquivo são
armazenadas no denominado bloco de controle de arquivo (file control block).
Figura 6.4 – Bloco de Controle de um
Arquivo.

Existem atualmente muitos sistemas de arquivos em uso pelos sistemas operacionais.


Entre eles, convém citar: FAT, FAT32, NTFS, EXT2, EXT3, ReiserFS, JFSetc.

Os sistemas de arquivos FAT, FAT32 e NTFS são utilizados pelos sistemas operacionais
Windows, o qual, em suas versões mais recentes, privilegia o uso do NTFS por questões
de segurança e desempenho.

Os sistemas operacionais EXT2, EXT3 e ReiserFS são utilizados nas várias distribuições
Linux. Anteriormente a preferência era pelo EXT2, todavia, atualmente, é pelo EXT3
que, por utilizar um recurso denominado journaling, permite uma melhor recuperação
caso ocorra alguma corrupção nos arquivos (quando ocorre, por exemplo, desligamento
brusco de uma máquina). Algumas distribuições utilizam ReiserFS, que tem uma maior
estabilidade no controle dos metadados, caso ocorram problemas de corrupção no
sistema de arquivos.

O JFS foi desenvolvido pela IBM e disponibilizado aos sistemas Unix/Linux.

Logo, ter uma estrutura em camadas permite aos diversos sistemas operacionais utilizar
seus próprios sistemas de arquivos, com as suas particularidades associadas à
organização e controle de acesso.

Implementação
Para a utilização de um sistema de arquivos são necessárias algumas estruturas no
disco. Essas estruturas armazenam informações relevantes para que o sistema consiga
iniciar-se e, em seguida, começar a funcionar.

Um primeiro elemento que deve existir é o bloco de controle de boot (boot control
block), o qual contém informações necessárias ao processo de inicialização (boot) da
máquina. Essas informações costumam estar no primeiro bloco da primeira partição do
disco, o que, no NTFS, é denominado de partition boot sector.
Outro elemento é o bloco de controle da partição (partition control block) e contém as
informações sobre a quantidade de blocos, o tamanho de cada bloco e a quantidade de
blocos livres, além de ponteiros para os blocos de controle de arquivos. No NTFS é
denominado de master file table.
Tem-se ainda, conforme o sistema operacional, outras partições que são utilizadas para
armazenar os dados ou auxiliar no processo de boot. Alguns detalhes serão vistos nos
estudos de caso do Windows e Linux.
Nesta aula, você estudou a forma como os sistemas operacionais mapeiam os dados
presentes nos dispositivos de armazenamento secundários (discos) e os organizam e
apresentam aos usuários e aplicações.
Viu que os dados presentes nos dispositivos na forma de blocos são apresentados sob a
forma de arquivos, os quais possuem vários atributos, como: nome, tipo, tamanho e
informações de data e hora.
Viu ainda que esses arquivos estão organizados em diretórios. Assim, um diretório
contém pastas e, dentro delas, arquivos. Essa organização facilita ainda o controle de
acesso a essas pastas e arquivos, sendo possível controlar não somente quem pode
acessá-los, mas quem pode manipulá-los (ler, escrever ou executar).
Você teve acesso ainda a informações sobre como é feito esse mapeamento pelo ponto
de vista do sistema operacional que, em última instância, efetua uma apresentação
lógica dos dados fisicamente presente nos dispositivos, como blocos contendo bytes.
Por último, viu que um sistema operacional precisa utilizar estruturas que informam ao
computador onde estão as informações de que precisa para, após o processo de boot,
entregar o controle ao sistema operacional (bloco de controle de boot), além do bloco
de controle de partição (com informações sobre esta).
Essas informações, em conjunto com os itens a serem abordados nos estudos de caso
do Windows e Linux, permitirão que você tenha uma visão bem abrangente sobre o que
são e como funcionam os sistemas operacionais atuais. Esse estudo permitirá que você
consiga determinar os pontos fortes e fracos de cada sistema, o que ajudará você nos
processos decisórios de que irá participar.

Aplicando o Conhecimento
1. O que é um arquivo?
2. Quais os atributos de um arquivo?
3. Quais tipos de arquivo você mais utiliza?
4. O que é um sistema de arquivos?
5. O que é a montagem de um sistema de arquivos?
6. Como é feito o controle de acesso aos arquivos em um sistema operacional?

Para Refletir
Considerando o computador que você utiliza normalmente, pesquise:

a. Quantas partições existem no disco rígido?


b. Qual o sistema de arquivos em cada uma das partições?
c. Você concorda que o sistema de arquivos utilizado em cada partição é o mais
adequado ao seu uso? Quais as vantagens e limitações?
Aula 07 - Estudo de Caso (Linux)
O GNU/Linux ou simplesmente Linux é um sistema operacional amplamente utilizado
atualmente. Está presente em um grande número de empresas onde é o sistema
operacional utilizado em servidores com as mais diversas funções. Possui vários
aspectos que atraem a atenção de usuários e administradores em todo o mundo, pelo
fato de ser um sistema operacional de código aberto (open-source) e livre (free).
O termo open-source vem do fato de que todo o código fonte utilizado está disponível.
O segundo termo, free, não quer dizer grátis, sendo seu significado correto “livre”,
permitindo ao usuário, inclusive, alterar o sistema, se julgar conveniente.
Esses fatores, aliados às características de segurança, estabilidade e desempenho, têm
feito com que a cada dia mais usuários o utilizem em suas máquinas – sejam elas
computadores, servidores ou mesmo dispositivos móveis como celulares.
Nesta aula, você verá algumas das características desse sistema operacional, o que,
sem dúvida, irá apoiá-lo na decisão sobre onde e como poderá ser mais bem aplicado.

Histórico do Linux
O Linux surgiu em 1991, quando o estudante finlandês Linus Torvalds o escreveu. Foi
baseado no GNU criado em 1984 por Richard Stallman.
Consistia inicialmente de um pequeno kernel para processadores Intel 80386, um
processador de 32 bits criado pela Intel. Segundo Linus, era preciso muito mais do que
esse pequeno kernel, que controlava os recursos do sistema e interagia com o
hardware.

O fato de ter sido disponibilizado na Internet desde o começo fez com que a
colaboração de usuários do mundo inteiro o levasse, em relativamente pouco tempo, a
um sistema estável e confiável de ampla utilização.

Visão Geral do Linux


O Linux é um sistema operacional multiusuário e multitarefa com suporte a
multiprocessamento. Está disponível para várias arquiteturas, desde arquiteturas x86,
até arquiteturas Alpha, Sparc e PowerPC.

Entre suas principais características, podemos citar: multitarefa; bibliotecas


compartilhadas; carregamento de módulos sob demanda; gerenciamento completo de
memória; utilização de memória virtual; suporte a TCP/IP; suporte a consoles virtuais.

Arquitetura
A arquitetura do Linux é composta de camadas que vão desde as aplicações do usuário
ao hardware, o que pode ser visualizado na figura a seguir.
Figura 7.1 – Arquitetura em Camadas do
Linux.

O usuário e as aplicações interagem com o kernel por meio de um shell. É por meio
desse shell que o usuário e as aplicações enviam solicitações ao kernel. Diferentemente
de outros sistemas operacionais, o kernel do Linux não libera o acesso ao hardware
para as aplicações; ele mesmo faz o acesso e controle, encaminhando os resultados das
operações a quem as solicitou. É, portanto, uma garantia de segurança extra. Cabe,
então, ao kernel efetuar o gerenciamento de memória e servir de intermediário no
acesso ao hardware.

Figura 7.2 – Interação


Usuário e Shell.

O Kernel do Linux
O Kernel do Linux foi lançado em 1991, em sua versão 0.01. Consistia em 9300 linhas
de código C e 950 de linguagem de montagem. Implantava processos Unix em espaços
de endereço protegidos e incluía um sistema básico de memória virtual. Porém, o
sistema de arquivos utilizado era do Minix, no qual também se baseava.

A versão 1.0, lançada em 1994, possuía 16.5000 linhas de código, contando inclusive
com um novo sistema de arquivos.

Em 1996, foi lançada a versão 2.0, a partir da qual o Linux ganhou o mercado. A essa
altura, possuía 47.0000 linhas de código e 8.000 linhas de código de montagem. Incluía
melhorias no desempenho do TCP/IP, suporte a threads internas do kernel e tratamento
de dependências entre módulos carregáveis, além de carregamento automático de
módulos sob demanda. Na versão 2.2 foi melhorado o tratamento de sinais e de
interrupções, além de operações de entrada e saída com bloqueios mais confiáveis.

O kernel do Linux possui a capacidade de carregar e descarregar da memória partes do


kernel (módulos), conforme a demanda.

A utilização de módulos no kernel é um aspecto altamente positivo no Linux. Em geral,


é sempre desejável deixar o kernel mais enxuto e compacto. Desse modo, tudo o que
não for absolutamente essencial e de uso intensivo pode ficar em módulos.

Um exemplo clássico é quando há necessidade de utilização de um novo driver para


reconhecimento de um dispositivo recém incorporado. O driver pode ser incorporado ao
sistema na forma de um módulo.
O kernel possui ainda, como recursos, em relação aos módulos: gerenciamento de
módulos – permite aos módulos carregados na memória conversarem com o kernel;
registro de driver – permite aos módulos informarem ao kernel sobre um
novo driver disponível; mecanismo de solução de conflito – permite quedrivers de
diferentes dispositivos reservem recursos de hardware sem a ocorrência de conflitos.

Distribuições Linux
A utilização de distribuições é a forma mais prática de se obter e instalar um sistema
operacional Linux. Elas consistem em sistema operacional básico, utilitários extras,
programas de uso geral, suítes de escritório (planilhas, editor de texto etc.),
navegadores web, jogos e outros.

Podem-se considerar três componentes principais em uma distribuição Linux: o kernel –


mantém todas as abstrações do sistema operacional, inclusive a manipulação de
processos, threads e memória virtual; as bibliotecas do sistema – funções que
permitem às aplicações interagirem com o kernel; os utilitários do sistema – utilitários
de uso geral dentro do sistema, para gerenciamento e configuração de serviços,
incluindo os daemons.
Uma distribuição obtém o kernel original e, a partir dele, efetua uma recompilação,
ajustando o que julgar necessário, seja por questão de desempenho para algum
componente específico ou mesmo para adicionar suporte a outros. A partir daí, adiciona
os programas mencionados anteriormente, incluindo ainda um instalador que facilite a
vida do usuário.

Existem atualmente centenas de distribuições disponíveis para download. Algumas com


instalação mais amigável, outras com finalidades bem específicas, como as dedicadas
para dispositivos móveis.

Entre as distribuições para uso geral, em computadores e servidores, podemos citar:

 Red Hat
 Fedora
 Debian
 SuSE
 OpenSuSE
 Mandriva
 Slackware

Se você é novato na utilização do Linux, qualquer uma dessas distribuições pode ser
utilizada, pois são de fácil instalação e uso, exceto o slackware, que apresenta uma
dificuldade maior de instalação e configuração em virtude de sua proposta de ser um
sistema bem enxuto e estável.

Interface gráfica
Ao contrário de outos sistemas operacionais, o Linux oferece algumas opções em
termos de interface gráfica. As mais comuns são KDE e Gnome. Existem ainda opções
para computadores com pouca memória, tal como o XFCE.

Gerenciamento de Processos
No Linux, cada processo em execução é uma instância de um programa. A criação de
novos processos no Linux é baseada na chamada de sistema fork. Através dessa
chamada um processo (pai) cria outro processo (filho).

Esse novo processo possui um espaço de memória próprio e também um identificador


único (PID). O processo é associado ainda ao usuário que o criou, o que dá ao processo
certas permissões e privilégios.

Figura 7.3 – Criação


de Processos.

Ambiente do processo
Quando um processo filho é criado, este herda do pai um ambiente. Todavia, na
chamada de sistema execve o processo passa as variáveis de ambiente que possui ao
novo programa. Cabe então ao kernel passar essas variáveis de ambiente ao programa
seguinte. Com isso, o ambiente é ajustado a cada processo e não ao sistema
operacional como um todo. Pode-se então estabelecer configurações personalizadas e
restrições de segurança para cada usuário ou processo em execução no sistema.
Processos e threads
Cada processo em execução possui seu próprio espaço de endereçamento, enquanto
duas threads dentro de um mesmo processo compartilham o espaço de endereços.
Assim, qualquer modificação efetuada por uma thread será percebida pelas
outras threads presentes no mesmo processo.
No Linux é utilizada a mesma representação para processos e threads. A diferença
consiste em que um thread é um processo que compartilha o espaço de endereçamento
com o processo pai.
A chamada fork cria um novo processo com seu próprio contexto. Enquanto a
chamada clone cria um novo processo que compartilha as estruturas de dados do
processo pai, ou seja, uma thread.

Gerenciamento de Memória
O gerenciamento de memória no Linux possui duas partes: memória física e memória
virtual.

No gerenciamento de memória física é feita a alocação e liberação, seja de páginas,


grupo de páginas ou blocos de memória.

No gerenciamento de memória virtual, esta é mapeada no espaço de endereços dos


processos em execução. Deve manter os espaços de endereços para cada processo,
criando páginas sob demanda. No Linux, esse gerenciamento é feito sob duas visões,
como um conjunto de páginas separadas ou como um conjunto de páginas.

Como um conjunto de páginas separadas é a visão lógica, descreve instruções do


sistema de memória virtual em relação ao esquema de endereços. Consiste em um
subconjunto contínuo do espaço de endereços, alinhado por página.

Já o conjunto de páginas se refere a uma visão física. Possui as tabelas de páginas do


hardware associadas ao processo.

Swapping e paginação
O Linux implementa a área de troca (swapping) transferindo páginas da memória
principal para a secundária, quando necessário. Como vimos em aulas anteriores, isso é
necessário sempre que se deseja liberar espaço na memória para processos que estão
em execução.
A área de troca possui um algoritmo que define quais páginas serão transferidas para o
disco (swap out) e um mecanismo de paginação que resolve quais páginas deve trazer
de volta (swap in).

Gerenciamento do Sistema de Arquivos


O sistema de arquivos mais utilizado no Linux é o EXT2 ou seu sucessor, o EXT3.

O EXT2 pode endereçar até 4 Terabytes (TB), quando utilizados blocos de 4 KB.


Já o EXT3 pode endereçar desde 1TB, quando utiliza blocos de 1 KB, até 32 TB, quando
utiliza blocos de 8 KB. A principal vantagem desse sistema de arquivos é a utilização
de journaling, técnica em que as atividades no sistema de arquivos são registradas
em log, permitindo identificar os arquivos danificados durante uma queda brusca do
sistema operacional (crash).
O EXT3 possui três níveis de journaling: journal – os metadados e os dados são escritos
no log antes de efetivamente escritos; ordered – escreve os metadados no log e força
que os dados sejam escritos no sistema de arquivos; writeback – escreve somente os
metadados no log.
O journal acaba escrevendo os dados duas vezes; é o sistema mais confiável, porém, o
mais lento. O ordered é o journaling padrão, pois força o sistema de arquivos a escrever
os dados cujos metadados acabaram de ser colocados no log. Desse modo, em caso
de crash, os metadados anotados no log referem-se ao que o sistema de arquivos
estava fazendo imediatamente antes do crash.
Por fim, o writeback atua de modo semelhante ao ordered. Porém, não há garantias,
pois a ordem dos dados no log pode não corresponder exatamente à ordem em que as
coisas estavam sendo feitas, podendo provocar erros.
Virtual filesystem
O Linux implementa ainda um sistema de arquivos virtual, denominado sistema de
arquivos de processo, ou sistema de arquivos proc, em referência ao diretório /proc
presente na máquina. É um sistema de arquivos cujo conteúdo não está salvo em
nenhum diretório da máquina e é calculado sob demanda. Desse modo, se você for
visualizar o conteúdo de algo no diretório /proc, saiba que aquele conteúdo está sendo
calculado no momento em que lhe for apresentado, não estando em nenhum arquivo.

Entrada e Saída
O Linux também dispõe dos dispositivos de bloco e os de caractere, relembrando que os
dispositivos de bloco são aqueles em que os dados estão armazenados em estruturas
organizadas (por exemplo, em trilhas e setores). Para esse tipo de E/S, a velocidade é
importante e cabe ao sistema operacional garantir que seja a mais rápida possível, o
que é feito por meio do cache de buffer de bloco e pelo gerenciador de requisições.

O cache do buffer de bloco atua como um buffer para E/S e como um cache para
operações já efetuadas e completadas. Desse modo, pode agilizar operações de E/S e
utilizar-se de cache para repetir operações já efetuadas.

Já o gerenciador de requisições supervisiona a leitura e escrita do buffer no driver do


dispositivo.

Já na comunicação com dispositivos de caracteres, o kernel simplesmente passa a


requisição para o dispositivo, não realizando nenhum pré-processamento. A exceção são
os dispositivos que implementam terminal (tty). Estes possuem buffers para controle de
fluxo. Um terminal tty é responsável por centralizar a entrada e saída de terminal do
usuário a ele conectado.

Segurança
O controle de segurança no Linux é feito utilizando autenticação e controle de acesso.

A autenticação visa garantir que somente se pode acessar o sistema após provar que se
possui direitos para isso. O controle de acesso verifica se um usuário (ou aplicação) tem
direito de acessar um objeto (arquivo ou dispositivo).
O controle de acesso é feito conforme descrito na aula anterior, ou seja, por controle
em cada arquivo. Havendo direitos de usuário, de grupo e dos demais usuários (global).
Há ainda as permissões de leitura, escrita e execução que são concedidas a cada um
desses três grupos, para cada arquivo ou pasta.

Nesta aula, você estudou como o sistema operacional Linux implementa os vários
assuntos estudados ao longo da disciplina, entre eles: a estrutura do sistema
operacional; o gerenciamento de processos, de memória, de E/S e do sistema de
arquivos. No “Aplicando o Conhecimento”, você terá indicações sobre como testar e
verificar alguns tópicos apresentados, tendo então a oportunidade de compará-los com
as atividades da Aula 8 – Estudo de Caso Windows.

Aplicando o Conhecimento
Para resolução destes exercícios é necessário que você tenha acesso a um computador
com sistema operacional Linux. Caso seu computador não utilize Linux você pode fazer
o download de uma versão LiveCD de uma distribuição que você tenha preferência. O
tamanho do download varia de 40 MB a 650 MB. A vantagem de um LiveCD é que você
pode dar o boot no computador com o CD-ROM e utilizar o Linux. Após removê-lo e
reiniciar o computador o sistema operacional original estará intacto.
Obs.: Existem algumas distribuições, como a Mandriva, que possuem uma versão para
uso em pendrive. Desse modo você pode utilizar o sistema operacional instalado no
pendrive.
1. Utilizando o comando ps, verifique os processos em execução no computador.
Caso você tenha dúvidas quanto à sintaxe utilize a ajuda on-line com o
comando man os. Você pode utilizar, por exemplo, ps aux ou ps Ahl, entre outras
opções.
2. Acesse o diretório /proc (diretório virtual) e verifique os dados sobre o sistema.
Para isso, utilize os comandos:
 Para mudar para o diretório /proc, digite cd /proc.
 Para listar o conteúdo do diretório, digite ls ou dir.
 Para visualizar o conteúdo de um arquivo, digite cat <nome do arquivo>.
Obs.: Ao responder às questões 1 e 2 procure verificar sobre como são apresentadas as
características da máquina (processador, memória, periféricos etc).
Veja ainda quantos processos estão em execução. Dedique um tempo a pesquisar o que
faz cada um. Uma dica: procure pelo nome deles emhttp://www.google.com/linux.

Para Refletir
a. Quais os fatores que levam ao grande número de usuários e soluções baseadas
em Linux disponíveis atualmente?
b. Em seu ambiente de trabalho ou estudo você já utiliza ou considera utilizar
Linux? Por qual razão?

Aula 08 - Estudo de Caso (Windows)


Nesta aula, você estudará algumas das características presentes nos sistemas
operacionais Windows. Presente em grande parte das empresas e residências ao redor
do mundo, o Windows possui vários fatores que o tornaram um dos sistemas mais
utilizados em computadores pessoais e servidores.
O objetivo desta aula é possibilitar que você perceba, nesse sistema operacional, as
características e conceitos estudados durante este curso, tendo ainda a oportunidade de
compará-lo com o sistema operacional Linux.

Histórico do Windows
A história do Windows se confunde com a da empresa que o criou, a Microsoft. Em
1981, a empresa lançou seu primeiro sistema operacional, denominado MS-DOS
(Microsoft Disk Operating System), concebido para ser o sistema operacional padrão
dos computadores IBM PC.
O MS-DOS foi criado para atender a computadores pessoais; é um sistema operacional
16 bits, monousuário e com acesso por linha de comando. Reunia algumas idéias do
Unix e do CP/M.

Em 1985, foi lançada a primeira versão do MS-DOS que contava com interface gráfica,
chamada de Windows 3.1. Essas versões foram seguidas pelas versões Windows 95,
Windows 98 e Windows ME.

Em 1988, em função das limitações experimentadas por essas versões, baseadas no


MS-DOS, a Microsoft optou por criar um novo sistema operacional.

Em 1993, foi lançado o sistema operacional Windows NT, utilizando uma arquitetura de
32 bits, multitarefa, preemptiva, multithread. Suportava ainda memória virtual e
múltiplos processadores. Inicialmente, a idéia era utilizar no Windows NT a API
(Application Program Interface) do OS/2. Porém, durante a etapa de desenvolvimento,
resolveu-se que seria utilizada a API 32 bits do Windows.

A primeira versão do Windows NT a ser lançada foi o Windows NT 3.1, pois coincidia
com o período de comercialização do Windows 3.1. Em sua versão 4.0, o Windows NT
passou a adotar interface similar à do Windows 95. Rotinas da interface com o usuário e
de controle da interface gráfica foram incorporadas ao kernel do sistema operacional.
No NT, foi incorporado ao sistema operacional o servidor Web.

Em 2000, foi lançado o Windows 2000, baseado no Windows NT 4, mantendo a


arquitetura deste. No Windows 2000 foi incorporado o Active Directory, um serviço de
diretório então baseado no X.500 e depois no LDAP.

Em 2001, foi lançado o Windows XP, oferecido como uma atualização ao Windows 2000
e uma substituição ao Windows 95 e 98.

Todavia, em 2003, foi lançado o Windows 2003, cuja finalidade era suceder o Windows
2000. Incorporando recursos do XP, tinha como objetivo ser o principal produto
relacionado a servidores.
Em fins de 2007, foi lançado o Windows 2008 RC2 (Release Candidate), versão de
avaliação com todos os recursos da versão final. Nela, foram incorporados importantes
recursos ao servidor web, além de recursos de virtualização e de segurança, esse deve
ser o sistema preferencial da Microsoft destinado a servidores. Ainda em 2007, foi
lançado o Windows Vista, destinado a computadores pessoais, conta com várias
melhorias em termos de interatividade e recursos gráficos.

Visão Geral do Windows


Como vimos, as versões disponíveis do Windows – XP, Vista, 2003 e 2008, são
multitarefa, multithread, suporte a arquiteturas 32 e 64 bits e autenticação Kerberos,
estando disponíveis somente para processadores Intel compatíveis.

Entre suas principais características, podemos citar: escalonamento preemptivo;


multiprocessamento simétrico; memória virtual; sistemas de arquivos FAT, FAT32 e
NTFS; compressão e criptografia de arquivos, entre outras.

Estrutura do Sistema
A estrutura dos sistemas operacionais Windows envolve algumas similaridades, entre
elas, a utilização de modo kernel e modo usuário, incluindo ainda um subsistema
protegido.

Não são consideradas, neste item e nos próximos, as versões mais antigas do Windows,
tais como NT4.0 (e anteriores) e Windows ME (e anteriores).

A seguir é apresentada uma figura com a arquitetura do Windows 2000.


Figura 8.1 –
Arquitetura do Sistema Operacional Windows 2000.

Observe a presença do Hardware Abstraction Layer (HAL), uma biblioteca que incorpora


o código do sistema dependente do hardware, como endereçamento de dispositivos e
DMA.

Acima do HAL, está o kernel, cuja função é tornar o sistema operacional independente
do hardware, além de controlar o acesso a este.

A seguir vem o núcleo executivo, independente do hardware e que gerencia serviços


diversos. Fazem parte dele: Gerência de Objetos (GO); Gerência de Processos
e Threads (GPT); Gerência de Memória Virtual (GMV); Monitor de segurança (MS);
Gerência de Cachê (GC); Plug and Play (P&P); Gerência de Energia; Configuração
do Registry (CR); Local Procedure call (LPC); Gerência de E/S (GES); Drivers de
Recursos Gráficos - Graphics Device Interface (GDI).
Em seguida têm-se as APIs, implementadas com o uso de DLL e do subsistema Win32.

Gerenciamento de Processos
O kernel do Windows é a base do sistema operacional. Entre as principais funções
estão: o escalonamento de threads; tratamento de interrupção; sincronismo de baixo
nível com processador e recuperação em caso de falta de energia.

O kernel é orientado a objetos. Sendo um objeto uma instância de um tipo de objeto.


Um tipo de instância de objeto é um tipo de dado com um conjunto de atributos e
métodos. Cabe ao kernel executar as tarefas não suportadas pelo HAL; é o Kernel que
efetua as trocas de contexto, escalonamento e o tratamento das interrupções e
exceções.
O kernel utiliza um despachante (dispatcher) que atua como uma base para o executivo
e os subsistemas. Entre as funções desse despachante estão: o escalonamento
de threads; interrupções de software. O despachante não é paginado para fora da
memória, nem sua execução é preemptada.
Uma thread pode ter seis estados diferentes: pronto – pronto para
executar; standby – thread em estado de pronta e com prioridade mais alta, devendo
ser a próxima a executar; em execução – thread executando no processador; em
espera; em transição – esperando por recursos necessários à execução; terminada.
Pode ainda ser considerado um sétimo estado, que é o de criação.
O Windows utiliza 32 níveis de prioridade. Esses níveis estão divididos em duas faixas:
1-15 (escalonamento de prioridade variável); 16-31 (escalonamento em tempo real). A
prioridade 0 (zero) serve para execução e uma thread especial, quando não
existirem threads prontas para executar.

Figura 8.2 – Níveis de


Prioridade.

O escalonamento de prioridade variável é uma política que implementa escalonamento


circular com prioridade. A thread de maior prioridade é executada durante a fatia de
tempo determinada no sistema. Após esse tempo, essa thread é preemptada
(removida) do processador e retorna para o final de fila dethreads com o mesmo nível
de prioridade que ela.
No escalonamento em tempo real, é adotado o escalonamento por prioridades.
As threads em execução permanecem em execução pelo tempo que for necessário. Não
existe fatia de tempo. O processamento é interrompido sempre que surgir um processo
com mais prioridade. Nessa faixa (16-31) ficam somente threads do sistema
operacional.

A possibilidade de utilizar prioridade por tempo compartilhado e por tempo real


possibilita uma certa flexibilidade de usos para o sistema operacional.
Gerenciamento de Memória
O Windows utiliza o gerenciamento de memória virtual com paginação. Considere que o
gerenciamento de memória lida com processos e não com as threads, uma vez que
as threads de um mesmo processo compartilham seu espaço de endereçamento.

O tamanho de página varia entre 4 e 64 KB, sendo em geral 4 KB.

A figura a seguir ilustra a utilização do espaço de endereçamento.

Figura 8.3 – Espaço de


Endereçamento Virtual.

Gerenciamento do Sistema de Arquivos


Os sistemas de arquivo suportados pelo Windows são o FAT, o FAT32 e o NTFS, além
dos sistemas de arquivos específicos para CDROM e DVD.

O FAT suporta partições de até 2 GB, pouco para os padrões atuais. O FAT32 já
consegue lidar com até 2 TB. Porém, também possui poucos recursos de segurança,
além de um desempenho inferior ao NTFS.

O NTFS suporta: RAID 0, RAID 1 e RAID 5; desfragmentação e quotas; criptografia e


compressão; proteção de arquivos e pastas por ACL (listas de controle de acesso);
nomes de arquivos com até 255 caracteres.
O NTFS utiliza volumes, que são partições lógicas de um disco. Cada volume pode
representar parte de um disco. A estrutura de um volume é feita a partir de um arquivo
com 1 Kb, denominado MFT (Master File Table), que possui os metadados do arquivo.

Figura 8.4 – Master File Table.

Entrada e Saída
A entrada e saída é controlada pela gerência de entrada e saída (GES). Ela recebe as
solicitações das threads e as repassa aos drivers e ao HAL.
A gerência de E/S oferece suporte a operações síncronas e assíncronas.  Os drivers para
Windows deve ter suporte a plug and play, múltiplos processadores e gerenciamento de
energia. Esse desenvolvimento deve seguir um modelo especificado pela Microsoft e
denominado Windows Driver Model (WDM).
Devido à complexidade para se implementar um driver completo conforme a WDM, é
utilizado um conceito denominado driver de porta e driver de mini-porta. O primeiro é
um driver genérico para classes de dispositivos, que suporta operações padrão para
aquele tipo de dispositivo. O de mini-porta implementa as funções específicas daquele
dispositivo.
Convém ressaltar que o Windows utiliza drivers também para emular aplicações MS-
DOS e implementar sistemas de arquivos. Por exemplo, o sistema NTFS e FAT também
são implementados através de drivers que recebem as solicitações da gerência de E/S e
repassam aos drivers de disco.

Segurança
A segurança no Windows é implementada pelo monitor de segurança. Com isso, permite
a utilização de um mecanismo padronizado para validar o acesso em tempo de
execução e verificar as condições de auditoria para cada entidade acessível ao usuário.
Sempre que um processo abre o descritor de um objeto, o monitor verifica o token de
segurança do processo e a lista de controle de acesso. Desse modo, determinadas
operações podem ser executadas somente por determinados usuários que possuem
acesso privilegiado. Os tokens podem permitir ainda que determinados programas
tenham também acessos restritos, o que evita danos caso executem códigos maliciosos.
Já na segurança no sistema de arquivos NTFS, cada arquivo referencia um descritor de
segurança que contém um token e uma lista de acesso. Indicando as permissões
concedidas aos usuários. Essas permissões podem ser ativadas ou não.

A outra parte da segurança é implementada pelo WINLOGON. Cabe a ele interceptar o


acesso pelas teclas (CRTL-ALT-DEL), além de montagem de tela de login, de troca de
senha e bloqueio da estação de trabalho.

Nesta aula, você pôde visualizar uma série de características do Windows. Viu ainda que
possui uma série de diferenças em relação ao Linux.
Em essência, a diferença está na estrutura do sistema operacional, ou seja, na forma
como o kernel e demais elementos do sistema operacional lidam com as solicitações do
usuário ou aplicações. A forma como gerencia os processos é outra particularidade do
Windows, inclusive com a utilização de dois níveis de prioridade.
No “Aplicando o Conhecimento”, você terá a oportunidade de verificar essas
características, podendo compará-las ao que foi visto na aula anterior.

Aplicando o Conhecimento
Para resolução destes exercícios é necessário que você tenha acesso a um computador
com sistema operacional Windows. Caso seu computador não utilize Windows você
pode fazer o download de uma versão para testes a partir do site da Microsoft. O
tamanho do download pode variar entre 650 MB e 4.7 GB. Você pode alternativamente
utilizar as versões disponibilizadas em revistas de computador que podem ser
encontradas em bancas de revistas.
1. Quais as configurações (processador, memória, periféricos) do computador?
2. Quantos processos e threads estão em execução neste momento em seu
computador?
3. Dica: utilize o task manager e as informações disponíveis no painel de controle.

Para Refletir
a. Quais os pontos positivos e negativos do sistema operacional Windows?
b. Você utiliza somente o sistema operacional Windows? Qual a razão?

Sistematização
Referências
ELZOLT, Phillip G. Optimizing Linux performance. Prentice Hall, 2005.

FERREIRA, Rubem E. Linux – Guia do administrador do sistema. Novatec, 2003.


MACHADO, Francis B. e MAIA, Luiz P. Arquitetura de Sistemas Operacionais. LTC,
2004.

Microsoft Technet Homepage. Disponível em: 


<http://technet.microsoft.com/pt-br/default.aspx>.

SILBERSCHATZ, Abraham. Sistemas Operacionais: conceitos e aplicações. Elsevier,


2004.

SINGHAL, Mukesh. Advanced concepts in Operating Systems: distributed,


database, and multiprocessor operating systems. McGraw Hill, 1994.

TANENBAUM, Andrew S. Sistemas Operacionais modernos. Prentice Hall, 2003.

The Linux Documentation Project. Disponível em: <http://tldp.org/>.


The Linux Kernel Archives. Disponível em: <http://www.kernel.org/>.

THOMPSON, Marco A. Microsoft Windows 2003 Server – administração de redes.


Editora Érica, 2003.

Glossário
A
ACL – Lista de Controle de Acesso.

C
CPU – Central Processing Unit ou Unidade Central de Processamento, onde o
processamento de um computador é efetuado. É composto basicamente de duas partes:
Unidade Lógico Aritmética (ULA) – que efetua cálculos aritméticos e lógicos; Unidade de
Controle – que extrai as instruções da memória, decodifica e as executa, se necessário,
chamando a ULA.

D
Daemons – Programas que ficam em execução permanente em segundo plano
(background), aguardando para responder a conexões de rede ou receber requisições
de login.
DLL – Dynamic Link Library – Biblioteca de funções executáveis ou dados que podem
ser utilizadas por uma aplicação Windows. Uma DLL provê uma ou mais funções para os
programas ligados estática ou dinamicamente a ela.
DMA – Direct Memory Access – Componente que permite a transferência de dados
diretamente da memória ao dispositivo de entrada ou saída. Utilizado para tornar mais
rápida a transferência dos dados e para liberar o processador para outras atividades.

J
JVM – Java Virtual Machine.
L
LDAP – Lightweight Directory Access Protocol – Serviço de diretório hierárquico
baseado no X.500; porém, mais simples, rápido e com mais recursos.

M
Mainframe – Computador de grande porte, capaz de suportar o uso simultâneo por
centenas ou mesmo milhares de usuários ao mesmo tempo. Utilizado, sobretudo, por
governos, grandes empresas e universidades, em razão de seu alto custo.

N
NFS – Network File System – Serviço que efetua a montagem de pastas remotas
localmente no computador do usuário. Permite aos usuários acessarem arquivos
localizados em máquinas remotas como se estivessem localizados em sua própria
máquina.

P
PDA – Personal Digital Assistant.
PID – Process Identifier – Número que identifica unicamente um processo em execução
no sistema operacional.

U
UID – User Identifier – Número que identifica o usuário ou processo que criou o
processo atual.

X
X.500 – Serviço de diretório hierárquico, criado pela ITU-T, com diferentes níveis para
cada categoria.

Você também pode gostar