Вы находитесь на странице: 1из 108

Universidade Estadual de Campinas - UNICAMP

Faculdade de Eng. Eltrica e de Computao

Introduo aos Sistemas Operacionais


Eleri Cardozo
FEEC - UNICAMP

Maurcio F. Magalhes
FEEC - UNICAMP

Lus F. Faina
Faculdade de Computao
Universidade Federal de Uberlndia

Janeiro de 2002
Campinas, SP - Brasil

Sumrio
Lista de Figuras

iv

Lista de Tabelas

vi

Introduo

1.1
1.2
1.3
1.4
1.5

O que um Sistema Operacional ? . . . . .


Histria dos Sistemas Operacionais . . . . .
Conceitos Bsicos em Sistemas Operacionais
O Sistema Operacional UNIX . . . . . . . .
Arquitetura do Sistema Operacional UNIX .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

. 1
. 2
. 4
. 6
. 13

Introduo . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Modelo de Processos . . . . . . . . . . . . . . .
2.1.2 Concorrncia e Regies Crticas . . . . . . . . .
2.1.3 Mtua Excluso Com Espera Ocupada . . . . .
2.1.4 Mtua Excluso com Espera Bloqueada . . . .
2.1.5 Comunicao Inter-processos . . . . . . . . . . .
Escalonamento de Processos . . . . . . . . . . . . . . .
Gerenciamento de Processos no UNIX . . . . . . . . .
Escalonamento de Processos no Unix . . . . . . . . . .
Controle de Processos no UNIX . . . . . . . . . . . . .
Comunicao e Sincronizao Inter-processos no UNIX

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

Processos

2.1

2.2
2.3
2.4
2.5
2.6
3

Sistema de Arquivos

Gerenciamento de Memria

3.1
3.2
3.3
3.4
3.5

4.1

Interface do Sistema de Arquivos . . . . . . . . . .


Projeto do Sistema de Arquivos . . . . . . . . . . .
Conabilidade do Sistema de Arquivos . . . . . . .
Desempenho do Sistema de Arquivos . . . . . . . .
O Sistema de Arquivos do UNIX (System V) . . . .
3.5.1 O Cache de Buers . . . . . . . . . . . . . .
3.5.2 Representao Interna dos Arquivos . . . . .
3.5.3 Atribuio de inodes e Blocos . . . . . . . .
3.5.4 Chamadas de Sistema Referentes ao Sistema

.
.
.
.
.

. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
de Arquivos

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

20

20
20
21
22
23
24
25
26
29
31
35

42

42
43
51
53
55
55
58
61
62

64

Gerenciamento Sem Permuta ou Paginao . . . . . . . . . . . . . . . . . . . . . 64


4.1.1 Monoprogramao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
ii

SUMRIO

4.2

4.3
4.4

4.5

4.1.2 Multiprogramao e Uso da Memria . . . . . . . . .


4.1.3 Multiprogramao com Parties Fixas . . . . . . . .
Permuta (Swapping) . . . . . . . . . . . . . . . . . . . . . .
4.2.1 Multiprogramao com Parties Variveis . . . . . .
4.2.2 Gerenciamento de Memria com Mapa de Bits . . . .
4.2.3 Gerenciamento de Memria com Listas Encadeadas .
4.2.4 Alocao de Espao Para Permuta . . . . . . . . . .
Memria Virtual . . . . . . . . . . . . . . . . . . . . . . . .
4.3.1 Paginao . . . . . . . . . . . . . . . . . . . . . . . .
4.3.2 Segmentao . . . . . . . . . . . . . . . . . . . . . .
Algoritmos de Troca de Pgina . . . . . . . . . . . . . . . .
4.4.1 Troca tima de Pgina . . . . . . . . . . . . . . . . .
4.4.2 Troca da Pgina No Recentemente Usada (NRU) . .
4.4.3 Troca da Pgina FIFO . . . . . . . . . . . . . . . . .
4.4.4 Troca da Pgina Menos Recentemente Usada (LRU)
Gerenciamento de Memria no UNIX . . . . . . . . . . . . .
4.5.1 Paginao por Demanda . . . . . . . . . . . . . . . .
4.5.2 O Processo Paginador . . . . . . . . . . . . . . . . .
4.5.3 Falta de Paginao . . . . . . . . . . . . . . . . . . .
4.5.4 Falta de Proteo . . . . . . . . . . . . . . . . . . . .

Entrada/Sada

5.1
5.2
5.3
5.4

iii

Princpios do Hardware . .
Princpios do Software . .
Discos Rotativos . . . . .
5.3.1 Hardware do Disco
5.3.2 Software do Disco .
Entrada/Sada no UNIX .

Referncias Bibliogrcas

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

65
66
68
68
70
71
72
73
73
76
77
77
78
79
79
80
81
84
85
86
87

87
90
94
95
95
98

102

Lista de Figuras
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9

Arquitetura do sistema operacional UNIX . . . . . . . .


Organizao hierrquica do sistema de arquivos . . . . .
Nveis de interrupo denidas pelo UNIX . . . . . . . .
Arquitetura do ncleo do sistema operacional UNIX . . .
Estruturas de dado do sistema de arquivos . . . . . . . .
Estrutura do sistema de arquivos . . . . . . . . . . . . .
Estado das pilhas para o programa copy . . . . . . . . .
Estruturas de dados associadas ao controle dos processos.
Estados de um processo . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

6
7
12
13
14
15
17
18
19

2.1
2.2
2.3
2.4

Diagrama completo de transio de estados para processos . .


Classes de prioridades para ns de escalonamento de processos
A execuo de uma chamada de sistema fork. . . . . . . . . .
Esquema de memria compartilhada . . . . . . . . . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

27
30
31
38

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 (a) blocos livres armazenados em lista ligada; (b) um mapa de bits. . . . . . .
3.3 Esquema de lista encadeada usado pelo MS-DOS. Os registros 0 e 1 so usadas
para especicao do tipo do disco. Os cdigos EOF e FREE so usados para
End Of File e registros livres, respectivamente. . . . . . . . . . . . . . . . . . .
3.4 Estrutura do inode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5 Registros de diretrios: (a) CPM; (b) MS-DOS; (c) UNIX . . . . . . . . . . .
3.6 Os passos para achar /usr/mfm/mailbox . . . . . . . . . . . . . . . . . . . . .
3.7 Um sistema de arquivos contendo um arquivo compartilhado . . . . . . . . . .
3.8 (a) situao anterior conexo; (b) aps a conexo ter sido feita; (c) aps o
proprietrio remover o arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.9 Cabealho do buer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.10 Estrutura do cache de buers : la de hash e lista de buers livres . . . . . . .
4.1
4.2
4.3
4.4
4.5

Trs formas de organizar a memria para o sistema operacional e um processo


do usurio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Utilizao da CPU como uma funo do nmero de processos na memria . . .
(a) Parties de memria xa com las de entrada separadas para cada partio;
(b) partio de memria xa com uma la simples de entrada . . . . . . . . .
Mudanas na alocao de memria com processos chegando e deixando a memria (regies sombreadas representam espao livre) . . . . . . . . . . . . . . . .
(a) Espao para crescimento do segmento de dados. (b) espao para crescimento
da pilha e do segmento de dados. . . . . . . . . . . . . . . . . . . . . . . . . .
iv

. 44
. 45
.
.
.
.
.

46
47
48
49
50

. 51
. 56
. 57
. 65
. 66
. 67
. 69
. 70

LISTA DE FIGURAS

4.6

4.12
4.13
4.14
4.15

(a) Parte da memria com 5 processos e 3 espaos livres (as marcas mostram
as unidades de alocao da memria e as regies sombreadas esto livres); (b)
Mapa de bits correspondente. (c) A mesma informao como uma lista ligada
Quatro combinaes de memria quando um processo terminar . . . . . . . . .
A posio e funo da MMU . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Relao entre endereo virtual e endereo fsico de memria, dada pela tabela de
pginas
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operao interna da MMU com 16 pginas de 4K . . . . . . . . . . . . . . . .
(a) MMU usada em muitos computadores baseados no 68000; (b) endereamento
virtual para um sistema de 4M . . . . . . . . . . . . . . . . . . . . . . . . . .
As vrias estruturas de dados empregadas para gerenciamento de memria . .
Situao aps um fork em um sistema paginado . . . . . . . . . . . . . . . . .
Lista de blocos adicionada ao inode durante a carga de um executvel . . . . .
Fila de pginas candidatas a permuta . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.

76
82
83
84
85

5.1
5.2
5.3
5.4
5.5
5.6
5.7

Um modelo para conexo da CPU, memria, controladores e dispositivos de E/S


A transferncia via DMA processada sem interveno da CPU . . . . . . . . .
Nveis do sistema de E/S e funes principais de cada nvel . . . . . . . . . . . .
Algoritmo de escalonamento menor seek primeiro (SSF) . . . . . . . . . . . . .
Escalonamento de requisies no disco atravs do algoritmo do elevador . . . . .
Esquema bsico de E/S no UNIX . . . . . . . . . . . . . . . . . . . . . . . . . .
Driver de terminal composto de um stream com trs pares de listas . . . . . . .

88
90
94
95
96
99
100

4.7
4.8
4.9
4.10
4.11

. 70
. 71
. 74
. 74
. 75

Lista de Tabelas
2.1

Exemplos de sinais no UNIX System V . . . . . . . . . . . . . . . . . . . . . . . 33

5.1

Exemplos de controladores no IBM PC com seus endereos e vetores de interrupo. 89

vi

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 [1].
Programas computacionais podem ser classicados em dois grandes grupos:
software de sistema, que manipulam a operao do computador;
programas aplicativos, que resolvem problemas para o usurio.
O mais importante dos softwares de 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 denir 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.
O Sistema Operacional como uma Mquina Virtual

A arquitetura1 da maioria dos computadores no nvel da linguagem de mquina primitiva


e difcil de programar, especicamente 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 identicados 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.
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 Conjunto

de instrues, organizao de memria, entrada/sada (E/S), estrutura de barramento, etc.


1

1.2 Histria dos Sistemas Operacionais

O Sistema Operacional como um Gerenciador de Recursos

Um computador moderno composto de vrios subsistemas tais como processadores, memorias, discos, terminais, tas 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 convel 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.
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, construa, programava, operava
e mantinha 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.
A Segunda Gerao (1955-1965): Transistores e Processamento em Batch

A introduo do transistor mudou radicalmente o quadro. Computadores tornaram-se conveis 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 infra-estrutura para empregar os
computadores desta gerao.
Estas mquinas eram acondicionadas em salas especiais com pessoal especializado para
sua operao. Para executar 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.
A maioria dos computadores de 2a gerao foram utilizados para clculos cientcos e de
engenharia. Estes sistemas eram largamente programados em FORTRAN e ASSEMBLY. Sistemas operacionais tpicos2 eram o FMS (Fortran Monitor Systems) e o IBSYS (IBM's Operating
Systems).
2 Que

eram capazes de gerenciar apenas um job por vez

1.2 Histria dos Sistemas Operacionais

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

No incio dos anos 60, a maioria dos fabricantes de computadores mantinham duas linhas
distintas e incompatveis de produtos. De um lado, havia os computadores cientcos que eram
usados para clculos numricos nas cincias e na engenharia. Do outro, haviam os computadores
comerciais que executavam tarefas como ordenao de dados e impresso de relatrios, sendo
utilizados principalmente por instituies nanceiras.
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 cientcas quanto comerciais.
No foi possvel para a IBM escrever um sistema operacional que atendesse a todos os
conitos 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 inuenciou os pesquisadores da
Bell que viriam a desenvolver o UNIX uma dcada depois.
A Quarta Gerao (1980-): Computadores Pessoais e Estaes de Trabalho

Com o desenvolvimento de circuitos integrados em larga escala (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.
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 tem dominado o mercado: MS-DOS (seguido do MS-Windows) para
os computadores pessoais e UNIX (com suas vrias vertentes) para as estaes de trabalho.

1.3 Conceitos Bsicos em Sistemas Operacionais

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 em um processador, mesmo que
sicamente 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, em um 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


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, sendo
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, que no CPU, indisponveis 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:
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.
Estas propriedades enfatizam a natureza sequencial e determinstica de um processo. O
processo sequencial denido pelo resultado de suas instrues, no pela velocidade com que
as instrues so executadas.
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).

1.3 Conceitos Bsicos em Sistemas Operacionais

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 (por exemplo, Windows'98) avanados e em sistemas de temporeal.
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 utilizado 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 ecincia 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 classicado como integral ou
serial. A multiprogramao denominada 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 nica
CPU, a multiprogramao serial encontrada com mais frequncia.
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 sejam executadas ao mesmo tempo. Um computador
com mltiplos processadores que compartilhem uma memria principal comum chamado um
multiprocessador. O sistema que suporta tal congurao um sistema que suporta o multiprocessamento.
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 par-

1.4 O Sistema Operacional UNIX

metros ao sistema operacional. Servios como login/logout, manipulao de arquivos, execuo


de programas, etc, so solicitados atravs do interpretador de comandos.
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 UNIX (Fig. 1.1) dividido em duas partes:
programas e servios: shell, mail, vi, date, etc;
ncleo

(kernel) :

prov suporte aos programas e servios.

prog. aplicativos

man

sh
a.out

nroff
Ncleo

cpp

find

comp

make

cc

Hardware
as

who
id

date
vi

wc
ed

grep

prog. aplicativos

Fig. 1.1: Arquitetura do sistema operacional UNIX


Desenvolvido nos Laboratrios da Bell em meados da dcada de setenta, o sistema UNIX
inicialmente atendia as necessidades especcas 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 sua portabilidade;
interface simples para com o usurio

(shell) ;

1.4 O Sistema Operacional UNIX

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;


multiusurio/multiprogramado;
esconde a arquitetura do hardware, permitindo que um programa execute em mltiplas
plataformas.
Programas interagem com o ncleo do sistema operacional atravs da evocao de um
conjunto bem denido de chamadas de sistema. 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 Fig. 1.1.
O Sistema de Arquivos

O sistema de arquivos do UNIX caracterizado por [2, 3]:


estrutura hierrquica;
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 Fig. 1.2.
/

usr

bin

sh ed

5bin

5include

tmp

5lib

etc

hosts

pub

passwd exportfs emacs tex

dev

X11

tty00

vi

Fig. 1.2: Organizao hierrquica do sistema de arquivos


Ainda com relao a esta Fig. 1.2 temos:

tty01

1.4 O Sistema Operacional UNIX

/: diretrio 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 contedo. Este
tratamento estende-se tambm aos diretrios, ou seja, estes so vistos pelo sistema operacional
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.
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(int old, int new)
{
int count;
while( (count = read(old, buffer, sizeof(buffer))) > 0 )
write(new, buffer, count);
}
main(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);
}

*/

1.4 O Sistema Operacional UNIX

/* cria arquivo novo */


fdnew = creat(argv[2], 0666);
if(fdnew == -1) {
/* erro no creat */
printf("Impossivel criar %s\n", argv[2]);
exit(1);
}

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

/*

*/

O 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(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));

/*

*/

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 situados no nvel do usurio. O exemplo de programa mais destacado neste caso o programa shell que o responsvel pela interpretao dos
comandos do usurio.
Na maior parte das vezes o shell executa o comando fork e o processo lho 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:

1.4 O Sistema Operacional UNIX

10

arquivo executvel produzido por compilao;


arquivo executvel contendo uma sequncia de linhas de comando do
comando interno do

shell ;

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 modic-lo para um ambiente particular. De fato, o UNIX disponibiliza vrios shells
para o usurio, cada qual com determinados recursos (por exemplo, capacidade de edio das
linhas de comando e capacidade de completar nomes de arquivos).
Modularidade no Ambiente UNIX

O ambiente tem como losoa permitir aos usurios o desenvolvimento de programas pequenos e modulares que possam ser usados como blocos primitivos na construo de programas
mais complexos. Existem duas formas de compor programas no UNIX:
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. Exemplo:


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.

pipe: permite que um uxo 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. Exemplo:



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).

1.4 O Sistema Operacional UNIX

11

Servios do Sistema Operacional

Dentre os servios suportados pelo ncleo do UNIX 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 secundria3 ;
alocao de memria secundria para armazenamento/recuperao eciente dos dados do
usurio (este servio constitui o sistema de arquivos);
acesso controlado aos dispositivos perifricos tais como terminais, tas, discos, redes, etc.
O ncleo fornece estes servios de forma transparente. Exemplo:
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 ns de armazenamento interno, entretanto,
este formato escondido do usurio, sendo retornado para este um stream no formatado
de bytes.
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 dene 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).

1.4 O Sistema Operacional UNIX

12

As excees podem ser caracterizadas como algo que ocorre no curso 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 estruturas de dados internas, isto porque o tratamento da interrupo pode
interferir na atualizao das estruturas provocando inconsistncias.
Normalmente, os computadores possuem instrues privilegiadas que permitem denir 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 Fig. 1.3, caso o ncleo mascare a interrupo do disco, todas as interrupes, exceto a
do relgio e dos erros da mquina, so enleiradas para tratamento a posteriori.
Erros de Hardware

Prioridade
Alta

Relgio
Disco

Nveis de Interrupo
definidos pelo UNIX

Dispositivos de Rede
Terminais
Interrupo de Software

Prioridade
Baixa

Fig. 1.3: Nveis de interrupo denidas 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.

1.5 Arquitetura do Sistema Operacional UNIX

13

1.5 Arquitetura do Sistema Operacional UNIX


Uma viso mais detalhada da arquitetura do ncleo do UNIX mostrada na Fig. 1.4.
Programas
do Usurio
Bibliotecas
usurio

traps

ncleo
Interface de Chamadas de Sistema

Subsistema de Arquivos

Arquitetura do Sistema
Operacional UNIX

Subsistema de Controle
de Processos

comunicao
interprocessos
buffer cache
escalonador
caractere

bloco

gerenciamento
de memria

drivers de dispositivo

Controle do Hardware
ncleo
hardware
Hardware

Fig. 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 sosticado das chamadas ao sistema (exemplo: biblioteca
de E/S).
A Fig. 1.4 divide as chamadas ao sistema em chamadas ao sub-sistema de arquivos e ao
sub-sistema de controle dos processos. O sub-sistema de arquivos acessa os dados nos arquivos atravs de um mecanismo de buferizao que, atravs da interao com os drivers de
dispositivos de E/S orientados a bloco, regula o uxo 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 buferizao.
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

1.5 Arquitetura do Sistema Operacional UNIX

14

fsica suciente para todos os processos, o ncleo move-os entre a memria fsica e a memria
secundria de modo a que todos os processos tenham 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.
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 denominase 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 oset, no arquivo correspondente, do prximo byte a ser lido/escrito, assim


como, os direitos de acesso do processo;

TDAU

identica todos os arquivos abertos para o processo.

A Fig. 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.
Tabela Descritora de
Arquivo do Usurio

Tabela de Arquivo

Tabela de Inodes

Fig. 1.5: Estruturas de dado do sistema de arquivos

1.5 Arquitetura do Sistema Operacional UNIX

15

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 identicado 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
congurao. 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 Fig. 1.6):
bloco de
boot

super
bloco

lista de inodes

blocos de dados

Fig. 1.6: Estrutura do sistema de arquivos


bloco de boot : contm o cdigo do
sistema operacional;

bootstrap

que lido na mquina quando da partida do

super-bloco: descreve o estado de um sistema de arquivo;


lista de inodes : tem o seu tamanho denido quando da congurao do sistema de arquivos. Um dos inodes corresponde raiz do sistema de arquivo. atravs deste inode que
a estrutura de diretrios do sistema acessada;
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 identicado como processo pai e o que acabou de ser criado identicado
como processo lho. Todo processo tem um nico pai mas pode ter vrios lhos. O ncleo
identica cada processo atravs de um nmero denominado process identier (PID). No caso do
processo lho, ele recebe como retorno aps a execuo do fork o valor 0, enquanto o processo

1.5 Arquitetura do Sistema Operacional UNIX

16

pai recebe um valor diferente de 0 que corresponde ao PID do lho. Atravs do teste do valor
retornado pelo fork, um processo pode distinguir se ele o processo pai ou o processo lho 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 Fig. 1.7 mostra a pilha do usurio para o
programa copy quando da chamada de sistema write.
Cada chamada de sistema possui uma entrada na biblioteca de chamadas de sistema, a
qual codicada 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 endereamento 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. Quando um processo evoca fork o ncleo duplica o espao de endereamento
do processo antigo permitindo, quando possvel, que processos compartilhem regies ou, caso

1.5 Arquitetura do Sistema Operacional UNIX

17

Pilha do Usurio
variveis locais
end. do quadro 2
end. de retorno aps
chamada do write
parmetros do write
(new, buffer, count)
variveis locais
(count)
end. do quadro 1
end. de retorno aps
chamada do copy
parmetros do copy
(old, new)
variveis locais
(fdold, fdnew)
end. do quadro 0
end. de retorno aps
chamada do main
parmetros do main
(argc, argv)

direo de
crescimento
da pilha

quadro 3
call write

Pilha do Ncleo
quadro 2
call copy

quadro 1
call main

processamento da
chamada write

Fig. 1.7: Estado das pilhas para o programa

copy

contrrio, fazendo uma cpia da regio. Quando um processo evoca exit o ncleo libera as
regies que o processo estava usando. A Fig. 1.8 ilustra as 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;
identicadores 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.

1.5 Arquitetura do Sistema Operacional UNIX


rea U

Tabela de
Regies

Informaes de Controle
e Status sobre o Processo

pregion

18

Tabela de Processos

Memria Primria

Fig. 1.8: Estruturas de dados associadas ao controle dos processos.


Contexto de um Processo

O contexto de um processo o estado denido pelo seu texto correspondendo aos valores
das suas variveis globais e estruturas de dados, 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 sucientes de
modo que posteriormente ele possa recuperar o contexto do processo e continuar a sua 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

O ciclo de vida de um processo pode ser representada por um conjunto de estados (Fig. 1.9):
executando no modo usurio;
executando no modo ncleo;
pronto;
bloqueado (dormindo).
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.

1.5 Arquitetura do Sistema Operacional UNIX

19

pronto em
memria

executando em
modo usurio

executando em
do
modo ncleo
an
n
o
al
esc

evento

retorno

2
interrupo

ev

en

to

bloqueado em
memria

4
Fig. 1.9: Estados de um processo
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 denimos 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 interprocessos [1].

2.1.1 Modelo de Processos


A maioria dos computadores modernos so capazes de realizar diversas atividades em paralelo. Enquanto executa 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 ecincia. 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 paralelismo1. Conforme denido anteriormente, a habilidade de
executar mltiplos programas em uma 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, dependendo 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 assegurar
que estas iro ocorrer.
1 Paralelismo

real obtido apenas com a utilizao de mltiplas CPUs.

20

2.1 Introduo

21

2.1.2 Concorrncia e Regies Crticas


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 sejam efetuadas. Caso contrrio,
a tabela fatalmente assumiria um estado inconsistente onde apenas algumas alteraes foram
processadas.
Em situaes como a exemplicada acima, a tabela denida 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 m de evitar que os recursos compartilhados
atinjam estados inconsistentes.
A chave para prevenir problemas em reas compartilhadas 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 estejam executando ao mesmo tempo
uma regio crtica delimitando um mesmo recurso compartilhado, inconsistncias so evitadas2 .
Embora este quesito evite inconsistncias, o mesmo no garante ecincia 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 classicados segundo o modo com que esperam pela autorizao de entrada em
uma 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 nal 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.
Para permitir que regies crticas que acessam recursos compartilhados distintos possam
ser executadas ao mesmo tempo, cada recurso compartilhado possui um identicador (via de
regra um nmero inteiro). Assim sendo, as duas funes que compem o algoritmo de garantia
de mtua excluso possuem este identicador como parmetro.
2 Note

que regies crticas delimitando diferentes recursos podem ser executadas por diferentes processos ao
mesmo tempo.

2.1 Introduo

22

2.1.3 Mtua Excluso Com Espera Ocupada


Nesta seo analisaremos algumas propostas para garantir excluso mtua nas regies crticas, no permitindo que mais de um processo possa manipular um recurso compartilhado ao
mesmo tempo. Em todas, o processo que est tentando 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 hardware.
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 compartilhada3 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 dene 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 04 .
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 ?
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.
3 Uma
4 Este

para cada recurso compartilhado.


algoritmo facilmente generalizado para N processos, N

> 2.

2.1 Introduo

23

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 outras palavras, a instruo TSL
indivisvel mesmo frente a interrupes de hardware).

2.1.4 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 ecientes que
os anteriores, posto que processos bloqueados no competem pela CPU.
Sleep e Wakeup

Um dos mtodos mais simples consiste 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 denidas. A
operao DOWN executada no incio da regio crtica, enquanto UP executada no nal. O
semforo consiste de um contador iniciado em 1 e uma lista de processos aguardando liberao
para executar a regio crtica protegida pelo semforo.
A operao DOWN decrementa o contador do semforo de uma unidade e verica seu valor.
Se for igual a 0, retorna (fazendo com que o processo entre na regio crtica). Se o valor for
menor que 0, o processo bloqueado e adicionado lista de processos aguardando liberao. A
operao UP incrementa o valor do semforo. Se um ou mais processos estiverem bloqueados
sobre aquele semforo, um deles escolhido da lista pelo sistema para completar a operao
DOWN. Neste caso o sistema remove-o da lista e emite-lhe um sinal de wakeup.
As operaes com semforos so atmicas e implementadas com instrues TSL.
Contadores de Evento

Um outro tipo de varivel de sincronizao entre processos. Trs operaes so denidas


para um contador de evento (E):
READ(E): retorna o valor corrente de E;
ADVANCE(E): incrementa atomicamente E;
AWAIT(E,v): bloqueia at que E

 v.

2.1 Introduo

24

Note que os contadores de eventos nunca decrescem e partem sempre de 0. Contadores de


evento so mais convenientes que semforos para problemas do tipo produtor-consumidor com
buer 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 ativo5 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 (por exemplo, Java implementa monitores atravs
da palavra-chave synchronized).

2.1.5 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 gerenciar 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 buers alocados pelos processos para ns de envio e
recepo de mensagens. Mensagens so estruturas tipadas ou no cujo contedo interpretado
unicamente pelos processos emissor e receptor da mensagem.
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:
5 Executando

qualquer um de seus procedimentos.

2.2 Escalonamento de Processos

25

store(posio, dado): grava dados em uma 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 servidor6 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


Quando mais de um processo estiver 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 :

garantir que cada processo tenha acesso CPU;

2.

ecincia :

manter a CPU ocupada praticamente 100% do tempo;

3.

tempo de resposta :

4.

tempo de espera :

5.

vazo :

minimizar o tempo de resposta na execuo dos processos, principalmente os interativos (editores, planilhas, etc);
impresso, etc);

minimizar o tempo de espera de servios no interativos (compilao,

maximizar o nmero de processos executados por unidade de tempo.

importante observar que alguns desses objetivos so contraditrios. Se um algoritmo


favorece o escalonamento de processos interativos certamente estar comprometendo os no
interativos. Vejamos alguns 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 nal do quantum,
ele suspenso e a CPU alocada a outro processo. Se o processo acabar ou for bloqueado
antes do nal 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 ecincia da CPU, pois a
alocao da CPU para outro processo implica um certo overhead. Se for muito grande, degrada
a resposta para os processos interativos.
6 Ou

colocada em uma la de espera.

2.3 Gerenciamento de Processos no UNIX

26

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 indenidamente, 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 dene 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 indicado para aplicaes no interativas, onde o tempo mdio de execuo
conhecido a priori. O algoritmo dene que as tarefas menores devem ser executadas primeiro.
Prova-se que esta poltica minimiza o tempo mdio de espera das tarefas.
Algoritmo Policy-Driven

Este algoritmo particiona a CPU de forma equnime entre os usurios (no entre os processos). O algoritmo dene 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.
Escalonamento em Dois Nveis

At agora foi considerado que todos os processos residem em memria primria. Entretanto
se esta memria for insuciente, processos ativos podem ser armazenados temporariamente em
memria secundria (tipicamente disco). O meio mais prtico para controlar a comutao de
processos denir 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 UNIX


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

2.3 Gerenciamento de Processos no UNIX

27

Transies de Estado

Na Fig. 1.9 apresentamos um diagrama de estados simplicado onde um processo possua


4 estados: executando em modo usurio, executando em modo ncleo, pronto e bloqueado
(dormindo). A rigor, um processo no UNIX apresenta 9 estados (Fig. 2.1):
1. Executando em modo usurio;
2. Executando em 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.

da
un
ab

me

executando em
modo usurio

it

ex

executando em
o
nd
modo ncleo
na
o
l
a
esc

o
al

to

bloqueado em
memria

de

d
na

CP

en

rd
a

pe

preemptado

evento

evento

c
es

ev

pronto em
memria sec.

5
swap out

2
interrupo

swap in

retorno

m.

ass

esc

pronto em
memria

m.

terminado

fork()

me

nte

swap out

bloqueado em
memria sec.

Fig. 2.1: Diagrama completo de transio de estados para processos


Vejamos o que tipicamente ocorre a partir da criao de um processo. Aps a execuo
de uma chamada 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

2.3 Gerenciamento de Processos no UNIX

28

primria). O escalonador seleciona ento o processo para executar, movendo-o para o estado
2 (executando em modo ncleo), onde a chamada fork ser 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-o para o estado 7. Este
estado similar ao estado 3, sendo a distino feita para enfatizar que o 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 execuo 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 noticado 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 movido para o estado 3, aguardando CPU.
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 noticado.
Algumas observaes sobre o diagrama de transio de estados apresentado na Fig. 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 overows, ou de segmentao como referncia a posies invlidas
de memria, podem forar compulsoriamente o trmino do processo.
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 identicador do usurio (UID), isto , o dono do processo;

2.4 Escalonamento de Processos no Unix

29

o identicador 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:
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 denidos 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 entrada/sada, 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 atribudos durante a criao de arquivos).

2.4 Escalonamento de Processos no Unix


O escalonamento de processos no UNIX segue um algoritmo que combina 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 denominadas de tempo real estritas (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.

2.4 Escalonamento de Processos no Unix


prioridade em
modo ncleo

Nveis de Prioridade

30
Processos

swapper
E/S em disco
aguardando buffer
no passvel
de interrupo

aguardando inode
entrada em terminal

Escalonamento
Round Robin

sada em terminal
limiar de prioridade
em modo ncleo

trmino de processo filho

Escalonamento
por Prioridades

nvel de usurio 0
nvel de usurio 1

prioridade em
modo usurio

...

passvel de
interrupo

nvel de usurio N

Fig. 2.2: Classes de prioridades para ns de escalonamento de processos


A Fig. 2.2 mostra as classes de prioridades adotadas. Prioridades em modo ncleo so subdivididas em dois grupos. O primeiro grupo, de elevada prioridade, constitudo de processos
bloqueados a espera de swapping, E/S em disco, buers 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 buers).
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 lho.
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 em uma mesma classe de prioridade so dispostos em uma la, como representado
na Fig. 2.2 pelos crculos interligados.
O algoritmo de escalonamento do UNIX processado segundo o seguinte esquema. Quando
ocorre uma interrupo do hardware:
caso a interrupo habilite 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 zer 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:

2.5 Controle de Processos no UNIX

31

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, 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.
Instanciao de Processos

O mecanismo bsico de criao de processos no UNIX a chamada de sistema fork. A


Fig. 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.
Processo Pai
pregion
dados
do pai

rea U

Tabela de
Arquivos

* arq. abertos
* dir. corrente
* dir. raiz

Pilha do Ncleo

pilha
do pai
Processo Pai

.
.
fork();

Texto Compartilhado

.
.

Processo Filho
pregion
dados
do filho

pilha
do filho

rea U
* arq. abertos
* dir. corrente
* dir. raiz

Pilha do Ncleo

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

Tabela de
inodes

2.5 Controle de Processos no UNIX

32

Como pode ser observado, a cpia da rea U faz com que todos os descritores de arquivo
permaneam ativos para o processo lho. 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 lho.
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.
A chamada 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 mantida pelo ncleo refeita para o novo processo. Isto signica que
a histria do processo antigo perdida, mas o PID e descritores de arquivo por ele abertos
permanecem vlidos7 .
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);
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 */
...

/*

*/

No exemplo acima, o programa executa um fork, deixando a cargo do lho 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(int argc, char *argv[])
{
int fd1, fd2;
7 Entretanto,

a nica maneira do novo processo conhecer o valor destes descritores atravs da passagem de
parmetros via argc e argv.

2.5 Controle de Processos no UNIX

33

/* acessa descritores abertos pelo executor do exec */


sscanf(argv[1], "%d", &fd1);
sscanf(argv[2], "%d", &fd2);
...

/*

*/

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 notic-lo:
de uma requisio de mudana de estado (ex: morte de um processo via chamada kill);
do trmino do processo lho;
da ocorrncia 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: Ctrl-C);
de interrupes para ns de depurao (ex: ocorrncia de um

breakpoint ).

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
Tab. 2.1.
sinal

signicado

SIGHUP
SIGINT
SIGILL
SIGFPE
SIGKILL
SIGSEGV
SIGSYS
SIGALRM
SIGSTOP
SIGCONT
SIGCHLD

hang-up
interrupo
instruo ilegal (trap)
exceo aritmtica (trap)
trmino forado
violao de segmentao (trap)
argumento invlido em chamada de sistema
alarme de relgio
suspenso da execuo
continuao da execuo
mudana de status de processo lho

Tab. 2.1: Exemplos de sinais no UNIX System V


Processos podem apresentar as seguintes reaes a sinais:

2.5 Controle de Processos no UNIX

34

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 denido um comportamento default para o processo que o recebe. Em
geral, este comportamento 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 (denido 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 denominada gerenciador do sinal para o processo.
Exemplo: capturar interrupes de teclado. Quando o usurio executa um Ctrl-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 conrmao que o Ctrl-C no foi acidental. O cdigo abaixo ilustra esta situao:
/*

*/

/* gerenciador para SIGINT */


int ger()
{
int c;
printf("Tem certeza que quer terminar [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 conrmao 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

2.6 Comunicao e Sincronizao Inter-processos no UNIX

35

campo correspondente ao sinal na tabela de processos. Neste campo est localizado tambm o
gerenciador do sinal (denido pelo processo ou default ).
No momento que um processo passa do modo ncleo para o modo usurio, o ncleo verica
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 dena um gerenciador para o sinal, executa a ao


contrrio, prossiga.
3. Associa temporariamente a ao

default

default.

Caso

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.
O passo 3 merece um comentrio adicional. Ele existe para evitar que uma rajada de
sinais ocasione um stack overow 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 ca em uma 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.
Pipes

O mecanismos originais de comunicao inter-processos so os chamados pipes. Em geral,


pipes so empregados para estabelecer comunicao entre processos pai e lho. Um pipe
um canal unidirecional de comunicao, isto , a informao ui em uma nica direo. Para
estabelecer-se comunicao bidirecional, so necessrios dois pipes.
Pipes podem ser vistos como um buer conectando dois processos. Um processo escreve
dados em um dos lados do buer, 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).

2.6 Comunicao e Sincronizao Inter-processos no UNIX

36

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 ! lho, o processo
pai fecha o primeiro descritor (com a chamada close), e o lho o segundo. A partir da, o pai
executa chamadas write no segundo descritor e o lho 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 nal da sesso de comunicao, os lados abertos do pipe tambm so fechados a m
de liberar os recursos a ele associados pelo ncleo.
Exemplo: enviar um string do processo pai para o processo lho.

/*

*/

main()
{
int fd[2];
char buff[32];
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);
}
lse { /* FILHO */
close(fd[1]);
read(fd[0], buff, 32);
printf("%s", buff);
close(fd[0]);
exit(0);
}

/*

*/

Mensagens

Troca de mensagens um mecanismo de comunicao mais exvel 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 comunicao. Ports so identicados por um nmero inteiro. A chamada de sistema msgget cria um port, retornando seu
identicador local. O primeiro parmetro uma chave atribuda ao port, seu identicador
global. O segundo parmetro so opes relativas a criao, acesso, etc. Via de regra, msgget
retorna um port dado seu identicador global, criando-o caso tal port inexista.
O ncleo mantm uma tabela de ports, e mensagens enviadas a ports so enleiradas, sendo
recebidas na ordem que foram enviadas. A comunicao bidirecional, posto que, de posse de
um identicador 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 identicador do port para o qual a mensagem deve ser enviada; a estrutura que

2.6 Comunicao e Sincronizao Inter-processos no UNIX

37

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 denidas 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 */
char conteudo[1024]; /* conteudo da mensagem (1K max.) */
};

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


so necessrios: o identicador 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 especicado).
Uma quarta chamada de sistema, msgctl, empregada para obter e alterar o status de
ports. Possui trs parmetros: o identicador 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.
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 identicador global da regio compartilhada, o tamanho da regio em bytes; e opes de
controle (criao e acesso). Como msgget, esta chamada retorna um identicador 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 identicador 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 em um 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 (Fig. 2.4).

2.6 Comunicao e Sincronizao Inter-processos no UNIX


rea U

pregion Processo 2

38

Tabela de Regies

pregion Processo 1

Tabela de Memria
Compartilhada

Tabela de Processos

Memria Primria

Fig. 2.4: Esquema de memria compartilhada


O cdigo abaixo aloca um texto em uma regio de memria compartilhada.
/*
#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, sh;
/* cria area compartilhada */
sh = shmget(KEY, 1024, 0777 | IPC_CREAT);
/* assoacia area compartilhada a um endereco local */
buff = shmat(sh, 0, 0);
poema[0] = "As armas e os baroes assinalados";
poema[1] = "Que da ocidental praia Lusitana";
poema[2] = "Por mares nunca dantes navegados";
poema[3] = "Passaram ainda alem de Tapobrana";
poema[4] = "E, em perigos e guerras esforcados";
poema[5] = "Mais do que prometia a forca humana";
poema[6] = "Por gente remota edificaram";
poema[7] = "Novo reino, que tanto sublimaram";

2.6 Comunicao e Sincronizao Inter-processos no UNIX

39

/* 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, sh;
/* acessa area compartilhada */
sh = shmget(KEY, 1024, 0777);
if(sh < 0) {
printf("\nArea compartilhada nao criada\n");
exit(0);
}
/* 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%s", poema[i]);


printf("\n\n");

/*

*/

Semforos

Semforo um mecanismo de sincronizao inter-processos composto das operaes DOWN


e UP. Via de regra, dene-se um semforo para cada recurso compartilhado. A execuo da
parte do cdigo que acessa tais recursos (regio crtica) abraada pelas operaes DOWN e
UP.
Processos denem/acessam semforos com a chamada de sistema semget. Esta chamada
requer trs parmetros: um identicador global para um array de semforos; o nmero de
semforos contido no array; e um ag estipulando aes relativas a permisses e criao.
Operaes em semforos se processam atravs da chamada de sistema semop. Esta chamada
requer trs parmetros: o identicador 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.

2.6 Comunicao e Sincronizao Inter-processos no UNIX

40

struct sembuf {
short sem_num; /* indice do semaforo */
short sem_op;
/* operacao requisitada */
short sem_flag; /* controle da operacao */
};

O segundo campo da estrutura


seguinte lgica. Se sem_op for:

sembuf

opera no respectivo semforo de acordo com a

negativo: caso a soma de sem_op com o valor do semforo seja no negativa, some
sem_op ao valor do semforo e retorne. Caso seja negativa, bloqueie.
positivo: some

sem_op

ao valor do semforo e retorne.

nulo: retorne se o valor do semforo for nulo; bloqueie, caso contrrio.


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_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_t key)
{
int semid;
semid = semget(key, 1, 0777);
return(semid);
}
/* define operacao DOWN */
void DOWN(int semid)
{
struct sembuf psem[2];
psem[0].sem_num = 0;

2.6 Comunicao e Sincronizao Inter-processos no UNIX

41

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

/* define operacao UP */
void UP(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);
}
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]
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";

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 conabilidade de seu
sistema de arquivos [1].

3.1 Interface do Sistema de Arquivos


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

A maior parte dos sistemas operacionais trazem a seguinte proposta para armazenamento
de informao: permitir aos usurios denir 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 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 especicar em qual dispositivo o mesmo se encontra
sicamente 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 especicar 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 de entrada e sada no drive B, cada um deles
dever ser especicado juntamente com o nome do arquivo:
A:programa < B:entrada > B:saida
42

3.2 Projeto do Sistema de Arquivos

43

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 identicar arquivos atravs de
nomes simblicos (i.e. sequncia de caracteres ASCII). Arquivos especiais so usados para
especicar perifricos tais como terminais, impressoras, unidades de ta, etc. Assim podemos
para copiar um arquivo abc para o terminal (arquivo especial /dev/tty) atravs do comando:
cp abc /dev/tty

Em muitos sistemas, arquivos regulares so subdivididos em diferentes tipos em funo de


sua utilizao. Os tipos so identicados pelos nomes com que os arquivos regulares terminam.
Por exemplo,

arquivo.c - Arquivo fonte em C


arquivo.obj - Arquivo objeto
arquivo.bin - Programa binrio executvel
arquivo.lib - Biblioteca de arquivos .OBJ usados pelo

linker

Em certos sistemas, as extenses so simples convenes: 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.
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 Fig. 3.1 ilustra
estas trs situaes.
Quando o sistema de arquivos organizado como uma rvore de diretrios, algum meio se
faz necessrio para especicar nomes de arquivos. Dois mtodos so comumente empregados.
No primeiro mtodo, cada arquivo identicado pela sequncia de diretrios desde o diretrio
raiz at o arquivo (caminho absoluto). Como um exemplo, o caminho /usr/mfm/mailbox
signica 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.
Uma outra forma de especicar 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. Em UNIX o diretrio corrente denotado por . (ponto).

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 identicados, quais operaes so

3.2 Projeto do Sistema de Arquivos

44

Diretrio nico Compartilhado por Usurio


diretrio raiz
rvore Arbitrria por Usurio
diretrio raiz
A

arquivo

Diretrio nico por Usurio

diretrio
de usurio

diretrio raiz
subdiretrio

diretrio
de usurio

arquivo

arquivo

Fig. 3.1: Trs projetos de sistemas de arquivos: (a) diretrio nico compartilhado pelos usurios;
(b) um diretrio por usurio; (c) rvore arbitrria por usurio
permitidas, 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 ecientemente e convel.
Gerenciamento de Espao em Disco

Arquivos so normalmente armazenados 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 xo, que no precisam ser adjacentes1 .
Uma vez decidido armazenar arquivos em blocos de tamanho xo, a questo denir 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, signica que cada arquivo ter muitos blocos. A leitura de cada
1 Salvo

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

3.2 Projeto do Sistema de Arquivos

45

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 livres no disco. Dois mtodos so largamente usados (Fig. 3.2). O primeiro consiste
no uso de uma lista ligada de blocos, com cada elemento da lista armazenando tantos blocos
livres quanto possvel. Com elementos de 1K e o nmero do bloco de 16 bits, cada elemento na
lista de blocos livre armazena 511 blocos livres. Um disco com 20 Gigabytes necessita de uma
lista ocupando aproximadamente 40K blocos para apontar para todos os 20G blocos do disco
(ou seja, a lista ocupa 0,2% do disco).
239
124
432
58
490
643
486
12
43
481

971
7
99
640
589
737
872
543
321
13

...

...

...

410
312

654
318

597
873

(a)

1001 0010 0101 1001


0000 1001 0001 1000
0011 0011 1010 0100
1000 0000 1000 0011
0101 1001 1010 1100
0100 0011 0000 0011

...

42
136
45
127
65
254
321
342
123
415

1111 0000 1100 0011


(b)

Fig. 3.2: (a) blocos livres armazenados em lista ligada; (b) um mapa de bits.
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 livres so representados por 1s no
mapa de bits; blocos alocados por 0s (ou vice-versa). Um disco com 20 Gigabytes necessita de
20M bits para o mapa, volume equivalente a 2500 blocos (ou seja, o mapa ocupa apenas 0,013%
do disco). 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
livres) a lista ligada necessita de menos espao que o mapa de bits.
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

3.2 Projeto do Sistema de Arquivos

46

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 Fig. 3.3 mostra o esquema de alocao
usado pelo MS-DOS. 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.
File Allocation
Table
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

x
x
EOF
13
2
9
8
FREE
4
12
3
FREE
EOF
EOF
EOF
BAD

tamanho
do disco

Lista Encadeada usada pelo MS-DOS

Arq. A

Arq. B

12

Arq. C

10

13

Fig. 3.3: Esquema de lista encadeada usado pelo MS-DOS. Os registros 0 e 1 so usadas para
especicao do tipo do disco. Os cdigos EOF e FREE so usados para End Of File e registros
livres, respectivamente.
Associada a cada disco, existe uma tabela chamada Tabela de Alocao de Arquivos (File
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 6 da
FAT 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 m do arquivo.
Este esquema vai se tornando ineciente a medida que a capacidade do disco aumenta. Para
limitar o tamanho da tabela, deve-se aumentar o tamanho do bloco. Suponha um disco de 2
Gigabytes que contm 16K blocos de 32K, resultando em uma FAT com 16K entradas de 2
bytes cada. Dois problemas so intrnsecos deste esquema:

Allocation TableFAT)

1. dado que mais que um arquivo no pode ocupar o mesmo bloco, um arquivo de 1 byte
armazenado em um bloco de 32 Kbytes;
2. por razes de ecincia, toda a FAT deve estar presente integralmente em memria,
independentemente do nmero de arquivos abertos.
Um mtodo mais ecaz, seria manter listas dos blocos para diferentes arquivos em lugares
diferentes. Isto exatamente o que o UNIX faz.
Associado a cada arquivo no UNIX, tem-se uma pequena tabela (no disco), chamada inode,
como mostrado na Fig. 3.4. Ela contm informaes sobre o arquivo tais como tamanho e

3.2 Projeto do Sistema de Arquivos

47

...

ponteiro p/
bloco de dados

...

...
...
...

...

inode
arquivo
nmero de links
identificador do proprietrio
grupo do proprietrio
tamanho do arquivo
data da criao
data do timo acesso
data da ltima modificao
ponteiro p/ bloco 1 de dados
ponteiro p/ bloco 2 de dados

...

...

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.

...

...

ponteiro p/ bloco 10 de dados


bloco indireto simples
bloco indireto duplo
bloco indireto triplo

Fig. 3.4: Estrutura do

inode

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 suciente 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. O bloco indireto duplo suciente 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. Entretanto, aumentando o tamanho do bloco para 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 ).
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

3.2 Projeto do Sistema de Arquivos

48

sistemas de diretrios so organizados. Estes variam desde solues simples at razoavelmente


sosticadas.
Vamos comear com um sistema de diretrio particularmente simples, aquele do CP/M,
ilustrado na Fig. 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 Fig. 3.5(a) so resumidos a seguir. O campo de usurio informa a quem
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 mltiplos registros no
diretrio. Estes campos so usados para especicar a ordem dos registros. O campo contador
de bloco informa quais dos 16 blocos de disco esto em uso. Os 16 campos nais 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
Fig. 3.5(b) ilustra 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 xo (448
registros para um disquete de 1.44M), 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 Fig. 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 Fig. 3.4). Todos os diretrios do UNIX so arquivos e podem conter um nmero
arbitrrio destes registros.
1

16
CPM

nome do arquivo

tipo
(extenso)

contador
de bloco

nmero de blocos de disco

tamanho

usurio
8

10

4
MSDOS

nome do arquivo

tipo
(extenso)
atributos

hora data

tamanho

primeiro bloco
na FAT
UNIX

nmero do inode

nome do arquivo

Fig. 3.5: Registros de diretrios: (a) CPM; (b) MS-DOS; (c) UNIX

3.2 Projeto do Sistema de Arquivos

49

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 xo 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 Fig. 3.6.
Bloco 1 - diretrio raiz
1
1
4
7
14
9
6
8
17
11

.
..
bin
dev
lib
etc
usr
tmp
var
pub

inode #6
blk = 132

diretrio /usr
no bloco 132

bloco com os arquivos


do diretrio

Bloco 132 - diretrio /usr


6
1
19
30
51
92
79
27

.
..
clt
ral
mfm
ec
wst
lpm

inode #51
blk = 416

Bloco 416 - diretrio /usr/mfm


51
6
321
106
85
539

.
..
cursos
papers
mbox
pvm

diretrio /usr/mfm
no bloco 416

/usr/mfm/mbox no
inode #85

Fig. 3.6: Os passos para achar /usr/mfm/mailbox


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 registro .. 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.
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 Fig. 3.7 mostra o sistema de arquivos da Fig. 3.1(c), com um dos arquivos do
usurio C presente em um dos diretrios do usurio B. A associao entre um diretrio e
um arquivo pertencente a outro diretrio chamada de conexo ou link (linha pontilhada da
Fig. 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.

3.2 Projeto do Sistema de Arquivos

50

diretrio raiz

subdiretrio

diretrio
de usurio

... a associao entre um diretrio e


um arquivo pertencente a outro dire
trio chamada de conexo ou link.

Fig. 3.7: Um sistema de arquivos contendo um arquivo compartilhado


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 identica-o como do tipo link, lendo deste
apenas o caminho para o arquivo compartilhado. De posse do caminho, o arquivo compartilhado
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 Fig. 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 m 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 Fig. 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

3.3 Conabilidade do Sistema de Arquivos


Diretrio do Usurio C
51
6
321
106
85

.
..
cursos
papers
mbox

Diretrio do Usurio B
53
6
539
85

.
..
java
mbox

51

Diretrio do Usurio C
51
6
321
106
85

.
..
cursos
papers
mbox

Diretrio do Usurio B
53
6
539
85

.
..
java
mbox

inode #85

inode #85

inode #85

owner = C
count = 1

owner = C
count = 2

owner = C
count = 1

Antes da Conexo

Aps a Conexo

Aps proprietrio
remover o Arquivo

Fig. 3.8: (a) situao anterior conexo; (b) aps a conexo ter sido feita; (c) aps o proprietrio
remover o arquivo
para usar o arquivo via conexo simblica falhar, dada a incapacidade do sistema em localizar
o arquivo. Remover uma 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
Fig. 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 Conabilidade do Sistema de Arquivos


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
blocos defeituosos. Estes blocos so armazenados num arquivo, acessado quando da construo
da lista de blocos livres. Conhecendo os blocos defeituosos, o sistema operacional no os
incorpora na lista de blocos livres, eliminando assim sua ocorrncia futura em arquivos de
dados.

3.3 Conabilidade do Sistema de Arquivos

52

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 ta magntica ou disquetes de alta densidade.
Para discos de grande capacidade (dezenas de gigabytes), salvar o contedo inteiro em
tas 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
ta todos os arquivos a cada semana ou ms, e, diariamente, apenas daqueles arquivos que
foram modicados deste o ltimo backup completo. Um outro esquema, mais eciente, 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.
Consistncia do Sistema de Arquivos

Outro tpico envolvendo conabilidade a consistncia do sistema de arquivos. Muitos


sistemas de arquivos lem blocos, modica-os, e os regrava mais tarde. Se o sistema falha
antes que todos os blocos modicados 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
livres.
Para vericar a consistncia do sistema de arquivos, muitos sistemas operacionais utilizam
programas utilitrios desenvolvidos para este m. Este programa executado sempre que o
sistema iniciado, particularmente depois de um desligamento abrupto. A seguir descrito
como tal utilitrio opera no UNIX2 .
O controle de consistncia se d em dois nveis: blocos e arquivos. Para controle de consistncia no 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 livres.
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 livres rastreando todos os blocos que no esto em uso. Cada ocorrncia de
um bloco na lista de blocos livres 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 vericador do sistema de arquivos acrescenta-os na lista de blocos livres.
Outra situao possvel de ocorrer a repetio de blocos na lista de blocos livres. A soluo
neste caso tambm simples: reconstruir a lista de blocos livres, eliminando-se as duplicaes.
2 Este

utilitrio denomina-se fsck (le system checker).

3.4 Desempenho do Sistema de Arquivos

53

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 livres, 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 livres duas
vezes.
A ao apropriada do utilitrio alocar um bloco livre, copiar o contedo do bloco duplicado
para o mesmo, 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 vericar se cada bloco contado corretamente, o utilitrio tambm examina
o sistema de diretrios (consistncia no nvel de arquivos). Neste caso, usada uma tabela
de contadores por arquivos (no por blocos, como anteriormente). A vericao 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 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 catastrco, 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 catastrco) 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 atribudos 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, vericar blocos e vericar diretrios, so frequentemente integradas
por razes de ecincia (i.e., uma nica passagem sobre os inodes requerida). Outros controles
heursticos so tambm possveis. Por exemplo, diretrios tm um formato denido, 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
alguns 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 buer cache. Neste
contexto, uma cache uma coleo de blocos que pertencem logicamente ao disco, mas so
mantidos na memria por razes de desempenho.

3.4 Desempenho do Sistema de Arquivos

54

Vrios algoritmos podem ser usados para gerenciar o cache, mas o mais comum o que
verica 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 modicado 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 modicado na cache, necessrio que o mesmo seja escrito no disco
imediatamente. Escrevendo blocos crticos rapidamente no disco, reduzimos a probabilidade
que falhas daniquem o sistema de arquivos.
At mesmo com estas medidas para manter a integridade do sistema de arquivos, indesejvel 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 modicados 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 modicado para o disco to logo tenha sido escrito. Caches nas quais blocos modicados 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
buer 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 buferizao interna, procedendo gravaes em disco apenas quando existir
uma determinada quantidade de bytes pendentes. A estratgia adotada pelo MS-DOS foi
inuenciada pela garantia que a remoo de um disco exvel 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 livres 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 livres, parte da qual est no disco, mais difcil alocar blocos prximos.
Entretanto, com uma lista de blocos livres 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 siste-

3.5 O Sistema de Arquivos do UNIX (System V)

55

ma 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 de cilindros, cada qual com os seus prprios inodes, blocos, e lista de blocos livres.
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 funo 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 [3, 2]. 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 buers denominado de cache de buers. 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 Buers


O nmero de buers que fazem parte do cache de buers 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 buer formado de duas partes: um segmento de memria utilizado para abrigar os dados que so lidos/escritos da/na memria e um
cabealho que identica o buer.
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 dos dispositivos.
Dentro desta viso, o ncleo enxerga o sistema de arquivos como sendo formado por vrios blocos de disco; no caso, um buer corresponde a um bloco, sendo o seu contedo identicado pelo
ncleo atravs de um exame dos campos presentes no cabealho associado ao buer. Podemos
concluir que o buer 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 buer. Uma restrio importante
a de que um bloco do disco no pode ser mapeado em mais de um buer ao mesmo tempo.
O cabealho de um buer contm 4 classes de informao (ver Fig. 3.9): identicao,
posicionamento, estado e posio dentro do segmento de memria. A identicao permite
reconhecer a qual bloco do disco o buer est associado. O cabealho do buer contm um
campo com o nmero do dispositivo e um campo com o nmero do bloco. Estes campos

3.5 O Sistema de Arquivos do UNIX (System V)

56

especicam o sistema de arquivo e o nmero do bloco de dado no disco identicando de forma


nica o buer. Com relao ao posicionamento, o cabealho possui apontadores para posicionar
o buer em duas estruturas: lista de buers livres e a la hash. O cabealho possui um
apontador para a rea de dado (segmento) correspondente ao buer. 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 buer, podendo ter um dos seguintes valores:
buer trancado (locked );
buer contendo dados vlidos;
buer com escrita retardada - signica a situao em que o ncleo deve escrever o contedo
do buer no disco antes de reatribuir o buer a um outro bloco;
o ncleo encontra-se lendo ou escrevendo o contedo do buer no disco;
um processo encontra-se aguardando que o buer torne-se livre.

nmero do dispositivo
nmero do bloco

rea de dados
(tamanho do bloco)

status
ponteiro p/ rea de dados
ponteiro
elemento anterior
da fila de hash

prximo elemento
da fila de hash

ponteiro
ponteiro

elemento anterior da
lista de blocos livres

ponteiro

prximo elemento da
lista de blocos livres

Fig. 3.9: Cabealho do buer

Estrutura do Pool de Buers

Os blocos de dado no disco so organizados no cache de buers atravs de uma poltica


denominada de uso menos recente. Atravs desta poltica, quando um buer alocado a um
determinado bloco, este buer 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 buers livres que organizada segundo a ordem do uso menos
recente.
O ncleo retira um buer da cabea da lista quando da necessidade de um buer livre.
possvel que um buer seja retirado do meio da lista caso o ncleo identique um bloco
especco no cache de buers. Em ambos os casos o buer removido da lista. Quando o
ncleo retorna um buer ao pool, ele normalmente coloca o buer no nal da lista sendo que,
ocasionalmente (em situaes de erro), o buer colocado na cabea da lista. O buer nunca
recolocado no meio da lista de buers livres.
Quando o ncleo necessita acessar um bloco do disco, ele procura um buer que possua
a combinao adequada nmero de dispositivo-nmero de bloco. Para evitar a necessidade do
ncleo pesquisar o cache de buers por completo, estes so organizados em las separadas,

3.5 O Sistema de Arquivos do UNIX (System V)

57

espalhadas por uma funo de hash que tem como parmetros os nmeros do dispositivo e do
bloco. Os buers so colocados em uma la hash circular, duplamente ligada, em uma forma
equivalente estrutura da lista de buers livres.
Todo buer est na la hash, no existindo, entretanto, signicado para a sua posio na
la. Um buer pode encontrar-se, simultaneamente, na lista de buers livres, caso o seu estado
seja livre, e na la hash (por exemplo, o buer 64 da Fig. 3.10). Desta forma, o ncleo pode
procurar um buer na lista hash caso ele esteja procurando um buer especco, ou ele pode
remover um buer da lista de buers livres caso ele esteja procurando por um buer livre
qualquer. Resumindo, um buer que se encontra na lista hash pode ou no encontrar-se na
lista de buers livres.
28

17

97

98

50

64

14

38

3
3

cabea

f(b) = b mod 4
fila hash

Fig. 3.10: Estrutura do

cauda

lista de buffers livres


cache de buers :

la de

hash

e lista de buers livres

Cenrios para Recuperao de um Buer

O cache de buers 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 buers e, caso ele no se encontre, um buer livre atribudo
ao bloco. Os algoritmos para leitura/escrita em blocos do disco usam um algoritmo (getblk)
para alocao de buers a partir do pool.
Existem cinco cenrios tpicos associados ao algoritmo getblk:
1. O ncleo encontra o buer correspondente ao bloco na la hash e o buer est livre. Neste
caso, o algoritmo marca o buer como ocupado, remove-o da lista de buers livres e
retorna um ponteiro para o buer.

3.5 O Sistema de Arquivos do UNIX (System V)

58

2. O ncleo no encontra o buer correspondente ao bloco na la hash e aloca um buer da


lista de buers livres, reposicionando-o na la de hash.
3. O ncleo no encontra o buer correspondente ao bloco na la hash e, na tentativa de
alocar um buer da lista de buer livre (como no cenrio 2), encontra um buer na lista
de buers livres marcado com escrita adiada (delayed write). Neste caso, o ncleo deve
escrever (assincronamente) o buer no disco e continuar a procura de um buer livre para
o bloco.
4. O ncleo no encontra o buer correspondente ao bloco na la hash, e a lista de buers
livres encontra-se vazia. Neste caso, o processo bloqueado at que outro processo devolva
um buer lista de buers livres.
5. O ncleo encontra o buer correspondente ao bloco na la hash, mas o seu buer 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 buer j posicionado
na la de hash para que a operao de E/S possa continuar; ou bloqueia o processo a espera
de buer ou liberao do bloco.
Alm do algoritmo getblk, existem outros quatro algoritmos que operam o cache de buers :
1. brelse: libera um bloco, retornando-o lista de blocos livres.
2. bread: l sincronamente (com espera) o bloco do disco para o buer.
3. breada: l assincronamente (sem espera) o bloco do disco para o buer.
4. bwrite: escreve um bloco do buer 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 (blocos) do arquivo. 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 buers discutidos anteriormente.
iget: retorna um inode previamente identicado, possivelmente atravs da sua leitura
do disco via o cache de buers ;
iput: libera o

inode ;

bmap: dene os parmetros do ncleo para o acesso a um arquivo;


namei: converte um nome (path ) de arquivo no
alloc: aloca blocos do disco para os arquivos;
free: libera blocos de disco;

inode

correspondente;

3.5 O Sistema de Arquivos do UNIX (System V)

ialloc: aloca

inodes

ifree: libera

inodes.

59

para os arquivos;

Estes algoritmos utilizam outros que manipulam o


bread, breada, bwrite).

cache de buers

(getblk, brelse,

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 Fig. 3.4):
identicador 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 modicao, ltimo acesso e ltima modicao
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
em disco:
status do
-o

inode

inode

inode

em memria contm os seguintes campos em adio aos campos do

inode

na memria indicando:

est trancado;

- processo encontra-se esperando que o


- a representao do
dados do inode ;

inode

inode

seja liberado;

na memria difere da cpia do disco devido a mudanas nos

- 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 sistema de arquivos que contm o arquivo;


o nmero do inode. O inode no disco no necessita deste nmero pois os
armazenados em um arranjo linear no disco;

inodes

so

apontadores para outros inodes na memria. O ncleo liga os inodes em las hash e em
uma lista de inodes livres da mesma forma que os buers so ligados no cache de buers ;
um contador de referncia, indicando o nmero de instncias do arquivo que esto ativas.

3.5 O Sistema de Arquivos do UNIX (System V)

60

A diferena mais signicativa entre o inode na memria e o cabealho do buer no cache


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 livres
se, e somente se, o seu contador de referncia 0, signicando que o ncleo pode realocar sua
estrutura na memria a um outro inode do disco. A lista de inodes livres serve como um cache
de inodes (exatamente como o cache de buers ).
de buers

Acesso aos Inodes

O ncleo identica um inode especco 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 buers.
Caso o algoritmo no encontre o inode na la hash associada ao nmero do dispositivo e
ao nmero do inode procurado, um inode alocado a partir da lista de inodes livres 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 oset do inode dentro do bloco, o ncleo utiliza as seguintes expresses:

no do bloco: ((no do inode -1) / nmero de


da lista de
oset :

inodes

por bloco) + nmero do bloco inicial

inodes

((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 livres 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 (supondo blocos de 1 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 oset correspondente a estes

3.5 O Sistema de Arquivos do UNIX (System V)

61

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.
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 nome3 . 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.5.3 Atribuio de inodes e Blocos


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

O super-bloco um segmento contnuo de disco formado pelos seguintes campos:


tamanho do sistema de arquivos;
nmero de blocos livres no sistema;
lista de blocos livres disponveis no sistema de arquivos;
ndice do prximo bloco livre na lista de blocos livres;
tamanho da lista de
nmero de
lista de

inodes

inodes

inodes ;

livres no sistema de arquivos;

livres no sistema de arquivos;

ndice do prximo

inode

campos trancados

(locked)

ag

livre na lista de

inodes ;

para as listas de blocos livres e

inodes

livres;

indicando que o super-bloco foi modicado.

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.
3 Verses

correntes do UNIX permitem nomes bem mais extensos.

3.5 O Sistema de Arquivos do UNIX (System V)

62

Atribuio de um Inode a um Novo Arquivo

O algoritmo ialloc atribui um inode do disco para um arquivo recm criado. O sistema
de arquivos 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 sistema de arquivos
contm um arranjo que atua como um cache no qual so armazenados os inodes livres do
sistema de arquivos No confundir esta lista com aquela para abrigar os inodes livres 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
livres 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.
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 signica 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 livres. Este
arranjo utiliza blocos de disco cujo contedo so nmeros de blocos livres. Uma das entradas
destes blocos constitui-se de um apontador para outro bloco contendo nmeros de blocos livres.
Estabelece-se, desta forma, uma lista ligada (em disco) de blocos que contm nmeros de blocos
livres. 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 livres no disco. O algoritmo alloc
realiza a alocao de um bloco do sistema de arquivos alocando o prximo bloco disponvel na
lista do super-bloco.

3.5.4 Chamadas de Sistema Referentes ao Sistema de Arquivos


As chamadas de sistema que compem o sistema de arquivos utilizam, dentre outros, os
algoritmos descritos acima (getblk, ialloc, etc.). Cada arquivo no UNIX identicado por
um descritor de arquivos (um nmero inteiro). Descritores de arquivos identicam univocamente arquivos no 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 sucintamente
descritas a seguir.
1. open: abre um arquivo para leitura/gravao. Parmetros da chamada indicam, por
exemplo, se o arquivo deve ser criado (caso inexista) e permisses.
2. dup: duplica um descritor de arquivo, retornando um novo descritor associado ao mesmo
arquivo.
3. pipe: cria no sistema de arquivos um pipe. Pipes so arquivos de uso exclusivo por parte
de dois processos: um produtor e um consumidor de dados.
4. close: encerra a operao sobre um arquivo aberto.
5. link: cria uma conexo simblica para um arquivo j existente.

3.5 O Sistema de Arquivos do UNIX (System V)

63

6. unlink: remove uma conexo simblica.


7. read: l dados de um arquivo (para um buer em memria).
8. write: escreve dados num arquivo (de um buer em memria).
9. lseek: altera a posio corrente de leitura/gravao no arquivo.
10. mknod: cria um arquivo especial (tipo bloco ou caractere), associando-o a perifrico (unidade de disco, ta, terminal, etc).
11. mount: adiciona uma nova unidade lgica ao sistema de arquivos.
12. umount: remove uma unidade lgica do sistema de arquivos.
13. chdir: altera o diretrio corrente na rea U.
14. chown: altera o usurio que tm a posse do arquivo.
15. chmod: altera permisses de um arquivo.
16. stat: fornece informaes sobre um arquivo (tipicamente as constantes no
arquivo).

inode

do

Captulo 4
Gerenciamento de Memria
Memria um recurso importante que deve ser cuidadosamente gerenciado. Enquanto a
capacidade de armazenamento dos computadores vem crescendo continuamente, a complexidade do software cresce talvez taxas maiores [1]. 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; e gerencia a permuta
de processos entre memria principal e secundria (quando a memria principal no capaz
de abrigar todos os processos).

4.1 Gerenciamento Sem Permuta ou Paginao


Sistemas de gerenciamento de memria podem ser divididos em duas grandes classes: aqueles que movem processos entre a memria principal e secundria (tipicamente disco) durante a
execuo, e aqueles que mantm os processos xos 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 para a memria, podendo este fazer uso de toda a mquina. Se a memria for insuciente,
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 Fig. 4.1. A memria dividida entre
o sistema operacional e um processo do usurio. O sistema operacional pode estar no nal da
memria RAM (Random Access Memory) como mostrado na Fig. 4.1(a), ou em ROM (Read
Only Memory), como mostrado na Fig. 4.1(b), ou ainda tendo os device drivers em ROM e o
resto do sistema operacional em RAM ocupando a parte baixa da memria, como mostrado na
Fig. 4.1(c).
A arquitetura IBM PC original (processadores Intel x86) utilizava o modelo da Fig. 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 (Basic Input Output System).
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
64

4.1 Gerenciamento Sem Permuta ou Paginao


0xFFF...

65

0xFFF...
Sist. Oper. em
Memria ROM

0xFFF...
Drivers de dispositivos em ROM

Programa
do Usurio

Programa
do Usurio

Programa
do Usurio

Sistema
Operacional

Sist. Oper. em
Memria RAM
0

0
Modelo de memria
utilizado pelo IBM PC

Fig. 4.1: Trs formas de organizar a memria para o sistema operacional e um processo do
usurio
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 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 em um 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.
Modelagem da Multiprogramao

Quando a multiprogramao usada, o percentual de utilizao da CPU aumenta. Via


de regra, 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, bem como despreza o esforo de gerenciamento dos 5 processos por parte
do sistema operacional.
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 espera de E/S. Com n processos na

4.1 Gerenciamento Sem Permuta ou Paginao

66

memria por vez, a probabilidade que todos os n processos estejam esperando por E/S pn .
A utilizao da CPU ento 1 pn . A Fig. 4.2 mostra a utilizao da CPU em funo de n,
chamado grau de multiprogramao.
utilizao da CPU (%)

20 % de

50%

I/O

de

Utilizao da CPU = 1 - p

I/O
80%

/O

de I

grau da multiprogramao (n)


1

10

Fig. 4.2: Utilizao da CPU como uma funo do nmero de processos na memria
Da Fig. 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 em um estado de espera de E/S, deve car claro que tempos de espera para E/S
superiores a 80% so usuais. Processos utilizando unidades de armazenamento 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 memria. A estratgia mais simples consiste
em dividir a memria em n parties (possivelmente diferentes). Estas parties podem, por
exemplo, ser estabelecidas na congurao do sistema operacional.
Quando um processo inicia, este pode ser colocado em uma la de entrada para ocupar
a menor partio de tamanho suciente para acomod-lo. Desde que as parties so xas,
qualquer espao em uma partio no usado pelo processo perdido. A Fig. 4.3(a) apresenta
este esquema de partio.
A desvantagem de se ordenar os processos que chegam em las separadas torna-se aparente
quando a la para a maior partio est vazia, mas a la para a menor partio est cheia, como
no caso das parties 1 e 4 na Fig. 4.3(a). Uma organizao alternativa manter uma la nica
como na Fig. 4.3(b). Toda vez que uma partio liberada, a mesma alocada ao primeiro
processo da la. Uma vez que indesejvel gastar uma partio grande com um processo
pequeno, uma estratgia mais ecaz procurar em toda la 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 xas denidas 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

4.1 Gerenciamento Sem Permuta ou Paginao

Partio 4

67

Partio 4
700 KB

Partio 3

700 KB

Partio 3

400 KB
Partio 2

400 KB
Partio 2

200 KB
Partio 1
Sistema
Operacional

200 KB
Partio 1

100 KB
0 KB

Fila de Entrada separadas por Partio

Sistema
Operacional

100 KB
0 KB

Fila nica de Entrada por Patio

Fig. 4.3: (a) Parties de memria xa com las de entrada separadas para cada partio; (b)
partio de memria xa com uma la simples de entrada
de implementar: os processos que chegam so colocados em uma la at que uma partio
adequada seja liberada, quando ento so carregados e executados.
Realocao e Proteo

Multiprogramao introduz dois problemas essenciais que devem ser resolvidos: realocao
e proteo. Da Fig. 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 Fig. 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 modicar realmente as instrues quando o programa carregado
para a memria (tcnica denominada carregamento dinmico). 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 que segmentos do
programa so endereos para 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.
1 Isto

, o programa principal, subrotinas escritas pelo usurio, e bibliotecas so combinados dentro de um


espao de endereamento nico.

4.2 Permuta (Swapping)

68

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
atribudo 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 si 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
modicada 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 modiquem.
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 Permuta (Swapping)


Em um sistema operando em batch, a organizao da memria em parties xas 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 xas. 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 xas 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 Fig. 4.4 mostra como parties variveis so implementadas. Inicialmente,
somente o processo A est na memria. Ento o processo B e C so criados ou trazidos do
disco. Na Fig. 4.4(d) o processo A termina ou movido para o disco. Ento o processo D inicia
e B termina. Finalmente, o processo E inicia.

4.2 Permuta (Swapping)

69

Sistema
Operacional

Sistema
Operacional

Sistema
Operacional

Sistema
Operacional

Sistema
Operacional

Sistema
Operacional

Sistema
Operacional

a.

b.

c.

d.

e.

f.

g.

Fig. 4.4: Mudanas na alocao de memria com processos chegando e deixando a memria
(regies sombreadas representam espao livre)
A principal diferena entre parties xas da Fig. 4.3 e parties variveis da Fig. 4.4 que
o nmero, a localizao e o tamanho das parties variam dinamicamente ao longo do tempo.
A exibilidade de no se ter um nmero xo 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 espaos livres disjuntos em um nico espao livre 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 64M bytes de memria e que pode copiar 32 bytes
por s (32 megabyte/seg), gasta 2 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 xo que permanece constante ao longo de sua
execuo, ento a alocao simples: aloca-se exatamente o necessrio ao tamanho do processo.
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 espao livre adjacente, simplesmente
o espao livre 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
espao livre grande o suciente para armazena-lo, ou um ou mais processos tero que ser
movidos para disco com o intuito 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
Fig. 4.5(a) mostra a congurao da memria na qual a rea para crescimento foi alocada para
os dois processos.

4.2 Permuta (Swapping)

70

B - pilha

espao para crescimento

espao para crescimento


B - dados
B

espao para uso


B - texto

A - pilha
espao para crescimento

espao para crescimento


A - dados

espao para uso

A - texto

Sistema
Operacional

Sistema
Operacional

Fig. 4.5: (a) Espao para crescimento do segmento de dados. (b) espao para crescimento da
pilha e do segmento de dados.

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 Kbytes. 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 Fig. 4.6
mostra parte da memria e o correspondente mapa de bits.
A

D
16

11111000
11111111
10011111

....
24

(a)

(b)
A
P

B
5

9 14

P 15 17

D
B 18 19

P 20 25

P: processo
B: buraco
(c)

Fig. 4.6: (a) Parte da memria com 5 processos e 3 espaos livres (as marcas mostram as
unidades de alocao da memria e as regies sombreadas esto livres); (b) Mapa de bits
correspondente. (c) A mesma informao como uma lista ligada
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 grande, o mapa de bits ser
pequeno, mas 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 xa da memria) prov uma maneira simples de
gerenciar memria, uma vez que o tamanho do mapa de bits depende somente do tamanho da

4.2 Permuta (Swapping)

71

memria e do tamanho da unidade de alocao. O problema principal 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 espao livre entre dois processos.
A memria da Fig. 4.6(a) representada na mesma Fig. (c) como uma lista encadeada de
segmentos. Cada entrada da lista especica um espao livre (L) 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 nalizao de um processo, ao seu lado teremos processos ou espaos livres. Quatro
situaes podem ocorrer como mostradas na Fig. 4.7.
Antes do Processo
X Terminar

Aps o Processo
X Terminar

X
B

Antes do Processo
X Terminar

A
X

Aps o Processo
X Terminar

Antes do Processo
X Terminar

Aps o Processo
X Terminar

Antes do Processo
X Terminar

Aps o Processo
X Terminar

A
X
B

X
B

Fig. 4.7: Quatro combinaes de memria quando um processo terminar


Quando processos e espaos livres so mantidos na lista ordenada por endereos, vrios
algoritmos podem ser usados para alocar memria, a m de criar ou permutar processos. Tais
algoritmos so evocados quando o gerenciador de memria necessita um segmento de memria
de M bytes.
Algoritmo First-t

o algoritmo mais simples. O algoritmo procura ao longo da lista de segmentos at encontrar um espao livre de tamanho maior ou igual a M. Caso o espao livre tenha tamanho
superior a M (N), o espao livre quebrado em dois segmentos: um para o processo (de tamanho M ) e o outro para a memria no usada (de tamanho N - M ). First-t um algoritmo
rpido pois naliza a busca o mais cedo possvel.
Algoritmo Next-t

Este algoritmo opera da mesma forma que o rst-t, exceto que guarda a posio da lista
onde o ltimo espao livre foi alocado. Da prxima vez que chamado, o algoritmo comea a
procurar a partir deste ponto.

4.2 Permuta (Swapping)

72

Algoritmo Best-t

Este algoritmo procura pela lista inteira e toma o espao livre de tamanho mais prximo
de M. um algoritmo lento e cria na memria espaos livres pequenos que dicilmente sero
alocados. Entretanto, para M grande, best-t aumenta as chances de se encontrar na lista
um espao livre de tamanho adequado, posto que minimiza o uso espaos livres grandes para
atender requisies pequenas.
Como um exemplo, considere a Fig. 4.6. Se um bloco de tamanho 2 for solicitado, o
algoritmo rst t alocar o espao livre 5, e o best t o espao livre 18.
Algoritmo Quick-t

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 espaos livres de tamanho 4K, a segunda um ponteiro para a cabea da lista de espaos
livres de tamanho 8K, a terceira de tamanho 12K, e assim sucessivamente. Com o quick-t,
acha-se um espao livre de tamanho requerido muito rapidamente, mas com a desvantagem de
todos os esquemas de classicar os espaos livres 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 espaos livres no utilizveis.
Todos os quatro algoritmos podem aumentar seus respectivos desempenhos mantendo-se em
separado listas para processos e espaos livres. Neste caso, todos devotam suas energias para
inspeo de espaos livres, 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 espaos livres. Novamente, a inecincia est em se determinar possveis fuses.

4.2.4 Alocao de Espao Para Permuta


Os algoritmos 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 eles. Em alguns sistemas, quando um processo est na memria, nenhum espao
em disco lhe 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 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, o mesmo posicionado no espao em disco a ele previamente alocado.
Quando um processo termina, o seu espao para permuta em disco desalocado. Esta tcnica
mais eciente 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

73

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, denominados 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 que aloca 1M bytes de memria por processo,
escolhendo-se cuidadosamente quais dos 1M ser mantido na memria a cada instante, com
segmentos sendo permutados entre disco e memria assim que forem necessrios.
Memria virtual est intimamente relacionada com multiprogramao. Por exemplo, oito
programas de 10M cada podem ser alocados em parties de 2M em uma memria de 16M,
com cada programa operando como se tivesse sua prpria mquina virtual de 2K. 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 virtual, o endereo
virtual 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
especco mapeia os endereos virtuais nos endereos da memria fsica como ilustrado na
Fig. 4.8.
Um exemplo de como este mapeamento se processa mostrado na Fig. 4.9. Neste exemplo,
temos um computador que pode gerar endereos de 16 bits, de 0 at 64K. Estes so os endereos
virtuais. 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 do programa deve estar presente no
disco e segmentos do programa podem ser trazidos para a memria pelo sistema a medida que
se tornem necessrios.

4.3 Memria Virtual

74

Processador

CPU
Endereo
Virtual

Memria

Controle
de Disco

MMU

Endereo Fsico
Barramento

Fig. 4.8: A posio e funo da MMU


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.
Espao de Endereamento
Virtual - Tabela
0
1

Espao de Endereamento
Real - Fsico
0

Pag. 2

Pag. 0

Pag. 1

Pag. 1

Pag. 6

Pag. 2

Pag. 0

Pag. 3

Pag. 4

Pag. 4

Pag. 3

Pag. 5

xxx

Pag. 6

4096

Endereos Virtuais

8192

12288

16384

4
5

Considere um Computador que pode gerar


endereos de 16 bits, de 0 at 65535 bytes.

Este Computador tem no entanto somente


32768 bytes de Memria Fsica

20480
24576

Endereos Reais

28678

Pag. 7

xxx

32767

8
xxx
9
Pag. 5

page frame

10
xxx
11
Pag. 7
12
xxx
13
xxx

xxx - pgina ausente (em disco)

14
xxx
15

pgina
pgina de 4096 bytes

xxx

Fig. 4.9: Relao entre endereo virtual e endereo fsico de memria, dada pela

tabela 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

4.3 Memria Virtual

75

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 instruo 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 Fig. 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 vejamos como a MMU trabalha e porque temos de escolher um tamanho de pgina
como uma potncia de 2. Na Fig. 4.10 temos um exemplo de um endereo virtual, 8196
(0010000000000100 em binrio), sendo mapeado usando o mapa da MMU da Fig. 4.9. O
endereo virtual de 16 bits divido em um nmero de pgina de 4 bits e oset 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 (oset), podemos enderear todos os 4096 bytes dentro da uma pgina.
Endereo Virtual de Entrada 8196
0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0

O Endereo Virtual de 16 bits dividido 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
offset podemos enderear todos os 4096 bytes
dentro de uma pgina.

Tabela de Pginas
Endereo
Bit Presente
Ausente
0
010 1
1
001
1
O nmero da pgina usado como um ndice
2
110
1
110
dentro da tabela de pginas, permitindo ao
3
000
1
page frame corresponder quela pgina virtual.
4
100
1
5
011
1
6
000
0
Offset de 12 bits
7
000
0
(copiado diretamente)
8
000
0
9
101
1
10
000
0
11
111
1
12
000
0
13
000
0
14
000
0
15
000
0

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

Fig. 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 bits2 de mais alta ordem do registrador de sada, juntamente com os 12 bits do oset, o qual
copiado sem ser modicado 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.

4.3 Memria Virtual

76

4.3.2 Segmentao
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 1K 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 Fig. 4.11(a).
Descritor de Segmento

...

64 descritores de segmento p/ processo #1

proteo

ponteiro p/ tabela de pginas

Tabela de Pginas

1 Segmento
(16 Pginas)

...

...

64 descritores de segmento p/ processo #0

...

tamanho

Memria Fsica

...

Tabela de Segmentos

64 descritores de segmento p/ processo #n

4 bits

6 bits

4 bits

12 bits

Processo #

Segmento #

Pgina #

Off-Set na Pgina

ndice do Segmento
Endereamento Virtual de 22 bits

Fig. 4.11: (a) MMU usada em muitos computadores baseados no 68000; (b) endereamento
virtual para um sistema de 4M
Cada um dos descritores de segmento contm um tamanho de segmento (0 a 16 pginas),
bits de proteo informando 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 em um 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

4.4 Algoritmos de Troca de Pgina

77

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 multiplicados por 16 processos.
Verica-se ento os bits de proteo no descritor de segmentos para ver se o acesso permitido. Se o for, a MMU ento verica o nmero da pgina extrada do endereo virtual com
o tamanho do segmento no descritor de segmentos, para vericar 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 em
uma 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 enviado ao barramento.
Uma das caractersticas chave deste modelo que quando o sistema operacional escolhe um
processo, apena o registrador do nmero de 4 bits do processo alterado. Isto faz com que no
tenha que recarregar todas as tabelas de segmento ou de pgina. Dois ou mais processos podem
dividir um segmento se seus descritores de segmentos apontam para a mesma tabela de pginas.
Qualquer mudana feita por um processo em uma pgina deste segmento automaticamente
visvel para os outros processos.
Enquanto o modelo da Fig. 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 maiores 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 pode-riamos suportar 64 segmentos de 1M
por processo, por exemplo.

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 m de dar lugar que ser trazida do disco. Se a pgina a ser removida
foi modicada 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.
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 ecientes 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.

4.4 Algoritmos de Troca de Pgina

78

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 algoritmo 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 em um
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 modicao, 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, permitindo 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 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
classica em 4 categorias baseado nos valores correntes de seus bits R e M :
Classe 0 : no referenciada, no modicada.
Classe 1 : no referenciada, modicada.
Classe 2 : referenciada, no modicada.
Classe 3 : referenciada, modicada.
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.

4.4 Algoritmos de Troca de Pgina

79

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 algoritmo 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 modicada que no foi referenciada pelo menos no ltimo tick de relgio
(tipicamente 20 mseg), que uma pgina no modicada mas muito usada. As caractersticas principais do NRU que ele fcil de entender, eciente 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 m a instalada mais recentemente. Em uma falta de pgina,
a pgina da cabea removida e a nova pgina acrescentada no m da lista.
Uma simples modicao 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 modicada), 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 m 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 em uma lista circular.
Em vez de colocar as pginas no m da lista para dar a elas uma segunda chance, o ponteiro
da cabea da lista simplesmente avanado uma pgina, produzindo o mesmo efeito.

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, retira-se 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 nal. A diculdade
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

4.5 Gerenciamento de Memria no UNIX

80

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) referenciadas no comeo da execuo de um programa permanecem com
um contador alto at o nal da execuo. Felizmente, uma pequena modicao no NFU faz
com que este seja capaz de simular LRU muito bem (o algoritmo modicado denominado
Aging ). A modicao tem 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 uma 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
signicativos 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 nito
de bits (tipicamente 8). Portanto, no podemos classicar 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 [3, 2]. Verses atuais empregam
o esquema de paginao por demanda, que descreveremos a seguir.

4.5 Gerenciamento de Memria no UNIX

81

4.5.1 Paginao por Demanda


Este esquema necessita da habilidade do hardware de reiniciar uma instruo interrompida
pela ausncia de pgina cujo endereo foi referenciado na instruo. Assim que a pgina
trazida para a memria, a instruo 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 ns 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 dimenso xa 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: ag que indica que esta pgina est sendo compartilhada para ns
de leitura, devendo ser desmembrada caso alguns dos processos que a compartilham altere
seu contedo;
modicao: ag que indica se o processo modicou o contedo da pgina recentemente;
referncia: ag que indica se o processo referenciou o contedo da pgina recentemente;
validade: ag 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

nmero do bloco alocado pgina;

o tipo da pgina:
mais adiante).

swap

com rea disponvel para ler/gravar o contedo da pgina;

swap,

arquivo executvel,

demand ll

demand zero

(denidos

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.

4.5 Gerenciamento de Memria no UNIX

82

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 beneciar a ecincia do esquema de paginao, diminuindo o nmero de consultas s
tabelas.
A Fig. 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.
Endereo Virtual 1493 K
Tabela de Pgina

Descritor de Bloco

Tabela de Frame

Tabela de Swap

Registro da Tabela de Pgina

Descritor do Bloco

Pgina 794

Dispositivo Swap #1 Bloco #2743

Memria Fsica

Tabela em Uso
Frame 794
Contador Ref. #1
Contador Ref. #1
Disp. Swap #1

Pgina Fsica
Nro. #794

Bloco #2743

O contedo desta pgina pode estar em


memria ou no dispositivo de swap #1,
bloco 2743.

Memria
Secundria

rea de Swap

Fig. 4.12: As vrias estruturas de dados empregadas para gerenciamento de memria

A Chamada fork em um Sistema Paginado

A Fig. 4.13 ilustra a situao imediatamente aps uma chamada de sistema fork em um
sistema paginado. A rea de texto no duplicada tendo tanto o processo pai quanto o lho 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
tabelas 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,
signicando 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.

4.5 Gerenciamento de Memria no UNIX

83

Texto

Dados e
Pilha

Dados e
Pilha

Registro de Texto

Registro de Dados/Pilha
Processo Pai

Registro de Dados/Pilha
Processo Filho

Contador de Ref. #2
Registros Tab. Pginas

Contador de Ref. #1
Registros Tab. Pginas

Contador de Ref. #1
Registros Tab. Pginas

...

End. Virtual 97 K Pg. 613

...

End. Virtual 97 K Pg. 613

...

End. Virtual 24 K Pg. 967

...

Texto

...

pregion do
Processo Filho

...

pregion do
Processo Pai

Frame 967

Frame 613

Contador Ref. #1

Contador Ref. #2

Disp. Swap #k

Disp. Swap #p

Bloco #n

Bloco #s

Fig. 4.13: Situao aps um fork em um sistema paginado


A Chamada exec em um Sistema Paginado

Durante uma chamada exec, o ncleo carrega o programa executvel do disco para a memria. Em um 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 ll 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 ll (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

4.5 Gerenciamento de Memria no UNIX

84

correspondente no vetor (ver Fig. 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.
Regio
inode

Tabela de Pgina

Descritor de Bloco

Tabela de Frame

Tabela de Swap

Registro da Tabela
de Pgina

Bloco Lgico #84

Pgina #n

Dispositivo Swap #p
Bloco #k

inode

Lista de
Blocos
0

...

adicionada
ao inode

279

Fig. 4.14: Lista de blocos adicionada ao

inode

84

durante a carga de um executvel

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 Fig. 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 em uma 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 bit de validade reativado.

4.5 Gerenciamento de Memria no UNIX

85

Pgina Referenciada - idade zerada

Memria Fsica

...

Pgina Pronta
para Swap

Memria
Secundria

swap-out

Pgina No Referenciada - idade aumentada

rea de Swap
swap-in

Fig. 4.15: Fila de pginas candidatas a permuta

4.5.3 Falta de Paginao


Quando um processo referencia uma pgina cujo bit de validade esteja apagado, o processo
incorre em uma 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 em um
dos cinco estados abaixo:
1. no dispositivo de swap e no em memria;
2. em memria, na lista de pginas livres;
3. em um arquivo executvel sendo carregado;
4. marcada como

demand ll ;

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.
No segundo caso, se a pgina desde quando adicionada lista livre no for 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 atravs do descritor de bloco encontra no 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 um 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 Gerenciamento de Memria no UNIX

86

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 em uma pgina marcada como READ ONLY, por exemplo, na
sua prpria rea de texto.
2. O processo tenta escrever em uma 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, 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
permisso 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. O sistema operacional 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) [1]. O cdigo de entrada/sada representa uma frao
signicativa do total do sistema operacional. A forma como o sistema operacional gerencia E/S
o objeto deste captulo.

5.1 Princpios do Hardware


Diferentes prossionais vem o hardware de E/S de diferentes maneiras. Engenheiros eletrnicos vem em termos de chips, os, 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 suportadas, e os erros que
so reportados. O nosso interesse aqui restringir em como o hardware programado, e no
como ele trabalha internamente.
Dispositivos de E/S

Dispositivos de E/S podem ser divididos em duas grandes categorias: dispositivos de bloco e
dispositivos de caracteres. Um dispositivo de bloco armazena informaes em blocos de tamanho
xo, 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 a possibilidade de ler ou
escrever cada bloco independentemente de todos os demais. 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 caracteres, libera ou aceita uma la de caracteres
sem denir nenhuma estrutura de bloco. O dispositivo no enderevel e no aceita operaes
de busca. Terminais, impressoras e leitoras ticas so exemplos de dispositivos de caracteres.
Este esquema de classicao apresenta excees. Relgios, por exemplo, geram interrupes em intervalos regulares, ou seja, no so endereveis por bloco nem aceitam las de
caracteres. Contudo, este modelo geral o suciente 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, e deixa a parte dependente
87

5.1 Princpios do Hardware

88

do dispositivo para o software de mais baixo nvel, chamado acionadores de


drivers).

dispositivos (device

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.
A distino entre dispositivo e controlador deve ser ressaltada, j que o sistema operacional v o controlador, no o dispositivo. Normalmente, mini e microcomputadores usam um
barramento nico (Fig. 5.1) para comunicao entre CPU e os controladores. Mainframes
frequentemente usam um modelo diferente, no qual mltiplos barramentos e processadores
especializados de E/S aliviam parte da carga da CPU.

Interface Controlador/Dispositivo

CPU

Memria

Controladores
de Disco

Controlador
de Impressora

...

Outros
Controladores

Fig. 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 nalmente 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 montado, bit por bit, em
um buer mantido no controlador. Aps o checksum ter sido vericado e o bloco declarado
livre de erro, o mesmo pode ento ser copiado para a memria principal.
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 smbolo 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 retrace horizontal aps 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
diretamente 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.

5.1 Princpios do Hardware

89

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 Tab. 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 decodicador 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 exvel
porta serial primria

endereo de E/S

vetor interrupo

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

8
9
11
13
15
14
12

Tab. 5.1: Exemplos de controladores no IBM PC com seus endereos e vetores de interrupo.
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 e 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.
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 buer interno do
controlador. Depois, o controlador executa a operao de checksum para atestar que o bloco
est livre de erros. 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 buer do controlador
(byte a byte ou palavra a palavra) em uma 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 A
Fig. 5.2 ilustra todo este processo.
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

5.2 Princpios do Software

Memria

CPU

90

Unidades de Disco

Buffer

Controlador
de Disco

Registradores
End. Memria
Contador

Barramento

Fig. 5.2: A transferncia via DMA processada sem interveno da CPU


endereo de memria suprido pela CPU quando da requisio da operao. A partir da,
a cpia prossegue incrementado-se 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 buer requisitado j se encontra em 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 hardware e as mais altas apresentando-se de forma simples para o usurio.
Objetivos do Software de E/S

O conceito chave no projeto do software de E/S a independncia do dispositivo. Programas


que utilizam arquivos devem operar independentemente do local onde o arquivo encontra-se
armazenado. Relacionado com a independncia 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, o
mesmo deve tentar corrig-lo, 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 (bloqueantes) 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

5.2 Princpios do Software

91

realiza as operaes de forma assncrona, mas para o usurio ela se apresenta como transferncia sncrona pois o processo permanecer bloqueado at a operao ser nalizada (o que torna
muito mais simples a programao).
O conceito nal 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
nalize 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 eciente 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.
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.
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.
Drivers de Dispositivos

Todo o cdigo dependente do dispositivo se concentra no driver do dispositivo. Cada driver


manipula um dispositivo ou uma classe de dispositivos intimamente relacionados.
Observamos 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 estes registradores e para que
so utilizados. O driver reconhece setores, trilhas, cilindros, cabeas de leitura/escrita, motor,
fator de entrelaamento e todos os mecanismos que fazem um disco operar propriamente.
Em termos gerais, a funo 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 em
uma la de requisies pendentes.
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.

5.2 Princpios do Software

92

O primeiro passo transcrever os termos abstratos da requisio para aes concretas. Para
um disk driver, por exemplo, isto signica informar onde o bloco se encontra no disco, vericar
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, o driver 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 processados 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 vericar 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 la, uma delas pode agora ser selecionada e iniciada. Caso contrrio,
o driver ca aguardando a prxima requisio.
Software de E/S Independente do Dispositivo

Embora alguns dos softwares de E/S sejam especcos 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 se concentrar nos drivers, por ecincia e por outras razes. As funes
listadas abaixo so tipicamente implementadas no software independente do dispositivo:
interface uniforme para com os

drivers

de dispositivos;

identicao simblica dos dispositivos;


proteo dos dispositivos;
manipulao de blocos independente dos dispositivos;
buferizao;
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, alm de prover uma interface uniforme para o software do
usurio.

5.2 Princpios do Software

93

A questo principal em um sistema operacional como objetos tais como os arquivos e


dispositivos de E/S so identicados. 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 dispositivos se
localizam no diretrio /dev e o usurio tem permisso 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 outros sistemas, 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 nico 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 caracteres. 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
caracteres, pode ser interessante coletar caracteres em um buer e submete-los em conjunto
para o dispositivo (requerendo, portanto, buferizao).
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 driver.
Alguns dispositivos, tais como as tas magnticas, devem ser usadas somente por um nico
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 o erro. Se ocorreu em um arquivo
do usurio, suciente informar o erro para o mesmo. Entretanto, se o erro ocorreu em uma
rea crtica, o sistema operacional deve apresentar uma mensagem e, eventualmente, solicitar
interveno do administrador.
Software no Nvel do Usurio

Embora muito do software de E/S esteja embutido no sistema operacional, uma pequena
poro deste 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

5.3 Discos Rotativos

94

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 arquivo permanea com o processo
aberto por vrias horas. Nenhum outro processo poder imprimir. Para estes casos, cria-se 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 armazena 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
monopolizao eliminado.
Spooling no somente usado para impressoras, sendo igualmente usado em outras situaes. Por exemplo, transferncia de mensagens de correio eletrnico se processa atravs de
um network daemon. Para enviar uma mensagem, o aplicativo armazena-a em um diretrio de
spooling. Periodicamente, o network daemon acessa o diretrio e transmite todas as mensagens
armazenadas.
A Fig. 5.3 resume o sistema de E/S, mostrando todas os nveis bem como as funes
principais de cada nvel.
Camada

Funcionalidades

Processos do Usurio

Executa Operao de Entrada/Sada

Software Independente
do Dispositivo

Identificao, Proteo, Bloqueio


Bufferizao

Drivers de Dispositivos

Inicia Registradores do Dispositivo


verifica status da operao

Gerenciadores de Interrupo

Desbloqueia o Driver quando a


operao de entrada/sada se completa.

Dispositivos

Executa fisicamente a operao de E/S

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

5.3 Discos Rotativos


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

drivers

5.3 Discos Rotativos

95

5.3.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 32 a 128. Todos os setores contm o mesmo
nmero de bytes, embora setores no anel externo do disco sejam sicamente 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 consideravelmente o tempo mdio de acesso.

5.3.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 rotacional (tempo para o
setor desejado car 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 dispositivo
Algoritmos de Escalonamento do Brao do Disco

Se o

aceita uma requisio por vez e a executa nesta ordem, isto , First-Come,
pouco pode ser feito para otimizar o tempo de seek. Entretanto, outra
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, indexada pelo nmero do cilindro, com todas as requisies
pendentes para cada cilindro, encadeadas juntas em uma lista.
Para este tipo de estrutura de dados, podemos melhorar o algoritmo de escalonamento
First-Come, 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
apresentadas na Fig. 5.4.
disk driver

First-Served (FCFS),

Posio Incial

10

15

20

25

30

35

39
Cilindro

Fig. 5.4: Algoritmo de escalonamento

menor seek primeiro

(SSF)

5.3 Discos Rotativos

96

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 percorrendo 10, 35, 20, 18, 25, e 3 cilindros,
totalizando 111 cilindros.
Alternativamente, a prxima requisio pode ser manuseada a m de minimizar o tempo
de seek. Dadas as requisies da gura 5.4, a sequncia 12, 9, 16, 1, 34, e 36, como mostrado
na linha segmentada da Fig. 5.4. Com esta sequncia, os movimentos do brao percorrem 1, 3,
7, 15, 33, e 2 cilindros, totalizando 61 cilindros. Este algoritmo, menor seek primeiro (SSF),
diminuiu o total de movimentos do brao pela metade, comparado com o FCFS.
Infelizmente, SSF apresenta um problema. Suponha mais requisies chegando enquanto as
requisies da Fig. 5.4 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 discos 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 conito.
Um algoritmo para reconciliar os objetivos conitantes entre a ecincia e equitatividade
constitui-se 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 requisio termina, o disk driver testa o bit. Se for UP, o brao movido
para a prxima requisio pendente de posies mais altas, se houver. Se no houver 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 Fig. 5.5 ilustra o algoritmo do elevador usando as mesmas sete requisies da Fig. 5.4,
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, totalizando
60 cilindros. Neste caso, o algoritmo do elevador sensivelmente 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 xado: ele apenas duas
vezes o nmero de cilindros.
Posio Incial

10

15

20

25

30

35

39
Cilindro

Fig. 5.5: 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 estes 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 em um cilindro, requisies consecutivas podem ser conduzidas para
diferentes trilhas sem qualquer penalidade. O controlador pode selecionar alguma das cabeas
instantneamente, uma vez que seleo de cabea no involve movimento dos braos nem atraso

5.3 Discos Rotativos

97

rotacional.
Manipulao de Erros

Discos rotativos esto submetidos a 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

permanente (i.e. bloco do disco sicamente danicado);

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 de 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 em uma tarefa rdua. Alguns controladores inteligentes reservam algumas poucas trilhas, no 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 ocorreu.
Alguns computadores corrigem o erro de seek automaticamente, enquanto outros simplesmente atribuem um bit de erro e deixam o resto para o driver. O driver manipula este erro
pela emisso de um comando recalibrate, que ajusta os movimentos do brao aos cilindros
do disco. Caso esta operao no solucione o problema, o dispositivo deve ser reparado.
Como temos visto, o controlador um pequeno computador especializado, contendo software, variveis, buers, e ocasionalmente bugs. Algumas vezes uma sequncia no usual de
eventos, tal como uma interrupo sobre um dispositivo ocorrendo simultaneamente com um
comando recalibrate para outro, expe o bug e causa o controlador entrar em loop ou perderse do estava fazendo. Projetistas de controladores usualmente consideram a pior situao e

5.4 Entrada/Sada no UNIX

98

provem um pino no chip, o qual, quando em nvel alto, fora o controlador esquecer sua tarefa
corrente, reiniciando-o. 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 internamente um 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 buer 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 dispositivo 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.4 Entrada/Sada no UNIX


Drivers Convencionais

Dispositivos no UNIX podem ser do tipo bloco ou caracteres. 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 [3, 2].
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 modo bloco, a transferncia de dados entre o espao de
endereamento de um processo e o dispositivo de d via buer cache (ver Cap. 3). A razo para
tal que tais dispositivos (discos, por exemplo) so lentos, sendo portanto a buferizao um
meio de aumentar a taxa de transferncia de dados. Dispositivos do tipo caracteres (terminais,
por exemplo) so inerentemente rpidos e no necessitam deste recurso.
A Fig. 5.6 apresenta 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 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.

5.4 Entrada/Sada no UNIX

open

close

read

write

99

open
mount

ioctl

close
umount

read

write

Rotina do
Cache de Buffers

Tabela de Chaveamento
(dispositivos orientados a caracter)

open

close

read

write

Tabela de Chaveamento
(dispositivos orientados a bloco)

open

ioctl

close

strategy

Driver

Driver

Gerenciador de Interrupoes

Gerenciador de Interrupoes

Vetor de Interrupo
interrupes
Dospositivo

Dospositivo

Dospositivo

Fig. 5.6: Esquema bsico de E/S no UNIX


Uma chamada close faz com que o ncleo acesse o respectivo procedimento para o dispositivo, cuja identicao obtida na tabela de arquivos.
Chamadas ioctl permitem o usurio operar tanto arquivos regulares quanto dispositivos
do tipo caracteres. Operaes tpicas so:
bloquear um arquivo;
desligar o eco do terminal;
ajustar taxa de transferncia de modens;
reenrolar uma ta.
Para dispositivos do tipo bloco, chamadas read e write seguem o mesmo procedimento.
Para tais dispositivos, na qual o driver tem que interagir com as rotinas de buer 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 identica a rotina
strategy denida para o dispositivo, passando mesma o endereo do cabealho do buer
para onde os dados devem ser copiados, caso leitura, ou contendo os dados para escrita.

5.4 Entrada/Sada no UNIX

100

Streams

um conceito que prov maior modularidade na implementao de drivers para dispositivos do tipo caracteres (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 (Fig. 5.7). 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 Fig. 5.7 ilustra um driver de terminal empregando o conceito de
stream.
Stream

inode do Arquivo
do Dispositivo

Cabea do Stream

write

read

Fila de Entrada

Fila de Sada

put
Disciplina de Linha

Fila de Entrada

push
Fila de Sada

put
Driver do Terminal

Fig. 5.7:

Driver

Fila de Entrada

push
Fila de Sada

de terminal composto de um

stream

com trs pares de listas

Quando um processo escreve dados em um 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 em uma 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 la de itens aguardando passagem para a para a prxima lista no
stream ;
campos utilizados para o controle de uxo, escalonamento de servios. etc.

5.4 Entrada/Sada no UNIX

101

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


de chaveamento de dispositivo.
O uxo 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. Uma chamada open causa a criao
do stream, com um conjunto de blocos para o uxo de mensagens.
Quando um processo escreve em um 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 invocando 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 destrudos
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 (prximos ao
dispositivo).

Bibliograa
[1] Andrew Tanenbaum.
ISBN 0-13-595752-4.

Modern Operating Systems .

Massachusetts Addison-Wesley, 1984.

[2] Uresh Vahalia. UNIX Internals: The New Frontiers . Prentice Hall, Upper Saddle River,
New Jersey 07458, 1996. ISBN 0-13-101908-2.
[3] Maurice J. Bach. The Design of The UNIX Operating System . Prentice Hall Software
Series, Englewood Clis, New Jersey 07632, 1990. ISBN 0-13-201799-7.

102