Você está na página 1de 138

INTRODUO AOS SISTEMAS OPERACIONAIS

Maurcio F. Magalhes 1

Eleri Cardozo 2
Agosto de 1992

Faculdade de Engenharia Eltrica e de Computao UNICAMP


Faculdade de Engenharia Eltrica e de Computao UNICAMP
3
Departamento de Informtica - UFU
2

Luis F. Faina 3

Sumrio
1 INTRODUO
1.1 O que um Sistema Operacional ? . . . . . . . .
1.2 Histria dos Sistemas Operacionais . . . . . . . .
1.3 Conceitos Bsicos em Sistemas Operacionais . .
1.4 O Sistema Operacional UNIX . . . . . . . . . .
1.5 Uma Viso Geral do Sistema Operacional UNIX
1.6 Arquitetura do Sistema Operacional UNIX . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

3
3
4
6
8
9
16

2 PROCESSOS
2.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Escalonamento de Processos . . . . . . . . . . . . . . . . .
2.3 Gerenciamento de Processos no Sistema Operacional UNIX
2.4 Escalonamento de Processos no Unix . . . . . . . . . . . .
2.5 Controle de Processos no UNIX . . . . . . . . . . . . . . .
2.6 Comunicao e Sincronizao Inter-processos no UNIX . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

23
23
28
30
33
35
40

3 SISTEMA DE ARQUIVOS
3.1 Interface do Sistema de Arquivos . . . . . . .
3.2 Projeto do Sistema de Arquivos . . . . . . . .
3.3 Confiabilidade do Sistema de Arquivos . . . .
3.4 Desempenho do Sistema de Arquivos . . . .
3.5 O Sistema de Arquivos do UNIX (System V)

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

49
49
51
59
62
64

4 GERENCIAMENTO DE MEMRIA
4.1 Gerenciamento de Memria Sem Permuta ou Paginao .
4.2 Swapping (Permuta) . . . . . . . . . . . . . . . . . . .
4.3 Memria Virtual . . . . . . . . . . . . . . . . . . . . . .
4.4 Algoritmos de Troca de Pgina . . . . . . . . . . . . . .
4.5 Gerenciamento de Memria no UNIX . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

75
75
80
85
90
94

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

5 ENTRADA/SADA
101
5.1 Princpios do Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.2 Princpios do Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

DCA-FEEC-UNICAMP
5.3
5.4
5.5

Introduo aos Sistemas Operacionais

Discos RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109


Discos Rotativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Entrada/Sada no UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

6 TPICOS ESPECIAIS
6.1 Padronizao em Sistemas Operacionais
6.2 Processos Leves (Threads) . . . . . . .
6.3 Arquitetura de Microprocessadores . . .
6.4 Intel 80386 . . . . . . . . . . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

119
119
122
126
131

Captulo 1

INTRODUO
Programas computacionais (ou software) constituem o elo entre o aparato eletrnico (ou hardware) e o ser humano. Tal elo se faz necessrio dada a discrepncia entre o tipo de informao
manipulada pelo homem e pela mquina. A mquina opera com cadeias de cdigos binrios enquanto o homem opera com estruturas mais abstratas como conjuntos, arquivos, algoritmos, etc.
Programas computacionais podem ser grosseiramente divididos em dois tipos:




programas do sistema, que manipulam a operao do computador;


programas aplicativos, que resolvem problemas para o usurio.

O mais importante dos programas do sistema o sistema operacional, que controla todos os recursos do computador e proporciona a base de sustentao para a execuo de programas aplicativos.

1.1 O que um Sistema Operacional ?


A maioria de usurios de computador tm alguma experincia com sistemas operacionais, mas
difcil definir precisamente o que um sistema operacional. Parte do problema decorre do fato do
sistema operacional realizar duas funes bsicas que, dependendo do ponto de vista abordado, uma
se destaca sobre a outra. Estas funes so descritas a seguir.

1.1.1 O Sistema Operacional como uma Mquina Virtual


A arquitetura (conjunto de instrues, organizao de memria, E/S e estrutura de barramento)
da maioria dos computadores a nvel de linguagem de mquina primitiva e difcil de programar,
especificamente para operaes de entrada e sada. prefervel para um programador trabalhar com
abstraes de mais alto nvel onde detalhes de implementao das abstraes no so visveis. No
caso de discos, por exemplo, uma abstrao tpica que estes armazenam uma coleo de arquivos
identificados por nomes simblicos.
O programa que esconde os detalhes de implementao das abstraes o sistema operacional.
A abstrao apresentada ao usurio pelo sistema operacional simples e mais fcil de usar que o
hardware original.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

Nesta viso, a funo do sistema operacional apresentada ao usurio como uma mquina estendida ou mquina virtual que mais fcil de programar que o hardware que a suporta.

1.1.2 O Sistema Operacional como um Gerenciador de Recursos


Um computador moderno composto de vrios subsistemas tais como processadores, memrias, discos, terminais, fitas magnticas, interfaces de rede, impressoras, e outros dispositivos de
E/S. Neste ponto de vista, o sistema operacional tem a funo de gerenciar de forma adequada estes
recursos de sorte que as tarefas impostas pelos usurios sejam atendidas da forma mais rpida e
confivel possvel. Um exemplo tpico o compartilhamento da unidade central de processamento
(CPU) entre as vrias tarefas (programas) em sistemas multiprogramados. O sistema operacional o
responsvel pela distribuio de forma otimizada da CPU entre as tarefas em execuo.

1.2 Histria dos Sistemas Operacionais


Os sistemas operacionais tm evoludo com o passar dos anos. Nas prximas sees vamos
apresentar de forma sucinta este desenvolvimento.

1.2.1 A Primeira Gerao (1945-1955): Vlvulas e Plugs


Aps muitos esforos mal sucedidos de se construir computadores digitais antes da 2a guerra
mundial, em torno da metade da dcada de 1940 alguns sucessos foram obtidos na construo de
mquinas de clculo empregando-se vlvulas e rels. Estas mquinas eram enormes, ocupando salas
com racks que abrigavam dezenas de milhares de vlvulas (e consumiam quantidades imensas de
energia).
Naquela poca, um pequeno grupo de pessoas projetava, construia, programavam operava e dava
manuteno em cada mquina. Toda programao era feita absolutamente em linguagem de mquina,
muitas vezes interligando plugs para controlar funes bsicas da mquina. Linguagens de programao eram desconhecidas; sistemas operacionais idem. Por volta de 1950 foram introduzidos os
cartes perfurados aumentando a facilidade de programao.

1.2.2 A Segunda Gerao (1955-1965): Transistores e Processamento em Batch


A introduo do transistor mudou radicalmente o quadro. Computadores tornaram-se confiveis
e difundidos (com a fabricao em srie), sendo empregados em atividades mltiplas. Pela primeira
vez, houve uma separao clara entre projetistas, construtores, operadores, programadores e pessoal
de manuteno. Entretanto, dado seu custo ainda elevado, somente corporaes e universidades de
porte detinham recursos e infraestrutura para empregar os computadores desta gerao.
Estas mquinas eram acondicionadas em salas especiais com pessoal especializado para sua operao. Para rodar um job (programa), o programador produzia um conjunto de cartes perfurados
(um carto por comando do programa), e o entregava ao operador que dava entrada do programa no
computador. Quando o computador completava o trabalho, o operador devolvia os cartes com a
impresso dos resultados ao programador.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

A maioria dos computadores de 2a gerao foram utilizados para clculos cientficos e de engenharia. Estes sistemas eram largamente programados em FORTRAN e ASSEMBLY. Sistemas operacionais tpicos 1 eram o FMS (Fortran Monitor Systems) e o IBSYS (IBMs Operating Systems).

1.2.3 A Terceira Gerao (1965-1980): Circuitos Integrados e Multiprogramao


No incio dos anos 60, a maioria dos fabricantes de computadores tinha duas linhas distintas e
incompatveis de produtos. De um lado, havia os computadores cientficos que eram usados para
clculos numricos na cincia e engenharia. Do outro, haviam os computadores comerciais que executavam tarefas como ordenao de dados e impresso de relatrios, sendo utilizados principalmente
por instituies financeiras.
A IBM tentou resolver este problema introduzindo a srie System/360. Esta srie consistia de
mquinas com mesma arquitetura e conjunto de instrues. Desta maneira, programas escritos para
uma mquina da srie executavam em todas as demais. A srie 360 foi projetada para atender tanto
aplicaes cientficas quanto comerciais.
No foi possvel para a IBM escrever um sistema operacional que atendesse a todos os conflitos
de requisitos dos usurios. O resultado foi um sistema operacional (OS/360) enorme e complexo
comparado com o FMS.
A despeito do tamanho e problemas, o OS/360 atendia relativamente bem s necessidades dos
usurios. Ele tambm popularizou muitas tcnicas ausentes nos sistemas operacionais de 2a gerao,
como por exemplo a multiprogramao. Outra caracterstica apresentada foi a capacidade de ler
jobs dos cartes perfurados para os discos, assim que o programador os entregasse. Dessa maneira,
assim que um job terminasse, o computador iniciava a execuo do seguinte, que j fra lido e
armazenado em disco. Esta tcnica foi chamada spool (simultaneous peripherical operation on line),
sendo tambm utilizada para a sada de dados.
O tempo de espera dos resultados dos programas reduziu-se drasticamente com a 3a gerao
de sistemas. O desejo por respostas rpidas abriu caminho para o time-sharing, uma variao da
multiprogramao onde cada usurio tem um terminal on-line e todos compartilham uma nica CPU.
Aps o sucesso do primeiro sistema operacional com capacidade de time-sharing (o CTSS) desenvolvido no MIT, um consrcio envolvendo o MIT, a GE e o Laboratrio Bell foi formado com
o intuito de desenvolver um projeto ambicioso para a poca: um sistema operacional que suportasse centenas de usurios on-line. O MULTICS (MULTiplexed Information and Computing Service)
introduziu muitas idias inovadoras, mas sua implementao mostrou-se impraticvel para a dcada
de sessenta. O projeto MULTICS influenciou os pesquisadores da Bell que viriam a desenvolver o
UNIX uma dcada depois.

1.2.4 A Quarta Gerao (1980-): Computadores Pessoais e Estaes de Trabalho


Com o desenvolvimento de circuitos LSI, chips contendo milhares de transistores em um centmetro quadrado de silcio, surgiu a era dos computadores pessoais e estaes de trabalho. Em termos
de arquitetura, estes no diferem dos minicomputadores da classe do PDP-11, exceto no quesito
mais importante: preo. Enquanto os minicomputadores atendiam companhias e universidades, os
computadores pessoais e estaes de trabalho passaram a atender usurios individualmente.
1

Que eram capazes de gerenciar apenas um job por vez

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

O aumento do potencial destas mquinas criou um vastssimo mercado de software a elas dirigido. Como requisito bsico, estes produtos (tanto aplicativos quanto o prprio sistema operacional)
necessitavam ser amigveis, visando usurios sem conhecimento aprofundado de computadores e
sem inteno de estudar muito para utiliz-los. Esta foi certamente a maior mudana em relao ao
OS/360 que era to obscuro que diversos livros foram escritos sobre ele. Dois sistemas operacionais dominaram o mercado: MS-DOS para os computadores pessoais e UNIX para as estaes de
trabalho.
O prximo desenvolvimento no campo dos sistemas operacionais surgiu com a tecnologia de
redes de computadores: os sistemas operacionais de rede e distribudos.
Sistemas operacionais de rede diferem dos sistemas operacionais para um simples processador no
tocante capacidade de manipular recursos distribudos pelos processadores da rede. Por exemplo,
um arquivo pode ser acessado por um usurio num processador, mesmo que fisicamente o arquivo
se encontre em outro processador. Sistemas operacionais de rede provem ao usurio uma interface
transparente de acesso a recursos compartilhados (aplicativos, arquivos, impressoras, etc), sejam
estes recursos locais ou remotos.
Sistemas operacionais distribudos so muito mais complexos. Estes sistemas permitem que os
processadores cooperem em servios intrnsecos de sistemas operacionais tais como escalonamento
de tarefas e paginao. Por exemplo, num sistema operacional distribudo uma tarefa pode migrar durante sua execuo de um computador sobrecarregado para outro que apresente carga mais
leve. Contrrio aos sistemas operacionais de rede que so largamente disponveis comercialmente,
sistemas operacionais distribudos tm sua utilizao ainda restrita.

1.3 Conceitos Bsicos em Sistemas Operacionais


1.3.1 Processos
Um conceito fundamental em sistemas operacionais o de processo ou tarefa. Um processo
(s vezes chamado de processo sequencial) basicamente um programa em execuo. Ele uma
entidade ativa que compete por recursos (principalmente CPU) e interage com outros processos.
Em um instante qualquer, um processo est em um determinado estado. Estes estados podem ser:





executando (usando a CPU para executar as instrues do programa);


bloqueado (aguardando recursos 2 no disponveis no momento);
ativo (aguardando apenas CPU para executar).

Um processo em execuo passa por um sequncia de estados ordenados no tempo. Um processo


possui duas importantes propriedades:



2

o resultado da execuo de um processo independe da velocidade com que executado;


se um processo for executado novamente com os mesmos dados, ele passar precisamente pela
mesma sequncia de instrues e fornecer o mesmo resultado.

Que no CPU.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

Estas propriedades enfatizam a natureza sequencial de um processo. O processo sequencial


definido pelo resultado de suas instrues, no pela velocidade com que as instrues so executadas.

1.3.2 Sistemas Multitarefas e Multiusurios


Como j mencionado, um programa em execuo chamado de processo ou tarefa. Um sistema
operacional multitarefa se distingue pela sua habilidade de suportar a execuo concorrente de processos sobre um processador nico, sem necessariamente prover elaborada forma de gerenciamento
de recursos (CPU, memria, etc).
Sistemas operacionais multiusurios permitem acessos simultneos ao computador atravs de
dois ou mais terminais de entrada. Embora frequentemente associada com multiprogramao, multitarefa no implica necessariamente em uma operao multiusurio. Operao multiprocessos sem
suporte de multiusurios pode ser encontrado em sistemas operacionais de alguns computadores pessoais avanados e em sistemas de tempo-real.

1.3.3 Multiprogramao
Multiprogramao um conceito mais geral que multitarefa e denota um sistema operacional
que prov gerenciamento da totalidade de recursos tais como CPU, memria, sistema de arquivos,
em adio ao suporte da execuo concorrente dos processos.
Em uma mquina podemos ter o conjunto de processos sendo executados de forma serial ou
de forma concorrente, ou seja, os recursos presentes na mquina podem ser alocados a um nico
programa at a concluso de sua execuo ou esses recursos podem ser alocados de modo dinmico
entre um nmero de programas ativos de acordo com o nvel de prioridade ou o estgio de execuo
de cada um dos programas.
No caso de um computador no qual o sistema operacional usado permite apenas a monoprogramao, os programas sero executados instruo-a-instruo, at que seu processamento seja concludo. Durante a sua execuo, o programa passar por diversas fases, alterando momentos em que
se encontra executando ou bloqueado aguardando, por exemplo, a concluso de uma operao de
entrada/sada de dados (normalmente lenta, se comparada velocidade de execuo das instrues
por parte do processador).
Atravs do uso da multiprogramao possvel reduzir os perodos de inatividade da CPU e consequentemente aumentar a eficincia do uso do sistema como um todo. O termo multiprogramao
denota um sistema operacional o qual em adio ao suporte de mltiplos processos concorrentes,
permite que instrues e dados de dois ou mais processos disjuntos estejam residentes na memria
principal simultaneamente.
O nvel de multiprogramao presente em um sistema pode ser classificado como integral ou
serial. A multiprogramao dita integral caso mais de um processo possa se encontrar em execuo
em um dado instante, enquanto que no caso da serial apenas um processo se encontra em execuo
a cada instante, sendo a CPU alocada aos processos de forma intercalada ao longo do tempo. Uma
vez que a maioria dos computadores apresenta apenas uma unica CPU, a multiprogramao serial
encontrada com mais frequncia.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

1.3.4 Multiprocessamento
Embora a maioria dos computadores disponha de uma nica CPU que executa instrues uma a
uma, certos projetos mais avanados incrementaram a velocidade efetiva de computao permitindo
que vrias instrues fossem executadas ao mesmo tempo. Um computador com mltiplos processadores que compartilhem uma memria principal comum chamado um multiprocessador. O sistema
que suporta tal configurao um sistema que suporta o multiprocessamento.

1.3.5 Interpretador de Comandos (Shell)


O interpretador de comando um processo que perfaz a interface do usurio com o sistema operacional. Este processo l o teclado a espera de comandos, interpreta-os e passa seus parmetros ao
sistema operacional. Servios como login/logout, manipulao de arquivos, execuo de programas,
etc, so solicitados atravs do interpretador de comandos.

1.3.6 Chamadas de Sistema (System Calls)


Assim como o interpretador de comandos a interface usurio/sistema operacional, as chamadas
do sistema constituem a interface programas aplicativos/sistema operacional. As chamadas do sistema so funes que podem ser ligadas com os aplicativos provendo servios como: leitura do relgio
interno, operaes de entrada/sada, comunicao inter-processos, etc.

1.4 O Sistema Operacional UNIX


Dada sua larga aceitao, o sistema operacional UNIX ser utilizado como referncia neste curso.
O sistema dividido em duas partes:




programas e servios: shell, mail, vi, date, etc;


ncleo (kernel): Prov suporte aos programas e servios.

Desenvolvido nos Laboratrios da Bell em meados da dcada de setenta, o sistema UNIX inicialmente atendia as necessidades especficas do grupo de Cincia da Computao da Bell. A razo da
aceitao do UNIX explicada pelos atributos abaixo:








escrito em linguagem de alto nvel, o que facilita seu transporte para diferentes plataformas;
interface simples para com o usurio (shell);
fornece primitivas que permitem o desenvolvimento de programas complexos a partir de programas mais simples;
estrutura hierrquica de arquivos;
formatao de arquivos baseada no conceito de stream (cadeia) de bytes;
interfaceamento simples e consistente com os dispositivos perifricos;

DCA-FEEC-UNICAMP




Introduo aos Sistemas Operacionais

multiusurio/multiprogramado;
esconde a arquitetura do harware, permitindo que um programa execute em mltiplas plataformas.

1.5 Uma Viso Geral do Sistema Operacional UNIX

outros programas aplicativos

man

sh

nroff

a.out

cpp

find

Ncleo
comp

make

cc

Hardware
who

as

date

ld
wc

vi
ed

grep

outros programas aplicativos

Figura 1.1: Arquitetura do sistema operacional UNIX


Programas interagem com o ncleo atravs da evocao de um conjunto bem definido de chamadas de sistema. Muitos destes programas so denominados comandos.
O conjunto de chamadas do sistema e os algoritmos internos que implementam estas chamadas
formam o corpo do ncleo. A organizao do ambiente UNIX pode ser vista na forma de camadas
conforme mostrado na figura 1.1.

1.5.1 Sistema de Arquivos


O sistema de arquivos do UNIX caracterizado por:

estrutura hierrquica;

DCA-FEEC-UNICAMP







Introduo aos Sistemas Operacionais

10

tratamento consistente dos dados de arquivo;


facilidade na criao/eliminao de arquivos;
crescimento dinmico de arquivos;
proteo aos dados dos arquivos;
tratamento dos dispositivos perifricos como arquivos de dados.

O sistema de arquivo organizado na forma de rvore conforme pode ser visto no exemplo da
figura 1.2.
/

usr

bin

5bin

5include 5lib

tmp

etc

hosts passwd exportfs

pub

emacs tex

dev

X11

tty00

tty01

sh ed vi

Figura 1.2: Organizao hierrquica do sistema de arquivos


Ainda com relao a esta figura temos:





/ > raiz;
no-folhas > diretrios de arquivos;
folhas > diretrios ou arquivos regulares ou arquivos especiais de dispositivos.

A localizao de um arquivo na hierarquia pode ser na forma absoluta ou relativa. Na forma


absoluta utiliza-se o caracter / no incio do endereo para indicar a raiz, enquanto no caso relativo
inicia-se o caminho com o nome do arquivo que tem o diretrio atual como o ponto de partida do
endereo.
Os programas no ambiente UNIX no possuem nenhum conhecimento sobre o formato interno
no qual o ncleo armazena os dados de arquivo. Os dados so fornecidos pelo UNIX como um stream
(cadeia) de bytes, cabendo aos programas interpretarem o seu conteudo. Este tratamento estende-se
tambm aos diretrios, ou seja, estes so vistos como arquivos regulares.
O acesso aos arquivos controlado pelas permisses de acesso associadas a cada arquivo. No
caso, temos os seguintes tipos de permisses: leitura, escrita e execuo, para os seguintes tipos de
usurios: proprietrio do arquivo, grupo de usurios ou qualquer outro usurio.
Uma caracterstica importante do UNIX o fato de que os programas acessam os dispositivos
perifricos com a mesma sintaxe utilizada para o acesso aos arquivos regulares. Os dispositivos
tambm so protegidos da mesma forma que os arquivos regulares.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

11

O cdigo abaixo ilustra o programa copy que copia o contedo de um arquivo para outro.
/*
#include <stdio.h>
#include <sys/fcntl.h>
#include <sys/stat.h>
char buffer[512];
void copy(old, new)
int old, new;
{
int count;
while((count = read(old, buffer, sizeof(buffer))) > 0)
write(new, buffer, count);
}

main(argc, argv)
int argc;
char *argv[];
{
int fdold, fdnew;
if(argc != 3)
{
printf("Uso: copy f1 f2\n");
exit(1);
}
/* abre arquivo para leitura */
fdold = open(argv[1], O_RDONLY);
if(fdold == -1)
/* erro no open */
{
printf("Impossivel abrir %s\n", argv[1]);
exit(1);
}
/* cria arquivo novo */
fdnew = creat(argv[2], 0666);
if(fdnew == -1)
/* erro no creat */
{
printf("Impossivel criar %s\n", argv[2]);

*/

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

12

exit(1);
}
/* chama copy */
copy(fdold, fdnew);
exit(0);
}
/*

*/

1.5.2 Ambiente de Processamento


Um programa um arquivo executvel, e um processo uma instncia do programa em execuo.
No UNIX vrios processos podem executar simultneamente, sendo que vrias instncias de um
mesmo programa podem existir ao mesmo tempo no sistema.
o programa abaixo ilustra os comandos fork, execl, wait e exit (implcito) utilizados na criao
e sincronizao de processos.
/*

*/

#include <stdio.h>
#include <sys/wait.h>
#include <sys/time.h>
main(argc, argv)
int argc;
char *argv[];
{
int pid;
struct timeval tv1, tv2;
double t1, t2;
pid = fork();
/* fork */
if(pid == 0) execl(argv[1], NULL);
/* processo filho */
gettimeofday(&tv1, NULL);
/* processo pai continua ... */
t1 = (double)(tv1.tv_sec) + (double)(tv1.tv_usec)/ 1000000.00;
wait(NULL);
/* sincroniza com o termino do filho */
gettimeofday(&tv2, NULL);
t2 = (double)(tv2.tv_sec) + (double)(tv2.tv_usec)/ 1000000.00;
printf("\nO tempo de execucao de %s eh: %lf\n", argv[1], (t2 - t1));
}
/*

*/

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

13

Uma das caractersticas marcantes do UNIX que este no suporta, no nvel do ncleo, muitas
das funes que fazem parte dos ncleos de outros sistemas operacionais. No caso do UNIX, estas
funes so, em geral, programas no nvel do usurio. O exemplo de programa mais destacado neste
caso o programa shell que o responsvel pela intepretao dos comandos do usurio.
Na maior parte das vezes o shell executa o comando fork e o processo filho executa o comando
solicitado atravs da chamada exec. As palavras restantes na linha de comando so tratadas como
parmetros do comando. O shell aceita trs tipos de comandos:





arquivo executvel produzido por compilao;


arquivo executvel contendo uma sequncia de linhas de comando do shell;
comando interno do shell.

O shell normalmente executa um comando sincronamente, ou seja, espera o trmino do processo


associado ao comando antes da leitura de uma nova linha de comando. Tambm possvel a execuo
assncrona do comando. Neste caso, o shell l e executa a prxima linha de comando sem esperar o
trmino do processo associado ao comando anterior, o qual executa em background.
Como o shell um programa que se situa no nvel do usurio, no fazendo parte do ncleo,
fcil modific-lo para um ambiente particular.

1.5.3 Modularidade no Ambiente UNIX


O ambiente tem como filosofia permitir aos usurios o desenvolvimento de programas pequenos e modulares que possam ser usados como blocos primitivos na construo de programas mais
complexos.
a) redirecionamento de entrada/sada (E/S) : os processos possuem, convencionalmente, acesso a
trs tipos de arquivos padro: entrada, sada e erro.
Processos que so executados a partir de um terminal possuem, tipicamente, o terminal como
arquivo de entrada, sada e erro. Estes arquivos podem ser redirecionados independentemente. Ex:





ls : lista todos os arquivos do diretrio corrente na sada padro;


ls > output : redireciona a sada padro para o arquivo chamado output no diretrio atual;
mail mjb < carta : faz com que o programa mail (correio eletrnico) leia o contedo da
mensagem do arquivo carta, e no do terminal.

b) pipe : permite que um fluxo de dados seja estabelecido entre um processo produtor e um processo
consumidor.
Processos podem redirecionar a sua sada padro para um pipe a ser lido por outro processo que
tenha redirecionado a sua entrada padro para o mesmo pipe. Ex:




grep main a.c b.c c.c : lista as ocorrncias da palavra main nos arquivos a.c, b.c e c.c;
grep main a.c b.c c.c j wc -l : submete a sada do comando anterior a um utilitrio que conta o
nmero de linhas de um arquivo (wc, opo -l).

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

14

1.5.4 Servios do Sistema Operacional


Dentre os servios suportados pelo ncleo temos:







controle de execuo dos processos: criao, terminao, suspenso, comunicao entre processos;
escalonamento (ordem de acesso CPU) de processos;
alocao de memria principal para execuo dos processos. Caso a memria esteja escassa, o
ncleo move temporariamente processos da memria primria para a secundria 3 ;
alocao de memria secundria para armazenamento/recuperao eficiente dos dados do usurio (este servio constitui o sistema de arquivos);
acesso controlado aos dispositivos perifricos tais como terminais, fitas, discos, redes, etc.

O ncleo fornece estes servios de forma transparente. Ex:




o ncleo deteta que um dado arquivo um arquivo regular ou um dispositivo, mas esconde esta
distino dos processos do usurio;
o ncleo formata os dados em um arquivo para fins de armazenamento interno, entretanto,
este formato escondido do usurio, sendo retornado para este um stream no formatado de
bytes.

1.5.5 Aspectos do Hardware


A execuo dos processos do usurio no ambiente UNIX dividida em 2 nveis: usurio e ncleo.
Quando um processo executa uma chamada do sistema, o modo de execuo do processo muda do
modo usurio para o modo ncleo. As diferenas entre estes 2 modos so:




processos no modo usurio podem acessar as suas instrues e dados, mas no as instrues
e dados do ncleo ou de qualquer outro processo. Processos no modo ncleo podem acessar
endereos do ncleo ou do usurio;
algumas instrues so privilegiadas e resultam em erro quando executadas no modo usurio.

Interrupes e Excees
O UNIX permite que dispositivos tais como perifricos de E/S ou o relgio do sistema interrompam a CPU assincronamente. Geralmente, o hardware define prioridades para os dispositivos de
acordo com a ordem na qual as interrupes devero ser atendidas caso ocorram simultaneamente.
Uma condio de exceo refere-se ocorrncia de um evento no esperado provocado pelo
processo. Alguns destes eventos podem ser: endereamento ilegal da memria, execuo de instruo
privilegiada, diviso por zero, etc.
3

Esta transferncia pode ser do processo completo (swapping), ou de segmentos do processo (paginao).

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

15

As excees podem ser caracterizadas como algo que ocorre no meio da execuo de uma instruo, onde o sistema tenta reiniciar a instruo aps tratar a exceo. No caso das interrupes,
estas podem ser consideradas como se ocorressem entre a execuo de duas instrues, sendo que o
sistema continua a executar a partir da prxima instruo aps tratar a interrupo.
O UNIX utiliza um mesmo mecanismo para manipular as condies de interrupo e exceo.
Nveis de Execuo do Processador
O ncleo necessita muitas vezes impedir a ocorrncia de interrupes durante a execuo de
atividades crticas. Exemplo: o ncleo no deve aceitar interrupo do disco enquanto estiver operando sobre listas ligadas, isto porque o tratamento da interrupo pode interferir na atualizao dos
apontadores provocando inconsistncias.
Normalmente, os computadores possuem instrues privilegiadas que permitem definir o nvel
de execuo do processador. A atribuio do nvel de execuo do processador em um determinado
valor mascara a interrupo daquele nvel e dos nveis inferiores (tornando habilitadas as de nveis
superiores).
Na figura 1.3, caso o ncleo mascare a interrupo do disco, todas as interrupes, exceto a do
relgio e dos erros da mquina, so impedidas.
Erros de Hardware
Prioridade Alta
Relgio
Disco
Dispositivos de Rede
Terminais
Prioridade Baixa
Interrupo de Software

Figura 1.3: Nveis de interrupo definidas pelo UNIX

Gerenciamento de Memria
O ncleo reside permanentemente na memria principal, assim como, os processos em execuo
(ou pelo menos parte deles).
Quando da compilao, so gerados endereos no programa que representam variveis e instrues. O compilador gera estes endereos para uma mquina virtual como se nenhum outro programa fosse executar simultaneamente na mquina real. Quando da execuo do programa, o ncleo
aloca espao na memria principal atravs do mapeamento do endereo virtual no endereo fsico da
mquina. Este mapeamento depende das caractersticas do hardware da mquina.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

16

1.6 Arquitetura do Sistema Operacional UNIX


Uma viso mais detalhada da arquitetura do ncleo do UNIX mostrada na figura 1.4.
Programas do usurio
bibliotecas

traps
Nvel do usurio
Nvel do ncleo

interface das chamadas de sistema

comunicao
interprocessos

subsistema de arquivos

subsistema
de controle
de processos

escalonador

buffer cache
gerenciamento
de memria
caractere

bloco

drivers de dispositivos

controle do hardware
Nvel do ncleo
Nvel de hardware
hardware

Figura 1.4: Arquitetura do ncleo do sistema operacional UNIX


Os programas em linguagem de mquina podem evocar chamadas ao sistema diretamente, isto ,
sem o uso da biblioteca. Por sua vez, os programas em linguagem de alto nvel realizam as chamadas
como se estivessem evocando funes ordinrias, cabendo biblioteca mapear estas chamadas de
funes nas primitivas necessrias para acessar o sistema operacional. Outras bibliotecas permitem
um uso mais sofisticado das chamadas ao sistema (exemplo: biblioteca de E/S).
A figura 1.4 divide as chamadas ao sistema em chamadas ao sub-sistema de arquivos e ao subsistema de controle dos processos. O sub-sistema de arquivos acessa os dados nos arquivos atravs

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

17

de um mecanismo de bufferizao que, atravs da interao com os drivers de dispositivos de


E/S orientados a bloco, regula o fluxo de dado entre o ncleo e os dispositivos de armazenamento
secundrio. Os dispositivos de E/S orientados a bloco so dispositivos de armazenamento de acesso
randmico.
O sub-sistema de arquivo interage diretamente com dispositivos que no so do tipo bloco (terminais, por exemplo). Neste caso, no h a interveno do mecanismo de bufferizao.
Os sub-sistemas de arquivo e de controle dos processos interagem quando do carregamento de um
arquivo na memria para execuo. O mdulo de gerenciamento da memria controla a alocao de
memria, ou seja, caso em um determinado instante o sistema no possua memria fsica suficiente
para todos os processos, o ncleo move-os entre a memria fsica e a memria secundria de modo
a que todos os processos possuam as mesmas chances de execuo. Duas polticas so normalmente
utilizadas: permuta (swapping) e paginao.
O mdulo de escalonamento aloca a CPU aos processos, os quais executam at o instante em que
liberam a CPU para aguardar um recurso, ou ento, so preemptados porque a execuo excedeu
o quantum de tempo disponvel para o processo. Neste caso, o escalonador escolhe o processo
pronto de maior prioridade.
Ainda com relao aos processos, existem vrias formas de comunicao entre estes, variando
desde a sinalizao assncrona de eventos at a transmisso sncrona de mensagens entre processos.

1.6.1 Introduo aos Conceitos do Sistema


Uma Viso do Sistema de Arquivos
A representao interna de um arquivo dado por um inode. Este contm uma descrio do layout
no disco do arquivo de dado, assim como outras informaes tais como: proprietrio do arquivo,
permisses de acesso e instantes de acesso.
Todo arquivo possui um inode, o qual alocado quando da sua criao, podendo possuir, entretanto, vrios nomes, todos mapeados no mesmo inode. Cada um destes nomes denomina-se link. Os
inodes so armazenados no sistema de arquivos e so lidos em uma tabela de inodes (em memria)
quando da manipulao dos respectivos arquivos.
Duas outras estruturas de dados so importantes: tabela de arquivo (TA) e tabela descritora de
arquivo do usurio (TDAU), sendo que TA uma estrutura global ao ncleo enquanto uma TDAU
criada para cada processo. Quando da criao/abertura de um arquivo, o ncleo associa uma entrada
de cada uma das tabelas ao inode correspondente ao arquivo, permitindo que as entradas destas trs
estruturas -TA, TDAU e inode- mantenham o estado do arquivo, assim como, os direitos de acesso
ao arquivo.
TA mantm o offset, no arquivo correspondente, do prximo byte a ser lido/escrito, assim como, os
direitos de acesso do processo;
TDAU identifica todos os arquivos abertos para o processo.
A figura 1.5 ilustra o uso das tabelas TDAU, TA e de inodes. Note um link onde dois campos na
TDAU apontam para o mesmo campo na TA.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais


TDAU

TA

18

Tabela de Inodes

Figura 1.5: Estruturas de dado do sistema de arquivos


O ncleo retorna um descritor de arquivo quando das chamadas open e create, o qual corresponde
a um ndice na TDAU. Quando da execuo de um write ou um read, o ncleo utiliza o descritor
de arquivo para acessar a TDAU e atravs desta alcanar a TA e o inode do arquivo onde, atravs
deste ltimo, o ncleo encontra o dado no arquivo. Esta arquitetura dos dados permite vrios nveis
de acesso compartilhado ao arquivo.
Uma instalao pode possuir vrias unidades fsicas de disco, cada uma delas contendo um ou
mais sistemas de arquivo. O ncleo relaciona-se com os sistemas de arquivo de um ponto de vista
lgico ao invs de tratar com discos. Cada dispositivo lgico identificado por um nmero do
dispositivo lgico. A converso entre os endereos do dispositivo lgico (sistema de arquivo) e os
endereos, no dispositivo fsico (disco) realizada pelo driver do disco.
Um sistema de arquivos consiste de uma sequncia de blocos lgicos, cada um contendo qualquer
mltiplo de 512 bytes. O tamanho de um bloco lgico homogneo dentro do sistema de arquivos
podendo, entretanto, variar para diferentes sistemas de arquivo em uma dada configurao. Blocos
maiores representam um aumento na taxa de transferncia dos dados entre a memria e o disco.
Entretanto, blocos maiores demandam mais espao em memria para manipul-los. Um sistema de
arquivos possui a seguinte estrutura (ver figura 1.6):
bloco de
boot

super
bloco

lista de inodes

blocos de dados

Figura 1.6: Estrutura do sistema de arquivos





bloco de boot : contm o cdigo do bootstrap que lido na mquina quando da partida do
sistema operacional;
super-bloco : descreve o estado de um sistema de arquivo;
lista de inodes : tem o seu tamanho definido quando da configurao do sistema de arquivos.
Um dos inodes corresponde raiz do S.A. atravs deste inode que a estrutura de diretrios
do sistema acessada;

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

19

bloco de dados : contm arquivos e dados administrativos. Um bloco de dados s pode pertencer a um nico arquivo do sistema.

Processos
Um processo corresponde execuo de um programa e consiste de um conjunto de bytes que a
CPU interpreta como instruo de mquina, dado e pilha.
O processo executa uma sequncia de instrues que auto-contida e que no salta para um outro
processo. Ele l e escreve seus dados nas suas reas de dado e pilha, mas no pode ler ou escrever
nas reas de dado e pilha de outro processo. Os processos comunicam com outros processos e com o
resto do sistema atravs de chamadas de sistema.
Do ponto de vista prtico, um processo em UNIX uma entidade criada pela chamada fork.
Exceto o primeiro, qualquer outro processo criado atravs da chamada fork. O processo que chamou o fork identificado como processo pai e o que acabou de ser criado identificado como
processo filho. Todo processo tem um nico pai mas pode ter vrios filhos. O ncleo identifica
cada processo atravs de um nmero denominado process ID (PID). No caso do processo filho, ele
recebe como retorno aps a execuo do fork o valor 0, enquanto o processo pai recebe um valor
diferente de 0 que corresponde ao PID do filho. Atravs do teste do valor retornado pelo fork, um
processo pode distinguir se ele o processo pai ou o processo filho e, em consequncia, tomar a ao
correspondente.
O processo 0 um processo especial criado quando da iniciao do sistema (boot). Aps criar o
processo 1, conhecido como init, o processo 0 torna-se o processo swapper. O processo 1 ancestral
de qualquer outro processo no sistema, possuindo uma relao especial com estes, relao esta que
ser discutida nos captulos subsequentes.
Um arquivo executvel gerado quando da compilao de um programa consiste das seguintes
partes:






um conjunto de cabealhos que descrevem os atributos dos arquivos;


o texto do programa;
representao em linguagem de mquina dos dados que possuem valor inicial e uma indicao
de quanto espao o ncleo necessita alocar para os dados sem valor inicial, denominado bss;
outras sees tais como informaes sobre a tabela de smbolos.

O ncleo carrega um arquivo executvel, gerado pelo compilador, durante a execuo de uma
chamada exec, consistindo o processo carregado de trs partes: texto, dado e pilha.
As regies de texto e dado correspondem s sees do texto e dados iniciados e no-iniciados
(bss). A pilha criada automaticamente e o seu tamanho ajustado dinamicamente pelo ncleo em
tempo de execuo. Um quadro (frame) da pilha contm os parmetros para a funo chamada, suas
variveis locais e os dados necessrios (apontador de pilha e contador de programa) para recuperar o
quadro anterior na pilha.
Como um processo no UNIX pode executar em 2 modos, ncleo ou usurio, utiliza-se uma pilha
separada para cada modo. O lado esquerdo da figura 1.7 mostra a pilha do usurio para o programa
copy quando da chamada de sistema write.

DCA-FEEC-UNICAMP

variveis locais

Introduo aos Sistemas Operacionais

20

direo do
crescimento
da pilha

end. do quadro 2
end. de retorno apos
chamada do write
parmetros do write
(new, buffer, count)

quadro 3
call write

variveis locais
(count)
end. do quadro 1
end. de retorno aps
chamada do copy
parmetros do copy
(old, new)
variveis locais
(fdold, fdnew)

quadro 2
call copy

end. do quadro 0
end. de retorno aps
chamada do main
parmetros do main
(argc, argv)

quadro 1
call main

Pilha do Usurio

processamento da
chamada white
Pilha do Ncleo

quadro 0
incio

quadro 0
interface das chamadas de sistema

Figura 1.7: Estado das pilhas para o programa copy


Cada chamada de sistema possui uma entrada na biblioteca de chamadas de sistema, a qual
codificada em assembler, contendo instrues especiais (traps) que, quando executadas, provocam
uma interrupo resultando em um chaveamento no hardware para o modo ncleo passando a utilizar
a pilha do ncleo. A construo da pilha do ncleo ocorre nos mesmos moldes da construo da pilha
no modo usurio.
Todo processo possui uma entrada na tabela de processos (TP) do ncleo e a cada um alocada
uma rea U que contm dados privados manipulados somente pelo ncleo. A TP aponta para uma
tabela de regies do processo (pregion), cujas entradas apontam para entradas na tabela de regio.
Uma regio uma rea contgua de um espao de endereo do processo, tal como: texto, dado e
pilha.
As entradas na tabela de regio descrevem os atributos da regio, ou seja, se a regio contm
texto ou dado, se uma regio compartilhada ou privada e se o contedo da regio encontra-se em
memria.
O nvel extra de encadeamento, ou seja, da pregion para a tabela de regio, permite que processos
independentes compartilhem regies de memria.
Quando um processo evoca a chamada exec o ncleo aloca regies para o texto, dado e pilha do
processo que est sendo criado, aps liberar as regies antigas do processo que estava executando.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

21

Quando um processo evoca fork o ncleo duplica o espao de endereo do processo antigo permitindo, quando possvel, que processos compartilhem regies ou, caso contrrio, fazendo uma cpia da
regio. Quando um processo evoca exit o ncleo libera as regies que o processo estava usando. A
figura 1.8 ilustra as estruturas de dados associadas ao controle dos processos.
pregion

Tabela de Regies

rea U

memria primria
Tabela de Processos

Figura 1.8: Estruturas de dados associadas ao controle dos processos


A entrada na tabela de processos e a rea U contm informaes de controle e status sobre o
processo. A rea U pode ser vista como uma extenso da entrada do processo na tabela de processos.
Campos importantes da tabela de processos:





campo de estado;
identificadores dos usurios que possuem o processo;
um conjunto descritor de evento quando o processo est bloqueado.

A rea U contm informaes que descrevem o processo e que so acessadas somente durante a
execuo do processo. Os campos mais importantes so:






apontador para o campo na TP do processo em execuo;


descritores de arquivo para todos os arquivos abertos;
parmetros internos de E/S;
limites de tamanho do processo e arquivo.

Contexto de um Processo
O contexto de um processo o estado definido pelo seu texto correspondendo aos valores das
suas variveis globais e estruturas de dado, os valores dos registros de mquina usados, os valores
armazenados no seu slot na tabela de processos e na rea U e o contedo das suas pilhas de usurio
e ncleo. Quando o ncleo decide executar um novo processo realiza-se uma mudana de contexto.
Quando da realizao de uma mudana de contexto o ncleo salva informaes suficientes de
modo a que posteriormente ele possa recuperar o contexto do processo anterior e continuar a sua

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

22

execuo. Da mesma forma, quando da mudana do modo usurio para o modo ncleo, o ncleo
salva as informaes necessrias para que o processo possa retornar ao modo usurio e continuar a
execuo. Neste ltimo caso, temos uma mudana de modo e no de um chaveamento de contexto.
Estados do Processo
A vida de um processo pode ser representada por um conjunto de estados (figura 1.9):






executando no modo usurio;


executando no modo ncleo;
pronto;
bloqueado (dormindo).

chamada de sistema
ou interrupo

Executando em
Modo Ncleo

Executando em
Modo Usurio

retorno

interrupo/retorno
2

escalonado
aguardando
evento
3

evento

Bloqueado

Pronto

Figura 1.9: Estados de um processo


O ncleo protege a sua consistncia permitindo chaveamento de contexto apenas quando o processo transita do estado executando no modo ncleo para o modo bloqueado. O ncleo tambm
eleva o nvel de execuo do processador quando da execuo de regies crticas de modo a impedir interrupes que possam provocar inconsistncias em suas estruturas de dados. O escalonador de
processo realiza, periodicamente, a preempo de processos executando no modo usurio de forma
a que os processos no monopolizem a CPU.

Captulo 2

PROCESSOS
2.1 Introduo
No captulo anterior definimos o conceito de processo, bem como algumas generalidades sobre
como o sistema operacional UNIX gerencia processos. Neste captulo, avanaremos no estudo de
processos, analisando problemas de concorrncia, escalonamento e comunicao inter-processos.

2.1.1 Modelo de Processos


A maioria dos computadores modernos so capazes de realizar diversas atividades em paralelo.
Enquanto roda um programa do usurio, o computador pode ler um disco ou utilizar a impressora.
Em sistemas multiprogramados, a CPU comutada de programa a programa em perodos da ordem
de milisegundos, dando ao usurio a impresso de paralelismo.
O gerenciamento de atividades paralelas difcil de ser implementado com eficincia. Entretanto, projetistas de sistemas operacionais ao longo dos anos vm desenvolvendo modelos objetivando
tornar esta tarefa mais simples.
No modelo mais empregado atualmente, todos os programas executveis no computador, muitas vezes incluindo subsistemas do sistema operacional, esto organizados na forma de processos.
Conceitualmente, cada processo tem uma prpria CPU virtual (tabela armazenando contedo de registradores, contador de programa, etc). A posse da CPU real passada periodicamente de processo
a processo. O sistema pode ser visto como uma coleo de processos sendo executados em pseudo
paralelismo. 1 Conforme definido anteriormente, a habilidade de executar mltiplos programas numa
nica CPU denomina-se multiprogramao.
Em sistemas multiprogramados, a velocidade de execuo de um processo funo da quantidade
de processos competindo pela CPU. Isto implica que o tempo de execuo de um processo varia a
cada nova execuo, dependadendo da carga da mquina. Assim sendo, processos no devem
ser programados com consideraes intrnsecas de tempo. Quando so requeridas consideraes de
tempo real, medidas especiais devem ser tomadas para se assegurar que estas iro ocorrer.
1

Paralelismo real obtido apenas com a utilizao de mltiplas CPUs.

23

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

24

2.1.2 Concorrncia
Em muitos sistemas operacionais, processos frequentemente compartilham outros recursos alm
da CPU. Por exemplo, durante uma chamada de sistema um processo pode ter acesso a uma tabela
mantida pelo ncleo. Neste caso, o ncleo deve inibir a comutao da CPU para outro processo, at
que todas as operaes na tabela forem efetuadas. Caso contrrio, a tabela fatalmente assumiria um
estado inconsistente onde apenas algumas alteraes foram processadas.
Em situaes como a exemplificada acima, a tabela definida como um recurso compartilhado,
e a parte do cdigo que o manipula como uma regio crtica. A execuo de uma regio crtica
deve ser um procedimento controlado a fim de evitar que os recursos compartilhados atinjam estados
inconsistentes.

2.1.3 Regies Crticas


A chave para prevenir problemas em reas compatilhadas proibir que mais de um processo leia
ou escreva dados compartilhados ao mesmo tempo, ou seja, deve-se garantir a mtua excluso. Se
for garantido que nenhum par de processos esteja executando ao mesmo tempo uma regio crtica
delimitando um mesmo recurso compartilhado, inconsistncias so evitadas. 2
Embora este quesito evite inconsistncias, o mesmo no garante eficincia na utilizao dos recursos compartilhados. Para assegurarmos uma boa soluo, necessrio que:






dois processos no estejam simultaneamente dentro de suas regies crticas referentes ao mesmo recurso compartilhado (garantia de mtua excluso);
a garantia de mtua excluso se d independente da velocidade relativa dos processos ou nmero de CPUs;
nenhum processo executando fora de regies crticas bloqueie outro processo;
nenhum processo espere um tempo arbitrariamente longo para executar uma regio crtica (ou
sofra estarvao).

Vrios algoritmos de controle visando garantir as propriedades acima foram propostos. Estes
algoritmos so classificados segundo o modo com que esperam pela autorizao de entrada numa regio crtica: espera ocupada (competindo pela CPU durante a espera) ou bloqueada (no competindo
pela CPU).
Todo algoritmo de mtua excluso possui, invariavelmente, duas partes (implementadas como
duas funes distintas). A primeira funo evocada quando o processo deseja iniciar a execuo de
uma regio crtica. Quando esta funo retorna, o processo est apto a executar a regio crtica. No final da execuo, o processo evoca a segunda funo, anunciando que a regio crtica j foi executada.
Esta segunda funo, via de regra, provoca o retorno da primeira funo em outro processo.
2
Note que regies crticas delimitando diferentes recursos podem ser executadas por diferentes processos ao mesmo
tempo.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

25

Para permitir que regies crticas que acessam recursos compartilhados distintos possam ser executadas ao mesmo tempo, cada recurso compartilhado possui um identificador (via de regra um nmero inteiro). Assim sendo, as duas funes que compem o algoritmo de garantia de mtua excluso
possuem este identificador como parmetro.

2.1.4 Mtua Excluso Com Espera Ocupada


Nesta seo analisaremos vrias propostas para garantir excluso mtua nas regies crticas, no
permitindo que mais de um processo possam manipular um recurso compartilhado ao mesmo tempo.
Em todas, o processo que est tentanto acessar uma regio crtica em execuo por outro processo
permanece em espera ocupada, isto , competindo pela CPU mas sem avanar no seu processamento.
Por esta razo, os mtodos que empregam espera bloqueada so os mais utilizados na prtica.
Desabilitar Interrupes
A soluo mais simples o mtodo de desabilitar todas as interrupes quando se est entrando
na regio crtica, e reabilit-las ao sair. Esta proposta no muito atrativa, pois d ao processo usurio
poder de desabilitar todas as interrupes, inclusive aquelas que permitem o ncleo reassumir a CPU.
Caso o processo no as reabilite por algum motivo, o sistema operacional jamais reassume o controle
do harware.
Em outro aspecto, conveniente para o sistema operacional desabilitar interrupes durante algumas instrues, enquanto est atualizando variveis internas. Assim, desabilitar interrupes uma
soluo til para o sistema operacional, no para processos de aplicao.
Variveis LOCK
Uma segunda tentativa leva-nos a uma soluo por software. Considere uma varivel simples e
compartilhada 3 LOCK, inicialmente igual a 0. Quando um processo deseja entrar em sua regio
crtica ele primeiro testa o LOCK. Se for 0, o processo altera para 1 e executa a regio crtica. Se for
1 ele espera at que seja 0. Embora parea uma boa soluo, o que ir ocorrer se ambos testam uma
varivel de valor 0 ao mesmo tempo ?
Alternncia Estrita
Esta proposta define uma varivel TURN, inicialmente 0. Ela indica quem deve esperar e quem
pode entrar na seo crtica. Se TURN for 0, o processo 0 pode entrar na regio crtica. Ao sair, deve
passar o valor de TURN para 1. Quando TURN 1 o processo 1 pode entrar na seo crtica. Ao sair
passa o valor de TURN para 0. 4
Este algoritmo garante a mtua excluso. Entretanto, os processos estritamente se alternam na
posse do recurso compartilhado. Isto faz com que um processo necessite aguardar o acesso a um
recurso compartilhado por todos os demais at que chegue novamente a sua vez. O que ocorre
quando o nmero de acessos for diferente entre os processos ?
3
4

Uma para cada recurso compartilhado.


Este algoritmo facilmente generalizado para

N processos, N > 2.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

26

Soluo de Peterson
Obtida pela combinao das idias de variveis LOCK e TURN, criando-se tambm uma soluo
por software para o problema. Esta soluo evita os problemas individuais das solues anteriores,
mas pouco utilizada na prtica por utilizar espera ocupada.
Instruo TSL
Esta proposta requer uma pequena ajuda do hardware. Ela utiliza a instruo TSL (Test and Set
Lock) presente em muitos processadores. Esta instruo permite a implementao de variveis LOCK
cujo teste e atualizao so atmicos (em outas palavras, a instruo TSL indivisvel mesmo frente
a interrupes de hardware).

2.1.5 Mtua Excluso com Espera Bloqueada


Sero apresentados a seguir alguns mecanismos de garantia de mtua excluso que bloqueiam os
processos quando tentam executar uma regio crtica ocupada. So mais eficientes que os anteriores, posto que processos bloqueados no competem pela CPU.
Sleep e Wakeup
Um dos mtodos mais simples constitue-se do par sleep e wakeup. sleep uma chamada de
sistema que muda o estado de um processo em execuo para bloqueado. Um processo bloqueado
volta a tornar-se ativo quando outro o desbloqueia atravs da chamada wakeup. O mtodo o mesmo
que emprega variveis LOCK operadas por instrues TSL, exceto que quando a varivel apresenta
valor 1, o processo executa sleep. O processo que altera o valor de LOCK para 0 ao sair da regio
crtica o responsvel por ativar um processo bloqueado (via wakeup).
Infelizmente, com o emprego de apenas sleep e wakeup fcil demonstrar e existncia de um
estado onde todos os processos encontram-se bloqueados. Esta situao denominada deadlock.
Semforos
So variveis inteiras que contam o nmero de vezes que a operao wakeup tenha sido realizada.
Duas operaes, DOWN e UP (generalizaes de sleep e wakeup) so definidas. A operao DOWN
verifica se o valor do semforo for maior que 0. Se o for, decrementa o valor e continua. Se o valor 0,
o processo bloqueado. A operao UP incrementa o valor do semforo. Se um ou mais processos
estiverem bloqueados sobre aquele semforo, um deles escolhido pelo sistema para completar a
operao DOWN (emitindo-lhe um wakeup).
As operaes com semforos so atmicas ou indivisveis, implementadas com instrues TSL.
Contadores de Evento
Um outro tipo de varivel de sincronizao entre processos. Trs operaes so definidas para
um contador de evento (E):

READ(E) : retorna o valor corrente de E;

DCA-FEEC-UNICAMP




Introduo aos Sistemas Operacionais

27

ADVANCE(E) : incrementa atomicamente E;


AWAIT(E,v) : bloqueia at que E  v.

Note que os contadores de eventos nunca decrescem e partem sempre de 0. Contadores de evento
so mais convenientes que semforos para problemas to tipo produtor-consumidor com buffer limitado.
Monitores
Semforos e contadores de evento tornam simples a proteo de recursos compartilhados. Entretanto, uma simples troca na ordem da chamada das primitivas pode gerar uma situao de deadlock.
Em suma, a utilizao de semforos e contadores de eventos deve se processar com extrema cautela.
Monitores so uma proposta de mecanismo de sincronizao de alto nvel. Um monitor uma
coleo de procedimentos, variveis e estruturas de dados agrupados em um bloco. Os processos
podem acessar os procedimentos do monitor mas no suas estruturas internas. Monitores tm uma
caracterstica importante: somente um processo pode estar ativo 5 no monitor em um dado instante
(garantindo portanto a mtua excluso).
Monitores constituem-se em um conceito de linguagem de programao, ou seja, o compilador
reconhece que os monitores so especiais e pode manusear as chamadas do monitor diferentemente de
outras chamadas. Esta uma das desvantagens de monitores: precisam de linguagens de programao
que os incorpore.
A concluso que monitores, apesar de elegantes na manuteno de mtua excluso, de aplicao restrita, pois raras so as linguagens de programao que os incorporam.

2.1.6 Comunicao Inter-processos


Muitos autores consideram os mecanismos de mtua excluso apresentados acima como formas de processos se comunicarem. Entretanto, preferimos considerar tais mecanismos como de
sincronizao inter-processos, usando o termo comunicao apenas quando ocorrer intercmbio de
informao entre processos. Sincronizao so procedimentos de controle, normalmente usados para
garantir mtua excluso, e utilizados para geranciar a competio entre os processos. Comunicao,
por sua vez, visa promover a cooperao entre os processos.
Passagem de Mensagem
Este mtodo de comunicao entre processos usa duas chamadas de sistema: send e receive.




send(destino, mensagem) : envia mensagem a um processo destino.


receive(fonte, mensagem) : recebe mensagem de um processo fonte.

Destino e fonte de mensagens so buffers alocados pelos processos para fins de envio e recepo
de mensagens. Mensagens so estruturas tipadas ou no cujo contedo interpretado unicamente
pelos processos emissor e receptor da mensagem.
5

Executando qualquer um de seus procedimentos.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

28

Compartilhamento de Dados
Processos podem se comunicar atravs do compartilhamento de uma rea comum onde dados podem ser escritos por um e lidos por outro processo. O acesso a esta rea comum deve ser disciplinado
por um mecanismo de mtua excluso (tipicamente semforos) ou tornando as instrues de leitura
e gravao atmicas. Duas primitivas so necessrias:




STORE(posio, dado) : grava dados numa certa posio;


FETCH(posio, dado) : acessa dados de uma certa posio.

Chamada de Procedimentos Remotos


Chamada de procedimentos remotos (ou RPC) uma forma mais estruturada de troca de mensagens entre processos servidores e clientes. Um processo servidor dispe de um conjunto de servios
que um processo cliente evoca como se evocasse um procedimento local. O cliente indica o servio
desejado ao servidor, passando parmetros para sua execuo, se for o caso. Recebida a requisio,
esta processada pelo servidor 6 que retorna os resultados ao cliente. O envio e recepo de parmetros e retornos se d por troca de mensagens. Uma biblioteca de RPC possui duas primitivas
bsicas:




REGISTER_RPC(servio) : utilizada por servidores para anunciar que servios esto aptos a
processar;
CALL_RPC(servio, parmetros, resultados) : utilizada por clientes para evocar servios.

2.2 Escalonamento de Processos


2.2.1 Introduo
Quando mais de um processo est ativo (pronto para executar), cabe ao sistema operacional
decidir qual ter a posse da CPU. A parte do sistema operacional que toma esta deciso chamada
escalonador e o algoritmo utilizado o algoritmo de escalonamento.
Vrios critrios devem ser observados por um algoritmo de escalonamento:
1. progresso: garatir que cada processo tenha acesso CPU;
2. eficincia: manter a CPU ocupada praticamente 100% do tempo;
3. tempo de resposta: minimizar o tempo de resposta na execuo dos processos, principalmente
os interativos (editores, planilhas, etc);
4. tempo de espera: minimizar o tempo de espera de servios no interativos (compilao, impresso, etc);
5. vazo: maximizar o nmero de processos executados por hora.
6

Ou colocada numa fila de espera.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

29

importante observar que alguns desses objetivos so contraditrios. Se um algoritmo favorece o escalonamento de processos interativos certamento estar comprometendo os no interativos.
Vejamos agora alguns algoritmos de escalonamento.

2.2.2 Algoritmos de Escalonamento


Escalonamento Round Robin
Este o mais antigo e simples algoritmo de escalonamento. Cada processo executado por um
intervalo de tempo (quantum). Se o processo ainda estiver executando ao final do quantum, ele
suspenso e a CPU alocada a outro processo. Se o processo acabar ou for bloqueado antes do final
do quantum, a CPU tambm passada a outro processo. A nica questo a ser analisada o tamanho
do quantum. Se for muito pequeno, diminui a eficincia da CPU, pois a alocao da CPU para outro
processo implica num certo overhead. Se for muito grande, degrada a resposta para os processos
interativos.
Algoritmos com Prioridades
O algoritmo Round Robin faz a considerao que todos os processos so de igual importncia.
Certas aplicaes, como controle de processos industriais, demandam um algoritmo de escalonamento com prioridades. A idia bsica que cada processo tem uma prioridade e processos com
prioridades superiores devem ser executados primeiro. Para prevenir que processos de alta prioridade executem indefinidamente, o escalonador, via de regra, diminui a prioridade dos processos com o
aumento de seu respectivo tempo de execuo.
Mltiplas Filas
Este um algoritmo que define classes com prioridades. Processos na classe de menor prioridade
so executados por um quantum. Processos na classe seguinte, por dois quanta. Na prxima classe
por 4 quanta, e assim por diante. Quando um processo utiliza todos os quanta a ele alocados, o
mesmo interrompido e sua classe tem a prioridade diminuda. Este algoritmo diminui o nmero de
comutaes da CPU entre os processos ativos.
Tarefas Pequenas Primeiro
Este algoritmo designado para aplicaes no interativas, onde o tempo mdio de execuo
conhecido a priori. O algoritmo define que as tarefas menores devem ser executadas primeiro.
Prova-se que esta poltica minimiza o tempo mdio de espera dos Jobs.
Algoritmo Policy-Driven
Este algoritmo particiona a CPU de forma equnime entre os usurios (no entre os processos).
O algoritmo define que se existirem n usurios ligados ao sistema, e cada usurio dever receber 1/n
do poder da CPU. Para isto, o sistema deve manter informaes do tempo de CPU que cada usurio
j disps desde que entrou no sistema, e do instante de tempo que cada usurio ligou-se ao sistema.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

30

Escalonamento em Dois Nveis


At agora foi considerado que todos os processos residem em memria primria. Entretanto se
esta memria for insuficiente, processos ativos podem ser armazenados temporariamente em memria secundria (tipicamente disco). O meio mais prtico para controlar a comutao de processos
definir dois nveis de escalonamento. Um escalonador de baixo nvel se restringe a troca de processos
que esto na memria primria no momento. Um escalonador de alto nvel decide sobre a troca dos
processos entre as memrias primria e secundria.

2.3 Gerenciamento de Processos no Sistema Operacional UNIX


No captulo 1 introduzimos o conceito de processo, como so criados e como o sistema operacional os mantm. Neste captulo detalharemos mais a estruturao de processos no UNIX e apresentaremos como processos so controlados, escalonados e se comunicam.

2.3.1 Transies de Estado


Na figura 1.9 apresentamos um diagrama de estados simplificado onde um processo podia se encontrar em 4 estados: executando em modo usurio, executando em modo ncleo, pronto e bloqueado
(dormindo). A rigor, um processo no UNIX apresenta 9 estados (figura 2.1):
1. Executando em modo usurio;
2. Executando no modo ncleo;
3. Pronto para execuo (aguardando apenas CPU) e residindo em memria primria;
4. Bloqueado (dormindo) e residindo em memria primria;
5. Pronto para execuo, mas residindo em memria secundria (aguardando swapping);
6. Bloqueado (dormindo) e residindo em memria secundria;
7. O processo est saindo do modo ncleo e retornando ao modo usurio, quando ocorre uma
mudana de contexto e o processo perde a CPU;
8. O processo acabou de ser criado e est em transio para pronto;
9. O processo executou um exit, no mais existe, mas seu registro mantido at que seja enviado
ao processo pai seu cdigo de retorno e outras estatsticas.
Vejamos o que tipicamente ocorre a partir da criao de um processo. Aps executado um fork,
so criados para o novo processo um campo na tabela de processos, sua rea U e apontadores para
sua pregion. O processo encontra-se no estado 8. Dependendo da disponibilidade ou no de memria
primria, o processo move-se, respectivamente, para os estados 3 ou 5. Assuma que o processo
deslocou-se para o estado 3 (pronto em memria primria). O escalonador seleciona ento o processo
para executar, movendo-o para o estado 2 (executando em modo ncleo), onde a chamada fork ser

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

31

Executando em
Modo Usurio
1
escalonado
chamada de sistema
ou interrupo

retorno

"Preemptado"

9
exit

Terminado

perda da CPU

Executando em
Modo Ncleo

interrupo/retorno

escalonado
aguardando
evento
Bloqueado
em Memria

evento

Pronto
em Memria
memria abundante

"swap out"

"swap out"

"swap in"

fork

memria escassa
Bloqueado
em Memria
Secundria

evento
6

Pronto
em Memria
Secundria

Figura 2.1: Diagrama completo de transio de estados para processos


completada para este processo, retornando 0. A partir da, o processo entra em execuo no modo
usurio, processando suas instrues uma a uma. Expirado seu quantum de CPU, uma interrupo
de relgio faz com que o processo retorne ao modo ncleo novamente. Terminado o tratamento
da interrupo, o escalonador pode decidir alocar a CPU a um outro processo, movendo este para
o estado 7. Este estado equivalente ao estado 3 como mostra a linha pontilhada na figura 2.1.
Esta distino feita para enfatizar que um processo tem a CPU tomada somente quando est apto a
retornar para o modo usurio, diferente do estado 3 onde deve voltar ao modo ncleo para completar
uma chamada de sistema.
A eventual execuo de uma chamada de sistema faz com que o processo abandone o modo
usurio (estado 1) e continue sua execuco no modo ncleo (estado 2). Suponha que o processo
requeira uma operao de E/S do disco. O ncleo coloca o processo no estado 4 (dormindo em
memria) at que o processo seja notificado que a operao de E/S se completou (mais precisamente,
quando a operao se completa, o hardware interrompe a CPU, cujo tratamento da interrupo resulta
no acordar do processo). Se ao ser desbloqueado o processo ainda estiver residindo em memria
primria, o mesmo posto no estado 3, aguardando CPU.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

32

Entretanto, se durante sua permanncia no estado 4 o ncleo necessitar de espao na memria


primria, o processo sofre swapping, sendo removido da memria primria e armazenado em memria secundria (tipicamente disco). Neste caso, o processo atinge o estado 6 (dormindo em memria
secundria). Uma vez completada a operao de E/S com o processo no estado 6, este transita para
o estado 5 (pronto em memria secundria). Quando o swapper escolhe o processo para aloc-lo
novamente em memria primria, este volta para o estado 3.
No estado 3, quando o escalonador volta a atribuir a CPU ao processo, o mesmo atinge o estado
2 onde completa a chamada de sistema e volta ao estado 1, executando no modo usurio.
Quando um exit executado pelo processo, o mesmo transita, via estado 2, para seu estado
terminal (9), permanecendo neste estado at que o processo pai seja notificado.
Algumas observaes sobre o diagrama de transio de estados apresentado na figura 2.1:





uma vez criado, as transies de estado de um processo dependem exclusivamente do sistema


operacional;
um processo pode forar a entrada no modo ncleo atravs da execuo de uma chamada de
sistema, mas a sada deste estado foge ao seu controle;
um processo pode atingir o estado 9 sem explicitamente evocar um exit: traps aritmticos
como diviso por zero e overflows, ou de segmentao como referncia a posies invlidas de
memria, podem forar compulsoriamente o trmino do processo.

2.3.2 Descritores de Processos


A tabela de processos e a rea U descrevem o estado dos processos. A primeira uma estrutura
mantida pelo ncleo com os seguintes campos:










o estado do processo;
a localizao da rea U e do prprio processo, seja na memria primria ou secundria, bem
como o tamanho do processo;
o identificador do usurio (UID), isto , o dono processo;
o identificador do processo (PID), nico durante toda a vida do processo;
eventos aguardados pelo processo quando no estado bloqueado (dormindo);
parmetros de escalonamento, utilizados para decidir quais processos transitaro entre estados
de execuo nos modos usurio e ncleo;
sinais enviados ao processo, mas ainda no tratados;
marcas de tempo como tempo total CPU, despertadores armados pelo processo, etc, alm de
recursos consumidos do ncleo (estes parmetros so utilizados no cmputo da prioridade de
escalonamento do processo).

A rea U de um processo armazena as seguintes informaes:

DCA-FEEC-UNICAMP













Introduo aos Sistemas Operacionais

33

um ponteiro de volta ao respectivo ndice na tabela de processos;


privilgios que o processo dispe, de acordo com o seu UID;
tempos de execuo nos modos usurio e ncleo;
ponteiros para os gerenciadores de sinais definidos pelo processo;
o terminal de login associado ao processo, caso exista;
um campo de erro, armazenando os erros gerados por chamadas de sistema;
parmetros de I/O, tais como endereo de dados a serem transferidos, tamanho destes dados,
destino, etc;
o diretrio corrente e o diretrio raiz;
descritores de arquivos abertos pelo processo;
limites (tamanho mximo de pilha, arquivos, etc);
permisses (modos de acesso atribuidos durante a criao de arquivos).

2.4 Escalonamento de Processos no Unix


O escalonamento de processos no UNIX segue um algoritmo de meio termo entre prioridades
e Round Robin. necessrio enfatizar que tal algoritmo tem o objetivo de compartilhar a CPU de
forma equnime entre mltiplos usurios (sendo portanto orientada ao time-sharing). Tal algoritmo
inadequado para aplicaes que requeiram o cumprimento estrito de restries temporais, como
impostas por aquelas ditas de tempo real pesadas (hard real-time).
O ncleo divide os processos segundo duas classes de prioridades:




prioridades em modo ncleo (altas), referentes a processos bloqueados no estado 4 ou 5;


prioridades em modo usurio (baixas), referentes a processos prontos no estado 7.

A figura 2.2 mostra as classes de prioridades adotadas. Prioridades em modo ncleo so subdivididas em dois grupos. O primeiro grupo, de elevada prioridade, constituido de processos bloqueados
a espera de swapping, E/S em disco, buffers de cache e inodes. Quando acordados, estes processos
completam suas respectivas chamadas de sistema ininterruptamente (visando a rpida liberao de
recursos do ncleo, tais como buffers).
O segundo grupo, de prioridade mais baixa que o primeiro, constitui-se de processos bloqueados
a espera de entrada de terminal, sada em terminal e terminao de processo filho. Tais processos
podem ser interrompidos, pois estes estados de bloqueio no demandam grandes recursos do ncleo.
Finalmente, processos aguardando apenas CPU (estado 7) so dispostos segundo um certo nmero de nveis de prioridade (este nmero dependente da particular implementao).
Processos numa mesma classe de prioridade so dispostos numa fila, como representado na figura
2.2 pelos crculos interligados.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

prioridades
em modo
ncleo
Nveis de Prioridade

34

processos

swapper
no passvel
de interrupo

aguardando E/S em disco


aguardando buffer
aguardando inode
aguardando entrada de terminal

passvel de
interrupo

aguardando sada em terminal


Escalonamento por Prioridades
aguardando trmino do proc. filho

limiar de prioridade
em modo ncleo
nvel de usurio 0

Escalonamento Round Robin

nvel de usurio 1

nvel de usurio N
prioridades
em modo
usurio

Figura 2.2: Classes de prioridades para fins de escalonamento de processos


O algoritmo de escalonamento do UNIX processado segundo o seguinte esquema. Quando
ocorre uma interrupo do hardware:




caso a interrupo acorde um ou mais processos com prioridade de modo ncleo, aloque a
CPU quele de mais alta prioridade;
caso contrrio, se uma mudana de contexto se fizer necessria, aloque a CPU ao processo de
mais alta prioridade dentre as de modo usurio.

Em existindo mais de um processo apto a executar no mesmo nvel, a seleo se d segundo a


poltica Round Robin.
Pode-se observar que o escalonamento de processos no UNIX se d em duas direes: por prioridades na vertical, e por Round Robin na horizontal (para processos de mesma prioridade). Outras
caractersticas importantes do algoritmo de escalonamento do UNIX:
1. As prioridades no modo ncleo dependem apenas do evento aguardado pelo processo.
2. Processos transitando do modo ncleo para o modo usurio, tem seu nvel de prioridade rebaixado em relao sua posio inicial. Esta penalidade, por utilizar recursos do ncleo,

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

35

visa evitar o monoplio da CPU pelos processos que utilizam chamadas de sistema de forma
frequente.
3. A cada intervalo de tempo (tipicamente um segundo), as prioridades em modo usurio so
recomputadas. Processos que se utilizaram recentemente da CPU so penalizados em benefcio
dos processos que no a utilizaram.

2.5 Controle de Processos no UNIX


O controle de processos se divide em duas atividades: instanciao (criao) e interrupo de
processos.

2.5.1 Instanciao de Processos


O mecanismo bsico de criao de processos no UNIX a chamada de sistema fork. A figura
2.3 ilustra o que ocorre quando um processo executa esta chamada de sistema. Um novo elemento na
tabela de processos mantida pelo ncleo criado; a rea U criada imagem da rea U do processo
pai; uma tabela de regio criada com reas de pilha e dados copiadas do processo pai, e rea de
texto compartilhada com o processo pai. A pilha mantida pelo ncleo copiado tambm.
Como pode-se observar na figura, a cpia da rea U faz com que todos os descritores de arquivo
permaneam ativos para o processo filho. A cpia das regies de dados e pilhas faz com que toda a
histria de execuo do processo pai (valores de variveis, retorno de funes, etc) seja herdada pelo
processo filho.
Uma alternativa de instanciao de processos a famlia exec de chamadas de sistema. Uma chamada exec utiliza os recursos do processo que a executou para instalar um novo processo. Diferente
do fork, o processo que executa uma chamada exec deixa de existir.
exec tem como parmetros o arquivo executvel e dados a serem passados ao novo processo,
sendo por este obtidos na funo main atravs dos argumentos argc e argv.
Basicamente, uma chamada exec libera as regies de memria relativas a texto, dados e pilha
alocadas pelo processo executor da chamada, instalando novas regies para o novo processo. O
campo na tabela de processos mantida pelo ncleo e a regio U permanecem inalterados. A pilha
mantido pelo ncleo refeito para o novo processo. Isto significa que a histria do processo antigo
perdida, mas o PID e descritores de arquivo por ele abertos permanecem vlidos. 7 .
Fica claro agora uma das utilidades da chamada fork: criar um novo processo sem que o processo
que o criou tenha sua execuo terminada. Exemplo:
/*

*/

int pid, fd1, fd2;


char arg1[16], arg2[16];
...
fd1 = open("arq1", O_RDONLY, 0);
7
Entretanto, a nica maneira do novo processo conhecer o valor destes descritores atravs da passagem de parmetros
via argc e argv.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais


processo pai
rea U

Tabela de Arquivos

pregion
arquivos abertos
dados
do pai

diretrio corrente
diretrio raiz

pilha
do pai

pilha do ncleo

texto
(compartilhado)
processo filho
rea U

Tabela de Inodes

pregion
arquivos abertos
dados
do filho

diretrio corrente
diretrio raiz

pilha
do filho

pilha do ncleo

Figura 2.3: A execuo de uma chamada de sistema fork.


fd2 = open("arq2", O_RDONLY, 0);
sprintf(arg1, "%d", fd1);
sprintf(arg2, "%d", fd2);
pid = fork();
if(pid == 0)
{ /* processo filho */
execlv("prog2", arg1, arg2, NULL);
/* se passar por aqui, execv falhou */
printf("execlv falhou !");
exit(0);
}
/* processo pai continua */

36

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

37

...
/*

*/

No exemplo acima, o programa executa um fork, deixando a cargo do filho a execuo do novo
processo. Os descritores de arquivo fd1 e fd2 so passados como argumento para o novo programa.
Capturando estes argumentos, o novo programa capaz de executar operaes nos respectivos arquivos sem reabr-los.
/*

*/

/* prog1 */
main(argc, argv)
int argc;
char *argv[];
{
int fd1, fd2;
/* acessa descritores abertos pelo executor do exec */
sscanf(argv[1], "%d", &fd1);
sscanf(argv[2], "%d", &fd2);
...
}
/*

*/

2.5.2 Interrupo de Processos


Processos no UNIX podem ter sua execuo alterada assincronamente por ao de um outro
processo (ou do usurio, atravs do shell). Esta ao referida como o envio de um sinal. Sinais
podem ser enviados a um processo para notific-lo:










de uma requisio de mudana de estado (ex: morte de um processo via kill -9);
do trmino do processo filho;
da corrncia de excees (ex: trap aritmtico);
de situaes irrecuperveis (ex: recursos exauridos durante o processamento de um exec);
da ocorrncia de erros inesperados (ex: utilizao de um pipe quebrado);
do disparo de despertadores de tempo (ex: retorno da chamada sleep);
de interrupes oriundas de terminais (ex:

"C );

de interrupes para fins de depurao (ex: ocorrncia de um breakpoint).

DCA-FEEC-UNICAMP
sinal
SIGHUP
SIGINT
SIGILL
SIGFPE
SIGKILL
SIGSEGV
SIGSYS
SIGALRM
SIGSTOP
SIGCONT
SIGCHLD

Introduo aos Sistemas Operacionais

38

significado
hang-up
interrupo
instruo ilegal (trap)
exceo aritmtica (trap)
trmino forado
violao de segmentao (trap)
argumento invlido em chamada de sistema
alarme de relgio
suspeno da execuo
continuao da execuo
mudane. status de proceso filho

Tabela 2.1: Exemplos de sinais no UNIX System V


Sinais so explicitamente enviados a processos atravs da chamada de sistema kill. kill tem como
parmetros o PID do processo ao qual o sinal se destina; e o tipo de sinal. Existem em torno de 30
tipos de sinais no UNIX System V, sendo os mais importantes mostrados na tabela 2.1.
Processos podem apresentar as seguintes reaes a sinais:






o processo compulsoriamente terminado;


o processo bloqueado at a ocorrncia de um sinal de desbloqueio;
o processo ignora o sinal;
o processo captura o sinal.

Sinais so armazenados na tabela de processos mantida pelo ncleo, sendo a ao correspondente


ao sinal tomada quando o processo passa da execuo de modo ncleo para modo usurio.
Para cada sinal definido um comportamento default para o proceso que o recebe. Em geral, este
comportamente simplesmente o trmino do processo. Um processo pode alterar o comportamento
default frente a ocorrncia de um dado sinal atravs da chamada de sistema signal. signal possui
dois parmetros: o nmero do sinal (definido em signal.h); e a ao a ser executada quando do
recebimento deste sinal. A ao pode possuir trs valores:
0 : o processo terminado quando receber o sinal;
1 : o sinal ignorado;
endereo vlido de funo : A funo chamada assincronamente quando da ocorrncia do sinal.
Esta funo dita gerenciador do sinal para o processo.
Exemplo: capturar interrupes de teclado. Quando o usurio executa um "C , um sinal do tipo
SIGINT enviado ao processo que est executando em foreground. O comportamento default para
este sinal o trmino do processo. Suponha um programador precavido que deseje a confirmao

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

39

que o "C no foi acidental. O cdigo abaixo ilustra esta situao:


/*

*/

/* gerenciador para SIGINT */


int ger()
{
int c;
printf("Tem certeza que quer abortar [s/n] ? ");
c = getchar();
if(c == s) exit(0);
}

main()
{
signal(SIGINT, ger);
...
}
*/

/*

Todas as vezes que um SIGINT for enviado ao processo, a funo ger chamada assincronamente,
solicitando confirmao do trmino da execuo. Caso o usurio responda n, a funo retorna e o
programa continua normalmente.
A maneira como o ncleo processa sinais descrita sucintamente a seguir. Quando um sinal
enviado a um processo (pelo ncleo ou por outro processo), o ncleo simplesmente ativa o campo
correspondente ao sinal na tabela de processos. Neste campo est localizado tambm o gerenciador
do sinal (definido pelo processo ou default).
No momento que um processo passa do modo ncleo para o modo usurio, o ncleo verifica se
existe sinais enviados ao processo e ainda no tratados. Caso exista, o ncleo executa os seguintes
passos:
1. Salva o contador de programa e o stack pointer do processo.
2. Caso o processo no defina um gerenciador para o sinal, executa a ao default. Caso contrrio,
prossiga.
3. Associa temporariamente a ao default para o sinal.
4. Cria um novo quadro na pilha como se o processo estivesse evocando o gerenciador neste
momento.
5. Direciona o contador de programa para o endereo da rotina gerenciadora do sinal e atualiza o
stack pointer para levar em conta o aumento da pilha causado pela chamada do gerenciador.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

40

O passo 3 merece um comentrio adicional. Ele existe para evitar que uma rajada de sinais ocasione um stack overflow pelo empilhamento de mltiplas chamadas do gerenciador (caso o intervalo
de ocorrncia dos sinais seja menor que o tempo de execuo do gerenciador). Entretanto, durante
a execuo da rotina gerenciadora, o processo fica numa condio vulnervel, pois a ao default
que ser executada face a ocorrncia de um novo sinal de mesmo tipo.

2.6 Comunicao e Sincronizao Inter-processos no UNIX


Nesta seo descreveremos trs mecanismos de comunicao inter-processos (pipes, mensagens
e memria compartilhada), e um de sincronizao inter-processos (semforos). Pipes so disponveis
em qualquer verso de UNIX, enquanto os demais esto presentes apenas nas verses compatveis
com o System V.

2.6.1 Pipes
O mecanismo original de comunicao inter-processos so os chamados pipes. Em geral, pipes
so empregados para estabelecer comunicao entre processos pai e filho. Um pipe um canal
unidirecional de comunicao, isto , a informao flui numa nica direo. Para estabelecer-se
comunicao bidirecional, so necessrios dois pipes.
Pipes podem ser vistos como um buffer conectando dois processos. Um processo escreve dados
num dos lados do buffer, enquanto o outro l estes dados no lado oposto. Esta forma de comunicao
pode ser obtida com o emprego de arquivos em disco. A diferena bsica que pipes so bloqueantes,
isto , a gravao em um pipe cheio ou a leitura em um pipe vazio causa o bloqueio do processo.
Pipes so implementados pelo ncleo como um sistema de arquivos. Cada pipe tem um inode
associado, sendo que o ncleo aloca blocos de dados medida que dados vo sendo escritos no pipe
(desalocando-os medida que so lidos).
Pipes so criados com a chamada de sistema pipe. A chamada retorna dois descritores de arquivos, sendo o primeiro para leitura e o segundo para gravao. Esta chamada, em geral, se processa
antes de ocorrer um fork. Se a comunicao for no sentido pai ! filho, o processo pai fecha o primeiro descritor (com a chamada close), e o filho o segundo. A partir da, o pai executa chamadas
write no segundo descritor e o filho read no primeiro. Um segundo pipe pode ser empregado para
a comunicao no sentido inverso, atentando-se para o fechamento correto dos descritores que no
sero empregados pelo processo.
Aps o final da sesso de comunicao, os lados abertos do pipe tambm so fechados a fim de
liberar os recursos a ele associados pelo ncleo.
Exemplo: enviar um string do processo pai para o processo filho.
/*
main{}
{
int fd[2];
char buff[32];

*/

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

41

if(pipe(fd) == -1) {perror("pipe"); exit(0);}


if(fork() != 0)
{
/* PAI */
close(fd[0]);
strcpy(buff, "oi filho !");
write(fd[1], buff, strlen(buff) + 1);
close(fd[1]);
exit(0);
}
else
{ /* FILHO */
close(fd[1]);
read(fd[0], buff, 32);
printf("%s", buff);
close(fd[0]);
exit(0);
}
/*

*/

2.6.2 Mensagens
Troca de mensagens um mecanismo de comunicao mais flexvel que pipes. Enquanto um
pipe um canal sncrono e unidirecional, mensagens so canais tanto sncronos quanto assncronos
e bidirecionais.
Para o envio e recepo de mensagens, cria-se um port de comunio. Ports so identificados por
um nmero inteiro. A chamada de sistema msgget cria um port, retornando seu identificador local. O
primeiro parmetro uma chave atribuida ao port, seu identificador global. O segundo parmetro so
opes relativas a criao, acesso, etc. Via de regra, msgget retorna um port dado seu identificador
global, criando-o caso tal port inexista.
O ncleo mantm uma tabela de ports, e mensagens enviadas a ports so enfileiradas, sendo
recebidas na ordem que foram enviadas. A comunicao bidirecional, posto que, de posse de um
identificador local de port, um processo pode tanto enviar quanto receber mensagens neste port.
Mensagens so enviadas com a chamada de sistema msgsnd. A chamada possui quatro parmetros: o identificador do port para o qual a mensagem deve ser enviada; a estrutura que contm a
mensagem; seu tamanho em bytes; e a opo de envio assncrono (retornando um cdigo de erro caso
no exista espao para o ncleo armazenar a mensagem no port). A opo default o envio sncrono,
onde o processo bloqueia ante a impossibilidade de armazenamento da mensagem no port.
Estruturas contendo mensagens devem ser definidas como structs contendo dois campos: um
inteiro (tipo da mensagem); e uma cadeia de bytes (o contedo da mensagem). Exemplo:
struct mensagem {
int tipo;
/* tipo da mensagem */

DCA-FEEC-UNICAMP
char conteudo[1024];
};

Introduo aos Sistemas Operacionais

42

/* conteudo da mensagem (1K max.) */

A recepo de mensagens se d atravs da chamada de sistema msgrcv. Cinco parmetros so


necessrios: o identificador local do port; a estrutura onde a mensagem ser copiada; o tamanho
mximo em bytes alocados pela estrutura; o tipo de mensagem desejada; e opo de recebimento
assncrono (retornando um cdigo de erro caso o port no contenha mensagem do tipo especificado).
Uma quarta chamada de sistema, msgctl, empregada para obter e alterar o status de ports.
Possui trs parmetros: o identificador local do port; o tipo de operao e o endereo da estrutura
com as informaes de entrada ou retorno, de acordo com a ao explicitada no segundo parmetro.

2.6.3 Memria Compartilhada


Uma outra forma de comunicao disponvel no UNIX o compartilhamento de um espao
virtual. Este espao criado via chamada de sistema shmget. shmget possui trs parmetros: um
identificador global da regio compartilhada, o tamanho da regio em bytes; e opes de controle
(criao e acesso). Como msgget, esta chamada retorna um identificador local da regio, criando-a
caso inexista.
Uma vez acessada, um processo associa a regio compartilhada em seu prprio espao de endereamento. Para tal, utiliza-se a chamada de sistema shmat que possui trs parmetros: o identificador local da regio compartilhada, o endereo local que apontar para a regio; e parmetros de
controle (se a regio deve ser considerada de leitura apenas, por exemplo).
O procedimento inverso, isto , a desassociao de uma regio compartilhada de um endereamento local se d com a chamada de sistema shmdt. Esta chamada possui um nico parmetro: o
endereo local previamente associado a uma regio compartilhada.
Finalmente, a chamada shmctl empregada para obter e alterar o status de uma regio compartilhada (permisses, desativao, etc). similar a msgctl.
Deve-se observar que o mecanismo de memria compartilhada no necessita operaes especiais
para a manipulao de dados. Como a regio mapeada num endereo local, leituras e escritas neste
endereo se processam com os comandos de associao e cpia binria providos pelas linguagem C.
Deve-se observar ainda, que este mecanismo de comunicao sempre assncrono, e pode suportar comunicao do tipo de-um-para-muitos (um processo escreve na memria compartilhada e
vrios outros lem).
Memria compartilhada implementada pelo ncleo atravs de uma tabela de regies alocadas
por shmget. Esta tabela aponta para a tabela de regies de memria mantida pelo ncleo. Aps a
chamada shmat, a tabela de regies do processo aponta para a respectiva regio mantida pelo ncleo
(figura 2.4).
O cdigo abaixo aloca um texto numa regio de memria compartilhada.
/*
#include <stdio.h>
#include <sys/types.h>

*/

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

Tabela de
Memria
Compartilhada

Tabela de Regies

pregion
(processo 1)

Tabela de Processos

processo 1

processo 2

pregion
(processo 2)
memria principal

regio de memria compartilhada


aps chamada de sistema shmat

Figura 2.4: Esquema de memria compartilhada


#include <sys/ipc.h>
#include <sys/sem.h>
#define KEY 67
extern char *shmat();
main()
{
char *buff;
char *poema[16];
int i;
int sh;
/* cria area compartilhada */
sh = shmget(KEY, 1024, 0777 | IPC_CREAT);

43

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

/* assoacia area compartilhada a um endereco local */


buff = shmat(sh, 0, 0);
poema[0]
poema[1]
poema[2]
poema[3]
poema[4]
poema[5]
poema[6]
poema[7]

=
=
=
=
=
=
=
=

"As armas e os baroes assinalados";


"Que da ocidental praia Lusitana";
"Por mares nunca dantes navegados";
"Passaram ainda alem de Tapobrana";
"E, em perigos e guerras esforcados";
"Mais do que prometia a forca humana";
"Por gente remota edificaram";
"Novo reino, que tanto sublimaram";

/* armazena o texto na area compartilhada */


for(i = 0; i < 8; i++) strcpy((buff + i * 100), poema[i]);
}
Agora, de um outro processo, podemos acessar o texto e imprim-lo.

#include
#include
#include
#include

<stdio.h>
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>

#define KEY 67
extern char *shmat();

main()
{
char *buff;
char *poema[16];
int i;
int sh;
/* acessa area compartilhada */
sh = shmget(KEY, 1024, 0777);
if(sh < 0)
{
printf("\nArea compartilhada nao criada\n");
exit(0);

44

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

45

}
/* assoacia area compartilhada a um endereco local */
buff = shmat(sh, 0, 0);
/* acessa texto da area compartilhada */
for(i = 0; i < 8; i++) poema[i] = (buff + i * 100);
for(i = 0; i < 8; i++)
printf("\n\n");
}

printf("\n%s", poema[i]);

*/

/*

2.6.4 Semforos
Semforo um mecanismo de sincronizao inter-processos composto das operaes DOWN
e UP. Via de regra, define-se um semforo para cada recurso compartilhado. O execuo da parte
cdigo que acessa tais regursos (regio crtica) abraada pelas operaes DOWN e UP.
Processos definem/acessam semforos com a chamada de sistema semget. Esta chamada requer
trs parmetros: um identificador global para um array de semforos; o nmero de semforos contido
no array; e um flag estipulando aes relativas a permisses e criao.
Operaes em semforos se processam atravs da chamada de sistema semop. Esta chamada
requer trs parmetros: o identificador local do semforo (obtido via semget); um array de estruturas
sembuf; e o nmero de estruturas no array. Cada estrutura efetua uma operao no semforo de ndice
estipulado na estrutura.
struct sembuf {
short sem_num;
short sem_op;
short sem_flag;
};

/* indice do semaforo */
/* operacao requisitada */
/* controle da operacao */

O segundo campo da estrutura sembuf opera no respectivo semforo de acordo com a seguinte
lgica. Se sem_op for:
negativo : Se a soma de sem_op com o valor do semforo for no negativa, some sem_op ao valor
do semforo e retorne. Se for negativa, bloqueie.
positivo : Some sem_op ao valor do semforo e retorne.
nulo : Retorne se o valor do semforo for nulo; bloqueie, caso contrrio.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

46

fcil notar que fazendo sem_op 1 ou +1 implementa-se, respectivamente, as operaes bsicas DOWN e UP.
Similar a msgctl e shmctl, a chamada de sistema semctl empregada para obter e alterar o status
de semforos (permisses, desativao, etc).
O cdigo abaixo ilustra o uso de semforo para acesso a uma regio crtica (no caso, o vdeo).
/*
#include
#include
#include
#include

*/
<stdio.h>
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>

/* cria um semaforo */
int DefSem(key)
key_t key;
{
int semid;
union semun arg;
semid = semget(key, 1, 0777 | IPC_CREAT);
arg.val = 1;
semctl(semid, 0, SETVAL, arg);
return(semid);
}

/* acessa um semaforo ja criado */


int GetSem(key)
key_t key;
{
int semid;
semid = semget(key, 1, 0777);
return(semid);
}

/* define operacao DOWN */


void DOWN(semid)
int semid;
{
struct sembuf psem[2];

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

psem[0].sem_num = 0;
psem[0].sem_op = -1;
psem[0].sem_flg = SEM_UNDO;
semop(semid, psem, 1);
}

/* define operacao UP */
void UP(semid)
int semid;
{
struct sembuf vsem[2];
vsem[0].sem_num = 0;
vsem[0].sem_op = 1;
vsem[0].sem_flg = SEM_UNDO;
semop(semid, vsem, 1);
}

extern errno;
main()
{
char *poema[16];
int i;
int semid;

semid = GetSem(13);
if(semid < 0)
{
printf("\nSemaforo nao criado !\n");
exit(0);
}
poema[0]
poema[1]
poema[2]
poema[3]

=
=
=
=

"As armas e os baroes assinalados";


"Que da ocidental praia Lusitana";
"Por mares nunca dantes navegados";
"Passaram ainda alem de Tapobrana";

47

DCA-FEEC-UNICAMP
poema[4]
poema[5]
poema[6]
poema[7]

=
=
=
=

Introduo aos Sistemas Operacionais

48

"E, em perigos e guerras esforcados";


"Mais do que prometia a forca humana";
"Por gente remota edificaram";
"Novo reino, que tanto sublimaram";

while(1)
{
DOWN(semid);
/* entrada na Regiao Critica */
for(i = 0; i < 8; i++)
{
printf("\n%s", poema[i]);
sleep(1);
}
printf("\n\n");
UP(semid);
/* saida da Regiao Critica */
}
}
/*

*/

Captulo 3

SISTEMA DE ARQUIVOS
A parte mais visvel de um sistema operacional o seu sistema de arquivos. Programas aplicativos
utilizam o sistema de arquivos (via chamadas de sistema) para criar, ler, gravar e remover arquivos.
Usurios utilizam interativamente o sistema de arquivos (via shell) para listar, alterar propriedades
e remover arquivos. A convenincia e facilidade de uso de um sistema operacional fortemente
determinada pela interface, estrutura e confiabilidade de seu sistema de arquivos.

3.1 Interface do Sistema de Arquivos


Do ponto de vista do usurio, o aspecto mais importante do sistema de arquivos como ele se
apresenta, isto , o que constitui um arquivo, como os arquivos so identificados e protegidos, que
operaes so permitidas sobre os arquivos, e assim por diante.

3.1.1 Fundamentos Bsicos


A maior parte dos sistemas operacionais trazem a seguinte proposta para armazenamento de informao: permitir aos usurios definir objetos chamados arquivos, que podem armazenar programas,
dados, ou qualquer outra informao. Estes arquivos no so parte enderevel de nenhum processo
e o sistema operacional prov operaes especiais (i.e., chamadas de sistema) para criar, destruir, ler,
atualizar e proteger arquivos.
Todos os sistemas operacionais visam uma independncia dos dispositivos de armazenamento,
permitindo acessar um arquivo sem especificar em qual dispositivo o mesmo se encontra fisicamente
armazenado. Um programa que l um arquivo de entrada e escreve um arquivo sada deve ser capaz de
operar com arquivos armazenados em quaisquer dispositivos, sem necessidade de um cdigo especial
para explicitar o tipo de perifrico.
Alguns sistemas operacionais provem maior independncia dos dispositivos de armazenamento
que outros. No UNIX, por exemplo, um sistema de arquivos pode ser montado em qualquer dispositivo de armazenamento, permitindo que qualquer arquivo seja acessado pelo seu nome (path name),
sem considerar o dispositivo fsico. No MS-DOS, por outro lado, o usurio deve especificar em qual
dispositivo cada arquivo se encontra (exceto quando um dispositivo default e for omitido). Assim,
se o dispositivo default for o drive C, para executar um programa localizado no drive A com arquivos

49

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

50

de entrada e sada no drive B, cada um deles dever ser especificado juntamente com o nome do
aquivo:
A:programa < B:entrada > B:saida
A maior parte dos sistemas operacionais suportam vrios tipos de arquivos. O UNIX, por exemplo, mantm arquivos regulares, diretrios e arquivos especiais. Arquivos regulares contm dados
e programas do usurio. Diretrios permitem identificar arquivos atravs de nomes simblicos (i.e.
sequncia de caracteres ASCII). Arquivos especiais so usados para especificar perifricos tais como
terminais, impressoras, unidades de fita, etc. Assim podemos digitar
cp abc /dev/tty
para copiar um arquivo abc para o terminal (arquivo especial /dev/tty).
Em muitos sistemas, arquivos regulares so subdivididos em diferentes tipos em funo de sua
utilizao. Os tipos so identificados pelos nomes com que os arquivos regulares terminam. Por
exemplo,
ARQUIVO.PAS - Programa fonte em Pascal
ARQUIVO.FTN - Programa fonte em Fortran
ARQUIVO.BAS - Programa fonte em Basic
ARQUIVO.OBJ - Arquivo objeto
ARQUIVO.BIN - Programa binario executvel
ARQUIVO.LIB - Biblioteca dos arquivos .OBJ usados pelo linker
ARQUIVO.TXT - Texto de entrada para formatao de programa
ARQUIVO.DAT - Arquivos de dados
Em certos sistemas, as extenses so simples conveno: o sistema operacional no faz uso delas.
Em outros, o sistema operacional tem regras rgidas em relao aos nomes. Por exemplo, o sistema
no executar um arquivo a menos que sua extenso seja .BIN.

3.1.2 Diretrios
Para organizar os arquivos, o sistema de arquivos prov diretrios, os quais em muitos casos
so tambm arquivos. Um diretrio contm tipicamente um nmero de registros, um por arquivo.
Sistemas primitivos admitiam um nico diretrio compartilhado por todos os usurios, ou um nico
diretrio por usurio. Os sistemas operacionais modernos permitem um nmero arbitrrio de diretrios por usurio (via de regra, formando uma hierarquia). A figura 3.1 ilustra estas trs situaes.
Quando o sistema de arquivos organizado como uma rvore de diretrios, algum meio se faz
necessrio para especificar nomes de arquivos. Dois mtodos so comumente empregados. No primeiro mtodo, cada arquivo identificado pela sequncia de diretrios desde o diretrio raiz at o
arquivo (caminho absoluto). Como um exemplo, o caminho /usr/mfm/mailbox significa que
o diretrio raiz (/) contm o subdiretrio usr, o qual contm o subdiretrio mfm, que por sua vez
contm o arquivo mailbox. Nomes absolutos para caminhos sempre comeam na raiz e so nicos.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

51

Uma outra forma de especificar nomes de arquivos atravs de seu caminho relativo. usado em
conjunto com o conceito de diretrio de trabalho (ou diretrio corrente). Um usurio pode designar
um diretrio como diretrio corrente. Neste caso, todos os caminhos so referenciados a partir do
diretrio corrente. Se o diretrio corrente for /usr/mfm, ento o arquivo cujo caminho absoluto
/usr/mfm/mailbox pode ser referenciado simplesmente como mailbox.
diretrio raiz

arquivo

(a)

diretrio raiz

diretrio de usurio

(b)

diretrio raiz

subdiretrio

diretrio de usurio

(c)

Figura 3.1: Trs projetos de sistemas de arquivos: (a) diretrio nico compartilhado pelos usurios;
(b) um diretrio por usurio; (c) rvore arbitrria por usurio

3.2 Projeto do Sistema de Arquivos


Examinaremos agora o sistema de arquivos do ponto de vista do projetista de sistemas operacionais. Aos usurios interessa como os arquivos so identificados, quais operaes so permitidas,

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

52

como os diretrios so organizados, etc. Projetistas esto interessados em como o espao de disco
gerenciado, como os arquivos so armazenados, e como manipular arquivos de forma eficientemente
e confivel.

3.2.1 Gerenciamento de Espao em Disco


Arquivos so normalmente armazendos em disco, sendo portanto o gerenciamento do espao em
disco de maior interesse do projetista. Duas estratgias so possveis para armazenamento em um
arquivo com n bytes: n bytes consecutivos do disco so alocados; ou o arquivo dividido em um
nmero de blocos no necessariamente contguos. A mesma poltica est presente no sistema de
gerenciamento de memria entre a segmentao pura e a paginao.
Armazenar um arquivo como uma sequncia contgua de bytes apresenta um problema bvio
que o crescimento do arquivo, uma ocorrncia muito comum. O arquivo provavelmente ter que ser
movido no disco. O mesmo problema apresentado para segmentao na memria, exceto que mover
um segmento na memria uma operao relativamente mais rpida. Por esta razo, normalmente
todos os sistemas de arquivos armazenam os arquivos em blocos de tamanho fixo, que no precisam
ser adjacentes 1 .
Uma vez decidido armazenar arquivos em blocos de tamanho fixo, a questo definir qual o
tamanho do bloco a ser usado. Dado a forma como os discos so organizados, os setores, as trilhas e
os cilindros so candidatos bvios para a unidade de alocao.
Uma unidade de alocao grande, tal como um cilindro, implica que muitos arquivos, at mesmo
arquivos de 1 byte, devero ocupar o cilindro inteiro. Por outro lado, usar uma unidade de alocao
pequena, signinifica que cada arquivo ter muitos blocos. A leitura de cada bloco normalmente
requer uma busca e uma latncia rotacional. Assim, a leitura de arquivos consistindo de muitos
blocos pequenos ser lenta.
compromisso usual escolher um bloco de tamanho 512, 1K ou 2K bytes. Se um bloco de
tamanho 1K for escolhido em um disco com setor de 512 bytes, ento o sistema de arquivo sempre
ir ler ou escrever em dois setores consecutivos, e trat-los como uma unidade indivisvel.
Uma vez escolhido o tamanho do bloco, a prxima questo como manter o rastreamento de
blocos livre no disco. Dois mtodos so largamente usados (figura 3.2). O primeiro consiste no uso
de uma lista ligada de blocos, com cada elemento da lista armazenando tantos blocos livre quanto
possvel. Com elementos de 1K e o nmero do bloco de 16 bits, cada elemento na lista de blocos
livre armazena 511 blocos livre. Um disco com 20 Megabytes necessita de uma lista de no mximo
40 elementos para apontar para todos os 20K blocos do disco.
Uma outra tcnica de gerenciamento de espao livre o mapa de bits. Um disco com n blocos
necessita de um mapa de bits com n bits. Blocos livre so representados por 1s no mapa de bits;
blocos alocados por 0s (ou vice-versa). Um disco com 20 Megabytes necessita de 20K bits para o
mapa, os quais somente necessitam de trs blocos. No surpresa que um mapa de bit necessite de
menos espao, desde que usa um bit por bloco, versus 16 bits da lista ligada. Entretanto, para um
disco cheio (com poucos blocos livre) a lista ligada necessita de menos espao que o mapa de bits.
1

Salvo alguns sistemas operacionais, notadamente os voltados computao de tempo-real, onde o armazenamento
contnuo adotado por razes de desempenho.

DCA-FEEC-UNICAMP
42
136
45
127
65
254
321
342
123
415

Introduo aos Sistemas Operacionais


239
124
432
58
490
643
486
12
43
481

971
7
99
640
589
737
872
543
321
13

53

1001001001011001
0000100100011000
0011001110100100
1000000100001001
0000000000001000

0100001100000011
1111000011000010
(b)

410
312

654
318

597
873

(a)

Figura 3.2: (a) blocos livre armazenados em lista ligada; (b) um mapa de bits.

3.2.2 Armazenamento de Arquivos


Se um arquivo consistir de uma sequncia de blocos, o sistema de arquivos deve ter uma maneira
de acessar todos os blocos do arquivo. Como visto acima, um mtodo possvel consiste em armazenar
os blocos de um arquivo em uma lista ligada. Cada bloco de disco de 1024 bytes, contm 1022
bytes de dados e um ponteiro de 2 bytes para o prximo elemento da lista. Esse mtodo tem duas
desvantagens, entretanto. Primeiro, o nmero de bytes de dados em um elemento da lista no uma
potncia de 2, o que frequentemente uma desvantagem para sua manipulao. Segundo, e mais
srio, o acesso aleatrio de difcil implementao. Se um programa busca o byte 32768 de um
arquivo, o sistema operacional tem que percorrer 32768/1022 ou 33 blocos para encontrar o dado.
Ler 33 blocos para buscar um dado, inaceitvel.
Entretanto, a idia de representar um arquivo como uma lista encadeada, pode ser ainda explorada
se mantermos os ponteiros em memria. A figura 3.3 mostra o esquema de alocao usado pelo MSDOS. Neste exemplo, temos trs arquivos, A, com os blocos 6,8,4 e 2; B, com os blocos 5, 9 e 12; e
C, com os blocos 10, 3 e 13.
Associada a cada disco, existe uma tabela chamada Tabela de Alocao de Arquivos (File Allocation TableFAT) que contm um registro para cada bloco do disco. O registro no diretrio para
cada arquivo fornece o endereo inicial do arquivo na FAT. Cada unidade da FAT contm o nmero
do prximo bloco do arquivo. O arquivo A comea no bloco 6, ento o registro da FAT 6 contm o
endereo do prximo bloco do arquivo A, que 8. O registro 8 da FAT contm o nmero do prximo
bloco que o 4. O registro 4 aponta para o registro 2, que est marcado como fim do arquivo.
Este esquema vai se tornando ineficiente a medida que a capacidade do disco aumenta. Suponha
um disco de 64 Megabytes que contm 64K blocos de 1K. A FAT ter 64K de registros de 2 bytes
e ir ocupar 128K. Se mantermos tudo isso em disco, significa que fazer um acesso na posio 32K
em um arquivo, deve requerer no minimo 1 e no mximo 33 leituras em disco.
A essncia do problema com a FAT que os ponteiros para todos os arquivos do disco esto

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

54

FAT
x

EOF

13

FREE

12

10

FREE

11

EOF

12

EOF

13

EOF

14

BAD

15

} tamanho
do disco

12

10

13

Figura 3.3: Esquema de lista encadeada usado pelo MS-DOS. Os registros 0 e 1 so usadas para
especificao do tipo do disco. Os cdigos EOF e FREE so usados para End Of File e registros
Free, respectivamente.
misturados aleatoriamente na mesma tabela. Isso significa que toda a FAT deve estar presente em
memria, mesmo se somente um arquivo estiver aberto. Um mtodo mais eficaz, seria manter listas
dos blocos para diferentes arquivos em lugares diferentes. Isto o que o UNIX faz.
Associado a cada arquivo no UNIX, tem-se uma pequena tabela (no disco), chamada inode, como
mostrado na figura 3.4. Ela contm informaes sobre o arquivo tais como tamanho e proteo. Os
itens chaves so os 10 nmeros de blocos do disco e os 3 nmeros de blocos indiretos. Para arquivos
com 10 blocos ou menos, todos os endereos dos blocos de dados no disco so mantidos no prprio
inode, sendo sua localizao imediata.
Quando o tamanho de um arquivo supera 10 blocos, um bloco livre adquirido e o ponteiro
indireto simples passa a apontar para ele. Este bloco usado para armazenar os ponteiros dos blocos
de disco. Com um bloco de disco de 1K e endereos de disco de 32 bits, o bloco indireto simples
pode acessar 256 endereos de disco. Esse esquema suficiente para arquivos de at 266 blocos (10
no inode, 256 no bloco indireto simples).
Acima de 266 blocos, o ponteiro indireto duplo usado para apontar para um bloco de disco de
at 256 ponteiros, que no apontam para blocos de dados, mas sim para 256 blocos indiretos simples.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

55

ponteiro para
blocos de dados

INODE
arquivo
numeros de links
identificador do proprietrio
grupo do proprietrio
tamanho do arquivo
data da criao
data do ltimo acesso
data da ltima modificao

ponteiro para 10 blocos de dados

bloco indireto simples


bloco indireto duplo
bloco indireto triplo

Figura 3.4: Estrutura do inode


O bloco indireto duplo suficiente para arquivos de at 266 + 2562 = 65802 blocos. Para arquivos
maiores que 64K bytes, o ponteiro indireto triplo usado para apontar para um bloco que contm
ponteiros para 256 blocos indiretos duplos, permitindo arquivos de at 16 Gigabytes.
Arquivos maiores que 16 Gigabytes no podem ser manuseados por este esquema 2 . Naturalmente, indo para um bloco de disco de 2K, cada bloco de ponteiro acessa 512 ponteiros ao invs de 256,
e o tamanho mximo de um arquivo se torna 128 Gigabytes. O ponto forte do esquema do UNIX
que os blocos indiretos so usados somente quando for necessrio. Para blocos de 1K bytes, arquivos com menos de 10K bytes no necessitam blocos indiretos. Note que mesmo para os arquivos
mais longos so necessrios, no mximo, 3 acessos a disco para localizar o endereo de um arquivo
(descontado o acesso ao inode).
2
Atualmente, o limite no tamanho mximo de arquivos dado pela capacidade de armazenamento das unidades (em
torno de 2 Gigabytes).

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

56

3.2.3 Estrutura de Diretrio


Antes de um arquivo ser manipulado, ele deve ser aberto. Quando um arquivo aberto, o sistema
operacional usa o nome de caminho fornecido pelo usurio para localizar os blocos no disco. Mapeando nomes de caminhos em inodes (ou equivalentes), introduz-se ao tpico de como sistemas de
diretrios so organizados. Estes variam desde solues simples at razoavelmente sofisticadas.
Vamos comear com um sistema de diretrio particularmente simples, aquele do CP/M, ilustrado
na figura 3.5(a). Neste sistema, existe apenas um diretrio. Assim, a localizao de um arquivo
reduz-se a procura em um nico diretrio. Encontrado o registro do arquivo, tem-se o nmero de
blocos do disco, posto que estes so armazenados no prprio registro. Se o arquivo utiliza mais
blocos de disco que o permitido no registro, o arquivo ter registros adicionais no diretrio.
Os campos na figura 3.5(a) so resumidos a seguir. O campo de usurio guarda a qual usurio
pertence o arquivo. Durante a pesquisa, apenas os registros pertencentes ao usurio corrente so
considerados. Os prximos campos do o nome e tipo do arquivo. O campo tamanho necessrio
porque um arquivo grande que ocupa mais de 16 blocos, utiliza multplos registros no diretrio. Estes
campos so usados para especificar a ordem dos registros. O campo contador de bloco diz quais dos
16 blocos de disco esto em uso. Os 16 campos finais contm os nmeros dos blocos de disco. O
tamanho dos arquivos medido em blocos, no em bytes.
Vamos considerar agora exemplos de sistemas de diretrio em rvore (hierrquicos). A figura
3.5(b) mostra um registro de diretrio do MS-DOS com 32 bytes de comprimento e armazenando o
nome do arquivo e o nmero do primeiro bloco, dentre outros itens. O nmero do primeiro bloco
pode ser usado como um ndice dentro da FAT, para achar o segundo bloco, e assim sucessivamente.
Deste modo, todos os blocos podem ser encontrados a partir do primeiro bloco armazenado na FAT.
Exceto para um diretrio raiz, o qual de tamanho fixo (112 registros para um disco flexvel de
360K), os diretrios do MS-DOS so arquivos e podem conter um nmero arbitrrio de registros.
A estrutura de diretrio usada no UNIX extremamente simples, como mostra a figura 3.5(c).
Cada registro contm exatamente o nome do arquivo e seu nmero de inode. Todas as informaes
sobre tipo, tamanho, marcas de tempo, propriedade, e blocos do disco esto contidas no inode (veja
figura 3.4). Todos os diretrios do UNIX so arquivos e podem conter um nmero arbitrrio destes
registros.
Quando um arquivo aberto, o sistema de arquivos recebe o nome de arquivo fornecido e localiza seus blocos no disco. Vamos considerar como o nome de caminho /usr/mfm/mailbox
localizado. Usaremos o UNIX como um exemplo, mas o algoritmo basicamente o mesmo para todo
sistema hierrquico de diretrios. Primeiro, o sistema de arquivo localiza o diretrio raiz. No UNIX,
o inode da raiz posicionado num lugar fixo no disco.
Ento, procura-se pelo primeiro componente do caminho, usr, no diretrio raiz para achar o
inode do arquivo /usr. Deste inode, o sistema localiza o diretrio para /usr e procura pelo prximo
componente, mfm, neste caso. Quando o registro para mfm encontrado, tem-se o inode para o
diretrio /usr/mfm. A partir deste inode, pode-se achar o prprio diretrio e procurar pela entrada
do arquivo mailbox. O inode para este arquivo ento lido para a memria e l ser mantido at
que o arquivo seja fechado. Este processo ilustrado na figura 3.6.
Nomes de caminhos relativos so pesquisados de forma idntica, apenas partindo do diretrio de
trabalho em vez de partir-se do diretrio raiz. Todos os diretrios tm registros para . e .., criados
juntamente com o diretrio. O registro . armazena o nmero do inode do diretrio corrente, e o regis-

DCA-FEEC-UNICAMP
bytes

Introduo aos Sistemas Operacionais

usurio

nome do arquivo

tipo
(extenso)

tamanho

57

16

contador
de bloco
nmero de blocos de disco

(a)

10

nome do arquivo

tipo
(extenso)

atributos

2
hora

2
data

primeiro bloco
(na FAT)

tamanho

(b)

14

numero do inode

nome do arquivo

(c)

Figura 3.5: Registros de diretrios: (a) CPM; (b) MS-DOS; (c) UNIX
tro .. o nmero do inode do diretrio pai. Assim, o procedimento de procurar por ../src/prog.c
simplesmente localiza .. no diretrio de trabalho, acha o nmero do inode para o diretrio pai, e
pesquisa pelo diretrio src. Nenhum mecanismo especial necessrio para manipular estes nomes.

3.2.4 Arquivos Compartilhados


No raro, usurios desenvolvendo trabalhos em equipe necessitam compartilhar arquivos. Como
resultado, conveniente que um mesmo arquivo pertena simultaneamente a diferentes diretrios. A
figura 3.7 mostra o sistema de arquivos da figura 3.1(c), com um dos arquivos de C presente em
um dos diretrios de B. A associao entre um diretrio e um arquivo pertencente a outro diretrio
chamada de conexo ou link (linha pontilhada da figura 3.7). O sistema de arquivos agora um
grafo acclico dirigido, ou DAG (directed acyclic graph).
Compartilhar arquivos conveniente, mas tambm fonte de alguns problemas. Por exemplo, se
diretrios armazenam endereos de disco, como no CP/M, a conexo se d pela cpia dos endereos
dos blocos do diretrio do qual o arquivo j faz parte para o diretrio sendo conectado. Se um
usurio aumentar o tamanho do arquivo, os novos blocos sero listados somente no diretrio deste
usurio: as mudanas no sero visveis para os outros usurios, anulando desta forma o propsito
do compartilhamento.
Este problema pode ser solucionado de duas maneiras. Na primeira, os blocos do disco no so
listados nos diretrios, mas em uma pequena estrutura de dados associada com o arquivo em questo.
Os diretrios ento apontariam justamente para a pequena estrutura de dados. Esta a estratgia
usada no UNIX (onde a pequena estrutura de dados o inode).
Na segunda soluo, B conecta-se a um dos arquivos de C atravs da criao (em B) de um
arquivo especial. Este arquivo contm justamente o caminho do arquivo conectado. Quando B
referencia o arquivo conectado, o sistema operacional identifica-o como do tipo link, lendo deste
apenas o caminho para o arquivo compartilhado. De posse do caminho, o arquivo compartilhado

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

bloco 1
diretrio / (raiz)
1
1
4
7
14
9
6
8
17
11

bloco 132
(diretrio /usr)

.
..
inode #6

bin
dev
lib
etc
usr
tmp
var
pub

58

blk = 132
/usr no
inode #6
diretrio /usr
no bloco 132

bloco com os
arquivos do
diretrio /

/usr/mfm/mbox
no inode #85

bloco 416
(diretrio /usr/mfm)
.
51
..
6
321
106
85
539

cursos
papers
mbox
pvm

6
1
19
30
51
92
79
27

.
..
clt
ral
mfm
ec
wst
lpm

/usr/mfm no
inode #6

inode #51
blk = 416

diretrio /usr/mfm
no bloco 416

Figura 3.6: Os passos para achar /usr/mfm/mailbox


acessado. Este mtodo chamado de conexo simblica.
Cada um destes mtodos tm suas desvantagens. No primeiro mtodo, no momento que B
conecta-se ao arquivo compartilhado, o inode registra C como proprietrio do arquivo. A criao
de uma conexo no muda o proprietrio do arquivo (ver figura 3.8), mas incrementa um contador
no inode que diz quantos diretrios apontam para o arquivo.
No caso de C subsequentemente tentar remover o arquivo, o sistema encontra um problema. Se
o sistema remover o arquivo e seu inode, B ter um registro de diretrio apontando para um inode
invlido. Se o inode for mais tarde reutilizado para um outro arquivo, a conexo de B apontar para
o arquivo incorreto. O sistema pode ver pelo contador do inode que o arquivo est ainda em uso,
mas no h maneira de encontrar todos os registros do diretrio para o arquivo, a fim de apag-los.
Ponteiros para os diretrios no podem ser armazenados no inode, uma vez que podem haver um
nmero ilimitado de diretrios.
A nica soluo remover os registros do diretrio C, mas abandonar o inode intacto, com o
contador em 1, como mostra a figura 3.8(c). Temos agora uma situao na qual B tem um registro
de diretrio para um arquivo de C. Se o sistema faz controle de cotas, C continuar sendo contabilizado pelo arquivo at B decidir remov-lo, momento em que o contador ir para 0 e o arquivo ser
removido.
Empregando-se conexes simblicas este problema no ocorre pois somente um diretrio proprietrio guarda o ponteiro para o inode. Diretrios que acabaram de conectar-se ao arquivo armazenam o caminho para o arquivo, no ponteiros para o seu inode. Quando o arquivo for removido do
diretrio proprietrio, o inode liberado pelo sistema, e subsequentes tentativas para usar o arquivo
via conexo simblica falhar, dada a incapacidade do sistema em localizar o arquivo. Remover uma

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

59

diretrio raiz

subdiretrio

diretrio de usurio

C
arquivo compartilhado

Figura 3.7: Um sistema de arquivos contendo um arquivo compartilhado


conexo simblica no afeta o arquivo, causando apenas o decrscimo do contador do inode.
Conexes simblicas introduzem um overhead extra na manipulao de arquivos. Num acesso
via conexo simblica, vrios inodes devem ser lidos do disco: o primeiro para acessar o caminho e
os subsequentes para percorrer todo o caminho at a localizao do arquivo (ver figura 3.6). Alm
de mltiplos acessos a disco, um inode extra necessrio para cada conexo simblica, juntamente
com um bloco extra para armazenar o caminho.
Existe ainda outro problema introduzido pelas conexes, simblicas ou no. Quando conexes
so permitidas, uma pesquisa numa rvore de diretrios pode encontrar o mesmo arquivo vrias
vezes. Isto um problema a se considerar, por exemplo, em aplicativos que efetuam backups.

3.3 Confiabilidade do Sistema de Arquivos


3.3.1 Blocos Defeituosos
Discos frequentemente apresentam blocos defeituosos (bad blocks), isto , blocos onde a escrita
e/ou leitura impossibilitada. Duas solues para o problema de blocos defeituosos so empregadas,
uma em hardware e outra em software. A soluo em hardware consiste em dedicar um setor no
disco para a lista de blocos defeituosos. Quando o controlador do disco iniciado, este l a lista de
blocos defeituosos e escolhe blocos sobressalentes para substitu-los. So feitas ento indirees dos
blocos defeituosos para os blocos sobressalentes. Da por diante, qualquer operao envolvendo um
bloco defeituoso ter efeito em seu respectivo bloco sobressalente.
A soluo em software requer que o usurio informe (ou que o sistema de arquivos detecte) os

DCA-FEEC-UNICAMP
diretrio do
usurio C

proprietrio = C
contador = 1

(a)

Introduo aos Sistemas Operacionais


diretrio do
usurio B

diretrio do
usurio C

proprietrio = C
contador = 2
(b)

60

diretrio do
usurio B

proprietrio = C
contador = 1
(c)

Figura 3.8: (a) situao anterior conexo; (b) aps a conexo ter sido feita; (c) aps o proprietrio
remover o arquivo
blocos defeituosos. Estes blocos so armazenados num arquivo, acessado quando da construo da
lista de blocos livre. Conhecendo os blocos defeituosos, o sistema operacional no os incorpora na
lista de blocos livre, eliminando assim sua ocorrncia futura em arquivos de dados.

3.3.2 Backups
Mesmo com uma estratgia engenhosa para tratar os blocos defeituosos, importante se proceder
backups frequentes. Sistemas de arquivos em discos de pequena capacidade podem ser salvos em fita
magntica, por exemplo, fitas padro de 9 trilhas (com capacidade de 50 Megabytes por bobina) ou
fita de 8 mm (com capacidade de at 1 Gigabyte).
Para discos de grande capacidade (e.g. 1 Gigabyte), salvar o contedo inteiro em fitas inconveniente e consome muito tempo. Uma estratgia de fcil implementao, mas que diminui pela
metade a capacidade de armazenamento, prover cada computador com um segundo disco de igual
capacidade. Ambos os discos so divididos em duas metades: dados e backup. Diariamente, a poro
de dados de um disco copiada para a poro de backup do outro disco, e vice-versa. Deste modo,
se um disco for completamente destrudo, nenhuma informao perdida.
Uma outra alternativa o backup incremental. Em sua forma mais simples, copia-se para fita
todos os arquivos a cada semana ou ms, e, diariamente, apenas daqueles arquivos que foram modificados deste o ltimo backup completo. Num outro esquema, mais eficiente, copia-se apenas aqueles
arquivos que foram alterados desde o ltimo backup. Para implementar este mtodo, o horrio da
ltima duplicao para cada arquivo deve ser mantida no disco.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

61

3.3.3 Consistncia do Sistema de Arquivos


Outro tpico envolvendo confiabilidade a consistncia do sistema de arquivos. Muitos sistemas
de arquivos lem blocos, modifica-os, e os regrava mais tarde. Se o sistema falha antes que todos os
blocos modificados forem escritos no disco, o sistema de arquivos assume um estado inconsistente.
Este problema especialmente crtico se alguns dos blocos que no foram escritos, so blocos de
inodes, blocos de diretrio, ou blocos contendo a lista de blocos livre.
Para verificar a consistncia do sistema de arquivos, muitos sistemas operacionais utilizam programas utilitrios desenvolvidos para este fim. Este programa executado sempre que o sistema
iniciado, particularmente depois de um desligamento adrpto. A seguir descrito como tal utilitrio
opera no UNIX 3 .
O controle de consistncia se d em dois nveis: blocos e arquivos. Para controle de consistncia
a nvel de bloco, o utilitrio constri uma tabela com dois contadores por bloco, ambos iniciados em
0. O primeiro contador rastreia quantas vezes o bloco aparece no arquivo; o segundo registra com
que frequncia ele aparece na lista de blocos livre.
O utilitrio l todos os inodes. Comeando de um inode, possvel construir uma lista de todos
os nmeros de blocos usados no correspondente arquivo. Assim que cada nmero de bloco lido, seu
respectivo contador na primeira tabela incrementado. A seguir, examinada a lista de blocos livre
rastreando todos os blocos que no esto em uso. Cada ocorrncia de um bloco na lista de blocos
livre resulta no incremento do respectivo contador na segunda tabela.
Se o sistema de arquivo for consistente, cada bloco ter o valor 1 na primeira tabela ou na segunda
tabela. Contudo, em caso de falha, pode detectar-se blocos que no ocorrem em nenhuma das tabelas
(blocos perdidos). Embora blocos perdidos no causem um dano real, eles desperdiam espao,
reduzindo assim a capacidade do disco. A soluo para blocos perdidos direta: o verificador do
sistema de arquivos acrescenta-os na lista de blocos livre.
Outra situao possvel de ocorrer a repetio de blocos na lista de blocos livre. A soluo neste
caso tambm simples: reconstruir a lista de blocos livre, eliminando-se as duplicaes.
O mais grave a ocorrncia do mesmo bloco de dados em dois ou mais arquivos. Se cada um
desses arquivos for removido, o bloco duplicado ser posto na lista de blocos livre, chegando-se em
uma situao em que o mesmo bloco est, ambiguamente, em uso e livre ao mesmo tempo. Se ambos
os arquivos forem removidos, o bloco ser adicionado na lista de blocos livre duas vezes.
A ao apropriada do utilitrio alocar um bloco livre, copiar o contedo do bloco duplicado
nele, e inserir a cpia em um dos arquivos. Desde modo, a informao dos arquivos no alterada
(embora certamente incorreta para um dos arquivos), mas a estrutura do sistema de arquivos , pelo
menos, consistente. O erro ser informado para permitir ao usurio examinar a falha.
Ainda para verificar se cada bloco contado corretamente, o utilitrio tambm examina o sistema de diretrios (consistncia a nvel de arquivos). Neste caso, usada uma tabela de contadores
por arquivos (no por blocos, como anteriormente). A verificao comea no diretrio raiz e, recursivamente, desce a rvore inspecionando cada diretrio no sistema de arquivos. Para cada arquivo
encontrado, incrementa-se o contador para o seu respectivo inode.
Quando toda a rvore de diretrios percorrida, tem-se uma lista, indexada pelo nmero do
inode, descrevendo quantos diretrios apontam para aquele inode. O utilitrio ento compara esses
3

Este utilitrio denomina-se fsck (file system checker).

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

62

valores com os contadores dos inodes. Em um sistema de arquivos consistente, ambos contadores
coincidiro. Contudo, dois tipos de erros podem ocorrer: o contador do inode pode ser maior ou
menor que o da lista do utilitrio.
Se a contagem no inode for maior que o nmero de registros do diretrio, ento mesmo se todos
os arquivos forem removidos dos diretrios, o contador ainda ser diferente de 0 e o inode no ser
liberado. Este erro no catastrfico, mas consome espao no disco com arquivos que no esto em
nenhum dos diretrios. O contador de conexes do inode deve ser corrigido atravs da atribuio do
valor obtido pelo utilitrio.
Outro erro (potencialmente catastrfico) ocorre quando o contador do inode menor que o encontrado pelo utilitrio. A medida que os arquivos que apontam para o inode vo sendo removidos, o
contador do inode pode chegar a zero, momento que o inode e seus respectivos blocos so liberados.
Esta ao resultar em um dos diretrios apontando para um inode no mais em uso, cujos blocos
podem rapidamente ser atribuidos a outros arquivos. Novamente, a soluo forar o contador do
inode para o nmero real de registros do diretrio (obtidas pelo utilitrio).
Estas duas operaes, verificar blocos e verificar diretrios, so frequentemente integradas por
razes de eficincia (i.e., uma nica passagem sobre os inodes requerida). Outros controles heursticos so tambm possveis. Por exemplo, diretrios tm um formato definido, com um nmero
inodes e nomes ASCII. Se um nmero inode for maior que o nmero de inodes no disco, o diretrio
encontra-se num estado inconsistente.

3.4 Desempenho do Sistema de Arquivos


Um acesso a disco muito mais lento que um acesso a memria. Ler uma palavra da memria
leva tipicamente algumas centenas de nanosegundos. Ler um bloco do disco requer dezenas de
milisegundos, um fator 100.000 vezes mais lento. Como resultado, muitos sistemas de arquivos tm
sido projetados para reduzir o nmero necessrio de acessos a disco.
A tcnica mais comum para reduzir o acesso a disco a block cache ou buffer cache. Neste
contexto, uma cache uma coleo de blocos que pertencem logicamente ao disco, mas so mantidos
na memria por razes de desempenho.
Vrios algoritmos podem ser usados para gerenciar o cache, mas o mais comum o que verifica
todas as requisies de leitura para ver se o bloco referido est na cache. Se estiver, a requisio
de leitura pode ser satisfeita sem acesso a disco. Se o bloco no estiver na cache, ele inicialmente
lido para a cache, e ento copiado para a rea do processo que requisitou o acesso. Requisies
subsequentes do mesmo bloco podem ser satisfeitas atravs da cache.
Quando um bloco tem que ser carregado para uma cache cheia, algum bloco ter que ser removido
e reescrito no disco, caso tenha sido modificado desde o instante em que foi instalado na cache. Esta
situao muito parecida com a paginao, e todos os algoritmos usuais de paginao, tal como o
menos recentemente usado (LRU) podem ser aplicados neste contexto.
Se um bloco for essencial para a consistncia do sistema de arquivos (basicamente tudo, exceto
blocos de dados), e foi modificado na cache, necessrio que o mesmo seja escrito no disco imediatamente. Escrevendo blocos crticos rapidamente no disco, reduzimos a probabilidade que falhas
danifiquem o sistema de arquivos.
At mesmo com estas medidas para manter a integridade do sistema de arquivos, indesejvel

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

63

manter blocos de dados na cache durante muito tempo antes que sejam descarregados em disco. Os
sistemas de arquivos adotam duas estratgias para tal. No UNIX, a chamada de sistema sync, fora
com que todos os blocos modificados sejam gravados em disco imediatamente. Quando o sistema
iniciado, um programa, usualmente chamado update, ativado. De 30 em 30 segundos, a atualizao
da cache estabelecida. Como resultado, na pior hiptese, perde-se os blocos gravados nos ltimos
30 segundos em caso de uma pane.
A soluo do MS-DOS gravar todo bloco modificado para o disco to logo ele tenha sido
escrito. Caches nas quais blocos modificados so reescritos imediatamente no disco so chamadas
caches de escrita direta. Elas requerem muito mais E/S de disco que caches de escrita no direta.
A diferena entre estas duas tcnicas pode ser vista quando um programa escreve num buffer de 1K,
caracter por caracter. O UNIX coleta todos os caracteres da cache, e escreve o bloco de uma vez em
30 segundos, ou quando o bloco for removido da cache.
O MS-DOS faz acesso a disco para cada um dos caracteres escritos. Naturalmente, muitos programas fazem bufferizao interna, procedendo gravaes em disco apenas quando existir uma
determinada quantidade de bytes pendentes. A estratgia adotada pelo MS-DOS foi influenciada pela garantia que a remoo de um disco flexvel de sua unidade no causa perda de dados. No UNIX,
necessria uma chamada sync antes da remoo de qualquer meio de armazenamento (ou da parada
programada do sistema).
Cache no a nica maneira de aumentar o desempenho do sistema de arquivos. Uma outra
maneira reduzir a quantidade de movimentos do brao do disco, colocando blocos que esto sendo
acessados em sequncia, preferencialmente em um mesmo cilindro. Quando um arquivo escrito, o
sistema de arquivos aloca os blocos um por vez, a medida do necessrio. Se os blocos livre estiverem
gravados em um mapa de bits, e o mapa de bits inteiro est na memria principal, fcil escolher
um bloco que est mais perto do bloco anterior. Com uma lista de blocos livre, parte da qual est no
disco, mais difcil alocar blocos prximos.
Entretanto, com uma lista de blocos livre alguns agrupamentos de blocos podem ser feitos. O
artifcio manter a trilha do disco armazenada no em blocos, mais em grupos consecutivos de
blocos. Se uma trilha consistir de 64 setores de 512 bytes, o sistema pode usar blocos de 1K bytes
(2 setores), porm alocando espao no disco em unidades de 2 blocos (4 setores). Isto no o
mesmo que ter um bloco de 2K, posto que na cache ainda se usa blocos de 1K com transferncia
para disco tambm de 1K. Entretanto, a leitura sequencial reduz o nmero de busca de um fator de 2,
melhorando consideravelmente o desempenho.
Outra variante fazer uso do posicionamento rotacional. Quando se alocam blocos, o sistema
atenta para colocar blocos consecutivos de um arquivo no mesmo cilindro, mas intercalados. Deste
modo, se um disco tiver um tempo de rotao de 16.67 mseg e 4 mseg so necessrios para o processo
do usurio requerer e acessar um bloco do disco, cada bloco deve ser colocado em ao menos um
quarto da distncia do seu antecessor.
Um outro agravante no desempenho dos sistemas que usam inodes, ou algo similar, que para
ler at mesmo um pequeno arquivo, seja necessrio 2 acessos no disco: um para o inode e outro para
o bloco. Caso todos os inodes estejam prximos do incio do disco, distncia mdia entre o inode
estar em torno da metade do nmero de cilindros, o que exige longas buscas.
Melhor alternativa instalar os inodes no meio do disco, reduzindo a mdia de busca entre o
inode e o primeiro bloco de um fator de 2. Uma outra idia consiste em dividir o disco em grupos

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

64

de cilindros, cada qual com os seus prprios inodes, blocos, e lista de blocos livre. Quando se cria
um novo arquivo, qualquer inode pode ser escolhido, mas tendo-se o cuidado de achar um bloco no
mesmo grupo de cilindros onde o inode est. Caso nenhum bloco esteja disponvel, escolhe-se um
bloco do cilindro mais prximo.

3.5 O Sistema de Arquivos do UNIX (System V)


O trabalho do ncleo do ponto de vista do sistema de arquivos consiste em permitir que os processos armazenem novas informaes ou que recuperem informaes previamente armazenadas. Para a
realizao destas atividades o ncleo necessita trazer informaes auxiliares para a memria. Como
exemplo, podemos destacar o super-bloco, o qual descreve, dentre outras informaes, a quantidade
de espao livre disponvel no sistema de arquivos e os inodes disponveis. Estas informaes so
manipuladas de forma transparente para os processos.
Com o objetivo de minimizar a frequncia de acesso ao disco o ncleo gerencia um pool interno
de buffers denominado de cache de buffers. Neste caso, trata-se de uma estrutura de software que no
deve ser confundida com a memria cache em hardware que utilizada para acelerar as referncias
memria.

3.5.1 O Cache de Buffers


O nmero de buffers que fazem parte do cache de buffers depende do tamanho da memria e
das restries de desempenho impostas, sendo o espao necessrio para armazen-los alocado pelo
ncleo durante a iniciao do sistema. Cada buffer formado de duas partes: um segmento de
memria utilizado para abrigar os dados que so lidos/escritos da/na memria e um cabealho que
identifica o buffer.
A viso que o ncleo possui do sistema de arquivos no disco uma viso lgica. O mapeamento
desta viso lgica na estrutura fsica do disco realizada pelos drivers do sistema. Dentro desta
viso, o ncleo enxerga o sistema de arquivos como sendo formado por vrios blocos de disco; no
caso, um buffer corresponde a um bloco, sendo o seu contedo identificado pelo ncleo atravs de
um exame dos campos presentes no cabealho associado ao buffer. Podemos concluir que o buffer
a cpia na memria de um bloco de disco, cpia esta que mantida at o instante em que o ncleo
decide mapear um outro bloco no buffer. Uma restrio importante a de que um bloco do disco no
pode ser mapeado em mais de um buffer ao mesmo tempo.
O cabealho de um buffer contm 4 classes de informao: identificao, posicionamento, estado
e posio dentro do segmento de memria. A identificao permite reconhecer a qual bloco do disco
o buffer est associado. O cabealho do buffer contm um campo com o nmero do dispositivo e um
campo com o nmero do bloco. Estes campos especificam o sistema de arquivo e o nmero do bloco
de dado no disco identificando de forma nica o buffer. Com relao ao posicionamento, o cabealho
possui apontadores para posicionar o buffer em duas estruturas: lista de buffers livre e a fila hash. O
cabealho possui um apontador para a rea de dado (segmento) correspondente ao buffer. Deve ser
observado que o tamanho desta rea deve ser igual ao tamanho do bloco do disco. O quarto campo
o campo de status que indica a situao do buffer, podendo ter um dos seguintes valores:

buffer trancado (locked);

DCA-FEEC-UNICAMP






Introduo aos Sistemas Operacionais

65

buffer contendo dados vlidos;


buffer com escrita retardada - significa a situao em que o ncleo deve escrever o contedo
do buffer no disco antes de reatribuir o buffer a um outro bloco;
o ncleo encontra-se lendo ou escrevendo o contedo do buffer no disco;
um processo encontra-se aguardando que o buffer torne-se livre.

A figura 3.9 ilustra o cabealho de um buffer.


nmero do dispositivo
nmero do bloco
status
ponteiro p/ area de dados

rea de dados
(tamanho do bloco)

ponteiro p/ prximo
(fila de hash)
ponteiro p/ anterior
(fila de hash)
ponteiro p/ prximo
(lista de blocos livre)
ponteiro p/ anterior
(lista de blocos livre)

Figura 3.9: Cabealho do buffer

Estrutura do Pool de Buffers


Os blocos de dado no disco so organizados no cache de buffers atravs de uma poltica denominada de uso menos recente. Atravs desta poltica, quando um buffer alocado a um determinado
bloco, este buffer no poder ser realocado a um outro bloco, a menos que todos os outros blocos
tenham sido usados mais recentemente. Para implementao desta poltica o ncleo mantm uma
lista de buffers livre que organizada segundo a ordem do uso menos recente.
O ncleo retira um buffer da cabea da lista quando da necessidade de um buffer livre. possvel
que um buffer seja retirado do meio da lista caso o ncleo identifique um bloco especfico no cache
de buffers. Em ambos os casos o buffer removido da lista. Quando o ncleo retorna um buffer ao
pool, ele normalmente coloca o buffer no final da lista sendo que, ocasionalmente (em situaes de
erro), o buffer colocado na cabea da lista. O buffer nunca recolocado no meio da lista de buffers
livre.
Quando o ncleo necessita acessar um bloco do disco, ele procura um buffer que possua a combinao adequada nmero de dispositivo-nmero de bloco. Para evitar a necessidade do ncleo pesquisar o cache de buffers por completo, estes so organizados em filas separadas, espalhadas por
uma funo de hash que tem como parmetros os nmeros do dispositivo e do bloco. Os buffers so

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

66

colocados em uma fila hash circular, duplamente ligada, em uma forma equivalente estrutura da
lista de buffers livre.
Todo buffer est na fila hash, no existindo, entretanto, significado para a sua posio na fila. Um
buffer pode encontrar-se, simultaneamente, na lista de buffers livre, caso o seu estado seja livre, e na
fila hash (por exemplo, o buffer 64 da figura 3.10). Desta forma, o ncleo pode procurar um buffer
na lista hash caso ele esteja procurando um buffer especfico, ou ele pode remover um buffer da lista
de buffers livre caso ele esteja procurando por um buffer livre qualquer. Resumindo, um buffer que
se encontra na lista hash pode ou no encontrar-se na lista de buffers livre.
fila de hash

28

17

97

98

50

64

14

38

cabea
f(b) = b mod 4

cauda

lista de buffers livres

Figura 3.10: Estrutura do cache de buffers: fila de hash e lista de buffers livre

Cenrios para Recuperao de um Buffer


O cache de buffers manipulado por um conjunto de algoritmos que so invocados pelo sistema
de arquivos. O sistema de arquivos determina o nmero do dispositivo lgico e o nmero do bloco a
ser acessado, por exemplo, quando um processo necessita ler dados de um arquivo.
Quando da leitura ou escrita de dados de um determinado bloco do disco, o ncleo determina
se o bloco encontra-se no cache de buffers e, caso ele no se encontre, um buffer livre atribuido

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

67

ao bloco. Os algoritmos para leitura/escrita em blocos do disco usam um algoritmo (getblk) para
alocao de buffers a partir do pool.
Existem cinco cenrios tpicos associados ao algoritmo getblk (figura 3.11):
1. O ncleo encontra o buffer correspondente ao bloco na fila hash e o buffer est livre. Neste
caso, o algoritmo marca o buffer como ocupado, remove-o da lista de buffers livre e retorna
um ponteiro para o buffer.
2. O ncleo no encontra o buffer correspondente ao bloco na fila hash e aloca um buffer da lista
de buffers livre, reposicionando-o na fila de hash.
3. O ncleo no encontra o buffer correspondente ao bloco na fila hash e, na tentativa de alocar
um buffer da lista de buffer livre (como no cenrio 2), encontra um buffer na lista de buffers
livre marcado com escrita adiada (delayed write). Neste caso, o ncleo deve escrever (assincronamente) o buffer no disco e continuar a procura de um buffer livre para o bloco.
4. O ncleo no encontra o buffer correspondente ao bloco na fila hash, e a lista de buffers livre
encontra-se vazia. Neste caso, o processo bloqueado at que outro processo devolva um
buffer lista de buffers livre.
5. O ncleo encontra o buffer correspondente ao bloco na fila hash, mas o seu buffer est ocupado
(outro processo est acessando exatamente este bloco). Neste caso, o processo bloqueado at
que o outro processo conclua a operao sob este bloco.
Note que em qualquer cenrio acima, ou o algoritmo getblk volta um buffer j posicionado na fila
de hash para que a operao de E/S possa continuar; ou bloqueia o processo a espera de buffer ou
liberao do bloco.
Alm do algoritmo getblk, existem outros quatro algoritmos que operam o cache de buffers:
1. brelse: libera um bloco, retornando-o lista de blocos livre.
2. bread: l sincronamente (com espera) o bloco do disco para o buffer.
3. breada: l assincronamente (sem espera) o bloco do disco para o buffer.
4. bwrite: escreve um bloco do buffer para o disco.

3.5.2 Representao Interna dos Arquivos


Todo arquivo no UNIX System V contm um nico inode. O inode possui as informaes necessrias para um processo acessar um arquivo, tais como: proprietrio do arquivo, direito de acesso,
tamanho do arquivo e localizao dos dados do arquivo no S.A. A referncia a um arquivo feita
pelo seu nome e, atravs deste, o ncleo determina o inode do arquivo.
Os algoritmos envolvidos na manipulao dos inodes resumidos a seguir utilizam os algoritmos
que operam sobre o cache de buffers discutidos anteriormente.

iget: retorna um inode previamente identificado, possivelmente atravs da sua leitura do disco
via o cache de buffers;

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

68

Algoritmo GETBLK
entrada: nmero do bloco, nmero da unidade lgica
sada: buffer trancado pronto para receber bloco do disco
{
do {
if(bloco na fila de hash)
{
if(buffer ocupado)

// cenrio 5

{
sleep(evento "buffer desocupado")
continue
}
marca buffer "ocupado"

// cenrio 1

remove buffer da lista de buffers livre


retorne buffer
}
else

// buffer no se encontra na fila de hash

{
if(lista de buffers livre vazia) // cenrio 4
{
sleep(evento "lista de buffers livre no vazia")
continue
}
remova buffer da lista de buffers livre
if(buffer marcado "delayed write")
// cenrio 3
{
escreva assincronamente o contedo do buffer em disco
continue
}
// cenrio 2
reposicione buffer na fila de hash
retorne buffer
} while(TRUE)
}

Figura 3.11: Algoritmo para alocao de um buffer da buffer cache (getblk)









iput: libera o inode;


bmap: define os parmetros do ncleo para o acesso a um arquivo;
namei: converte um nome (path) de arquivo no inode correspondente;
alloc: aloca blocos do disco para os arquivos;
free: libera blocos de disco;
ialloc: aloca inodes para os arquivos;
ifree: libera inodes.

Estes algoritmos utilizam outros que manipulam o cache de buffers (getblk, brelse, bread, breada,
bwrite).

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

69

Estrutura do Inode
Um inode existe estaticamente no disco e o ncleo realiza a sua leitura para a memria quando
necessita manipul-lo. O inode no disco contm os seguintes campos (ver figura 3.4):









identificador do dono do arquivo: divido em dono individual e grupo;


tipo do arquivo: regular, diretrio, especial ou FIFO (pipes);
permisso de acesso;
instantes de acesso ao arquivo: ltima modificao, ltimo acesso e ltima modificao ocorrida no inode;
nmero de conexes (links) associados ao arquivo;
endereos no disco dos blocos de dados do arquivo;
tamanho do arquivo.

A cpia do inode em memria contm os seguintes campos em adio aos campos do inode em
disco:

status do inode na memria indicando:


- o inode est trancado;
- processo encontra-se esperando que o inode seja liberado;
- a representao do inode na memria difere da cpia do disco devido a mudanas nos dados
do inode;
- a representao do arquivo na memria difere da cpia do disco devido a mudanas nos dados
do arquivo;
- o arquivo um mount point.






o nmero do dispositivo lgico do S.A. que contm o arquivo;


o nmero do inode. O inode no disco no necessita deste nmero pois os inodes so armazenados em um arranjo liner no disco;
apontadores para outros inodes na memria. O ncleo liga os inodes em filas hash e em uma
lista de inodes livre da mesma forma que os buffers so ligados no cache de buffers;
um contador de referncia, indicando o nmero de instncias do arquivo que esto ativas.

A diferena mais significativa entre o inode na memria e o cabealho do buffer no cache de


buffers o contador de referncia presente no inode, o qual indica o nmero de instncias (acessos)
ativas do arquivo. Um inode torna-se ativo quando um processo realiza a sua alocao, por exemplo,
atravs da abertura do arquivo. Um inode colocado na lista de inodes livre se, e somente se, o seu
contador de referncia 0, significando que o ncleo pode realocar sua estrutura na memria a um
outro inode do disco. A lista de inodes livre serve como um cache de inodes (exatamente como o
cache de buffers).

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

70

Acesso aos Inodes


O ncleo identifica um inode especfico atravs do nmero do seu sistema de arquivo e do seu
nmero dentro deste sistema. O algoritmo iget cria uma cpia do inode na memria fsica, realizando
um papel equivalente ao algoritmo getblk utilizado para encontrar um bloco do disco no cache de
buffers.
Caso o algoritmo no encontre o inode na fila hash associada ao nmero do dispositivo e ao
nmero do inode procurado, um inode alocado a partir da lista de inodes livre sendo consequentemente trancado (locked). A partir deste ponto o ncleo encontra-se em condio de ler o inode do
disco correspondente ao arquivo que esta sendo referenciado e copi-lo para a memria fsica. Para
determinar o bloco do disco que contm o inode referenciado e para determinar o offset do inode
dentro do bloco, o ncleo utiliza as seguintes expresses:

no do bloco: ((no do inode-1) / nmero de inodes por bloco) + nmero do bloco inicial da lista
de inodes

offset: ((no do inode-1) MOD (nmero de inodes por bloco) * tamanho do inode no disco

Quando o ncleo libera um inode (algoritmo iput) ele decrementa seu contador de referncia.
Caso o valor do contador se torne 0, o ncleo escreve o inode no disco caso a cpia na memria seja
diferente da cpia no disco. O inode colocado na lista de inodes livre na hiptese de que este inode
possa ser necessrio posteriormente.
Estrutura de um Arquivo Regular
A indicao dos blocos do disco que constituem um determinado arquivo encontra-se no inode
associado ao arquivo. Esta indicao traduz-se na utilizao de 13 nmeros para blocos. Os 10 primeiros nmeros (blocos diretos) contm nmeros para blocos de disco; o 11o nmero um indireto
simples, o 12o um indireto duplo e o 13o um indireto triplo. Esta soluo, conforme discutido anteriormente, permite que os 10 primeiros nmeros componham um arquivo de 10 Kbytes. Elevando-se
este nmero para 11, 12 e 13, tem-se, respectivamente, arquivos de at 256 Kilobytes, 64 Megabytes
e 16 Gigabytes (mximo para o UNIX).
Os processos enxergam o arquivo como um conjunto de bytes comeando com o endereo 0 e
terminando com o endereo equivalente ao tamanho do arquivo menos 1. O ncleo converte esta
viso dos processos em termos de bytes em uma viso em termos de blocos: o arquivo comea com o
bloco 0 (apontado pelo primeiro nmero de bloco no inode) e continua at o nmero de bloco lgico
correspondente ao tamanho do arquivo.
Um exame mais detalhado das entradas dos blocos no inode pode mostrar que algumas entradas
possuem o valor 0, indicando que o bloco lgico no contm dados. Isto acontece caso nenhum
processo tenha escrito dados no arquivo em qualquer offset correspondente a estes blocos. Deve ser
observado que nenhum espao em disco desperdiado para estes blocos. Este layout pode ser criado
pelo uso das chamadas lseek e write.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

71

3.5.3 Estrutura do Diretrio


Quando da abertura de um arquivo, o sistema operacional utiliza o nome (path) do arquivo fornecido pelo usurio para localizar os blocos do disco associados ao arquivo. O mapeamento do nome
nos inodes est associado forma como o sistema de diretrio encontra-se organizado.
A estrutura de diretrio usada no UNIX extremamente simples. Cada entrada contm o nome
do arquivo e o nmero do seu inode, representados atravs de 16 bytes, ou seja, 2 bytes para o nmero
do inode e 14 bytes para o nome 4 . Todos os diretrios do UNIX so arquivos e podem conter um
nmero arbitrrio destas entradas de 16 bytes.
Quando um arquivo aberto, o sistema deve, atravs do nome do arquivo, localizar os seus blocos
no disco. Caso o nome do arquivo seja relativo, isto , associado ao diretrio corrente, o ncleo acessa
o inode associado ao diretrio corrente na rea U do processo e realiza um procedimento semelhante
ao exemplo da subseo 3.2.3.

3.5.4 O Super-Bloco
At o momento consideramos a hiptese de que um inode havia sido previamente associado a
um arquivo e que os blocos do disco j continham os dados. Ser discutido na sequncia como o
ncleo atribui inodes e blocos do disco. Para isto importante conhecer a estrutura do super-bloco.
O super-bloco um segmento contnuo de disco formado pelos seguintes campos:












tamanho do sistema de arquivos;


nmero de blocos livre no sistema;
lista de blocos livre disponveis no S.A.;
ndice do prximo bloco livre na lista de blocos livre;
tamanho da lista de inodes;
nmero de inodes livre no S.A.;
lista de inodes livre no S.A.;
ndice do prximo inode livre na lista de inodes;
campos trancados (locked) para as listas de blocos livre e inodes livre;
flag indicando que o super-bloco foi modificado.

O super-bloco mantido na memria fsica de modo a agilizar as operaes sobre o sistema de


arquivos, sendo periodicamente copiado no disco para manter a consistncia do sistema de arquivos.
4

Verses mais atuais do UNIX permitem nomes mais extensos.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

72

3.5.5 Atribuio de um Inode a um Novo Arquivo


O algoritmo ialloc atribui um inode do disco para um arquivo recm criado. O S.A. contm uma
lista linear de inodes. Um inode nesta lista encontra-se livre quando o seu campo de tipo zero. Para
melhorar o desempenho, o super-bloco do S.A. contm um arranjo que atua como um cache no qual
so armazenados os inodes livre do S.A. No confundir esta lista com aquela para abrigar os inodes
livre no pool de inodes em memria. Aquela est relacionada manipulao de inodes associados a
arquivos j criados e que sero ativos para manipulao por parte dos processos. Esta lista de inodes
livre associada ao super-bloco abriga os inodes no disco que no esto alocados a nenhum arquivo
e que podero ser associados aos arquivos que sero criados no sistema. A figura 3.12 ilustra o
algoritmo de alocao de inodes para um arquivo sendo criado.
Algoritmo IALLOC
entrada: unidade lgica
sada: inode travado
{
do {
if(super-bloco travado)
{
sleep(evento "super-bloco livre")
continue
}
if(lista de inodes no super-bloco vazia)
{
trave super-bloco
acesse posio de onde a busca anterior terminou
pesquise inodes livre no disco, copiando-os para a lista do super-bloco
destrave super-bloco (evento "super bloco livre")
if(nenhum inode livre encontrado no disco)
{
retorne NULL // nenhum inode livre encontrado
}
marque posio onde a busca terminou
}
// existe inodes livres no super-bloco
acesse um nmero de inode da lista de inodes livre (super-bloco)
acesse inode do disco (algoritmo IGET)
if(inode no livre) // inconsistencia !!!
{
grave inode no disco
libere inode (algoritmo IPUT)
continue
}
// inode livre
inicialize inode
escreva inode no disco
decremente o nmero de inodes livres (super-bloco)
retorne inode
} while(TRUE)
}

Figura 3.12: Algoritmo para atribuio de um novo inode (ialloc)

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

73

3.5.6 Alocao de Blocos no Disco


Quando um processo necessita escrever dados em um arquivo, o ncleo aloca blocos do disco para
a expanso do arquivo, o que significa associar novos blocos ao inode. Para agilizar a determinao
de quais blocos do disco esto disponveis para serem alocados ao arquivo, o super-bloco contm
um arranjo que relaciona o nmero de blocos do disco que esto livre. Este arranjo utiliza blocos de
disco cujo contedo so nmeros de blocos livre. Uma das entradas destes blocos constitue-se de um
apontador para outro bloco contendo nmeros de blocos livre. Estabelece-se, desta forma, uma lista
ligada (em disco) de blocos que contm meros de blocos livre. O super-bloco possui parte desta
lista ligada, de tamanho mximo correspondendo a um bloco, sendo gerenciada quando da liberao
de blocos e quando da requisio de blocos de modo a manter sempre uma indicao de parte dos
blocos livre no disco. O algoritmo alloc (ver figura 3.13) realiza a alocao de um bloco do S.A.
alocando o prximo bloco disponvel na lista do super-bloco.
Algoritmo ALLOC
entrada: unidade lgica
sada: buffer para o novo bloco
{
while(super-bloco travado)
{
sleep(evento "super-bloco livre")
}
remova bloco da lista de blocos livres (super-bloco)
if(lista de blocos livres do super-bloco vazia)
{
trave super-bloco
leia prximo bloco da lista de blocos livres no disco (argoritmo BREAD)
copie o conteudo do bloco (nmero de blocos livres) na lista do super-bloco
libere o buffer associado ao bloco (algoritmo BRELSE)
destrave super bloco (evento "super bloco livre")
}
obtenha buffer da buffer cache (algoritmo GETBLK)
zere o contedo do buffer
decremente o contador de blocos livres (super-bloco)
marque super bloco como "modificado"
retorne buffer
}

Figura 3.13: Algoritmo para alocao de blocos do disco (alloc)

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

74

3.5.7 Chamadas de Sistema Referentes ao S.A.


As chamadas de sistema que compem o sistema de arquivos utilizam, dentre outros, os algoritmos descritos acima (getblk, ialloc, etc). Cada arquivo no UNIX identificado por um descritor
de arquivos (um nmero inteiro). Descritores de arquivos identificam arquivos univocamente nvel
de processo, isto , dois arquivos abertos pelo mesmo processo possuem descritores necessariamente
diferentes.
As principais chamadas de sistema referentes ao sistema de arquivos sero suscintamente descritas a seguir.
open : abre um arquivo para leitura/gravao. Parmetros da chamada indicam, por exemplo, se o
arquivo deve ser criado (caso inexista) e permisses.
dup : duplica um descritor de arquivo, retornando um novo descritor associado ao mesmo arquivo.
pipe : cria no S.A. um pipe. Pipes so arquivos de uso exclusivo por parte de dois processos: um
produtor e um consumidor de dados.
close : encerra a operao sobre um arquivo aberto.
link : cria uma conexo simblica para um arquivo j existente.
unlink : remove uma conexo simblica.
read : l dados de um arquivo (para um buffer em memria).
write : escreve dados num arquivo (de um buffer em memria).
lseek : altera a posio corrente de leitura/gravao no arquivo.
mknod : cria um aquivo especial (tipo bloco ou caractere), associando-o a perifrico (unidade de
disco, fita, terminal, etc).
mount : adiciona uma nova unidade lgica ao S.A.
umount : remove uma unidade lgica do S.A.
chdir : altera o diretrio corrente na rea U.
chown : altera o usurio que tm a posse do arquivo.
chmod : altera permisses de um arquivo.
stat : fornece informaes sobre um arquivo (tipicamente as constantes no inode do arquivo).

Captulo 4

GERENCIAMENTO DE MEMRIA
Memria um importante recurso que deve ser cuidadosamente gerenciado. Enquanto a capacidade de armazenamento dos computadores vem crescendo continuamente, a complexidade do
software cresce talvez taxas maiores. A parte do sistema operacional que gerencia a memria
chamada de gerenciador de memria, sendo o objeto deste captulo.
Dentre outras tarefas, o gerenciador de memria monitora quais partes da memria esto em uso
e quais esto disponveis; aloca e libera memria para os processos; gerencia a permuta de processos
entre memria principal e secundria (quando a memria principal no capaz de abrigar todos os
processos).

4.1 Gerenciamento de Memria Sem Permuta ou Paginao


Sistemas de gerenciamento de memria podem ser divididos em duas classes: aqueles que movem processos entre a memria principal e secundria (tipicamente disco) durante a execuo, e
aqueles que mantm os processos fixos em memria primria. Na primeira classe, o gerenciamento
baseado em tcnicas de swapping (permuta) ou de paginao.

4.1.1 Monoprogramao
O esquema mais simples possvel de gerenciamento de memria consiste em ter-se somente um
processo na memria durante toda a sua execuo. O usurio carrega um programa do disco ou fita
para a memria, podendo este fazer uso de toda a mquina. Se a memria for insuficiente, o programa
simplesmente tem sua execuo rejeitada. Embora essa tcnica ter sido comum em meados da dcada
de sessenta, ela no mais utilizada.
A tcnica usada em microcomputadores mostrada na figura 4.1. A memria dividida entre o
sistema operacional e um processo do usurio. O sistema operacional pode estar no final da memria
RAM (Random Access Memory) como mostrado na figura 4.1(a), ou em ROM (Read Only Memory),
como mostrado na figura 4.1(b), ou ainda tendo os device drivers em ROM e o resto do sistema
operacional na RAM ocupando a parte baixa da memria, como mostrado na figura 4.1(c).
O IBM PC utiliza o modelo da figura 4.1(c), com os device drivers localizados no bloco de 8K
mais alto dentro do espao de 1M de endereamento. O programa na ROM chamado de BIOS

75

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

76

(Basic Input Output System).


0xFFF...
sistema operacional em ROM

programa do
usurio

drivers de dispositivos em ROM

programa do
usurio
programa do
usurio

sistema operacional em RAM

sistema operacional em RAM


0

(a)

(b)

(c)

Figura 4.1: Trs formas de organizar a memria para o sistema operacional e um processo do usurio
Quando o sistema organizado dessa maneira, somente um processo pode estar em execuo
por vez. O usurio entra com um comando no terminal, e o sistema operacional carrega o programa
requerido do disco para a memria e o executa. Quando o processo termina, o sistema operacional
reassume a CPU e espera por um novo comando para carregar um outro processo na memria j
liberada pelo primeiro.

4.1.2 Multiprogramao e Uso da Memria


Embora a monoprogramao seja usada em pequenos computadores, em grandes computadores
com mltiplos usurios ela proibitiva. Grandes computadores frequentemente provem servios
interativos para vrios usurios simultaneamente. Para tal, a habilidade de ter-se mais de um processo
na memria num mesmo instante de tempo imprescindvel por razes de desempenho.
Uma outra razo para ter-se a multiprogramao, que muitos processos gastam uma substancial
frao do seu tempo para completar E/S em disco. comum para um processo permanecer em um
loop lendo um bloco de dados de um arquivo em disco e ento realizando alguma computao sobre
o contedo dos blocos lidos. Se for gasto 40 mseg para ler um bloco e a computao demanda apenas
10 mseg, sem a multiprogramao a CPU estar desocupada esperando pelo acesso ao disco durante
80% do tempo.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

77

Modelagem da Multiprogramao
Quando a multiprogramo usada, o percentual de utilizao da CPU aumenta. A grosso modo,
se a mdia dos processos utilizam CPU somente 20% do tempo que permanecem na memria, com 5
processos em memria, a CPU dever estar ocupada o tempo todo. Este modelo otimista, entretanto,
pois assume que os 5 processos nunca estejam esperando por E/S ao mesmo tempo.
O melhor modelo ver o uso da CPU do ponto de vista probabilstico. Suponha que os processo
gastem em mdia uma frao p do tempo a espera de E/S. Com n processos na memria por vez, a
probabilidade que todos os n processos estejam esperando por E/S pn . A utilizao da CPU ento
1 pn. A figura 4.2 mostra a utilizao da CPU em funo de n, chamado grau de multiprogramao.
utilizao da CPU (%)
100
20% de E/S
80
50% de E/S
60
80 de E/S
40

20

10

grau de multiprogramao (n)

Figura 4.2: Utilizao da CPU como uma funo do nmero de processos na memria
Da figura est claro que caso os processos gastem 80% do seu tempo esperando por E/S, ao
menos 10 processos devem estar na memria por vez para obter um desperdcio de CPU em torno de
10%. Quando se considera que um processo interativo aguardando comandos do terminal est num
estado de espera de E/S, deve ficar claro que tempos de espera para E/S superiores a 80% so usuais.
Processos utilizando disco e fitas com elevada frequncia, tambm contribuem para o aumento deste
percentual.

4.1.3 Multiprogramao com Parties Fixas


Se adotarmos a estratgia de admitir mais de um processo na memria por vez, devemos estabelecer uma estratgia de organizao da mmria. A estratgia mais simples consiste em dividir a

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

78

memria em (possilvelmente diferentes) n parties. Estas parties podem, por exemplo, ser estabelecidas na configurao do sistema operacional.
Quando um processo inicia, este pode ser colocado em uma fila de entrada para ocupar a menor
partio de tamanho suficiente para acomod-lo. Desde que as parties so fixas, qualquer espao
em uma partio no usado pelo processo perdido. A figura 4.3(a) apresenta este esquema de
partio.
partio 4

partio 4
700K

partio 3

partio 3

400K
partio 2

partio 2

200K
partio 1

partio 1
100K

sistema
operacional

sistema
operacional

(a)

(b)

Figura 4.3: (a) Parties de memria fixa com filas de entrada separadas para cada partio; (b)
partio de memria fixa com uma fila simples de entrada
A desvantagem de se ordenar os processos que chegam em filas separadas torna-se aparente
quando a fila para a maior partio est vazia, mas a fila para a menor partio est cheia, como no
caso das parties 1 e 4 na figura 4.3(a). Uma organizao alternativa manter uma fila nica como
na figura 4.3(b). Toda vez que uma partio liberada, a mesma alocada ao primeiro processo
da fila. Uma vez que indesejvel gastar uma partio grande com um processo pequeno, uma
estratgia mais eficaz procurar em toda fila de entrada a maior tarefa para a partio liberada. Note
que o ltimo algoritmo discrimina os processos pequenos, quando usualmente desejvel dar a eles
o melhor tratamento, no o pior.
Este sistema, com parties fixas definidas pelo operador, foi usado pelo sistema operacional
OS/360 nos grandes mainframes da IBM por muitos anos. Ele era chamado de MFT (Multiprograming with a Fixed number of Task). Ele simples de se entender e igualmente simples de implementar: os processos que chegam so colocados em uma fila at que uma partio adequada seja liberada,
quando ento so carregados e executados.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

79

Realocao e Proteo
Multiprogramao introduz dois problemas essenciais que devem ser resolvidos: realocao e
proteo. Da figura 4.3 est claro que diferentes processos sero executados em endereos diferentes. Quando um programa ligado (linked) 1 , o linker deve saber em qual endereo na memria o
programa comear.
Por exemplo, suponha que a primeira instruo de um programa uma chamada para um procedimento de endereo relativo 100 dentro do arquivo binrio produzido pelo linker. Se o programa
for carregado na partio 1 da figura 4.3(a), esta instruo saltar para o endereo absoluto 100,
em plena rea do sistema operacional. O que necessrio uma chamada para 100K + 100. Se o
programa for carregado na da partio 2, ele deve ser executado como uma chamada para 200K +
100, e assim por diante. Este problema conhecido como o problema da realocao.
Uma soluo possvel modificar realmente as instrues quando o programa carregado para
a memria. Programas carregados na partio 1 tm 100K adicionados para cada endereo, programas carregados na partio 2 tm 200K adicionados ao endereamento, e assim sucessivamente. Para
realizar a realocao durante o carregamento, o linker deve incluir no programa binrio uma lista contando quais palavras do programa so endereos para ser realocados e quais so cdigo, constantes,
e outros itens que no devem ser realocados.
Realocao durante o carregamento no resolve o problema da proteo. Pelo fato de programas
operarem endereos absolutos de memria, no existe maneira de proibir um programa de ler ou
gravar em qualquer posio de memria. Em sistemas multi-usurios indesejvel permitir que
processos leiam e escrevam em posies de memria alocadas a outros processos.
A soluo de proteo adotada pela IBM na famlia 360 foi dividir a memria em blocos de 2K
bytes e atribuir um cdigo de proteo de 4 bits para cada bloco. A cada processo atribuido um
cdigo nico de 4 bits, gravado tambm nos blocos de memria que ele ocupa. Este cdigo parte
do registro PSW (program status word) quando o processo tem a posse da CPU. O hardware protege
qualquer tentativa de programa em execuo de acessar a memria cujo cdigo de proteo difere
daquele presente na PSW. Desde que somente o sistema operacional pode mudar os cdigos de proteo dos blocos de memria e dos processos, processos do usurio esto protegidos de interferncias
entre s e com o sistema operacional.
Uma soluo alternativa, adotada por praticamente todos os microprocessadores atuais, para realocao e proteo equipar a mquina com dois registradores especiais no hardware, chamados de
registradores de base e limite. Quando um processo escalonado, o registrador de base carregado com o endereo do comeo da sua partio, e o registrador limite carregado com o tamanho
da partio. Cada endereo de memria referenciado tem o contedo do registrador de base a ele
adicionado antes de ser enviado para o barramento de acesso memria.
Por exemplo, se o registrador de base for 100K, uma instruo CALL 100 efetivamente modificada para CALL (100K + 100). Endereos so comparados com o registrador de limite para prevenir
endereamento fora do espao alocado ao processo. O hardware tambm protege os registradores
de base e limite para evitar que programas dos usurios os modifiquem. O IBM-PC usa uma verso
simplificada deste esquema: tem-se registradores de base (os registradores de segmento), mas no
registradores de limite.
1

Isto , o programa principal, subrotinas escritas pelo usurio, e bibliotecas so combinados dentro de um espao de
endereamento nico.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

80

Uma vantagem adicional do uso de registrador de base para realocao que um programa pode
ser movido na memria aps ter sua execuo iniciada. Depois de ter sido movido, tudo que se precisa
para torn-lo pronto para execuo em outra posio da memria mudar o valor do registrador
de base. Quando a realocao feita por alterao dos endereos do programa quando o mesmo
carregado, sua execuo em outra posio de memria demanda que todos os endereos sejam
novamente recomputados.

4.2 Swapping (Permuta)


Num sistema operando em batch, a organizao da memria em parties fixas simples e efetiva. Quanto mais jobs estiverem na memria, mais a CPU estar ocupada e no h razo para usar
algo mais complicado. Com time-sharing, a situao diferente: h normalmente mais usurios que
memria para armazenar os seus processos, sendo ento necessrio mover temporariamente processos para disco. Obviamente, para continuar sua execuo, um processo movido para disco deve ser
trazido novamente para a memria.

4.2.1 Multiprogramao com Parties Variveis


Em princpio, um sistema que utiliza swapping pode ser baseado em parties fixas. Sempre que
um processo bloqueado, ele pode ser movido para o disco e um outro processo trazido do disco
para a sua partio em memria. Na prtica, parties fixas so pouco atrativas quando a rea de
memria escassa pois muita memria perdida por programas muito menores que o tamanho da
partio. Assim sendo, um novo sistema de gerenciamento de memria foi desenvolvido, chamado
gerenciamento com parties variveis.
Quando parties variveis so usadas, o nmero e tamanho de processos na memria varia
dinamicamente. A figura 4.4 mostra como parties variveis trabalham. Inicialmente, somente o
processo A est na memria. Ento o processo B e C so criados ou trazidos do disco. Na figura
4.4(d) o processo A termina ou movido para o disco. Ento o processo D inicia e B termina.
Finalmente, E inicia.
A principal diferena entre parties fixas da figura 4.3 e parties variveis da figura 4.4
que o nmero, a localizao e o tamanho das parties variam dinamicamente ao longo do tempo.
A flexibilidade de no se ter um nmero fixo de parties aumenta a utilizao da memria, mas
tambm complica a tarefa de alocar e liberar a memria, bem como gerenci-la.
possvel combinar todos os burracos disjuntos num nico buraco movendo todos processos para
um lado da memria. Est tcnica conhecida como compactao da memria. Ela no empregada
com frequncia pelo fato de requerer muito tempo de CPU. Por exemplo, um microcomputador com
1M bytes de memria e que pode copiar 1 byte por s (1 megabyte/seg), gasta 1 seg para compactar
toda a memria. Certos mainframes utilizam hardware especial para a compactao da memria.
Um ponto negativo neste mtodo saber o quanto de memria alocar para um processo. Se os
processos so criados com um tamanho fixo que permanece constante ao longo de sua execuo,
ento a alocao simples: aloca-se exatamente o necessrio ao tamanho do processo, nem mais
nem menos.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

81

sistema
operacional
(a)

sistema
operacional

sistema
operacional

(b)

(c)

sistema
operacional

sistema
operacional

sistema
operacional

sistema
operacional

(d)

(e)

(f)

(g)

Figura 4.4: Mudanas na alocao de memria com processos chegando e deixando a memria
(regies hachuradas representam espao no usado)
Na prtica, os segmentos de dados e pilha de um processo tendem a crescer durante a sua execuo. Alocao dinmica de memria e recurso (presentes em praticamente em todas as linguagens
modernas de programao) so exemplos tpicos de crescimento destes segmentos. Se o processo necessitar expandir sua memria e existir um buraco adjacente, simplesmente o buraco pode vir a ser
incorporado ao espao de endereamento do processo. De outra forma, se o processo est adjacente a
outro processo, o primeiro dever ser movido para um burraco grande o suficiente para armazena-lo,
ou um ou mais processos tero que ser movidos para disco com o intito de criar espao na memria. Se o processo no puder crescer na memria e a rea do disco reservada para abrigar processos
permutados estiver cheia, o processo deve ser terminado.
Se for esperado que muitos processos crescero na memria quando executados, uma boa poltica
seria alocar uma pequena rea extra toda vez que o processo permutado ou movido. Contudo,
quando os processos so permutados para o disco, somente a rea de memria atualmente em uso
deve ser copiada, sendo desnecessrio permutar a rea extra de memria. A figura 4.5(a) mostra a
configurao da memria na qual a rea para crescimento foi alocada para os dois processos.

4.2.2 Gerenciamento de Memria com Mapa de Bits


Com um mapa de bits, a memria dividida em unidades de alocao, desde um pequeno nmero
de palavras at muitos kilobytes. Para cada unidade de alocao existe um bit no mapa de bits, que
0 se a unidade estiver livre e 1 caso esteja ocupada (ou vice-versa). A figura 4.6 mostra parte da
memria e o correspondente mapa de bits.
O tamanho de cada unidade de alocao uma importante caracterstica de projeto. Para pequenas unidades de alocao tem-se um mapa de bits maior. Entretanto, mesmo com uma unidade de
alocao to pequena como com 4 bytes, 32 bits de memria iro requerer somente 1 bit no mapa
(3% da memria). Se a unidade de alocao for escolhida grande, o mapa de bits ser pequeno, mas

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

82

B (pilha)
espao para crescimento
espao para crescimento
B (dados)
B

espao em uso
B (texto)

A (pilha)
espao para crescimento
espao para crescimento
A
sistema
operacional
(a)

espao em uso

A (dados)
A (texto)
sistema
operacional
(b)

Figura 4.5: (a) Espao para crescimento do segmento de dados. (b) espao para crescimento da pilha
e do segmento de dados.
memria considervel pode ser desperdiada se o tamanho do processo no for um mltiplo exato da
unidade de alocao.
Um mapa de bits (ocupando uma poro fixa da memria) prov uma maneira simples de gerenciar memria, uma vez que o tamanho do mapa de bits depende somente do tamanho da memria e
do tamanho da unidade de alocao. O problema principal com isto que quando se decide trazer
um processo de k unidades de alocao para a memria, o gerenciador de memria deve pesquisar no
mapa de bits uma sequncia de k consecutivos bits 0 no mapa. Esta operao lenta, razo pela qual
os mapas de bits so evitados na prtica.

4.2.3 Gerenciamento de Memria com Listas Encadeadas


Outra maneira de gerenciar a memria manter uma lista de alocaes e segmentos de memria
livre, onde um segmento um processo ou um buraco entre dois processos. A memria da figura
4.6(a) representada na mesma figura (c) como uma lista encadeada de segmentos. Cada entrada da
lista especifica um buraco (B) ou um processo (P), contendo o endereo onde comea, o tamanho, e
um ponteiro para a prxima entrada da lista.
Neste exemplo, a lista de segmentos mantida ordenada por endereos. A vantagem desse mtodo que quando o processo termina ou movido para o disco, a atualizao da lista direta. Na
finalizao de um processo, ao seu lado teremos processos ou buracos. Quatro situaes podem
ocorrer como mostradas na figura 4.7.
Quando processos e buracos so mantidos na lista ordenada por endereos, vrios algoritmos
podem ser usados para alocar memria, a fim de criar ou permutar processos. Tais algoritmos so

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

D
16

11111000
11111111
10011111

83

....
24

(a)

(b)
A
P

B
5

C
P 15 17

9 14

D
B 18 19

P 20 25

P: processo
B: buraco
(c)

Figura 4.6: (a) parte da memria com 5 processos e 3 buracos (as marcas mostram as unidades de
alocao da memria e as regies hachuradas esto livres); (b) mapa de bits correspondente. (c) a
mesma informao como uma lista ligada
evocados quando o gerenciador de memria necessita um segmento de memria de M bytes.
Algoritmo First-fit
o algoritmo mais simples. O algoritmo procura ao longo da lista de segmentos at encontrar
um buraco de tamanho maior ou igual a M. Caso o buraco tenha tamanho superior a M (N), o buraco
quebrado em dois segmentos: um para o processo (de tamanho M) e o outro para a memria no
usada (de tamanho N - M). First-fit um algoritmo rpido pois finaliza a busca o mais cedo possvel.
Algoritmo Next-fit
Este algoritmo trabalha da mesma forma que o first-fit, exceto que quarda a posio da lista onde
o ltimo buraco foi alocado. Da prxima vez que chamado, o algoritmo comea a procurar a partir
deste ponto.
Algoritmo Best-fit
Este algoritmo procura pela lista inteira e toma o buraco de tamanho mais prximo de M. um
algoritmo lento e cria na memria buracos pequenos que dificilmente sero alocados. Entretanto, para
M grande, o best-fit aumenta as chances de se encontrar na lista um buraco de tamanho adequado,
posto que minimiza o uso buracos grandes para atender alocaes pequenas.
Como um exemplo, considere a figura 4.6. Se um bloco de tamanho 2 for solicitado, o algoritmo
first fit alocar o buraco 5, e o best fit o buraco 18.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

antes do processo X terminar

84

aps o processo X terminar

Figura 4.7: Quatro combinaes de memria quando um processo terminar


Algoritmo Quick-fit
Este algoritmo mantm listas separadas para tamanhos comumente requeridos. Por exemplo, seja
uma tabela com n entradas, na qual a primeira um ponteiro para a cabea da lista de buracos de
tamanho 4K, a segunda um ponteiro para a cabea da lista de buracos de tamanho 8K, a terceira
de tamanho 12K, e assim sucessivamente. Com o quick-fit, acha-se um buraco de tamanho requerido
muito rapidamente, mas com a desvantagem de todos os esquemas de classificar os buracos por
tamanho, a saber, quando um processo termina ou permutado para disco, determinar seus vizinhos
para uma possvel fuso uma operao custosa. Se fuses no forem feitas, a memria rapidamente
se fragmentar em um grande nmero de pequenos buracos no utilizveis.
Todos os quatro algoritmos podem aumentar seus desempenhos mantendo-se em separado listas
para processos e buracos. Neste caso, todos devotam suas energias para inspeo de buracos, no de
processos. O preo pago por esse aumento de velocidade na alocao uma complexidade adicional
e diminuio de velocidade quando se trata de liberar memria, uma vez que um segmento livre tem
de ser removido da lista de processos e inserido na lista de buracos. Novamente, a ineficincia est
em se determinar possveis fuses.

4.2.4 Alocao de Espao Para Permuta


Os algortmos apresentados acima mantm o rastreamento da memria principal. Assim, quando
processos so permutados do disco para a memria, o sistema pode alocar espao em memria para
esles. Em alguns sistemas, quando um processo est na memria, nenhum espao em disco a ele
reservado. Quando for movido da memria, espao deve ser alocado na rea de disco para abrig-lo
(portanto, em cada troca o processo pode residir em lugares diferentes no disco). Neste caso, os
algoritmos para gerenciamento de espao para permuta so os mesmos usados para gerenciamento

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

85

da memria principal.
Em outros sistemas, quando um processo criado, um espao para permuta alocado em disco
(usando um dos algoritmos descritos acima). Sempre que um processo em memria d lugar a outro
processo, ele colocado no espao em disco a ele previamente alocado. Quando um processo termina, o seu espao para permuta em disco desalocado. Esta tcnica mais eficiente que a anterior
pois uma nica alocao de espao em disco por processo necessria (lembre-se que um processo
pode ser permutado vrias vezes durante a sua execuo). Entretanto, uma rea maior de disco deve
ser reservada para swapping.

4.3 Memria Virtual


Desde o incio da informtica, o tamanho dos programas vem superando a quantidade de memria
disponvel para abrig-los. A soluo usualmente adotada era dividir o programa em partes, chamados overlays. O overlay 0 comea a ser executado primeiro. Quando termina, o overlay seguinte
executado, e assim por diante. Alguns sistemas com overlay eram relativamente complexos, permitindo mltiplos overlays na memria por vez. Overlays eram mantidos em disco e permutados para
a memria pelo sistema operacional.
Overlays apresentavam um problema: a partio do programa era deixada a cargo do programador. Um mtodo que foi desenvolvido para deixar o particionamento do programa a cargo do sistema
operacional veio a ser conhecido como memria virtual. A idia bsica que a combinao do tamanho do programa, dados e pilha, pode exceder a quantia de memria fsica disponvel. O sistema
operacional mantm aquelas partes do programa correntemente em uso na memria principal e o resto no disco. Por exemplo, um programa de tamanho 10M bytes pode ser executado em uma mquina
com 1M bytes de memria escolhendo-se cuidadosamente quais dos 1M ser mantido na memria a
cada instante, com pedaos do programa sendo permutados entre disco e memria assim que forem
necessrios.
Memria virtual pode tambm trabalhar em um sistema com multiprogramao. Por exemplo,
oito programas de 1M podem ser alocados em parties de 256K numa memria de 2M, com cada
programa operando como se tivesse sua prpria mquina de 256K. De fato, memria virtual e multiprogramao esto intimamente relacionadas. Enquanto um programa est esperando que parte de
seu espao de endereamento seja trazido memria, o programa bloqueado, aguardando E/S. At
que a operao de E/S seja completada, a CPU pode ser direcionada para outro processo.

4.3.1 Paginao
A maioria dos sistemas com memria virtual usa uma tcnica chamada paginao. Em qualquer computador existe certo conjunto de endereos de memria que programas podem referenciar.
Quando um programa usa uma instruo como MOVE REG,1000, ele est movendo o contedo do
endereo de memria 1000 para o registrador REG (ou vice versa, dependendo do computador). Endereos podem ser gerados usando indexao, registradores base, registradores de segmento, dentre
outras maneiras.
Estes endereos gerados pelos programas so chamados endereos virtuais e formam o espao
virtual de endereamento do processo. Em computadores sem memria vitual, o endereo virtual

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

86

colocado diretamente no barramento de memria e causa uma palavra da memria fsica com mesmo
endereo ser lida ou escrita. Quando memria virtual usada, os endereos de memria no vo
diretamente para o barramento de memria. Ao invs disso, eles vo unidade de gerenciamento
de memria (Memory Management Unit, MMU), onde um hardware especfico mapeia os endereos
virtuais nos endereos da memria fsica como ilustrado na figura 4.8.
processador

CPU
endereo
virtual

memria

control.
de disco

MMU

barramento
endereo fsico

Figura 4.8: A posio e funo da MMU


Um exemplo de como este mapeamento trabalha mostrado na figura 4.9. Neste exemplo,
temos um computador que pode gerar endereos de 16 bits, de 0 at 64K. Estes so os endereos
vituais. Este computador, entretanto, tem somente 32K de memria fsica, assim, embora programas
de 64K possam ser escritos, eles no podem ser carregados para a memria na sua totalidade para
serem executados. Uma cpia completa de um ncleo de imagem do programa, acima de 64K, deve
estar presente no disco; os pedaos podem ser trazidos para a memria pelo sistema a medida que se
tornem necessrios.
O espao de endereamento virtual dividido em unidades chamadas pginas. As unidades
correspondentes na memria fsica so chamadas page frames. As pginas e page frames so sempre
do mesmo tamanho. Neste exemplo elas so de 4K, mas tamanhos de pginas de 512 bytes, 1K, e
2K so comumente usados. Com 64K de espao de endereo virtual e 32K de memria fsica, temos
16 pginas e 8 page frames. Transferncias entre memria e disco so sempre feitas em unidades de
pginas.
Quando o programa tenta acessar o endereo 0, por exemplo, usando a instruo MOV REG,0
o endereo virtual 0 enviado para a MMU. Ela reconhece que este endereo cai na pgina 0 (0 a
4095), o qual, de acordo com seu mapeamento a page frame nmero 2 (8192 at 12287). Ele ento
transforma o endereo para 8192 e coloca o endereo 8192 no barramento. A tabela de memria
nada sabe a respeito da MMU, e apenas v uma requisio para leitura ou escrita no endereo 8192,
a qual respeitada. Assim, a MMU mapeou todo endereo virtual entre 0 e 4095 em endereo fsico
de 8192 a 12287.
O que acontece se o programa tenta usar um pgina no mapeada ? Como exemplo, seja a ins-

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

espao de
endereamento
virtual (tabela)

espao de
endereamento
real (fsico)

0
2

87

0
0-4K

1
1

1
4-8K

2
6

2
8-12K

3
0

3
12-16K

4
4

4
16-20K

5
3

5
20-24K

6
X

6
24-28K

7
X

7
28-32K

8
X
9
5
10
X
11
7
12
X

X: pgina ausente (em disco)


13

X
14

: pgina de 4 Kbytes

X
15
X

Figura 4.9: Relao entre endereo virtual e endereo fsico de memria, dada pela tabela de pginas
truo MOV REG,32780, o qual referencia o byte nmero 12 dentro da pgina virtual 8 (comeando
em 32768). A MMU observa que a pgina est sem mapeamento (indicada por um x na figura 4.9),
e fora a CPU a causar uma interrupo (trap) no sistema operacional. Este trap chamado uma
falta de pgina (page fault). O sistema operacional remove o page frame menos usado e escreve
seu contedo de volta no disco. Ele ento busca a pgina referenciada para o page frame liberado,
atualiza o mapa, e retorna instruo interrompida.
Agora vajamos como a MMU trabalha e porque temos de escolher um tamanho de pgina como
uma potncia de 2. Na figura 4.10 temos um exemplo de um endereco virtual, 8196 (0010000000000100
em binrio), sendo mapeado usando o mapa da MMU da figura 4.9. O endereo virtual de 16 bits
divido em um nmero de pgina de 4 bits e offset de 12 bits dentro da pgina. Com 4 bits para
o nmero da pgina, podemos representar 16 pginas, e com 12 bits para o deslocamento (offset),
podemos enderear todos os 4096 bytes dentro da uma pgina.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

88

end. virtual de entrada (8196)


0

pgina virtual = 2
tabela de pginas
endereo | bit presente/ausente
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

010
001
110
000
100
011
000
000
000
101
000
111
000
000
000
000

1
1
1
1
1
1
0
0
0
1
0
1
0
0
0
0

110

off-set de 12 bits
copiado diretamente

endereo fsico de sada (24580)

Figura 4.10: Operao interna da MMU com 16 pginas de 4K


O nmero da pgina usado como um ndice dentro da tabela de pginas, permitindo ao page
frame corresponder quela pgina virtual. Se o bit ausente/presente for 0, uma interrupo causada.
Se for 1, o nmero do page frame encontrado na tabela de pginas copiado para os 3 bits 2 de
mais alta ordem do registrador de sada, juntamente com os 12 bits do offset, o qual copiado sem
ser modificado dentro do endereo virtual de entrada. O registrador de sada ento colocado no
barramento de memria como endereo de memria fsica. Note que no procedimento descrito acima,
entra em endereo virtual de 16 bits (0 - 64K) e sai um endereo fsico de 15 bits (0 - 32K).
2

Apenas 3 bits porque a memria fsica tem apenas 8 page frames.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

89

4.3.2 Segmentao
Paginao prov uma tcnica para implementao de um grande espao enderevel numa memria fsica limitada. Para algumas aplicaes, um espao enderevel bi-dimensional mais conveniente. Idealmente, cada programa deve ter um nmero muito grande de segmentos (i.e. 232 = 4G),
cada um consistindo de grande nmeto de bytes (i.e. tambm 232 ). Os primeiros 64K de segmentos
podem ser revervados para procedimentos, dados, e pilhas, pertencentes ao programa em execuo.
Os segmentos restantes podem conter um arquivo por segmento, tal que processos possam diretamente enderear todos seus arquivos, sem ter que abr-los e usar primitivas especiais de E/S para l-los
e escrev-los. Cada arquivo cresce ou reduz-se completamente, independentemente dos outros nesta
disposio, com cada byte da memria sendo endereado por um par (segment, offset).
Iniciada com o projeto MULTICS, a idia de memria segmentada sobrevive at hoje. Uma
implementao tpica prov suporte de hardware para at 16 processos, cada um com espao de
endereamento virtual de 1024 pginas de 2K ou 4K. Se introduzirmos pginas de 4K para este
exemplo, cada processo ter um espao de endereamento virtual de 4M, consistindo de 1024 pginas
de 4K cada.
Este esquema poderia ser implementado dando a cada processo sua prpria tabela com 1024
nmeros de page frames. Entretanto, esta tcnica raramente empregada. Em vez disto, o hardware
da MMU contm uma tabela com 16 sees, uma para cada um dos 16 processos. Cada seo tem 64
descritores de segmento, ento o espao de endereamento para cada processo de 4M dividido em
64 segmentos, cada um contendo 16 pginas de 4K. As tabelas de segmento e pgina so descritas
na figura 4.11(a).
Cada um dos descritores de segmento contm um tamanho de segmento (0 16 pginas), bits
de proteo dizendo se um segmento pode ser lido ou escrito, e um ponteiro para a prpria tabela
de pginas. Cada uma das tabelas de pginas contm 16 entradas, cada entrada apontando para uma
page frame na memria (guardando o nmero da page frame).
Quando o sistema operacional comea um processo, ele carrega um nmero de 4 bits do processo
num registrador especial do hardware. Sempre que o processo referencia a memria, a MMU traduz
o endereo virtual como se segue. Toma-se o nmero de 4 bits do processo e os 6 bits de mais alta
ordem dos 22 que compem o endereo virtual (necessrios para o endereo de 4M), combinando-os
em um nmero de 10 bits usados para indexar a tabela de segmentos e localizar o descritor de segmento relevante. Note que existem exatos 210 = 1024 segmentos na tabela: 64 segmentos/processo
X 16 processos.
Verifica-se ento os bits de proteo no descritor de segmentos para ver se o acesso permitido.
Se o for, a MMU ento verifica o nmero da pgina extrada do endereo virtual com o tamanho do
segmento no descritor de segmentos, para verificar se o segmento grande o bastante. Caso seja, o
nmero da pgina usado como um ndice para a tabela de pginas, cujo endereo fornecido no
descritor de segmento (todas tabelas de pginas so mantidas numa memria rpida especial dentro
da MMU). Uma vez que o nmero da estrutura de pgina encontrado, ele combinado com o
deslocamento do endereo virtual para formar o endereo fsico da memria, o qual ento posto no
barramento.
Uma das caractersticas chave deste modelo que quando o sistema operacional escolhe um
processo, tudo o que ele tem de fazer mudar o registrador do nmero de 4 bits do processo. Isto
faz com que no tenha que recarregar todas as tabelas de segmento ou de pgina. Dois ou mais

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais


descritor de segmento

tabela de segmentos
tamanho

.
.
.

proteo

pont. p/ tab. de pginas

64 descritores de
segmento p/ proc. 0
tabela de
pginas

.
.
.

.
.
.

90

endereamento
fsico

1 segmento
(at 16 pginas)

64 descritores de
segmento p/ proc. 1
(a)

4 bytes

processo #

segmento #

pgina #

12
off-set na pgina

ndice do segmento
endereamento virtual de 22 bits
(b)

Figura 4.11: (a) MMU usada em muitos computadores baseados no 68000; (b) endereamento virtual
para um sistema de 4M
processos podem dividir um segmento se seus descritores de segmentos apontam para a mesma tabela
de pginas. Qualquer mudana feita por um processo numa pgina deste segmento automaticamente
visvel para os outros processos.
Enquanto o modelo da figura 4.11 prov cada um dos 16 processos com somente 64 segmentos
de 64K cada, a idia pode facilmente ser estendida para espaos de endereo mais largos ao preo
de uma tabela maior dentro da MMU. A maior parte do espao para as tabelas de pginas. Se
tivssemos quatro vezes mais memria para as tabelas de pginas dentro da MMU e seus contedos
com 4 processos em vez de 16, o MMU poderiamos suportar 64 segmentos de 1M por processo.

4.4 Algoritmos de Troca de Pgina


Quando uma falta de pgina ocorre, o sistema operacional tem que escolher uma pgina para
remover da memria a fim de dar lugar que ser trazida do disco. Se a pgina a ser removida foi
modificada enquanto estava na memria, ela deve ser reescrita no disco para manter a cpia em disco
atualizada. Se, todavia, a pgina no tiver sido alterada, a cpia do disco j est atualizada, no sendo
necessria sua reescrita. A pgina a ser lida simplesmente superposta pgina retirada.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

91

Apesar de ser possvel escolher uma pgina aleatria para dar lugar pgina em demanda, o
desempenho do sistema melhorado se for escolhida uma pgina pouco usada (referenciada). Se uma
pgina muito usada removida, ela provavelmente ter de ser trazida de volta em breve, resultando
um esforo adicional. Algoritmos eficientes de troca de pgina visam minimizar este esforo.

4.4.1 Troca tima de Pgina


O melhor algoritmo de troca de pginas fcil de descrever mas impossvel de implementar. O
algoritmo opera da seguinte maneira. No momento que ocorre uma falta de pgina, um certo conjunto
de pginas est na memria. Uma dessas pginas ser referenciada em muitas das prxima instrues
(a pgina contendo a instruo). Outras pginas no sero referenciadas antes de 10, 100, ou talvez
1000 instrues. Cada pgina pode ser rotulada com o nmero de instrues que sero executadas
antes que a pgina seja inicialmente referenciada.
O algoritmo da pgina tima simplesmente diz que a pgina com o maior rtulo deve ser removida, adiando-se o mximo possvel a prxima falta de pgina.
O nico problema com este algoritimo que ele no realizvel. No momento da falta de pgina,
o sistema operacional no tem como saber quando cada pgina ser referenciada. (Observamos
facilmente uma situao similar com o algoritmo menor job primeiro - como pode o sistema dizer
qual job o menor ?). No mximo podemos executar um programa num simulador e, mantendo uma
lista de todas as pginas referenciadas, implementar o algoritmo na segunda execuo (usando as
informaes coletadas na primeira execuo).
Nesta linha, possvel comparar o desempenho de algoritmos realizveis como o melhor possvel.
Se um algoritmo apresenta um desempenho de, digamos, somente 1% pior que o timo, o esforo
gasto no aprimoramento do algoritmo produzir, no mximo, um aumento de 1% no desempenho
deste (para os casos estudados, obviamente).

4.4.2 Troca da Pgina No Recentemente Usada (NRU)


Para permitir que o sistema operacional colete estatsticas sobre quais pginas esto sendo usadas
e quais no esto, muitos computadores com memria virtual tm 2 bits associados cada pgina.
Um bit, R ou bit de referncia, ativado pelo hardware em qualquer leitura ou escrita de pgina. O
outro bit, M ou bit de modificao, ativado pelo hardware quando uma pgina escrita (i.e., um
byte alterado/adicionado na pgina). importante que estes bits sejam atualizados em qualquer
referncia de memria, assim, essencial que eles sejam ativados pelo hardware. Uma vez que um
bit foi ativado, ele permanece ativado at que o sistema operacional o desative (por software).
Se o hardware no dispe dos bits R e M, eles podem ser simulados como se segue. Quando
um processo iniciado, todas as suas entradas de tabela de pginas so marcadas como ausentes na
memria. To logo uma pgina seja referenciada, uma falta de pgina ocorrer. O sistema operacional ento ativa o bit R (em sua tabela interna), muda a entrada de tabela de pginas para apontar para
a pgina correta, com modo READ ONLY, e reinicia a instruo. Se a pgina subsequentemente
escrita, uma outra falta de pgina ocorrer, pemitindo ao sistema operacional ativar o bit M e mudar
o modo da pgina para READ/WRITE.
Os bits R e M podem ser usados para construir um algoritmo de paginao simples como se segue.
Quando um processo iniciado, ambos os bits de pgina para todas estas pginas so declarados 0

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

92

pelo sistema operacional. Periodicamente (i.e., a cada interrupo de relgio), o bit R zerado, para
distinguir pginas que no foram referenciadas recentemente daquelas que tenham sido.
Quando uma falta de pgina ocorre, o sistema operacional examina todas as pginas e as classifica
em 4 categorias baseado nos valores correntes de seus bits R e M:






Classe 0 : no referenciada, no modificada.


Classe 1 : no referenciada, modificada.
Classe 2 : referenciada, no modificada.
Classe 3 : referenciada, modificada.

Ainda que as pginas na classe 1 paream, primeira vista, impossveis de existir, elas ocorrem
quando as pginas da classe 3 tm seu bit R zerado pela interrupo do relgio. Interrupes de
relgio no zeram o bit M porque esta informao necessria para determinar se uma pgina ter
que ser reescrita no disco ou no.
O algoritimo No Recentemente Usada (Not Recently Used, NRU), remove uma pgina aleatria
da classe no vazia de numerao mais baixa. Implcito neste algoritmo que melhor remover uma
pgina modificada que no foi referenciada pelo menos no ltimo tick de relgio (tipicamente 20
mseg), que uma pgina no modificada mas muito usada. As caractersticas principais do NRU que
ele fcil de entender, eficiente de se implementar, e gera um desempenho que, enquanto certamente
no timo, geralmente tido como adequado.

4.4.3 Troca da Pgina FIFO


O algoritmo de paginao First-In-First-Out (FIFO) similar ao NRU. O sistema operacional
mantm uma lista de todas as pginas correntes na memria, sendo a pgina da cabea da lista a mais
velha e a pgina do fim a instalada mais recentemente. Em uma falta de pgina, a pgina da cabea
removida e a nova pgina acrescentada no fim da lista.
Uma simples modificao no FIFO para evitar o problema da retirada de uma pgina muito usada
examinar os bits R e M da pgina mais velha. Se a pgina pertencer a classe 0 (no referenciada,
no modificada), ela retirada, seno a prxima pgina mais velha examinada, e assim por diante.
Se pginas da classe 0 no esto presentes na memria, ento o algoritmo repetido procurando por
pginas da classe 1, 2 e 3.
Outra variao do FIFO o algoritmo Segunda Chance. A idia primeiro examinar a pgina
mais velha como uma vtima potencial. Se seu bit R 0, a pgina trocada imediatamente. Se o
bit R 1, o bit zerado e a pgina colocada no fim da lista de pginas, como se estivesse acabado
de chegar memria. Ento a pesquisa continua. O que o Segunda Chance faz procurar por uma
pgina velha que no tem sido referenciada no tick de relgio anterior. Se todas as pginas tiverem
sido referenciadas, o algoritmo degenera-se e torna-se simplesmente um FIFO.
Uma pequena variao do Segunda Chance guardar todas as pginas numa lista circular. Em
vez de colocar as pginas no fim da lista para dar a elas uma segunda chance, o ponteiro da cabea
da lista simplesmente avanado uma pgina, produzindo o mesmo efeito.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

93

4.4.4 Troca da Pgina Menos Recentemente Usada (LRU)


Uma boa aproximao para o algoritmo timo baseada em uma observao comum que as
pginas muito usadas nas ltimas instrues, provavelmente o sero nas prximas instrues. Da
mesma forma, pginas que no tm sido usadas por um longo tempo provavelmente continuaro sem
uso. Esta observao sugere um algoritmo realizvel: quando ocorre uma falta de pgina, retirase a pgina que no tem sido usada por um tempo longo. Esta estratgia chamada de Menos
Recentemente Usada (Least Recently Used - LRU).
Embora o algoritmo LRU seja teoricamente realizvel, seu custo alto. Para implementao
completa do LRU, necessrio manter uma lista ligada de todas as pginas em memria, com a
pgina mais recentemente usada no incio e a menos recentemente usada no final. A dificuldade
que a lista deve ser atualizada em toda referncia de memria. Encontrar a pgina na lista, remov-la
de sua posio corrente, e mov-la para o incio representa um esfro no desprezvel.
Manipular uma lista ligada a toda instruo proibitivo, at mesmo em hardware. Entretanto,
h outras maneiras de implementar LRU com um hardware especial. Vamos considerar o caminho
mais simples primeiro. Este mtodo requer equipar o hardware com um contador de 64 bits, C,
que automaticamente incrementado aps cada instruo. Alm disso, cada entrada na tabela de
pginas deve tambm ter um campo grande o bastante para conter o contador. Aps cada referncia
de memria, o corrente valor de C armazenado na entrada da tabela de pginas para a pgina
referenciada. Quando ocorre uma falta de pgina, o sistema operacional examina todos os contadores
na tabela de pginas para achar o menor deles. A pgina correspondente a menos recentemente
usada.
Agora vejamos um segundo algoritmo LRU, tambm em hardware. Para uma mquina com N
page frames, o LRU deve manter uma matriz de NxN bits, inicialmente todos zero. Quando o page
frame k referenciado, o hardware primeiro ativa todos os bits da linha k para 1, atribuindo a todos
os bits da coluna k o valor 0. Em algum instante, a linha na qual o valor binrio menor, a menos
recentemente usada, a linha na qual o valor o prximo superior a segunda menos recentemente
usada, e assim por diante.
Simulao do LRU em Software
Embora os algoritmos apresentados sejam realizveis, eles so dependentes de hardware especial, e so de pouco uso para o projetista de sistema operacional construindo um sistema para uma
mquina que no dispe deste hardware. Uma soluo que pode ser implementada em software
faz-se necessria. Uma possibilidade o algoritmo chamado de No Frequentemente Usada (Not
Frequently Used - NFU). O algoritmo NFU requer um contador em software associado a cada pgina, inicialmente zero. Em cada tick de relgio, o sistema operacional pesquisa todas as pginas na
memria. Para cada pgina, o bit R, que 0 ou 1, adicionado ao contador. Em suma, os contadores
so uma tentativa de guardar a frequncia com que cada pgina tem sido referenciada. Quando uma
falta de pgina ocorre, a pgina com o menor contador escolhida para substituio.
O principal problema com o NFU que ele nunca esquece referncias anteriores. Pginas muito
(e no mais) refenciadas no comeo da execuo de um programa permanecem com um contador
alto at o final da execuo. Felizmente, uma pequena modificao no NFU faz com que este seja
capaz de simular LRU muito bem (o algoritmo modificado denominado Aging). A modificao tem

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

94

duas partes. Primeiro, os contadores so cada um deslocados 1 bit para a direita antes do bit R ser
incrementado. Segundo, o bit R incrementado no bit mais a esquerda.
Quando ocorre ume falta de pgina, a pgina de menor contador removida. bvio que a pgina
que no tenha sido referenciada por, digamos, quatro ticks de relgio ter quatro zeros significativos
em seu contador, tendo assim um valor mais baixo que o contador de uma pgina que tenha sido
referenciada nos quatro ltimos ticks de relgio.
Uma diferena entre LRU e Aging que, no ltimo os contadores tm um nmero finito de
bits (tipicamente 8). Portanto, no podemos classificar as pginas segundo referncias anteriores
capacidade do contador.

4.5 Gerenciamento de Memria no UNIX


Verses anteriores ao System V e ao 4.2 BSD empregavam um esquema de permuta (swapping)
de processos como poltica de gerenciamento de memria. Verses atuais empregam o esquema de
paginao por demanda, que descreveremos a seguir.

4.5.1 Paginao por Demanda


Este esquema necessita da habilidade do hardware de reiniciar uma instruo interrompida pela
usncia de pgina cujo endereo foi referenciado na instruo. Assim que a pgina trazida para a
memria, a intruo interrompida reiniciada.
No esquema de paginao por demanda, o espao virtual de endereamento muito superior
quantidade de memria fsica disponvel, sendo limitado apenas pelo capacidade de endereamento
virtual da MMU.
O ncleo mantm 4 estruturas principais para fins de gerenciamento de memria: tabela de pginas, tabela de frames (pfdata), descritores de blocos e tabela de uso de swap.
A Tabela de Pginas
A tabela de pginas tem como entrada o nmero da pgina. Deve-se notar que esta tabela tem
dimeno fixa pois a quantidade de pginas igual quantidade fsica de memria dividida pelo
tamanho da pgina. Cada entrada na tabela possui os seguintes campos:







endereo fsico de memria que contm os dados referentes esta pgina;


idade da pgina: por quantos ciclos esta pgina est ativa (na memria);
COPY-ON-WRITE: flag que indica que esta pgina est sendo compartilhada para fins de
leitura, devendo ser desmembrada caso alguns dos processos que a compartilham altere seu
contedo;
modificao: flag que indica se o processo modificou o contedo da pgina recentemente;
referncia: flag que indica se o processo referenciou o contedo da pgina recentemente;

DCA-FEEC-UNICAMP





Introduo aos Sistemas Operacionais

95

validade: flag que indica se o contedo da pgina vlido (isto , o endereo fsico guarda o
contedo da pgina);
proteo: indica se o contedo da pgina do tipo READ ONLY ou READ/WRITE.
descritor de bloco com os seguintes campos:
dispositivo de swap com rea disponvel para ler/gravar o contedo da pgina;
nmero do bloco alocado pgina;
o tipo da pgina: swap, arquivo executvel, demand fill e demand zero (definidos mais
adiante).

A tabela de frames armazena dados adicionais pgina:






endereo fsico de memria que contm os dados referentes esta pgina;


um contador de referncia indicando quantos processos compartilham esta pgina em memria;
O dispositivo de swap associado pgina;
nmero do bloco alocado pgina.

Finalmente, a tabela de uso de swap acessada pelo dispositivo de swap e nmero do bloco neste
dispositivo. Esta tabela armazena apenas um contador de referncia indicando quantas pginas se
utilizam deste bloco em disco.
Deve-se notar que algumas informaes so replicadas em tabelas distintas. Esta replicao visa
beneficiar a eficincia do esquema de paginao, diminuindo o nmero de consultas s tabelas.
A figura 4.12 ilustra uma referncia ao endereo virtual 1493K. O hardware mapeia este endereo na pgina nmero 794. O contedo desta pgina pode estar em memria ou no dispositivo de
swap #1, bloco 2743. As tabelas de frames e de uso de swap mostram seus respectivos contadores de
referncia em 1, informando que o processo o nico a utilizar esta pgina tanto em memria como
em disco. As tabelas de pginas e a de frames apontam para o endereo fsico de memria onde os
dados referentes a esta pgina esto armazenados.
A Chamada fork num Sistema Paginado
A figura 4.13 mostra a situao imediatamente aps uma chamada de sistema fork num sistema
paginado. A rea de texto no duplicada tendo tanto o processo pai quanto o filho as mesmas
entradas para a tabela de pginas (estas pginas so do tipo READ ONLY). O ncleo duplica as
tabelas de pginas que contm as reas de dados e de pilha. As entradas destas tabalas compartilham
as mesmas entradas na tabela de frames (com o contador de referncia agora em 2). Todas as entradas
na tabela de pginas so marcadas como COPY-ON-WRITE, significando que quando qualquer um
dos dois processos alterar o contedo da pgina, a mesma deve ser desmembrada, desvinculando-se
os endereos fsicos de memria e as entradas na tabela de frames.

DCA-FEEC-UNICAMP

end. virtual
1493K

Introduo aos Sistemas Operacionais

registro da tab. de pagina

descritor de bloco

pag. 794

disp. swap #1 bloco 2743

96

frame 794
contador ref. 1

swap em uso

disp. swap #1

contador ref. 1

bloco 2743

pag. fisica 794

bloco 2743 do disp. swap #1

Figura 4.12: As vrias estruturas de dados empregadas para gerenciamento de memria


A Chamada exec num Sistema Paginado
Durante uma chamada exec, o ncleo carrega o programa executvel do disco para a memria.
Num sistema paginado, pode ocorrer que o tamanho do executvel supere o tamanho fsico da memria. Neste caso, aps todo o executvel ter sido carregado, parte dele j se encontra no dispositivo
de swap. Inicialmente, montado a tabela de pginas (com os respectivos descritores de blocos)
para o processo. O sistema conhece o tamanho do executvel a priori, informao esta presente no
cabealho do prprio executvel. As pginas so marcadas como demand zero para reas de pilha ou
demand fill para reas de texto e dados.
A partir da, o ncleo comea a cpia das regies de texto e dados para as pginas em memria.
O ncleo aloca uma pgina para cada registro da tabela de pgina. Pginas demand zero (para pilha)
no esto presentes no cdigo executvel, sendo simplesmente alocadas e zeradas. Pginas demand
fill (texto e dados) so copiadas do disco das respectivas pores do executvel.
Para copiar diretamente do executvel para uma pgina em memria, o ncleo adiciona ao inode
(em memria) um vetor de blocos que compem o executvel. O descritor de bloco da tabela de
pgina, nesta fase, armazena o ndice do bloco no vetor que contm a poro do executvel a ser
carregado nesta pgina. Ao copiar a poro do executvel para a pgina, o ncleo localiza o bloco
acessando seu ndice no descritor de bloco e seu nmero na posio correspondente no vetor (ver
figura 4.14).
Uma vez copiado a parte do arquivo executvel para a memria fsica alocada pgina, o descritor
de bloco atualizado, contendo agora um bloco fsico de swap associado pgina.

DCA-FEEC-UNICAMP
pregion do processo pai
texto

Introduo aos Sistemas Operacionais

97

pregion do processo filho


texto

dados/
pilha

dados/
pilha

reg. texto

reg. de dados/stack do pai

reg. de dados/stack do filho

contador ref. 2

contador ref 1

contador ref. 1

registros tab. paginas

registros tab. paginas

registros tab. paginas

end. virtual 24K pag. 967

end. virtual 97K pag. 613

end. virtual 97K pag. 613

frame 967

frame 613

contador ref. 1

contador ref. 2

Figura 4.13: Situao aps um fork num sistema paginado

4.5.2 O Processo Paginador


O processo paginador remove da memria pginas no referenciadas pelos processos por um longo tempo. Quando executado, o processo vai montando uma lista de pginas candidatas permuta
(ver figura 4.15). O processo paginador zera o bit de referncia da pgina (veja subseo 4.4.2).
Uma pgina candidata permuta quando seu contador de referncia foi zerado h um determinado nmero de passadas do processo paginador. Se uma pgina candidata permuta novamente
referenciada, a mesma removida da lista.
O processo paginador ativado quando a quantidade de memria disponvel atinge um limite
mnimo. Pginas so ento removidas da memria e gravadas em disco at que um limiar de memria
livre seja atingido.
Ao gravar uma pgina em disco, o processo paginador apaga o bit de validade da pgina e decrementa seu contador de referncia na tabela de frames. Se o contador de referncia vai a zero
(indicando que um nico processo estava utilizando a pgina), o ncleo adiciona o campo da tabela
de frames referente pgina numa lista de pginas livres. O contedo de uma pgina na lista de
pginas livres continua vlido at que o sistema associe a pgina outro processo. Mesmo na lista
de pginas livres, uma pgina pode ser revalidada (sem necessidade de traz-la do disco) caso um
processo torne a referenci-la. Neste caso, a pgina removida da lista de pginas livres, tendo seu

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

98

inode
lista de blocos
0
regio

.
.
.
inode
279

84

descritor de bloco
bloco lgico 84

Figura 4.14: Lista de blocos adicionada ao inode durante a carga de um executvel


bit de validade reativado.

4.5.3 Falta de Paginao


Quando um processo referencia uma pgina cujo bit de validade esteja apagado, o processo incorre numa falta de paginao. O ncleo deve ento providenciar a validao da pgina para que
o processo possa continuar sua execuo. A pgina referenciada pode estar num dos cinco estados
abaixo:
1. No dispositivo de swap e no em memria.
2. Em memria, na lista de pginas livres.
3. Num arquivo executvel sendo carregado.
4. Marcada como demand fill.
5. Marcada como demand zero.
No primeiro caso, o sistema deve alocar uma pgina livre e atualizar o contedo da memria
com aquele presente no dispositivo de swap. O processo bloqueado at que a operao de E/S se
complete.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

99

pgina referenciada (idade zerada)


pgina pronta
para swap
pgina em

....

memria
pgina no refenciada (idade aumentando)

pgina em
swap-in

disco

swap-out

Figura 4.15: Fila de pginas candidatas a permuta


No segundo caso, caso a pgina desde quando adicionada lista livre no foi associada a nenhum
outro processo, a pgina continua vlida, sendo removida da lista de pginas livres sem que nenhuma
operao de E/S se faa necessria.
No terceiro caso, o ncleo atrves do descritor de bloco encontra na vetor de blocos do inode
aquele que contm a parte do executvel sendo requisitado. Uma operao de E/S se faz necessria
para trazer o contedo do disco para a memria fsica associada pgina. Neste caso, o ncleo
tambm associa pagina uma bloco de swap.
No quarto caso, uma pgina alocada, sendo seu contedo atualizado de forma similar ao caso
anterior.
Finalmente, no ltimo caso, uma pgina alocada e seu contedo de memria simplesmente
zerado.

4.5.4 Falta de Proteo


Um segundo tipo de trap de memria, alm da falta de paginao, corre quando um processo
acessa uma pgina vlida, mas os bits de proteo da pgina impedem o acesso. Dois exemplos desta
situao so tpicos:
1. O processo tenta escrever numa pgina marcada como READ ONLY, por exemplo, na sua
prpria rea de texto.
2. O processo tenta escrever numa pgina marcada como COPY-ON-WRITE, por exemplo, aps
uma chamada fork.
No primeiro caso, a falta ilegal, sendo um sinal (tipicamente SIGBUS) enviado ao processo. O
processo ento terminado, caso no tenha provido gerenciador para o sinal.
No segundo caso, a falta legal, mas processo suspenso at o ncleo desmembrar a pgina
referenciada. O ncleo providencia a alocao de uma nova pgina, marca-a como READ/WRITE,

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

100

copia o contedo da pgina em falta para a nova pgina, e decrementa seu contador de referncia.
Se o contador vai a zero, a pgina marcada como COPY-ON-WRITE pode ser reusada. A tabela de
pgina do processo aponta para a nova pgina, agora com permissao de escrita. A partir deste ponto,
o processo retoma sua execuo.

Captulo 5

ENTRADA/SADA
Uma das principais funes do sistema operacional controlar todos os dispositivos de entrada/sada (E/S) do computador, emitindo comandos para os dispositivos, atendendo interrupes e
manipulando erros. Deve tambm prover uma interface entre os dispositivos e o resto do sistema,
que seja simples e fcil de usar (se possvel, a interface deve ser a mesma para todos os dispositivos).
O cdigo de entrada/sada representa uma frao significativa do total do sistema operacional. A
forma como o sistema operacional gerencia E/S o objeto deste captulo.

5.1 Princpios do Hardware


Diferentes indivduos vem o hardware de E/S de diferentes maneiras. Engenheiros eletrnicos
vem em termos de chips, fios, fontes de potncia, motores e todos os outros componentes fsicos
que constituem em conjunto o hardware. Programadores vem como a interface apresentada ao software, os comandos que o hardware aceita, as funes que ele suporta, e os erros que so reportados.
O nosso interesse aqui restringir em como o hardware programado, e no como ele trabalha
internamente.

5.1.1 Dispositivos de E/S


Dispositivos de E/S podem ser grosseiramente divididos em duas categorias: dispositivos de bloco e dispositivos de caracter. Um dispositivo de bloco armazena informaes em blocos de tamanho
fixo, cada um com seu prprio endereo. Tamanhos comuns de blocos esto na faixa de 128 bytes a
1024 bytes. A propriedade essencial dos dispositivos de bloco que possvel ler ou escrever cada
bloco independentemente de todos os outros. Em outras palavras, em qualquer instante, o programa
pode ler ou escrever qualquer um dos blocos. Discos so dispositivos de bloco.
O outro tipo de dispositivo de E/S, o de caracter, libera ou aceita uma fila de caracteres sem definir
nenhuma estrutura de bloco. Ele no enderevel e no aceita operaes de busca. Terminais,
impressoras, leitoras tica e outros dispositivos que no trabalham como os discos so exemplos de
dispositivos de caracter.
Este esquema de classificao no perfeito. Alguns dispositivos no so enquadrados nele.
Relgios, por exemplo, no so endereveis por bloco. Nem geram ou aceitam filas de caracteres.

101

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

102

Tudo o que fazem gerar interrupes em intervalos regulares. Contudo, este modelo geral o
suficiente para ser usado como base na construo de um sistema operacional com bom nvel de
independncia dos dispositivos de E/S. O sistema de arquivo, por exemplo, negocia apenas com
dispositivos de blocos abstratos, e deixa a parte dependente do dispositivo para o software de mais
baixo nvel, chamado acionadores de dispositivos (device drivers).

5.1.2 Controladores de Dispositivos


Unidades de E/S consistem tipicamente de componentes mecnicos e eletrnicos. frequente a
separao das duas pores para se obter um projeto mais geral e modular. O componente eletrnico
chamado de controlador do dispositivo (device controller ou adapter). Em mini e microcomputadores, ele normalmente toma forma de um circuito impresso que pode ser inserido no computador.
O componente mecnico o dispositivo propriamente dito.
O carto do controlador normalmente tem um conector, no qual um cabo condutor do prprio
dispositivo pode ser conectado. Muitos controladores podem manusear dois ou mais dispositivos do
mesmo tipo.
A distino entre dispositivo e controlador deve ser ressaltada, j que o sistema operacional v
o controlador, no com o dispositivo. Normalmente, minicomputadores e microcomputadores usam
um barramento nico (figura 5.1) para comunicao entre CPU e os controladores. Mainframes
frequentemente usam um modelo diferente, no qual mltiplos barramentos e computadores especializados de E/S, chamados canais de E/S, aliviam parte da carga da CPU.
unidades de disco

impressora
interface
controlador-dispositivo

CPU

memria

controlador
de disco

controlador
de impressora

outros
controladores

barramento

Figura 5.1: Um modelo para conexo da CPU, memria, controladores e dispositivos de E/S
A interface entre o controlador e o dispositivo , via de regra, uma interface de baixo nvel. O
disco, por exemplo, pode ser formatado com 8 setores de 512 bytes por trilha. O que realmente sai
do driver, entretanto, uma lista serial de bits, partindo com um prembulo, depois os 4096 bits no
setor, e finalmente o checksum ou o cdigo de correo de erro. O prembulo escrito quando o
disco formatado, e contm o nmero de cilindros e de setores, o tamanho do setor, e outros dados.
A tarefa do controlador converter a lista serial de bits em um bloco de bytes e realizar alguma
correo de erro necessria. O bloco de bytes tipicamente primeiro montado, bit por bit, em um
buffer mantido no controlador. Aps o checksum ter sido verificado e o bloco declarado livre de erro,
ele pode ento ser copiado para a memria principal.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

103

O controlador para o terminal CRT (catode ray tube) tambm trabalha como um dispositivo serial
de bits e em baixo nvel. Ele l da memria o byte contendo o caracter a ser exibido, e gera os sinais
usados na modulao do feixe do CRT para causar a escrita na tela. O controlador tambm gera os
sinais para o feixe CRT fazer o retrace horizontal aps ele ter terminado de esquadrinhar a linha,
como tambm, sinais para fazer o retrace vertical aps a tela toda ter sido esquadrinhada. Se no
tivssemos um controlador CRT, o sistema operacional teria que gerar estes sinais no tubo. Com o
controlador, o sistema operacional inicia-o com poucos parmetros, tais como o nmero de caracteres
por linha e o nmero de linhas por tela, deixando o controlador tomar conta do direcionador do feixe
de raios catdicos.
Cada controlador tem alguns poucos registradores que so usados para comunicao com a CPU.
Em alguns computadores estes registradores so parte do espao de endereamento regular. A tabela
5.1 mostra os endereos de E/S e os vetores de interrupo alocados para alguns dos controladores
do IBM PC. A atribuio de endereos de E/S para dispositivos feita por um decodificador lgico
associado ao controlador. Alguns IBM PC-compatveis usam diferentes endereos de E/S.
dispositivo
relgio
teclado
porta serial secundria
disco rgido
impressora
vdeo monocromtico
vdeo colorido
disco flexvel
porta serial primria

endereo E/S
040 - 043
060 - 063
2F8 - 2FF
320 - 32F
378 - 37F
380 - 3BF
3D0 - 3DF
3F0 - 3F7
3F8 - 3FF

vetor int.
8
9
11
13
15
14
12

Tabela 5.1: Alguns exemplos de controladores, os seus endereos de E/S e seus vetores de interrupo
no IBM PC
O sistema operacional realiza E/S escrevendo comandos nos registradores dos controladores. O
controlador de disquete do IBM PC, por exemplo, aceita 15 diferentes comandos, tais como read,
write, seek, format, e recalibrate. Muitos dos comandos tm parmetros, os quais so tambm
carregados nos registradores do controlador. Quando um comando aceito, a CPU pode abandonar
o controlador atender a outra tarefa. Quando completado, o controlador causa uma interrupo com
o objetivo de permitir que o sistema operacional tome o controle da CPU e teste o resultado da
operao. A CPU obtm o resultado e o status do dispositivo pela leitura de um ou mais bytes de
informao nos registradores do controlador.

5.1.3 Acesso Direto Memria (DMA)


Muitos controladores, especialmente os que operam em blocos, suportam DMA. Vejamos primeiro como discos operam sem DMA. Primeiro, o controlador l serialmente o bloco (um ou mais
setores) do dispositivo, bit a bit, at que este seja transferido para o buffer interno do controlador.
Depois, o controlador executa a operao de checksum para atestar que o bloco est livre de erros.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

104

Esta operao executada somente aps o bloco todo ter sido transferido. Ento, o controlador causa
uma interrupo.
Quando o sistema operacional reassume a CPU, ele pode ler o bloco do buffer do controlador
(byte a byte ou palavra a palavra) numa operao cclica, onde em cada ciclo um byte ou palavra
transferido do controlador para a memria.
Obviamente, o ciclo de transferncia de bytes dos controladores para a memria consome um
tempo aprecivel da CPU. DMA foi criado para livrar a CPU desta tarefa. Quando utilizado, a CPU
fornece duas informaes ao controlador (alm do endereo do bloco a ser lido): o endereo de
memria para onde o bloco deve ser copiado e o nmero de bytes a serem transferidos (ver figura
5.2).
unidades de disco

memria
controlador
de disco
buffer
CPU

registradores
end. memria
contador

barramento

Figura 5.2: A transferncia via DMA processada sem interveno da CPU


Aps o controlador ter lido o bloco, efetuado o checksum e no ter constatado erros de leitura, o
prprio controlador copia (via barramento) o primeiro byte (ou palavra) para o endereo de memria
suprido pela CPU quando da requisio da operao. A partir da, a cpia prossegue incrementadose o endereo da memria e decrementado-se o contador do DMA (bytes transferidos), at que este
se torne zero. Neste instante, o controlador causa uma interrupo. Quando o sistema operacional
reassume a CPU, nenhuma transferncia necessita ser efetuada pois o buffer requisitado j se encontra
na memria.

5.2 Princpios do Software


Os objetivos gerais do software de E/S so fceis de serem estabelecidos. A idia bsica organizar o software como uma srie de camadas, com as mais baixas escondendo peculiaridades do

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

105

hardware e as mais altas mostrando-se simples para o usurio.

5.2.1 Objetivos do Software de E/S


O conceito chave no projeto do software de E/S a independncia do dispositivo (device independence). Deve ser possvel escrever programas que usem arquivos gravados em disquete ou em disco
rgido, sem a necessidade de modificar o programa para cada tipo de dispositivo. De preferncia,
deve ser possvel utilizar o programa sem recompil-lo.
Relacionado com a indepndencia do dispositivo est a uniformidade de nome. O nome de um
dispositivo ou arquivo deve ser simplesmente uma cadeia de caracteres (string) ou um inteiro no
dependente do dispositivo em nenhum caso.
Outra caracterstica importante a manipulao de erros. Em geral os erros devem ser manipulados o mais prximo possvel do hardware. Se o controlador encontra um erro, ele deve tentar corriglo, se possvel. Se no, o driver do dispositivo deve faz-lo, talvez apenas tentando ler novamente.
Muitos erros so transientes e desaparecem se a operao for repetida. Somente se as camadas mais
baixas no conseguirem resolver o problema que este deve ser apresentado s camadas superiores.
Outra caracterstica chave so as transferncias sncronas (blocos) e assncronas (manipuladas
por interrupo). Muitos dispositivos de E/S so assncronos: a CPU inicia a transferncia e se ocupa
de outras atividades at que chegue uma interrupo. O sistema operacional realiza as operaes
de forma assncrona, mas para o usurio ela se apresenta como transferncia de blocos (o que torna
muito mais simples a programao).
O conceito final que deve ser observado dispositivos compartilhados e dedicados. Alguns dispositivos de E/S, como discos, podem ser utilizados por muitos usurios ao mesmo tempo. Outros
dispositivos, como impressoras, devem ser dedicados a um nico usurio at que este finalize a operao. A incluso de dispositivos dedicados introduz uma variedade de problemas, como o deadlock
1 . Sistemas operacionais devem manipular ambos os dispositivos de maneira a evitar estes problemas.
Estes objetivos podem ser organizados de maneira clara e eficiente pela estruturao do software
em quatro camadas:
1. Manipulao de interrupes.
2. Drivers de dispositivos.
3. Software do sistema operacional independente do dispositivo.
4. Software do nvel do usurio.

5.2.2 Manipuladores de Interrupes


Interrupes so eventos complicados de se tratar. Elas devem ser isoladas de modo que apenas
uma pequena parte do sistema operacional as manipule. Um meio para isol-las bloquear os processos aguardando operaes de E/S at que uma interrupo anuncie que a operao se completou.
1

Um deadlock ocorre quando existe um conjunto de processos bloqueados onde cada processo aguarda um evento
para continuar sua execuo, evento este que para ocorrer necessita da ao de outro processo pertencente a este mesmo
conjunto.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

106

Quando a interrupo acontece, a rotina de tratamento daquela interrupo libera o processo


bloqueado. Em alguns sistemas isto conseguido fazendo-se um UP sobre um semforo. Em outros,
ele far um SIGNAL sobre a varivel de condio no monitor. E ainda em outros, uma mensagem
enviada ao processo bloqueado. Em todos os casos o efeito da interrupo que o processo que
estava previamente bloqueado dever agora estar habilitado para execuo.

5.2.3 Drivers de Dispositivos


Todo o cdigo dependente do dispositivo aparece no driver do dispositivo. Cada driver manipula
um dispositivo ou uma classe de dispositivos intimamente relacionados.
Foi visto que cada controlador de dispositivos tem registradores para receber comandos. O driver do dispositivo envia estes comandos e testa se foram carregados propriamente. Desta maneira, o
driver a parte do sistema operacional que conhece quantos registradores tem, por exemplo, o controlador de disco e para que estes so utilizados. Ele reconhece setores, trilhas, cilindros, cabeas de
leitura/escrita, motor, fator de entrelaamento e todos os mecanismos que fazem um disco trabalhar
propriamente.
Em termos gerais, o trabalho de um driver aceitar requisies abstratas de um software de mais
alto nvel, e providenciar para que o pedido seja atendido. Uma tpica requisio ler um bloco.
Se o driver est desocupado no momento, a requisio aceita, sendo processada imediatamente.
Caso o driver esteja processando uma requisio, esta normalmente entra numa fila de requisies
pendentes.
O primeiro passo transcrever os termos abstratos da requisio para aes concretas. Para um
disk driver, por exemplo, isto significa informar onde o bloco se encontra no disco, verificar se o
motor do drive est girando, determinar se o brao est posicionado no cilindro apropriado, e assim
por diante. Em poucas palavras, o driver deve decidir quais operaes do controlador so requeridas
e em que sequncia.
Uma vez determinado quais comandos emitir ao controlador, este inicia a emisso escrevendo
nos registradores do controlador do dispositivo. Alguns controladores podem manusear somente um
comando por vez. Outros controladores aceitam uma lista de comandos, os quais so carregadas sem
a ajuda do sistema operacional.
Aps o comando ou comandos terem sido emitidos, podem ocorrer duas situaes. Em muitos
casos o device driver deve esperar at que o controlador execute as operaes requisitadas. Se estas
operaes forem lentas (envolvendo movimentos mecnicos, por exemplo), o driver bloqueia at que
as operaes se completem. Em outros casos, entretanto, as operaes so rpidas, situao esta em
que o driver no precisa ser bloqueado. Como um exemplo dessa situao, o deslocamento da tela
em terminais (incluindo o IBM PC) requer apenas escrita de uns poucos bytes nos registradores do
controlador. Nenhum movimento mecnico necessrio e a operao toda pode se completar em
alguns poucos microsegundos.
Neste ponto, aps a operao ter sido completada, o driver deve verificar a ocorrncia de erros.
Se tudo estiver correto, ele passa os dados (o bloco lido, por exemplo) para a prxima camada do
software de E/S. Finalmente, ele retorna alguma informao de status de erros. Se alguma requisio
est na fila, uma delas pode agora ser selecionada e iniciada. Se nenhuma est na fila, o driver fica
aguardando a prxima requisio.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

107

5.2.4 Software de E/S Independente do Dispositivo


Embora alguns dos softwares de E/S sejam especficos do dispositivo, uma grande frao deles
independente do dispositivo. O limite exato entre os drivers e o software independente dos dispositivos funo do sistema, uma vez que algumas funes que so independentes do dispositivo, podem
atualmente estarem nos drivers, por eficincia e por outras razes. As funes listadas abaixo so
tipicamente implementadas no software independente do dispositivo:










interface uniforme para com os drivers de dispositivos;


identificao simblica dos dispositivos;
proteo dos dispositivos;
manipulao de blocos independente dos dispositivos;
bufferizao;
alocao de espao nos dispositivos do tipo bloco;
alocao e liberao de dispositivos dedicados;
gerenciamento de erros.

A funo bsica do software independente do dispositivo realizar as funes de E/S que so


comuns a todos os dispositivos, e prover uma interface uniforme para o software do usurio.
A questo principal em um sistema operacional como objetos tais como os arquivos e dispositivos de E/S so identificados. O software independente do dispositivo se encarrega do mapeamento
simblico dos nomes dos dispositivos para os seus drivers apropriados. No UNIX, por exemplo, cada
device driver tem a ele associado um inode, o qual armazena informaes necessrias localizao
do driver e do dispositivo associados ao inode. Estes disposivivos se localizam no diretrio =dev e o
usurio tem permissao limitada para oper-los.
Relacionado ao nome est a proteo. Como o sistema previne usurios de acessar dispositivos
que no esto autorizados a acessar? Em muitos microcomputadores, no h nenhuma proteo.
Em muitos mainframes e superminis, acessos a dispositivos de E/S pelos usurios completamente
proibido.
Diferentes discos podem ter diferentes tamanhos de setor. O software independente do dispositivo deve encobrir este fato e prover um tamanho de bloco uniforme para camadas superiores, por
exemplo, pelo tratamento de vrios setores como um simples bloco lgico. Deste modo, os nveis superiores somente negociam com dispositivos abstratos que usam o mesmo tamanho de bloco lgico,
independente do tamanho fsico do setor.
Buferizao uma outra questo, tanto para dispositivos de blocos como para de caracter. Para
dispositivos de bloco, o hardware executa escrita e leitura de blocos inteiros, mas o processo do
usurio est livre para ler ou escrever unidades arbitrrias. Para dispositivos de caracter, usurios
podem escrever dados no sistema mais rpido do que a taxa com que eles so transferidos para
o dispositivo fsico, necessitando assim de buferizao. Entrada de teclado outro exemplo de
atividade que requer buferizao.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

108

Quando um arquivo criado e preenchido com dados, novos blocos de disco tm que ser alocados
para o arquivo. Para realizar esta alocao, o sistema operacional precisa de uma lista ou mapa de
bits dos blocos livres no disco, mas o algoritmo para localizar um bloco livre independente do
dispositivo e pode ser implementado acima do nvel do driver.
Alguns dispositivos, tais como as fitas magnticas, podem ser usadas somente por um simples
processo em um dado momento. o sistema operacional que examina a requisio para usar o
dispositivo e aceita ou no, dependendo da disponibilidade do dispositivo requisitado.
A manipulao de erros tambm feita nesta camada. Um erro tpico causado por um bloco do
disco ruim e que no pode mais ser lido. Aps o driver tentar ler o bloco vrias vezes, ele informa
ao software independente do dispositivo a razo. O erro ento tratado. Se ocorreu num arquivo do
usurio, suficiente informar o erro para o mesmo. Entretanto, se o erro ocorreu numa rea crtica, o
sistema operacional deve apresentar uma mensagem e, eventualmente, terminar sua execuo.

5.2.5 Software a Nvel do Usurio


Embora muito do software de E/S esteja embutido no sistema operacional, uma pequena poro
dele consiste de bibliotecas ligadas juntamente com programas do usurio, e at mesmo com programas inteiros executando fora do ncleo. Chamadas de sistema, incluindo chamadas do subsistema de
E/S, so normalmente feitas por procedimentos da biblioteca. Quando um programa em C contm a
chamada
bytes_lidos = fread(buffer, tam_item, n_itens, arquivo);
o procedimento da biblioteca fread ser ligado com o programa. A coleo de todos estes procedimentos da biblioteca parte do sistema de E/S.
Enquanto estes procedimentos fazem pouco mais que colocar seus parmetros em lugares apropriados para a chamada do sistema, h outros procedimentos de E/S que fazem o trabalho real. Em
particular, a formatao de uma entrada e sada feita por um procedimento da biblioteca.
Nem todo o software de E/S utilizado pelo usurio consiste de procedimentos da biblioteca. Outra importante categoria o sistema spooling. Spooling o modo de negociao com os dispositivos
dedicados de E/S em um sistema com multiprogramao. Considere um dispositivo tpico: impressora. Embora seja fcil permitir que algum processo do usurio abra o arquivo especial associado
impressora, suponha que o processo permanea com o processo aberto por vrias horas. Nenhum
outro processo poder imprimir.
Ao invs disso, o que feito criar um processo especial, chamado daemon, e um diretrio especial, chamado spooling directory. Para imprimir um arquivo, o aplicativo recebe o arquivo inteiro
para ser impresso e o coloca no spooling directory. Ento o daemon, o nico processo que tem permisso de usar o arquivo especial associado impressora, transfere um arquivo do spooling directory
para a impressora por vez. Protegendo-se os arquivos especiais contra o uso direto por usurios, o
problema de se ter algum monopolizando-os eliminado.
Spooling no somente usado para impressoras. Ele tambm usado em outras situaes. Por
exemplo, transferncia de arquivo na rede frequentemente usa um network daemon. Para enviar um
arquivo a algum lugar, o aplicativo coloca o arquivo dentro do diretrio de spooling da rede. Mais
tarde, o network daemon acessa o arquivo e o transmite.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

109

A figura 5.3 resume o sistema de E/S, mostrando todas os nveis e funes principais de cada
nvel.
camada

funcionalidade

processos do usurio

executa operao de E/S

software independente
do dispositivo

drivers de dispositivos

gerenciadores
de interrupo

dispositivos

requisio de E/S

identifio, proteo, bloqueio


"bufferizao"
inicia registradores do dispositivo
verifica status da operao
desbloqueia o driver quando a
operao de E/S se completa

executa fisicamente a operao de E/S

resposta da requisio

Figura 5.3: Nveis do sistema de E/S e funes principais de cada nvel

5.3 Discos RAM


Dispositivos do tipo bloco so armazenadores que aceitam dois comandos: escrever um bloco e
ler um bloco. Normalmente esses blocos so armazenados em memria rotativa, tal como os discos
rgidos e flexveis. Um disco RAM utiliza uma regio pr-alocada da memria principal para o
armazenamento de blocos e tem a vantagem de propiciar acesso muito rpido, tornando-o apropriado
para armazenamento de programas e dados que so utilizados com frequncia.
Um ponto a ser considerado, so os sistemas que suportam montagem de dispositivos e os sistemas que no suportam. No primeiro, exite um dispositivo raiz sempre presente em uma localizao
fixa, e sistemas de arquivos removveis (i.e. discos) podem ser montados (mounted) na rvore de
arquivos como forma de integrar o sistema de arquivos.
Em contraste, sistemas como o MS-DOS requerem que o usurio especifique a localizao de
cada arquivo, de forma explcita como em B:ARQUIVO, ou usando certos defaults (dispositivos correntes, diretrios correntes, e outros). Com somente um ou dois discos flexveis, esta carga pode ser

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

110

gerencivel, mas em grandes computadores, com dezenas de discos, deixar o controle de todos os
dispositivos para o usurio intolervel.
A figura 5.4 mostra a idia por detrs dos discos RAM. O disco RAM dividido em n blocos,
dependendo de quanto de memria foi alocado para ele. Cada bloco tem o mesmo tamanho que o
tamanho do bloco usado em discos rotativos. Quando o driver recebe um bloco para ler ou escrever,
ele apenas computa onde na memria de disco da RAM o bloco est, e l ou escreve nesta posio
de memria. Normalmente, a transferncia deve ser feita pela chamada de um procedimento em
linguagem assembly, que copia os dados gerados pelo programa do usurio com a mxima velocidade
com a qual o hardware capaz de operar.

memria principal (RAM)

processos do usurio

bloco n do disco RAM


disco RAM

bloco 1 do disco RAM


bloco 0 do disco RAM

sistema operacional

Figura 5.4: Um disco RAM

5.4 Discos Rotativos


Nas sees seguintes, descreveremos brevemente o hardware do disco, passando para os disk
drivers a seguir.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

111

5.4.1 Hardware do Disco


Todos os discos rotativos so organizados em cilindros, cada qual contendo tantas trilhas quanto
cabeas empilhadas verticalmente. As trilhas so divididas em setores, com um nmero de setores na
circunferncia, tipicamente entre 8 a 32. Todos os setores contm o mesmo nmero de bytes, embora
setores no anel externo do disco sejam fisicamente maiores que aqueles no anel interno. O espao
extra no aproveitado.
Um aspecto que tem importante implicaes no disk driver a possibilidade do controlador fazer
buscas (seek) em dois ou mais dispositivos ao mesmo tempo. Estas so conhecidas como busca
entrelaada (overlapped seek). Enquanto o controlador e o software esto esperando uma busca se
completar em um dispositivo, o controlador pode iniciar uma busca em outro. Muitos controladores
podem tambm ler ou escrever em um dispositivo enquanto executam uma busca em um ou mais de
um dispositivos, mas nenhum pode ler ou escrever em dois dispositivos no mesmo tempo. (Ler ou
escrever requer que o controlador mova bits na faixa de microsegundos, assim uma transferncia usa
muito de sua capacidade computacional). A habilidade de realizar duas ou mais buscas ao mesmo
tempo pode reduzir o tempo mdio de acesso consideravelmente.
Os parmetros de dispositios para discos flexveis do IBM PC so mostrados na tabela 5.2.
Esses so os parmetros padres para unidades de disquetes de 5.25, dupla-face/dupla-densidade e
capacidade para 360 Kbytes.
nmero de cilindros
trilhas por cilindro
setores por trilha
total de setores
bytes por setor
bytes por disquete

40
2
9
720
512
368640

tempo de busca (cils adjacentes)


tempo de busca (mdio)
tempo de rotao
tempo de partida/parada
tempo para transferir um setor

6 ms
77 ms
200 ms
250 ms
22 ms

Tabela 5.2: Parmetros de unidades de discos flexveis (360 Kbytes) para o IBM PC

5.4.2 Software do Disco


Nesta seo veremos algumas caractersticas genricas relacionadas com os disk drivers. O tempo
de leitura ou escrita de um bloco do disco determinado por trs fatores: o tempo de seek (tempo
para mover o brao para o cilindro desejado), o atraso rotacinal (tempo para o setor desejado ficar sob
a cabea de leitura/escrita), e o tempo de transferncia. Para muitos discos, o tempo de seek domina,
assim reduzindo-se o tempo de seek, podemos melhorar substancialmente o desempenho do sistema.
Algoritmos de Escalonamento do Brao do Disco
Se o disk driver aceita uma requisio por vez e a executa nesta ordem, isto , First-Come, FirstServed (FCFS), pouco pode ser feito para otimizar o tempo de seek. Entretanto estratgia possvel:
provvel que enquanto o brao est executando um seek na metade de uma requisio, uma outra
requisio de disco pode ter sido gerada por outro processo. Muitos disk drivers mantm uma tabela,

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

112

indexada pelo nmero do cilindro, com todas as requisies pendentes para cada cilindro, encadeadas
juntas numa lista.
Para este tipo de estrutura de dados, podemos melhorar o algoritmo de escalonamento FirstCome, First-Served. Considere um disco com 40 cilindros. Uma requisio chega para ler um bloco
no cilindro 11. Enquanto a busca para o cilindro 11 est em progresso, novas requisies chegam
para os cilindros 1, 36, 16, 34, 9, e 12, nesta ordem. Elas so inseridas na tabela de requisies
pendentes, tendo cada cilindro um lista separada. As requisies so mostradas na figura 5.5.
posio inicial

X
0

X
5

X X
10

X
15

X
20

25

X
30

cilindro

sequncia de movimentos

tempo

Figura 5.5: Algoritmo de escalonamento menor seek primeiro (SSF)


Quando a requisio corrente termina (cilindro 11), o disk driver tem que escolher qual ser a
prxima requisio. Usando FCFS, ele ir para o cilindro 1, ento para o 36, e assim por diante. Este
algoritmo requer movimentos do brao de 10, 35, 20, 18, 25, e 3, respectivamente, num total de 111
cilindros.
Alternativamente, a prxima requisio pode ser manuseada a fim de minimizar o tempo de seek.
Dadas as requisies da figura 5.5, a sequncia 12, 9, 16, 1, 34, e 36, como mostrado na linha
entalhada da figura 5.5. Com esta sequncia, os movimentos do brao so 1, 3, 7, 15, 33, e 2, num
total de 61 cilindros. Este algoritmo, menor seek primeiro (SSF), diminuiu o total de movimentos do
brao pela metade, comparado com o FCFS.
Infelizmente, SSF tem um problema. Suponha mais requisies chegando enquanto as requisies da figura 5.5 est sendo processada. Por exemplo, se, aps chegar ao cilindro 16, uma nova
requisio para o cilindro 8 est presente. Esta requisio ter prioridade sobre o cilindro 1. Se a
requisio for para o cilindro 13, o brao ir para o 13, ao invs de ir para o cilindro 1. Com disco
muito carregados, o brao tende a permanecer no meio do disco a maior parte do tempo, prejudicando
assim as requisies das extremidades. Requisies distantes do meio so em mdia mais demoradas,
colocando o objetivo de mnima resposta no tempo e equitatividade em conflito.
Um algoritmo para reconciliar os objetivos conflitantes entre a eficincia e equitatividade constituise em manter o movimento do brao na mesma direo at no haver mais requisies pendentes naquela direo, e ento o movimento do brao mudado. Este algoritmo, conhecido como algoritmo
do elevador, requer o software mantenha 1 bit: o bit da direo corrente, UP ou DOWN. Quando a

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

113

requisio termina, o disk driver testa o bit. Se UP, o brao movido para a prxima requisio
pendente de posies mais altas, se houver. Se no h requisies pendentes para posies mais altas,
o bit de direo revertido. Quando o bit mudado para DOWN, o movimento ser para a prxima
requisio de posio mais baixa, se houver.
A figura 5.6 mostra o algoritmo do elevador usando as mesmas sete requisies da figura 5.5,
assumindo que o bit de direo esteja inicialmente em UP. A ordem na qual os cilindros so servidos
12, 16, 34, 36, 9, e 1, gerando movimento do brao de 1, 4, 18, 2, 27, e 8, num total de 60 cilindros.
Neste caso, o algoritmo do elevador suavemente melhor que SSF, embora seja usualmente pior.
Uma propriedade interessante do algoritmo do elevador que dada uma coleo de requisies, o
limite superior para o total de movimentos fixado: ele apenas duas vezes o nmero de cilindros.
posio inicial

X
0

X
5

X X
10

X
15

X
20

25

X
30

cilindro

sequncia de movimentos
tempo

Figura 5.6: Escalonamento de requisies no disco atravs do algoritmo do elevador


Alguns controladores de disco provem um modo do software para inspecionar o nmero de
setores correntes sob a cabea. Com um desses controladores, uma outra otimizao possvel. Se
duas ou mais requisies para o mesmo cilindro esto pendentes, o driver pode emitir a requisio
para o setor que passar sob a cabea do prximo cilindro. Note que quando trilhas mltiplas esto
presentes num cilindro, requisies consecutivas podem ser conduzidas para diferentes trilhas com
nenhuma penalidade. O controlador pode selecionar alguma das cabeas instantneamente, uma vez
que seleo de cabea no involve movimento dos braos nem atraso rotacional.
Quando existe vrios dispositivos, uma tabela de requisies pendentes deve ser mantida para
cada dispositivo separadamente. Quando algum dispositivo est desocupado, um seek deve ser emitido para mover os seus braos para o cilindro onde ser necessrio (assumindo que o controlador
permita seeks sobrepostos). Quando a transferncia corrente termina, um teste pode ser feito para
verificar se algum dos dispositivos esto posicionados no cilindro correto. Se um ou mais esto, a
prxima transferncia pode ser iniciada no dispositivo que j est no cilindro correto. Se nenhum
dos braos est na posio desejada, o driver deve emitir novos seeks sobre os dispositivos que j
completaram a transferncia, e esperar at a prxima interrupo para examinar em qual dispositivo
o posicionamento do brao se completou.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

114

Manipulao de Erros
Discos RAM no tm preocupao sobre seek ou na otimizao rotacional: em algum instante
todos os blocos podem ser lidos ou escritos sem nenhum movimento fsico. Uma outra rea na qual
discos RAM so consideravelmente mais simples que discos rotativos a manipulao de erros.
Discos rotativos so submetidos por uma larga variedade de erros. Alguns dos mais comuns so:







erros de programao (i.e. requisio para setor no existente);


erro de checksum transiente (i.e. causado por sujeira na cabea);
erro de checksum permantente (i.e. bloco do disco fisicamente danificado);
erro de seek (i.e. enviar o brao para o cilindro 6, mas ele vai para o 7);
erro de controlador (i.e. recusa do controlador em aceitar comandos).

funo do disk driver manipular cada um desses erros da melhor maneira possvel. Erros de
programao ocorrem quando o driver diz ao controlador para executar uma operao de seek em um
cilindro no existente, ler de um setor no existente, usar uma cabea no existente, ou transferir de
ou para uma posio de memria inexistente.
Erros checksum transientes so causados por poeira no ar entre a cabea e a superfcie do disco.
Em muitos casos eles podem ser eliminados pela repetio da operao algumas vezes. Se o erro
persiste, o bloco deve ser marcado como defeituoso.
Um modo de evitar blocos defeituosos escrever um programa especial que toma a relao
destes blocos como entrada, e cria um arquivo contendo todos os blocos defeituosos. Uma vez que
este arquivo tenha sido criado, para o alocador do disco parecer que estes blocos esto ocupados,
no os alocando para outros arquivos. Como o arquivo de blocos defeituosos nunca lido, os blocos
defeituosos permanecero inertes no disco.
Evitar a utilizao de blocos defeituosos constitui numa tarefa rdua. Alguns controladores inteligentes reservam algumas poucas trilhas, no normalmente disponveis para programas do usurio.
Quando um disco formatado, o controlador determina quais blocos so defeituosos e automaticamente substitui por uma trilha de reserva. A tabela de mapas de trilhas defeituosos para trilhas de
reserva mantida na memria interna do controlador e no disco. Esta substituio transparente para
o driver.
Erros de seek so causados por problemas mecnicos no brao. O controlador mantm o rastreamento da posio do brao internamente. Para realizar um seek, ele emite uma srie de pulsos para
o motor do brao, um pulso por cilindro, para mover o brao para o novo cilindro. Quando o brao
chega no destino, o controlador l o nmero do cilindro (escrito quando o drive foi formatado). Se o
brao est no lugar errado, um erro de seek ocorre.
Alguns computadores corrigem o erro de seek automaticamente, mas outros (incluindo os IBM
PCs) apenas atribuem um bit de erro e abandonam o resto para o driver. O driver manipula este
erro pela emisso de um comando recalibrate, que move o brao to longe ele possa ir, e reinicia o
controlador interno do cilindro corrente em 0. Usualmente isto soluciona o problema. Caso contrrio,
o dispositivo deve ser reparado.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

115

Como temos visto, o controlador um pequeno computador especializado, contendo software,


variveis, buffers, e ocassionalmente bugs. Algumas vezes uma sequncia no usual de eventos, tal
como uma interrupo sobre um dispositivo ocorrendo simultaneamente com um comando recalibrate para outro, dispara o bug e causa o controlador entrar em loop ou perder-se do estava fazendo.
Projetistas de controladores usualmente consideram a pior situao e provem um pino no chip, o
qual, quando em nvel alto, fora o controlador esquecer sua tarefa corrente, reiniciando a si mesmo.
Se tudo isso falhar, o disk driver pode reiniciar o controlador. Se isto tambm for em vo, o driver
imprime uma mensagem e termina sua operao.
Cache de Rastreamento
O tempo requerido para uma operao de seek para um novo cilindro usualmente muito maior
que o tempo de transferncia ou rotao. Em outras palavras, uma vez que o driver tenha posicionado
o brao em algum lugar, pouco importa o tempo gasto para ler um setor ou uma trilha inteira.
Alguns disk drivers tiram proveito desta propriedade mantendo secretamente uma cache do rastreamento (track-at-a-time cache), o que no conhecido pelo software independente do dispositivo.
Se um setor demandado e o mesmo encontra-se no cache, nenhuma transferncia do disco requerida. A desvantagem da cache de rastreamento (em adio complexidade do software e espao de
buffer necessrio), que a transferncia da cache para o programa que requisitou a operao deve ser
feita pela CPU, usando um loop programado, ao invs de DMA.
Alguns controladores aprimoram este processo, e fazem o track-at-a-time caching na sua memria interna, transparente para o driver. Assim a transferncia entre o controlador e a memria pode
usar DMA. Note que ambos controlador e driver podem ler ou escrever trilhas inteiras em um nico
comando, mas que o software independente do sispositivo no pode, uma vez que ele considera o
disco como uma sequncia linear de blocos, sem considerar como eles so divididos em trilhas e
cilindros.

5.5 Entrada/Sada no UNIX


5.5.1 Drivers Convencionais
Dispositivos no UNIX podem ser do tipo bloco ou caracter. O interfaceamento com os dispositivos se d via subsistema de arquivos. Cada dispositivo tem um nome idntico a nomes de arquivos
(/dev/tty, /dev/console, etc) e um respectivo inode. inodes associados dispositivos tm como tipo
de arquivo block ou character special, o que os distingue dos arquivos regulares.
Cada dispositivo tem seu device driver associado. Conforme visto anteriormente, drivers so programas que manipulam o controlador do dispositivo. No UNIX, um driver implementa as chamadas
de sistema open, close, read, write e ioctl para o seu dispositivo, bem como prov tratamento para
as interrupes oriundas deste.
Em dispositivos que operam em bloco, a transferncia de dados entre o espao de endereamento
de um processo e o dispositivo de d via buffer cache (ver Cap. 3). A razo para tal que tais dispositivos (discos, por exemplo) so lentos, sendo portanto a bufferizao um meio de aumentar a taxa
de transferncia de dados. Dispositivos do tipo caracter (terminais, por exemplo) so inerentemente
rpidos e no necessitam deste recurso.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

116

A figura 5.7 mostra o esquema bsico de entrada/sada no UNIX. Quando um processo executa
uma chamada de sistema open, por exemplo, o ncleo acessa o inode do arquivo passado chamada e
descobre que um arquivo associado a um dispositivo de E/S. Atravs de uma tabela de chaveamento
de dispositivo, o ncleo obtm o endereo da rotina de open para este dispositivo. Uma vez iniciado
o dispositivo, um campo na tabela de arquivos (ver Cap. 3) adicionado, sendo o ndice deste campo
(descritor) retornado ao processo.
open close read write ioctl

open
close
read
mount umount

write

rotinas do
cache de buffers

tabela de chaveamento
(dispositivos orientados a caracter)

open close read write ioctl

tabela de chaveamento
(dispositivos orientados a bloco)

open

driver

close

strategy

driver

gerenciador de interrupes

gerenciador de interrupes

vetor de interrupo
interrupes
dispositivo

dispositivo

dispositivo

Figura 5.7: Esquema bsico de E/S no UNIX


Uma chamada close faz com que o ncleo acesse o respectivo procedimento para o dispositivo,
cuja identificao obtida na tabela de arquivos.
Chamadas ioctl permitem o usurio operar tanto arquivos regulares quanto dispositivos do tipo
caracter. Operaes tpicas so:

bloquear um arquivo;

DCA-FEEC-UNICAMP





Introduo aos Sistemas Operacionais

117

desligar o eco do terminal;


ajustar taxa de transferncia de modens;
reenrolar uma fita.

Para dispositivos do tipo bloco, chamadas read e write seguem o mesmo procedimento. Para
tais dispositivos, na qual o driver tem que iteragir com as rotinas de buffer cache, o procedimento
outro. Uma rotina denominada strategy perfaz as operaes de leitura e escrita em tais dispositivos.
Quando uma operao de leitura ou escrita requisitada, o ncleo identifica a rotina strategy
definida para o dispositivo, passando mesma o endereo do cabealho do buffer para onde os dados
devem ser copiados, caso leitura, ou contendo os dados para escrita.

5.5.2 Streams
Stream um conceito que prov maior modularidade na implementao de drivers para dispositivos do tipo caracter (principalmente drivers de rede que so estruturados em mltiplas camadas).
Um stream um conjunto de pares de listas ligadas. Uma lista armazena requisies de escrita
e na outra esto as leituras que o dispositivo j efetuou (figura 5.8). Cada par de listas implementa
um determinado nvel de abstrao, desde os mais altos (como as chamadas de sistema) at os mais
baixos (como controle direto do dispositivo), passando por nveis intermedirios (como protocolos).
A figura 5.8 mostra um driver de terminal empregando o conceito de stream.

write

cabea do STREAM

fila de entrada

put

disciplina de linha

fila de entrada

put

driver do terminal

fila de entrada

read

inode do arquivo
do dispositivo

fila de sada

push

fila de sada

push

fila de sada

Figura 5.8: Driver de terminal composto de um stream com trs pares de listas

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

118

Quando um processo escreve dados num stream, o ncleo envia os dados para a prxima lista,
at chegar ao dispositivo. Quando o driver recebe dados do dispositivo, ocorre o processo inverso:
os dados so enviados at chegar lista de nvel mais alto, permanecendo a disposio do processo
que requisitou a operao.
Cada lista do stream consiste numa estrutura de dados contendo:









um procedimento de abertura invocado durante uma chamada open;


um procedimento de fechamento invocado durante uma chamada close;
um procedimento de put para adicionar dados lista;
um procedimento de padro (servio) chamado quando a lista processada;
um ponteiro para a prxima lista no stream;
um ponteiro para a fila de itens aguardando passagem para a para a prxima lista no stream;
campos utilizados para o controle de fluxo, escalonamento de servios. etc.

O ncleo descobre se o driver comum ou baseado em streams quando da consulta tabela de


chaveamento de dispositivo.
O fluxo de dados entre listas se d por estruturas denominadas mensagens. Uma mensagem
consiste de uma lista de blocos contendo dados ou controle. Mensagens de controle so originadas
durante o processamento de uma chamada ioctl. Um open causa a criao do stream, com um
conjunto de blocos para o fluxo de mensagens.
Quando um processo escreve num stream, o ncleo copia os dados do espao de endereamento
do processo para os blocos alocados ao stream. O stream transfere estes blocos para a prxima lista
envocando sua rotina de put. Caso tal operao falhe (por no haver blocos disponveis nesta lista,
por exemplo), estes blocos so marcados para processamento futuro. A leitura de um stream se d
com a chamada ioctl com a opo PUSH. Streams so destruidos por ocasio da chamada close para
seu dispositivo.
Streams permitem a implementao de drivers onde as chamadas open, close, read e write possuem cdigo dependente do dispositivo fsico apenas nos nveis mais baixos.

Captulo 6

TPICOS ESPECIAIS
O objetivo deste captulo consiste na discusso de alguns itens importantes no contexto dos sistemas operacionais. A primeira questo abordada procura discutir o esforo internacional com relao
definio de um padro de interface atravs do Projeto POSIX. Posteriormente, apresenta-se o
conceito de thread que um novo modelo voltado para a programao concorrente e que tem sido
implementado na maior parte dos novos sistemas operacionais. Por ltimo, o captulo discute alguns
aspectos do projeto de hardware dos processadores 8088/8086, 80286 e 80386; trata-se de uma discusso introdutria que procura enfatizar a evoluo ocorrida nesta famlia de processadores tendo
como objetivo facilitar a implementao de ambientes multiprogramados.

6.1 Padronizao em Sistemas Operacionais


A necessidade de uniformidade, do ponto de vista da interface do sistema operacional, de modo a
facilitar a transportabilidade do software aplicativo entre vrias plataformas, tem feito com que grupos internacionais procurem definir um padro que atenda estas exigncias. A iniciativa atualmente
em curso com melhores perspectivas o projeto POSIX do IEEE descrito brevemente na sequncia.

6.1.1 POSIX - (Portable Operating System)


O objetivo do projeto POSIX consiste em eliminar a necessidade de produzir vrias verses de
programas de aplicao reduzindo os custos do desenvolvimento do software aplicativo.
Dois tipos de interfaces (figura refintpos) so especificadas no POSIX OSE (POSIX Open System Environment): a interface de programa de aplicao (API), e a interface do ambiente externo
(EEI). As APIs so chamadas de procedimentos feitas pela aplicao em uma determinada linguagem de programao. O ambiente externo refere-se as entidades externas com as quais a aplicao
troca informaes incluindo o usurio (interface homem/mquina), documentos, dispositivos fsicos
tais como vdeo, discos, impressoras e redes. No caso, as EEIs so voltadas para o problema de
interoperabilidade.
O padro 1003.1 que cobre os servios bsicos dos sistemas operacionais, foi adotado em dezembro/90 como padro ISO/IEC 9941-1 pela ISO (International Standard Organization) e pelo IEC

119

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

120

software de aplicao

interface com o ambiente externo (EEI)

plataforma de aplicao

interface de programas de aplicao (API)

ambiente externo

Figura 6.1: Ambiente POSIX


(International Electrotechnical Commission). O padro 1003.1, originalmente definido para a linguagem C ter, brevemente, definio para o Fortran (1003.9) e Ada (1003.5). A tabela 6.1 mostra os
vrios grupos de trabalho envolvidos no projeto de padronizao, assim como, o estado em que se
encontram.
A classe de padres do POSIX abriga mais do que a definio das interfaces para o sistema
operacional. O Comit reconheceu que as aplicaes de tempo real possuem necessidades especficas
originando os padres 1003.4 (extenses para tempo real), 1003.4a (sobre threads) e 1003.13 (perfil
do ambiente da aplicao para suporte s aplicaes de tempo real).
Outro aspecto importante o fato de que o padro no especifica mecanismos de implementao,
mas exige que as empresas aderentes ao POSIX.4 indiquem dados de performance para todas as
extenses em diversas condies de mquina e temporizao. Verificao das mtricas anunciadas
pelas empresas sero realizadas em laboratrios devidamente licenciados.
As extenses de tempo real incluem:








semforos binrios;
fixao de processo na memria;
memria compartilhada;
escalonamento preemptivo baseado em prioridade;
notificao de evento assncrono;
comunicao entre processos;

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

standard
1003.1

tpico
chamadas de sistema

1003.2
1003.2a
1003.4
1003.4a
1003.5
1003.6

shell e utilitrios
portabilidade
tempo-real
processos leves
interface ADA
segurana

1003.7
1003.8
1003.9
1003.12

administrao
transparncia
interface Fortran
interface de rede

1003.15
1003.17
1201.1

escalonamento em batch
diretrio de servios
sistema grfico

1224
1238.0
1238.1

X.400
funes de suporte
FTAM

121

escpo
servios bsicos
tais como E/S e controle de processos
linguagem de comando e utilitrios
utilitrios para time sharing
facilidades p/ programaes em tempo-real
facilidades para programao concorrente
chamadas do 1003.1 em ADA
segurana multinvel,
controle de acesso, etc
adio de usurios, status checking, etc
acesso transparente (via rede) a arquivos
chamadas do 1003.1 em Fortran
servios de comunicao
independente de protocolo
funes para processamento no interativo
registro e localizao de servios
funes de interfaceamento grfico
baseado em janelas
correio eletrnico padro OSI
funes de baixo nvel padro OSI
transferncia de arquivos padro OSI

Tabela 6.1: Grupos representativos dos padres de interface do IEEE para programas aplicativos. O
standard 1003.1 est completo (ISO 9945.1); os standards 1003.2 a 1003.6 3 1003.9 encontram-se
prximo de uma verso final; os demais standards esto ainda em discusso.

sistema de arquivos de tempo real.

Uma rea que ainda encontra-se em discusso relaciona-se s threads. Um thread um processo
leve que utiliza o espao de endereamento de um processo convencional (pesado) e requer um menor
overhead na criao, gerenciamento e execuo, do que um processo convencional. A mquina
necessita manter menos informaes de estado para uma thread e, apesar dela executar no espao de
endereamento do processo pai, ela o elemento de escalonamento e manipulao de sinais.
O grupo de trabalho POSIX 1003.4a est discutindo quanto do contexto deve estar associado a
uma thread e como uma notificao de evento assncrono ser negociada pela thread. Enquanto estas
questes no forem completadas, o POSIX 4.a no far parte do padro POSIX 4.
Por ltimo, o Comit identificou 4 perfis para os sistemas de tempo real: mnimo, controle,
dedicado e propsito geral. O objetivo dos perfis o de permitir que o ncleo seja configurado para
uma instalao ou aplicao especfica.
O perfil mnimo usado nos sistemas dedicados, autnomos, com poucos dispositivos de E/S
e no utiliza memria de massa. Neste caso o sistema formado somente por um nico processo

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

122

POSIX.1 com tratadores de interrupo, para todo o processamento a ser realizado.


O perfil de controle inclui um gerenciamento estruturado de E/S e memria, e acomoda armazenamento de disco em RAM e sinais. Armazenamento de massa pode ser utilizado mas no
obrigatrio.
O perfil dedicado inclui mltiplos processos e processadores. A maior parte das extenses POSIX.4 so necessrias exceto o sistema de arquivos de tempo real.
O perfil de propsito geral consiste na funcionalidade completa do POSIX.1 e POSIX.4 incluindo
a capacidade de uso interativo. Pode ser usado com conexo a rede, threads, gerenciamento de janela
e dispositivos de E/S de alta velocidade para armazenamento de massa.

6.2 Processos Leves (Threads)


Muitos sistemas operacionais suportam um modelo de processamento que uma extenso do
modelo tradicional do UNIX. O modelo convencional de processo no UNIX limitado a uma nica
atividade no processo de cada vez, ou seja, em um determinado instante existe uma nica linha de
controle (thread ou fluxo de execuo) no processo: trata-se de um modelo mono-thread. Diferentemente deste modelo, sistemas operacionais recentes (OS/2, Mach, Windows NT, etc.) oferecem um
modelo no qual muitas atividades avanam concorrentemente dentro de um nico processo, isto ,
um processo nestes sistemas pode ser multi-threaded.
Mltiplas threads so uma ferramenta poderosa para tratar problemas naturalmente concorrentes
como aqueles encontrados, por exemplo, em aplicaes de tempo real. Isto porque o programador
no necessita tratar mltiplas atividades, todas relacionadas a um mesmo contexto, do ponto de vista
de um nico fluxo de execuo, ou seja, uma thread pode ser criada para tratar cada atividade lgica.
Neste contexto importante esclarecer a distino entre processo e thread. O processo no
nada mais do que um receptculo para as threads. Podemos pensar da seguinte forma: no existem
mais processos, existem somente threads. O que antes era um processo, por exemplo, a invocao
de ls, trata-se na realidade de uma nica thread executando em um espao de endereamento. O
que resta para o processo uma forma conveniente de caracterizar um espao de endereamento, um
conjunto de descritores de arquivo, e assim por diante. A figura refloproc ilustra este novo conceito
de processo.
As threads so as unidades de escalonamento dentro de um processo. Em outras palavras, processos na realidade no executam, mas sim suas threads. Cada processo no sistema possui pelo menos
uma thread. Do ponto de vista do usurio o contexto de uma thread consiste de um conjunto de
registros, uma pilha e uma prioridade de execuo, conforme mostrado na figura 6.3.
Como comentado anteriormente, as threads compartilham todos os recursos possuidos pelo processo que as criou. Todas as threads dentro de um processo compartilham o mesmo espao de endereo virtual, arquivos abertos, semforos e filas. Cada thread encontra-se em um destes trs estados:
executando, pronta para executar e bloqueada. Somente uma nica thread no sistema encontra-se
no estado execuo quando se trata de uma plataforma de uma nica CPU. A thread que se encontra
em execuo aquela no estado pronta para executar e que foi selecionada pelo sistema operacional
de acordo com a poltica de escalonamento. Threads que se encontram no estado de bloqueio esto
esperando a ocorrncia de um evento.
Por exemplo, a verso de 16 bits do OS/2 suporta at 512 threads; a verso de 32 bits suporta at

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

123

processo

espao de
endereamento
virtual
do processo

thread #1

descritores
de arquivos

thread #2

pipes

semforos

thread #N

gerenciadores
de sinal

Figura 6.2: Layout de um processo


4095 threads. A verso de 16 bits possui limitaes no nmero de threads que podem executar dentro
de um processo (da ordem de 50 threads por processo) devido natureza segmentada da memria
do ncleo. No sistema de 32 bits podem existir tantas threads quanto o usurio deseje dentro de um
processo, at o limite do nmero de threads disponveis no sistema.
Na sequncia, so discutidos alguns aspectos relativos manipulao das threads utilizando-se
como referncia o sistema operacional OS/2. Threads no fazem parte do UNIX apesar de algumas
verses implementarem este conceito de forma no padronizada (como no caso do SUNOS).

6.2.1 Criao de Threads no OS/2


Threads so criadas atravs da chamada DosCreateThread. No OS/2 de 16 bits o solicitador
deve alocar uma pilha para a thread e passar para o chamada DosCreateThread o endereo da
pilha e o endereo do cdigo da thread que ir executar. No OS/2 de 32 bits, o sistema aloca a
pilha e, dinamicamente, redimensiona-a caso haja necessidade durante a vida da thread. O servio
DosCreateThread retorna um identificador de thread (TID) que similar ao PID do UNIX. Cada
thread no sistema identificada unicamente por PID:TID. Diferentemente dos processos, as threads
no so hierrquicas. Todas as threads em um processo possuem uma relao de irmo para com as
outras e permanecem parte do processo at que este termine.
A thread que criada quando um processo inicia com a chamada DosExecPgm denomina-se
thread 1, e possui algumas propriedades especiais que as outras threads dentro do processo no
possuem. A thread 1 recebe todos os sinais enviados ao processo e quando termina, todas as outras
threads no processo so terminadas.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

124

thread

registradores
pilha
prioridade

Figura 6.3: Layout de uma thread

6.2.2 Terminao de Threads no OS/2


Uma thread terminada atravs de uma chamada DosExit, que pode ser usado para terminar a
thread corrente ou todas as threads no processo. A API de multiexecuo da verso de 16 bits no
possui um servio anlogo ao DosKillProcess para matar outra thread; por outro lado, a verso de 32
bits fornece DosKillThread que permite terminar outra thread no processo corrente. A verso de 32
bits suporta ainda a chamada DosWaitThread, que permite que uma thread espere explicitamente a
terminao de uma thread especfica ou no dentro do processo. Este servio til quando as threads
dentro de um processo possuem um relacionamento mestre/escravo, no qual o mestre despacha as
threads escravas para realizarem uma tarefa.

6.2.3 Controle de Threads no OS/2


Existem vrias funes disponveis na API de multiexecuo para controle de threads. As chamadas DosEnterCritSec e DosExitCritSec permitem que threads dentro de um processo desabilitem o
chaveamento de threads dentro daquele processo. Esta facilidade til quando threads dentro de um
processo necessitam compartilhar dados entre si. A regio de cdigo que deve ser cuidadosamente
gerenciada denomina-se regio crtica. Entretanto, como as chamadas s regies crticas desabilitam
totalmente o chaveamento de threads dentro do processo, elas podem afetar negativamente se a regio crtica for muito longa. Existem outros mecanismos para sincronizao entre threads tais como
semforos.
Outro mtodo de controlar as threads dentro de um processo permitir que uma thread suspenda
a execuo de outra thread, liberando-a para reassumir a execuo posteriormente. Este controle
realiza-se atravs das chamadas DosSuspendThread e DosResumeThread, respectivamente. Ambas as chamadas utilizam TID como parmetro para indicar qual thread deve ser suspensa ou que deve
reassumir. Uma thread pode suspender ou reassumir somente uma thread que se encontre dentro do
mesmo processo.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

125

6.2.4 Informao Associada a Processo e Thread (OS/2)


O sistema de 16 bits fornece vrios objetos de memria denominados segmentos de informao
ou infosegs. O sistema contm 2 infosegs: um infoseg global compartilhado por todos os processos
e um infoseg local para cada processo. O infoseg global contm informaes do sistema que so
utilizadas por todos os processos, tais como data, horrio, e outros parmentros de configurao
do sistema. Os infosegs locais contm informaes vinculadas ao processo tais como prioridade
do processo, TID da thread corrente, prioridade da thread corrente, etc. Um processo requisita ao
sistema que mapeie infosegs no seu espao de endereamento atravs da chamada DosGetInfoSeg.
O sistema de 32 bits no utiliza esta arquitetura de infosegs exceto quando ele emula a compatibilidade para as aplicaes desenvolvidas para o OS/2 de 16 bits.

6.2.5 Escalonamento no OS/2


Todas as threads no sistema competem pelo processador. Para determinar qual thread dever
executar, o OS/2 implementa uma arquitetura multinvel de prioridade com um esquema de variao
dinmica de prioridade e escalonamento round-robin dentro do nvel de prioridade. Cada thread possui a sua prpria prioridade de execuo, e threads de alta prioridade que esto prontas para executar
so escalonadas antes das threads de menor prioridade que se encontram prontas para executar. Os
processos tambm tm prioridade; entretanto, esta prioridade no entra no clculo de qual thread
dever executar. A prioridade do processo atua somente como uma prioridade default para as threads
que so criadas por aquele processo. Uma thread pode mudar a prioridade de qualquer (ou todas) as
threads dentro daquele processo atravs da chamada DosSetPrty. Uma thread tambm pode alterar
a prioridade default de threads em outros processos, sem levar em conta se eles esto relacionados
ao processo hierarquicamente.
Existem 4 classes de prioridade no sistema OS/2: tempo crtico, servidor, regular e inativo. A
classe servidora tambm denominada de classe de prioridade alta-fixa (fixed-high priority class).
Cada classe de prioridade ainda dividida em 32 nveis de prioridade (figura 6.4).
As threads que se encontram na classe de prioridade mais alta (tempo crtico), possuem restries
de tempo. Um exemplo de uma thread de tempo crtico uma thread que espera por dados enviados
por um driver de dispositivo monitorando um dispositivo de comunicao de alta velocidade. A maior
parte das threads no sistema encontram-se na classe de prioridade regular. A classe de prioridade
servidora usada por programas que executam em um ambiente contendo servidores. A classe
servidora garante que programas clientes no sofrero degradao no desempenho devido presena
de programas na classe regular presentes no servidor.
Threads na classe prioridade inativa executaro somente quando no existirem threads nas outras
classes. Tipicamente, threads na classe inativa so threads que executam em background.
O algoritmo de escalonamento do tipo round-robin dentro do mesmo nvel de prioridade. O
quantum de tempo dirigido pelo relgio do sistema e o usurio pode configurar o quantum de
tempo de 32 a 248 milisegundos atravs da palavra chave TIMESLICE no arquivo CONFIG.SYS.
A thread executa o seu quantum de tempo completamente a menos que ocorra uma interrupo que
resulte na execuo de uma outra thread de classe de prioridade mais alta. Neste caso, a thread que
se encontra em execuo sofre preempo. Caso contrrio, a thread executa o seu quantum de tempo
completamente a menos que realize uma chamada ao ncleo que implique no seu bloqueio.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

126

processo com restries crticas de tempo


31

alta prioridade

30
...
0

round-robin

baixa prioridade

processos com prioridade de servidor


31

alta prioridade

30
...
0

baixa prioridade

processos de prioridade regular


31

alta prioridade

30

round-robin
...

baixa prioridade

processos inativos
31

alta prioridade

30
...
0

round-robin

baixa prioridade

Figura 6.4: Estrutura de prioridades no OS/2


A verso OS/2 de 32 bits implementa opcionalmente o quantum dinmico que procura maximizar
a utilizao do processador para threads que executam no modo usurio.

6.3 Arquitetura de Microprocessadores


Este item descreve algumas das solues de projeto adotadas no contexto dos processadores
8088/86, 80286 e 80386 visando, basicamente, atender um ambiente de multiprogramao. Neste
sentido, os aspectos ligados ao gerenciamento e proteo da memria so de fundamental importncia. No h a inteno de realizar-se uma discusso detalhada das caractersticas destes processadores.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

127

6.3.1 Intel 8088/86


Os microprocessadores 8088 e 8086 so equivalentes, sendo que o primeiro apresenta um barramento de dados externos de 8 bits enquanto o segundo trabalha com um barramento de dados de 16
bits.
Arquitetura de Memria (modelo segmentado)
Um processador de 16 bits permite um endereamento direto de 64 Kb de memria. No caso do
modelo segmentado do 8088/86 possvel enderear at 1 Mb de memria. Para tal, a memria
endereada na forma de 2 valores de 16 bits com a seguinte estrutura: segmento:offset ou 16:16. O
valor de um segmento indica o incio de uma regio de 64 Kb, enquanto o valor de offset expressa o
nmero de bytes a partir do incio do segmento de 64 Kb at o byte que est sendo endereado. Os
valores de segmento so carregados em um dos quatro registradores de segmento: CS, SS, DS e ES.
Conjunto de registradores
O conjunto de registradores do 8088 formado por:





registradores gerais;
registradores especiais;
registradores de segmento.

Os registradores AX, BX, CX, DX, SI e DI contm operandos das instrues lgicas e aritmticas.
Em instrues mais complexas estes registradores possuem papel especializado.
No caso dos registradores de segmento, o CS contm o endereo base do segmento de cdigo em
execuo (CS : IP - contador de instruo). Quando ocorre uma transferncia sem que o registrador
CS varie o seu contedo, diz-se se que ocorreu uma transferncia perto; caso o contedo de CS
varie, a transferncia ocorrida dita longe; o registrador SS contm o endereo de base da pilha
atual; o registrador SP aponta para o topo da pilha; DE e ES permitem a especificao de segmentos
de dados.

6.3.2 Sumrio
Como o 8088 no oferece nunhum mecanismo de proteo memria ou E/S, no se trata
de uma plataforma para suportar multiprogamao. Devido ao esquema de memria segmentada,
m cdigo escrito para o 8088 transportvel somente para sistemas que possuam, exatamente, a
mesma semntica de segmento e esquema de endereamento. O modelo de memria segmentada
e o pequeno conjunto de registradores adiciona um nvel de complexidade ao desenvolvimento de
programas e ferramentas de programao de suporte ao 8088.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

128

6.3.3 Intel 80286


O processador Intel 80286 pode operar em dois modos distintos: modo real e modo protegido.
No modo real, o 80286 atua como um 8088 rpido; no caso do modo protegido, o sistema oferece um
modelo segmentado de memria, assim como, vrios recursos que procuram facilitar a implementao de um ambiente de multiprogramao.
O 80286 colocado no modo protegido ativando o bit de modo protegido na palavra de status da
mquina (MSW) que se trata de um registrador de sistema do 80286. Uma vez no modo protegido o
80286 somente pode voltar ao modo real atravs do auxlio de circuito externo na placa do sistema.
Descritores
O modelo de memria no modo protegido diferente do modelo de memria no modo real.
Os endereos usados no modo protegido so denominados endereos virtuais. O mapeamento do
endereo virtual no endereo fsico ocorre atravs do uso de uma estrutura denominada descritor
formada por 8 bytes os quais contm: endereo fsico do segmento; tamanho do segmento (limite); a
forma como o segmento pode ser acessado e o privilgio para acessar o segmento.
O endereamento de base do segmento formado por 24 bits que correspondem a um endereo
da memria fsica. Como este endereo no visvel ao programa em execuo, o sistema operacional pode realocar segmentos dinamicamente na memria fsica. Esta realocao transparente ao
programa.
O limite de segmento indica o tamanho do segmento; os segmentos podem crescer ou encolher
dinamicamente.
Tabelas de Descritor
A arquitetura do 80286 agrupa os descritores em tabelas de descritores. A tabela de descritores
um segmento especial de comprimento varivel contendo at 8192 entradas para um tamanho mximo de 64 Kb por segmento. Existem 2 tabelas bsicas de descritores: tabela de descritor global
(GDT) e tabela de descritor local (LDT). Esta caracterstica permite a implementao de um modelo
de multiprogramao onde: na GDT so colocados os descritores para segmentos que so globais a
todos os processos; na LDT so colocados os segmentos que so propriedade do processo, ou seja,
existe uma LDT para cada processo presente no sistema e 1 GDT para todo o sistema. Os segmentos
GDT e LDT so localizados atravs de 2 registradores especiais GDTR e LDTR.
Seletores
Diferentemente do 8088, o segmento no formato segmento:offset do 80286 no representa uma
localizao fsica. Trata-se de um ndice na tabela descritora e denomina-se seletor. Desta forma, no
modo protegido, o endereamento 16:16 constitui-se em seletor:offset.
Traduo de Endereo
A figura 6.5 ilustra o mecanismo de traduo de endereo do 80286.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

129

16MB
seletor

....

offset
16-bit de offset

+
limite do
segmento

descritor

24-bit de end. base

....
....

0
tabela de descritores

memria fsica

reservado
direitos de acesso
end. de base (B0-15)
end. de base (B16-23)
limite

Figura 6.5: Traduo de endereo no modo protegido do 80286


Caso um seletor que referencie um descritor de segmento invlido seja carregado no registrador
de segmento correspondente, o 80286 ativa uma falha de proteo geral tratada pelo sistema operacional. Uma falha de proteo geral gerada caso um seletor vlido tente acessar uma posio de
memria ilegal. Apesar das aplicaes terem noo da presena dos seletores, elas no tm acesso
direto s tabelas de descritor. Estas tabelas so mantidas pelo sistema operacional em funo dos programas em execuo. Para agilizar a operao, quando um registro de segmento carregado com um
seletor vlido, o descritor lido automaticamente em um cache no chip correspondente ao registro
de segmento.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

130

Proteo
O conceito de proteo fundamental em sistemas multiprogramados e com endereamento virtual. O sistema operacional deve ser protegido das aplicaes e estas devem ser protegidas entre si.
O 80286 suporta um modelo de proteo que permite ao sistema operacional isolar-se das aplicaes
do usurio, isolar as aplicaes do usurio entre si e validar os acessos memria.
Sempre que a memria referenciada, o hardware da unidade de gerenciamento de memria
(MMU) no 80286 testa a referncia para verificar se ela satisfaz o critrio de proteo. Como este
teste feito antes que uma instruo se complete, qualquer violao proteo que ocorra durante o
teste far com que o 80286 provoque uma exceo. Os nveis de privilgio do 80286 so usados para
proteger dados e cdigos crticos do sistema contra cdigo menos confivel; o sistema usa LDTs para
isolar cada segmento de processo atravs da alocao de uma LDT para cada um e pelo chaveamento
de LDTs quando os processos so chaveados. Quando um seletor que referencia um segmento
carregado no registro de segmento, o processador carrega no somente o endereo de base e o limite
de segmento no cache de descritor mas, tambm, a informao de proteo.
O bit de acesso desativado toda a vez que o seletor carregado no registrador de segmento;
ele ativado sempre que o segmento lido ou escrito, e pode ser usado pelo sistema operacional
para monitorar o uso do segmento. O bit Presente no descritor indica se o segmento se encontra na
memria permitindo que o sistema operacional gerencie a memria virtual.
Testes de Tipo e Limite
O campo de tipo de um descritor distingue entre diferentes formatos de descritor e especifica o
uso previsto para o segmento. Indica, por exemplo, se o descritor corresponde a segmento de cdigo,
segmento de dados ou segmento especial usado pelo sistema. O bit de escrita indica se o segmento de
dados somente de leitura ou de leitura/gravao. No caso de segmentos de cdigo este bit impede
que gravaes ocorram nestes segmentos.
O campo limite do segmento no descritor indica o tamanho do segmento. Caso um programa
tente acessar um offset alm do limite de um segmento, uma falha de proteo indicada.
Nveis de Privilgio
O 80286 possui um esquema de proteo de 4 nveis: nvel 0, representa o nvel de privilgio mais
alto (sistema opreacional); o nvel 3 representa o nvel de menor confiana (programas do usurio).
Os nveis de privilgio so encontrados em trs reas da arquitetura do 80286: descritores (DPL)
- indica o nvel de privilgio necessrio para acessar o segmento; seletores (RPL) - representa o
nvel de privilgio de um procedimento que fornece um seletor como parmetro; o 80286 mantm,
internamente, o nvel de privilgio atual (CPL). Normalmente, CPL tem o mesmo valor do DPL
do segmento de cdigo em execuo. O valor do CPL muda quando o controle transferido entre
segmentos de cdigo com DPLs diferentes. O 80286 determina o direito de um procedimento acessar
segmentos comparando o CPL com os nveis de privilgio (DPL e RPL) dos segmentos envolvidos.
Quando um programa carrega o seletor de um segmento de dado no registro de segmento, o 80286
testa para ver se o programa pode acessar o segmento, ou seja, se CPL menor ou igual ao DPL do
segmento que contm o dado.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

131

6.3.4 Sumrio
O modelo protegido do 80286 fornece as funes necessrias para implementao de um sistema
operacional baseado em memria virtual e multiprogramao. Devido limitao dos 64 Kb na
arquitetura de endereamento, a programao do 80286 no trivial e o cdigo fonte de difcil
transporte. Programas grandes no 80286 devem alterar os registradores de segmento frequentemente,
tornando lenta sua execuo.

6.4 Intel 80386


O microprocessador 80386 utilizado em alguns IBM PS/2 e sistemas compatveis com o AT.
Da mesma forma que o 80286, o 80386 possui um modo real e um modo protegido; ele possui ainda
um outro modo denominado modo 8086 virtual.
No modo real o 80386 compatvel com todos os sistemas e aplicaes que executam no 8088.
No modo protegido o 80386 compatvel com software no modo protegido escrito para o 80286.
O modo virtual 8086 foi projetado para permitir que programas para o 8086/8088 executem em um
ambiente protegido.
O conjunto de registradores do 80386 e a arquitetura de endereamento do modo protegido permite suportar uma aritmtica de 32 bits, segmentos de at 4 Gb de tamanho e configurao de memria
fsica de at 4 Gb. O 80386 fornece uma arquitetura paginada sobre a qual o modelo segmentado
permite um uso mais eficiente da memria fsica no caso dos sistemas com grande quantidade de
memria.
Existem duas verses do processador 80386: 80386DX e 80386SX. Do ponto de vista do software estas duas verses so equivalentes. A diferena entre os chips 80386 situa-se nas conexes
externas: o 80386DX possui 32 bits para dados e endereos, enquanto o 80386SX possui 16 bits externos para dados e 24 bits externos para endereos. Desta forma, o 80386SX pode ser utilizado para
fornecer a funcionalidade e desempenho do 80386DX em uma arquitetura de 16 bits, tal como aquela
encontrada nos computadores baseados no 80286, enquanto o 80386DX requer uma arquitetura de
barramento de 32 bits. Embora os 32 bits da arquitetura de memria do 80386 suportem at 4 Gb
de endereamento de memria fsica, os sistemas 80386SX so limitados a 16 Mb de memria fsica
devido arquitetura de barramento externa reduzida.
Conjunto de Registradores
O conjunto de registradores de propsito geral do 80286 foi estendido para 32 bits para suportar
aritmtica e endereamento de 32 bits. Esta extenso permite ao software um melhor desempenho do
que aquele encontrado nas arquiteturas de 16 bits. A figura 6.6 ilustra o conjunto de registradores do
80386.
Contrrio ao 80286, qualquer um dos registradores pode ser utilizado como offset no clculo do
endereo da memria. Embora cada registrador possua 32 bits, a parte dos 16 bits utilizada pelos
programas 8088/8086 e 80286 podem ser acessadas em modo real, modo protegido e modo 8086
virtual. Os registradores de segmento so os mesmos que no 80286 exceto pela adio de 2 novos
registradores de segmento FS e GS. O registrador FLAGs foi estendido de modo a incluir um bit para
indicao de operao no modo 8086 virtual.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

registradores gerais

registradores especiais

registradores
de segmento

32 bits

32 bits

32 bits

EAX

AX

EIP

IP

CS

EBX

BX

EFLAGS

FLAGS

SS

ECX

CX

DS

EDX

DX

ES

ESI

SI

FS

EDI

DI

GS

EBP

BP

ESP

SP

132

Figura 6.6: Conjunto de registradores do 80386


Anteriormente, a depurao atravs de pontos de parada (breakpoints) tinha de se implementada por software; no caso do 80386, existem registradores que possibilitam a implementao por
hardware de pontos de parada para fins de depurao. O processador inclui registradores de sistema
com o objetivo de facilitar o gerenciamento da memria, equivalentes aqueles encontrados no 80286:
GDTR, LDTR, IDTR e TR.
O 80386 possui um novo conjunto de registradores, denominados registradores de controle. Estes
registradores so: CR0 (equivalente ao MSW do 80286) que contm os flags de controle do sistema;
este registrador possui um novo flag para indicar se a paginao encontra-se habilitada no sistema.
CR3 usado para localizar a estrutura correspondente ao diretrio de pginas, sendo denominado de
registro de base de diretrio de pginas (PDBR). O CR2 utilizado quando a paginao encontra-se
habilitada para indicar o endereo linear de uma falha de pgina.
O 80386 contm, tambm, um conjunto de registradores de teste usados no teste do buffer TLB
(translation lookaside buffer) que utilizado como uma cache para o armazenamento de informaes
relativamente paginao da memria.
Arquitetura de Memria
O 80386 suporta uma traduo paginada e segmentada do endereo virtual. Quando o modo
protegido encontra-se habilitado, a traduo de endereo de 32 bits segmentado ocorre por default.
Endereos resultantes da traduo do endereo segmentado so endereos fsicos como no 80286, a
menos que a paginao esteja habilitada. Neste caso, os endereos gerados pela traduo segmentada denominam-se endereos lineares. Os endereos lineares so ento traduzidos pela unidade de
paginao para criar endereos fsicos. Nenhuma destas tradues visvel para o programador da

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

133

aplicao, mas oferece ao programador de sistema uma grande flexibilidade no projeto de diferentes
modelos de memria.
Segmentao
A traduo de endereo segmentado ocorre no modo protegido do 80386, esteja ou no a paginao habilitada. A arquitetura de memria segmentada do 80386 utiliza as mesmas construes
que so empregadas no endereamento e proteo da memria virtual do 80286. O 80386 usa os
mesmos descritores, tabelas de descritores, registradores de sistema e mecanismos de proteo, da
mesma forma que o 80286 os utiliza. A caracterstica de 32 bits na segmentao do 80386 resulta
d a redefinio dos campos reservados nos descritores do 80286 para suportar endereamento de 32
bits. Como o 80286 requeria que estes campos fossem 0, todo cdigo de sistema e aplicao que
zerem os campos reservados no descritor, executa no 80386 sem modificao. Neste caso, como o
endereamento de 32 bits ocorre, os 8 bits de mais alta ordem dos endereos fsicos gerados pelo
80386 so sempre 0. Portanto, quando o cdigo do 80386 encontra-se executando, endereos fsicos
maiores que 16 Mb no so gerados pelo 80386 e o sistema, no caso, comporta-se como um 80286
rpido executando em modo protegido.
Como no 80286, um descritor de segmento formado por 8 bytes e contm o endereo de base
do segmento, o tamanho do segmento ou limite, informaes de acesso que descrevem qual o tipo de
segmento e como este pode ser utilizado. A figura 6.7 ilustra o contedo do descritor de segmento
para o 80386.

endereo de base (B24-31)


direitos de acesso

G D/B

DPS limite (B16-23)

endereo de base (B16-23)

endereo de base (B0-15)


limite (B0-15)

legenda:
G: bit de granularidade
D/B: default/big bit
DPS: disponvel para o sistema

Figura 6.7: Descritor de segmento no 80386


Os dois primeiros bytes do descritor, que no 80286 eram reservados, so utilizados para estender
a definio bsica do descritor no 80386. Existe um endereo de base do segmento de 32 bits, um

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

134

campo de limite de segmento de 24 bits e vrios novos bits de acesso. Um endereo de base de
segmento pode estar em qualquer ponto na faixa do 4 Gb.
O limite de 24 bits especifica o tamanho do segmento dependendo do bit de granularidade. Caso
este bit esteja desativado, o limite definido em unidades de 1 byte at o mximo de 1 Mb. Caso o
bit de granularidade esteja ativado o limite definido em unidades de 4 Kb at o mximo de 4 Gb.
No caso de um sistema 80286 executando no 80386, ele sempre ter este bit desativado de modo que
o limite seja interpretado como 16 bits e tendo a granularidade de 1 byte.
Paginao
Conforme visto no captulo 4, paginao uma tcnica de gerenciamento da memria virtual
utilizando blocos de tamanho fixo (pginas) em oposio aos segmentos de tamanho variado no caso
dos sistemas segmentados. O 80386 utiliza a arquitetura de pginas para fornecer um mecanismo
de alocao de memria fsica em um sistema contendo grandes segmentos. Como o 80386 permite
segmentos que podem ser muito maiores do que 64 Kb, o gerenciamento da memria sem utilizao
de uma tcnica do tipo paginao seria muito difcil, na medida em que o segmento deve residir em
posies contguas da memria. Ainda, a permuta (swapping) de segmentos de tamanho variado para
a memria secundria poderia resultar em um baixo desempenho do sistema. Desta forma, o esquema
de paginao no 80386 permite que os segmentos residam em espaos no contnuos da memria e
permite que a memria virtual seja gerenciada em termos de blocos pequenos e de tamanho fixo. Em
sees anteriores, referiu-se ao endereo de 32 bits resultante da traduo do endereo segmentado,
como endereo fsico. No 80386, entretanto, este endereo chamado de endereo linear. Caso o
80386 no tenha o esquema de paginao habilitado, o endereo linear o mesmo que o endereo
fsico. Entretanto, se o mecanismo estiver habilitado pelo bit de paginao no registrador CR0, ento
o endero linear no mais igual ao endereo fsico. Neste caso, o endereo linear de 32 bits
traduzido pela unidade de paginao do 80386 em um endereo fsico final de 32 bits.
Quando a paginao encontra-se habilitada, o 80386 divide a memria em unidades de 4 Kb
de endereos contguos (pginas). O endereo linear neste caso traduz uma tupla ordenada que
especifica a tabela de pginas e o offset dentro da pgina. A figura 6.8 ilustra o formato do endereo
linear.
A unidade de paginao do 80386 realiza a traduo dinmica do endereo atravs de 2 mapeamentos diretos. A estrutura usada pela unidade de paginao para mapear endereos a tabela de
pginas (ver captulo 4). Esta tabela constitui-se reside numa pgina de 1K entradas de 32 bits denominadas especificao de pgina. Dois nveis de tabelas de pginas so utilizadas para enderear
uma pgina da memria. O primeiro nvel o diretrio de pginas, o qual localizado pelo registrador CR3. Este diretrio enderea at 1 K tabelas de pginas do segundo nvel. Uma tabela de pginas
do segundo nvel enderea at 1 K pginas. Portanto, cada tabela de pgina do segundo nvel pode
mapear 4 Mb (1 Kb * 4 Kb) de memria fsica e um diretrio de pginas pode mapear 1 K * 4 Mb
= 4 Gb de memria fsica. A figura 6.9 ilustra como o 80386 converte um endereo linear em um
endereo fsico.
As entradas das tabelas de pginas possuem o mesmo formato sejam elas do primeiro ou do
segundo nvel. Como cada pgina limitada a 4 Kb, a entrada da tabela de pgina (PTE) utiliza
somente os 20 bits de mais alta ordem para designar uma pgina. Os outros 12 bits so utilizados
para definir os atributos da pgina. A figura 6.10 ilustra o formato de uma entrada na tabela de

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais


numero da pgina virtual
31

22 21
diretrio

especifica tabela de
pgina no diretrio
de pginas

135

deslocamento
12 11

pgina

0
offset

especifica pgina na
tabela de pginas

Figura 6.8: Endereo linear no 80386


pgina.
O bit present indica se a PTE pode ser usada na traduo do endereo. Caso o bit presente no
esteja ativado nas tabelas de pginas quando da ocorrncia de uma traduo de endereo, o 80386
envia uma falha de pgina. O tratador neste caso pode trazer a pgina do disco para a memria
fsica e reiniciar a instruo. Isto pode ocorrer duas vezes para um dado acesso memria caso a
tabela de pginas no se encontre presente em memria. O bit accessed e o bit dirty so usados em
funo do uso de uma pgina. O 80386 ativa o bit accessed sempre que uma referncia memria
tenta ler ou escrever em um endereo mapeado por um PTE. O bit dirty ativado somente quando se
trata de escrita em um endereo mapeado por um PTE. O 80386 no desativa estes bits. O sistema
operacional utiliza estes bits para determinar quais pginas devero ser transferidas para o disco
quando uma demanda de memria fsica excede a memria disponvel.
Proteo de Pginas
O bit read/write e o bit user/supervisor so utilizados na proteo da pgina. O bit user/supervisor especifica quais nveis de privilgio podem acessar a pgina. Caso o bit user/supervisor
esteja desativado, a pgina trata-se de uma pgina de nvel supervisor; caso esteja ativado trata-se de
uma pgina de usurio. O nvel corrente de privilgio (CPL) utilizado para determinar se o 80386
encontra-se executando no nvel de privilgio do supervisor ou no nvel de privilgio do usurio. Se
o CPL 0, 1 ou 2, o 80386 encontra-se executando no nvel de privilgio do supervisor. Caso o CPL
seja 3, a CPU encontra-se executando no nvel de privilgio do usurio. Quando o 80386 encontra-se
executando no nvel de privilgio do supervisor, todas as pginas so endereveis; quando encontrase executando no nvel de privilgio do usurio, somente as pginas de usurio so endereveis.
O bit read/write determina o tipo de acesso de uma dada pgina. Caso o bit esteja desativado, a
pgina somente pode ser lida; caso o bit esteja ativado a pgina pode ser lida e escrita.
Como as tabelas de pginas encontram-se na memria fsica, uma referncia a uma posio de
memria requer vrios ciclos de memria para obter as informaes de endereo das estruturas de
dados de paginao para realizar a traduo de endereo. Para aumentar o desempenho desta operao crtica o 80386 usa uma cache denominada TLB (translation lookaside buffer) para armazenar

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

136

4 GB
seletor offset

diretrio pgina offset


....

diretrio de pginas

tabela de pginas

pgina

descritor
....

tab. de pgina

pgina

....

tabela de descritores

0
CR3

memria fsica

registro de base
c/ diretrio de pginas
Figura 6.9: Converso de endereo segmentado em linear e linear em fsico no 80386
em hardware as pginas mais recentemente utilizadas.

6.4.1 Sumrio
O microprocessador Intel 80386 possui um sofisticado esquema de gerenciamento e proteo
de memria quando comparado com seus antecessores. Esta sofisticao permite a construo de
sistemas operacionais modernos (Windows NT, OS/2 de 32 bits, etc) ou a migrao de sistemas que
outrora necessitavam de plataformas de hardware dispendiosas, como o caso do UNIX.

DCA-FEEC-UNICAMP

Introduo aos Sistemas Operacionais

31

12 11

endereo da pgina virtual

DS

0
00

00 U/S R/W P

legenda:
P: bit "presente"
R/W: bit escrita/gravao
U/S bit "user/supervisor"
A: bit de acesso
D: bit "dirty"
DS: disponvel para o sistema
obs:
endero da pgina virtual = nmero da pgina virtual

Figura 6.10: Entrada da tabela de pginas no 80386

137

Você também pode gostar