Professional Documents
Culture Documents
Eleri Cardozo
FEEC - UNICAMP
Lus F. Faina
Faculdade de Computao
Universidade Federal de Uberlndia
Janeiro de 2001
Campinas, SP - Brasil
Sumrio
Lista de Figuras
iv
Lista de Tabelas
vi
Introduo
1.1
1.2
1.3
1.4
1.5
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 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
.
.
.
.
.
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
de Arquivos
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
20
20
20
21
22
23
24
25
26
29
31
35
44
44
45
53
55
57
57
60
63
64
66
SUMRIO
4.2
4.3
4.4
4.5
5.4
6
Entrada/Sada
5.1
5.2
5.3
Princpios do Hardware . .
Princpios do Software . .
Discos Rotativos . . . . .
5.3.1 Hardware do Disco
5.3.2 Software do Disco .
Entrada/Sada no UNIX .
Tpicos Especiais
6.1
6.2
6.3
6.4
iii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Referncias Bibliogrcas
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
(OS/2)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
67
68
70
70
72
73
74
75
75
78
79
79
80
81
81
82
83
86
87
88
89
89
92
96
97
97
100
104
104
104
107
108
109
109
109
109
110
110
111
111
113
114
117
121
Lista de Figuras
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
8
13
14
15
15
17
18
19
2.1
2.2
2.3
2.4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
30
31
38
3.1
. 46
. 47
.
.
.
.
.
48
49
50
51
52
. 53
. 58
. 59
. 67
. 68
. 69
. 71
. 72
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 . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
78
84
85
86
87
5.1
5.2
5.3
5.4
5.5
5.6
5.7
90
92
96
97
98
101
102
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
6.10
Ambiente POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Layout de um processo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Layout de uma thread . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Estrutura de prioridades no OS/2 . . . . . . . . . . . . . . . . . . . . . .
Traduo de endereo no modo protegido do 80286 . . . . . . . . . . . .
Conjunto de registradores do 80386 . . . . . . . . . . . . . . . . . . . . .
Descritor de segmento no 80386 . . . . . . . . . . . . . . . . . . . . . . .
Endereo linear no 80386 . . . . . . . . . . . . . . . . . . . . . . . . . . .
Converso de endereo segmentado em linear e linear em fsico no 80386 .
Entrada da tabela de pginas no 80386 . . . . . . . . . . . . . . . . . . .
105
107
108
118
119
119
119
120
120
120
4.7
4.8
4.9
4.10
4.11
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 72
. 73
. 76
. 76
. 77
.
.
.
.
.
.
.
.
.
.
Lista de Tabelas
2.1
5.1
6.1
Grupos representativos dos padres de interface do IEEE para programas aplicativos. O standard 1003.1 est completo (ISO 9945.1); os standards 1003.2 a
1003.6 3 1003.9 encontram-se prximo de uma verso nal; os demais standards
esto ainda em discusso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
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.
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 software de sistema o sistema operacional, que controla todos os
recursos do computador e proporciona a base de sustentao para a execuo de programas
aplicativos.
Um computador moderno composto de vrios subsistemas tais como processadores, memrias, 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.
Aps muitos esforos mal sucedidos de se construir computadores digitais antes da 2a guerra
mundial, em torno da metade da dcada de 1940 alguns sucessos foram obtidos na construo de
mquinas de clculo empregando-se vlvulas e rels. Estas mquinas eram enormes, ocupando
salas com racks que abrigavam dezenas de milhares de vlvulas (e consumiam quantidades
imensas de energia).
Naquela poca, um pequeno grupo de pessoas projetava, construia, 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
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.
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 unica
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)
prog. aplicativos
man
sh
a.out
nroff
cpp
Ncleo
find
comp
make
cc
Hardware
as
who
id
date
vi
wc
ed
grep
prog. aplicativos
8
/
usr
bin
sh ed
5bin
5include
tmp
5lib
etc
hosts
pub
dev
X11
tty00
tty01
vi
#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[])
{
*/
*/
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;
*/
10
*/
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 intepretao 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:
arquivo executvel produzido por compilao;
arquivo executvel contendo uma sequncia de linhas de comando do shell ;
comando interno do shell.
O shell normalmente executa um comando sincronamente, ou seja, espera o trmino do
processo associado ao comando antes da leitura de uma nova linha de comando. Tambm
possvel a execuo assncrona do comando. Neste caso, o shell l e executa a prxima linha
de comando sem esperar o trmino do processo associado ao comando anterior, o qual executa
em background.
Como o shell um programa que se situa no nvel do usurio, no fazendo parte do ncleo,
fcil 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:
11
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:
12
Aspectos do Hardware
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.
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 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,
Erros de Hardware
13
Prioridade
Alta
Relgio
Disco
Nveis de Interrupo
definidos pelo UNIX
Dispositivos de Rede
Terminais
Interrupo de Software
Prioridade
Baixa
14
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
inter-processos
buffer cache
escalonador
caractere
bloco
gerenciamento
de memria
drivers de dispositivo
Controle do Hardware
ncleo
hardware
Hardware
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
TDAU
15
A gura 1.5 ilustra o uso das tabelas TDAU, TA e de inodes. Note nesta gura um link
onde dois campos na TDAU apontam para o mesmo campo na TA.
Tabela Descritora de
Arquivo do Usurio
Tabela de Arquivo
Tabela deInodes
super
bloco
lista de inodes
blocos de dados
16
Processos
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)
direo de
crescimento
da pilha
quadro 3
call write
end. do quadro 1
end. de retorno aps
chamada do copy
parmetros do copy
(old, new)
variveis locais
(fdold, fdnew)
Pilha do Ncleo
quadro 2
call copy
end. do quadro 0
end. de retorno aps
chamada do main
parmetros do main
(argc, argv)
quadro 1
call main
processamento da
chamada write
Tabela de
Regies
Informaes de Controle
e Status sobre o Processo
pregion
18
Tabela de Processos
Memria Primria
O contexto de um processo o estado denido pelo seu texto correspondendo aos valores
das suas variveis globais e estruturas de dado, os valores dos registros de mquina usados, os
valores armazenados no seu slot na tabela de processos e na rea U e o contedo das suas
pilhas de usurio e ncleo. Quando o ncleo decide executar um novo processo realiza-se uma
mudana de contexto.
Quando da realizao de uma mudana de contexto o ncleo salva informaes 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 (gura
1.9):
executando no modo usurio;
19
executando em
modo usurio
executando em
o
nd
modo ncleo
na
o
l
a
esc
evento
retorno
2
interrupo
ev
en
to
bloqueado em
memria
4
Fig. 1.9: Estados de um processo
O ncleo protege a sua consistncia permitindo chaveamento de contexto apenas quando o
processo transita do estado executando no modo ncleo para o modo bloqueado. O ncleo
tambm eleva o nvel de execuo do processador quando da execuo de regies crticas de
modo a impedir interrupes que possam provocar inconsistncias em suas estruturas de dados.
O escalonador de processo realiza, periodicamente, a preempo de processos executando no
modo usurio de forma a que os processos no monopolizem a CPU.
Captulo 2
Processos
2.1 Introduo
No captulo anterior 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.
20
2.1 Introduo
21
que regies crticas delimitando diferentes recursos podem ser executadas por diferentes processos ao
mesmo tempo.
2.1 Introduo
22
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
> 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 outas palavras, a instruo TSL
indivisvel mesmo frente a interrupes de hardware).
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 implementadas com instrues TSL.
Contadores de Evento
v.
2.1 Introduo
24
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
25
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.
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
26
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.
27
Transies de Estado
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.
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 execuco no modo ncleo (estado 2). Suponha que o processo
requeira uma operao de E/S do disco. O ncleo coloca o processo no estado 4 (dormindo
em memria) at que o processo seja 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 gura 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
29
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
Escalonamento
por Prioridades
nvel de usurio 0
nvel de usurio 1
prioridade em
modo usurio
...
passvel de
interrupo
nvel de usurio N
31
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
Tabela de
inodes
32
Como pode-se observar na gura, 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:
/*
*/
/*
a nica maneira do novo processo conhecer o valor destes descritores atravs da passagem de
parmetros via argc e argv.
33
/*
*/
/* prog1 */
main(int argc, char *argv[])
{
int fd1, fd2;
/* 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:
"C );
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
suspeno da execuo
continuao da execuo
mudane. status de proceso lho
34
*/
35
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
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 default. Caso
contrrio, prossiga.
3. Associa temporariamente a ao default para o sinal.
4. Cria um novo quadro na pilha como se o processo estivesse evocando o gerenciador neste
momento.
5. Direciona o contador de programa para o endereo da rotina gerenciadora do sinal e
atualiza o stack pointer para levar em conta o aumento da pilha causado pela chamada
do gerenciador.
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.
36
Pipes
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);
}
else
{ /* FILHO */
close(fd[1]);
read(fd[0], buff, 32);
printf("%s", buff);
close(fd[0]);
*/
37
exit(0);
}
/*
*/
Mensagens
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
38
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 (gura 2.4).
rea U
pregion Processo 2
Tabela de Regies
pregion Processo 1
Tabela de Memria
Compartilhada
Tabela de Processos
Memria Primria
*/
#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]
poema[1]
poema[2]
poema[3]
poema[4]
poema[5]
poema[6]
poema[7]
=
=
=
=
=
=
=
=
#include
#include
#include
#include
<stdio.h>
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>
#define KEY 67
extern char *shmat();
main()
{
39
40
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\n");
}
printf("\n%s", poema[i]);
/*
*/
Semforos
struct sembuf {
short sem_num;
short sem_op;
short sem_flag;
};
/* indice do semaforo */
/* operacao requisitada */
/* controle da operacao */
41
#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;
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]
=
=
=
=
=
=
=
=
while(1)
{
DOWN(semid);
/* entrada na Regiao Critica */
for(i = 0; i < 8; i++)
{
printf("\n%s", poema[i]);
sleep(1);
}
printf("\n\n");
42
}
/*
UP(semid);
}
43
*/
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.
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 aquivo:
45
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
digitar
cp abc /dev/tty
para copiar um arquivo abc para o terminal (arquivo especial /dev/tty).
Em muitos sistemas, arquivos regulares so subdivididos em diferentes tipos em funo de
sua utilizao. Os tipos so identicados pelos nomes com que os arquivos regulares terminam.
Por exemplo,
46
arquivo
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
alguns sistemas operacionais, notadamente os voltados computao de tempo-real, onde o armazenamento contnuo adotado por razes de desempenho.
47
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)
...
42
136
45
127
65
254
321
342
123
415
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
48
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
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
Allocation TableFAT) que contm um registro para cada bloco do disco. O registro no diretrio
para cada arquivo fornece o endereo inicial do arquivo na FAT. Cada unidade da FAT contm
o nmero do prximo bloco do arquivo. O arquivo A comea no bloco 6, ento o registro 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:
1. dado que mais que um arquivo no podem 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
49
...
...
...
...
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
...
...
...
...
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
50
16
CPM
nome do arquivo
tipo
(extenso)
contador
de bloco
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
51
.
..
bin
dev
lib
etc
usr
tmp
var
pub
inode #6
blk = 132
diretrio /usr
no bloco 132
.
..
clt
ral
mfm
ec
wst
lpm
inode #51
blk = 416
.
..
cursos
papers
mbox
pvm
diretrio /usr/mfm
no bloco 416
/usr/mfm/mbox no
inode #85
52
diretrio raiz
subdiretrio
diretrio
de usurio
.
..
cursos
papers
mbox
Diretrio do Usurio B
53
6
539
85
.
..
java
mbox
53
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.
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.
54
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 disketes 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
55
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 atribuidos a outros arquivos. Novamente, a
soluo forar o contador do inode para o nmero real de registros do diretrio (obtidas pelo
utilitrio).
Estas duas operaes, 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.
56
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 buerizao 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-
57
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.
58
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
59
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
f(b) = b mod 4
fila hash
cabea
cauda
Fig. 3.10: Estrutura do cache de buers : la de hash e lista de buers livres
60
61
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 inode em memria contm os seguintes campos em adio aos campos do inode
em disco:
status do inode na memria indicando:
- o inode est trancado;
- processo encontra-se esperando que o inode seja liberado;
- a representao do inode na memria difere da cpia do disco devido a mudanas nos
dados do inode ;
- a representao do arquivo na memria difere da cpia do disco devido a mudanas nos
dados do arquivo;
- o arquivo um mount point.
o nmero do dispositivo lgico do sistema de arquivos que contm o arquivo;
o nmero do inode. O inode no disco no necessita deste nmero pois os inodes so
armazenados em um arranjo linear no disco;
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.
62
no do bloco: ((no do inode -1) / nmero de inodes por bloco) + nmero do bloco inicial
da lista de inodes
oset : ((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
63
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
64
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
65
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. 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.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).
66
0xFFF...
Sist. Oper. em
Memria ROM
67
0xFFF...
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
Quando o sistema organizado dessa maneira, somente um processo pode estar em execuo
por vez. O usurio entra com um comando no terminal, e o sistema operacional carrega o
programa requerido do disco para a memria e o executa. Quando o processo termina, o
sistema operacional reassume a CPU e espera por um novo comando para carregar um outro
processo na memria j liberada pelo primeiro.
68
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
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
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.
Partio 4
Partio 4
700 KB
Partio 3
700 KB
Partio 3
400 KB
Partio 2
400 KB
Partio 2
200 KB
Partio 1
Sistema
Operacional
69
200 KB
Partio 1
100 KB
0 KB
Sistema
Operacional
100 KB
0 KB
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
programing with a Fixed number of Task). Ele simples de se entender e igualmente simples
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
70
A soluo de proteo adotada pela IBM na famlia 360 foi dividir a memria em blocos
de 2K bytes e atribuir um cdigo de proteo de 4 bits para cada bloco. A cada processo
atribuido um cdigo nico de 4 bits, gravado tambm nos blocos de memria que ele ocupa. Este
cdigo parte do registro PSW (program status word) quando o processo tem a posse da CPU.
O hardware protege qualquer tentativa de programa em execuo de acessar a memria cujo
cdigo de proteo difere daquele presente na PSW. Desde que somente o sistema operacional
pode mudar os cdigos de proteo dos blocos de memria e dos processos, processos do usurio
esto protegidos de interferncias entre s e com o sistema operacional.
Uma soluo alternativa, adotada por praticamente todos os microprocessadores atuais,
para realocao e proteo equipar a mquina com dois registradores especiais no hardware,
chamados de registradores de base e limite. Quando um processo escalonado, o registrador de
base carregado com o endereo do comeo da sua partio, e o registrador limite carregado
com o tamanho da partio. Cada endereo de memria referenciado tem o contedo do
registrador de base a ele adicionado antes de ser enviado para o barramento de acesso memria.
Por exemplo, se o registrador de base for 100K, uma instruo CALL 100 efetivamente
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.
71
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 intito de criar espao na memria. Se o processo no puder crescer
na memria e a rea do disco reservada para abrigar processos permutados estiver cheia, o
processo deve ser terminado.
Se for esperado que muitos processos crescero na memria quando executados, uma boa
poltica seria alocar uma pequena rea extra toda vez que o processo permutado ou movido.
Contudo, quando os processos so permutados para o disco, somente a rea de memria atualmente em uso deve ser copiada, sendo desnecessrio permutar a rea extra de memria. A
Fig. 4.5(a) mostra a conFig.o da memria na qual a rea para crescimento foi alocada para
os dois processos.
72
B - pilha
A - pilha
espao para crescimento
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.
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
73
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
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 quarda 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.
74
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.
75
4.3.1 Paginao
A maioria dos sistemas com memria virtual usa uma tcnica chamada paginao. Em
qualquer computador existe certo conjunto de endereos de memria que programas podem
referenciar. Quando um programa usa uma instruo como MOVE REG,1000, ele est movendo
o contedo do endereo de memria 1000 para o registrador REG (ou vice versa, dependendo do
computador). Endereos podem ser gerados usando indexao, registradores base, registradores
de segmento, dentre outras maneiras.
Estes endereos gerados pelos programas so chamados endereos virtuais e formam o espao
virtual de endereamento do processo. Em computadores sem memria vitual, o endereo
virtual 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
vituais. Este computador, entretanto, tem somente 32K de memria fsica, assim, embora
programas de 64K possam ser escritos, eles no podem ser carregados para a memria na sua
totalidade para serem executados. Uma cpia completa 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.
76
Processador
CPU
Endereo
Virtual
Memria
Controle
de Disco
MMU
Endereo Fsico
Barramento
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
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
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
77
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
78
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
...
proteo
Tabela de Pginas
1 Segmento
(16 Pginas)
...
...
...
tamanho
Memria Fsica
...
Tabela de Segmentos
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
79
80
O algoritmo da pgina tima simplesmente diz que a pgina com o maior rtulo deve ser
removida, adiando-se o mximo possvel a prxima falta de pgina.
O nico problema com este algoritimo que ele no realizvel. No momento da falta
de pgina, o sistema operacional no tem como saber quando cada pgina ser referenciada.
(Observamos facilmente uma situao similar com o algoritmo menor job primeiro - como
pode o sistema dizer qual job o menor?). No mximo podemos executar um programa 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).
81
Interrupes de relgio no zeram o bit M porque esta informao necessria para determinar
se uma pgina ter que ser reescrita no disco ou no.
O algoritimo No Recentemente Usada (Not Recently Used, NRU), remove uma pgina aleatria da classe no vazia de numerao mais baixa. Implcito neste algoritmo que melhor
remover uma pgina 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.
82
de 64 bits, C, que automaticamente incrementado aps cada instruo. Alm disso, cada
entrada na tabela de pginas deve tambm ter um campo grande o bastante para conter o
contador. Aps cada referncia de memria, o corrente valor de C armazenado na entrada da
tabela de pginas para a pgina referenciada. Quando ocorre uma falta de pgina, o sistema
operacional examina todos os contadores na tabela de pginas para achar o menor deles. A
pgina correspondente a menos recentemente usada.
Agora vejamos um segundo algoritmo LRU, tambm em hardware. Para uma mquina
com N page frames, o LRU deve manter uma matriz de NxN bits, inicialmente todos zero.
Quando o page frame k referenciado, o hardware primeiro ativa todos os bits da linha k para
1, atribuindo a todos os bits da coluna k o valor 0. Em algum instante, a linha na qual o valor
binrio menor, a menos recentemente usada, a linha na qual o valor o prximo superior
a segunda menos recentemente usada, e assim por diante.
Simulao do LRU em Software
Embora os algoritmos apresentados sejam realizveis, eles so dependentes de hardware especial, e so de pouco uso para o projetista de sistema operacional construindo um sistema
para uma mquina que no dispe deste hardware. Uma soluo que pode ser implementada
em software faz-se necessria. Uma possibilidade o algoritmo chamado de No Frequentemente Usada (Not Frequently Used - NFU). O algoritmo NFU requer um contador em software
associado a cada pgina, inicialmente zero. Em cada tick de relgio, o sistema operacional
pesquisa todas as pginas na memria. Para cada pgina, o bit R, que 0 ou 1, adicionado
ao contador. Em suma, os contadores so uma tentativa de guardar a frequncia com que
cada pgina tem sido referenciada. Quando uma falta de pgina ocorre, a pgina com o menor
contador escolhida para substituio.
O principal problema com o NFU que ele nunca esquece referncias anteriores. Pginas
muito (e no mais) refenciadas no comeo da execuo de um programa permanecem com um
contador alto at o 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 ume falta de pgina, a pgina de menor contador removida. bvio que a
pgina que no tenha sido referenciada por, digamos, quatro ticks de relgio ter quatro zeros
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.
83
A tabela de pginas tem como entrada o nmero da pgina. Deve-se notar que esta tabela
tem dimeno 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:
o tipo da pgina: swap, arquivo executvel, demand ll e demand zero (denidos
mais adiante).
84
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
Descritor do Bloco
Pgina 794
Memria Fsica
Tabela em Uso
Frame 794
Contador Ref. #1
Contador Ref. #1
Disp. Swap #1
Pgina Fsica
Nro. #794
Bloco #2743
Memria
Secundria
rea de Swap
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
tabalas compartilham as mesmas entradas na tabela de frames (com o contador de referncia
agora em 2). Todas as entradas na tabela de pginas so marcadas como COPY-ON-WRITE,
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.
85
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
...
...
...
...
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
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
86
Tabela de Pgina
Descritor de Bloco
Tabela de Frame
Tabela de Swap
Registro da Tabela
de Pgina
Pgina #n
Dispositivo Swap #p
Bloco #k
inode
Lista de
Blocos
0
...
adicionada
ao inode
279
84
87
Memria Fsica
...
Pgina Pronta
para Swap
Memria
Secundria
swap-out
rea de Swap
swap-in
88
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). 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.
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
89
90
do dispositivo para o software de mais baixo nvel, chamado acionadores de dispositivos (device
drivers).
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 (gura 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.
91
Cada controlador tem alguns poucos registradores que so usados para comunicao com
a CPU. Em alguns computadores estes registradores so parte do espao de endereamento
regular. A tabela 5.1 mostra os endereos de E/S e os vetores de interrupo alocados para
alguns dos controladores do IBM PC. A atribuio de endereos de E/S para dispositivos
feita por um 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 E/S
vetor int.
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: Alguns exemplos de controladores, os seus endereos de E/S e seus vetores de interrupo no IBM PC
O sistema operacional realiza E/S escrevendo comandos nos registradores dos controladores.
O controlador de disquete do IBM PC, por exemplo, aceita 15 diferentes comandos, tais como
read, write, seek, format, e recalibrate. Muitos dos comandos tm parmetros, os quais so
tambm carregados nos registradores do controlador. Quando um comando aceito, a CPU
pode abandonar o controlador 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)
Memria
CPU
92
Unidades de Disco
Buffer
Controlador
de Disco
Registradores
End. Memria
Contador
Barramento
93
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
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.
94
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;
buerizao;
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.
95
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
96
Funcionalidades
Processos do Usurio
Software Independente
do Dispositivo
Drivers de Dispositivos
Gerenciadores de Interrupo
Dispositivos
97
Se o disk driver aceita uma requisio por vez e a executa nesta ordem, isto , First-Come,
First-Served (FCFS), 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 gura 5.4.
Posio Incial
10
15
20
25
30
35
39
Cilindro
98
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 gura 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 gura 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 gura 5.5 ilustra o algoritmo do elevador usando as mesmas sete requisies da gura
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
99
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 permantente (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 ocassionalmente bugs. Algumas vezes uma sequncia no usual de
eventos, tal como uma interrupo sobre um dispositivo ocorrendo simultaneamente com um comando recalibrate para outro, expe o bug e causa o controlador entrar em loop ou perder-se
do estava fazendo. Projetistas de controladores usualmente consideram a pior situao e provem um pino no chip, o qual, quando em nvel alto, fora o controlador esquecer sua tarefa
100
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.
open
close
read
write
101
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
Stream 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).
102
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
Fila de Entrada
push
Fila de Sada
Fig. 5.7: Driver 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.
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.
103
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 destruidos
por ocasio da chamada close para seu dispositivo.
Streams permitem a implementao de drivers onde as chamadas open, close, read e write
possuem cdigo dependente do dispositivo fsico apenas nos nveis mais baixos (prximos ao
dispositivo).
Captulo 6
Tpicos Especiais
O objetivo deste captulo consiste na discusso de alguns itens importantes no contexto dos
sistemas operacionais. A primeira questo abordada procura discutir o esforo internacional
com relao denio de um padro de interface atravs do Projeto POSIX. Posteriormente,
apresenta-se o conceito de thread que um novo modelo voltado para a programao concorrente e que tem sido implementado na maior parte dos novos sistemas operacionais. Por
ltimo, o captulo discute alguns aspectos do projeto de hardware dos processadores 8088/8086,
80286 e 80386; trata-se de uma discusso introdutria que procura enfatizar a evoluo ocorrida nesta famlia de processadores tendo como objetivo facilitar a implementao de ambientes
multiprogramados.
104
105
software de aplicao
plataforma de aplicao
ambiente externo
tpico
escpo
1003.1
chamadas de sistema
1003.2
1003.2a
1003.4
1003.4a
1003.5
1003.6
shell e utilitrios
portabilidade
tempo-real
processos leves
interface ADA
segurana
1003.7
1003.8
1003.9
1003.12
administrao
transparncia
interface Fortran
interface de rede
1003.15
1003.17
1201.1
escalonamento em batch
diretrio de servios
sistema grco
1224
1238.0
1238.1
X.400
funes de suporte
FTAM
servios bsicos
tais como E/S e controle de processos
linguagem de comando e utilitrios
utilitrios para time sharing
facilidades p/ programaes em tempo-real
facilidades para programao concorrente
chamadas do 1003.1 em ADA
segurana multinvel,
controle de acesso, etc
adio de usurios, status checking, etc
acesso transparente (via rede) a arquivos
chamadas do 1003.1 em Fortran
servios de comunicao
independente de protocolo
funes para processamento no interativo
registro e localizao de servios
funes de interfaceamento grco
baseado em janelas
correio eletrnico padro OSI
funes de baixo nvel padro OSI
transferncia de arquivos padro OSI
106
Tab. 6.1: Grupos representativos dos padres de interface do IEEE para programas aplicativos. O standard 1003.1 est completo (ISO 9945.1); os standards 1003.2 a 1003.6 3 1003.9
encontram-se prximo de uma verso nal; os demais standards esto ainda em discusso.
dela executar no espao de endereamento do processo pai, ela o elemento de escalonamento
e manipulao de sinais.
O grupo de trabalho POSIX 1003.4a est discutindo quanto do contexto deve estar associado a uma thread e como uma noticao de evento assncrono ser negociada pela thread.
Enquanto estas questes no forem completadas, o POSIX 4.a no far parte do padro POSIX
4.
Por ltimo, o Comit identicou 4 pers para os sistemas de tempo real: mnimo, controle,
dedicado e propsito geral. O objetivo dos pers o de permitir que o ncleo seja congurado
para uma instalao ou aplicao especca.
O perl mnimo usado nos sistemas dedicados, autnomos, com poucos dispositivos de
E/S e no utiliza memria de massa. Neste caso o sistema formado somente por um nico
processo POSIX.1 com tratadores de interrupo, para todo o processamento a ser realizado.
O perl de controle inclui um gerenciamento estruturado de E/S e memria, e acomoda
armazenamento de disco em RAM e sinais. Armazenamento de massa pode ser utilizado mas
no obrigatrio.
O perl dedicado inclui mltiplos processos e processadores. A maior parte das extenses
POSIX.4 so necessrias exceto o sistema de arquivos de tempo real.
O perl de propsito geral consiste na funcionalidade completa do POSIX.1 e POSIX.4
incluindo a capacidade de uso interativo. Pode ser usado com conexo a rede, threads, geren-
107
espao de
endereamento
virtual
do processo
thread #1
descritores
de arquivos
thread #2
pipes
semforos
thread #N
gerenciadores
de sinal
108
thread
registradores
pilha
prioridade
109
110
prontas para executar so escalonadas antes das threads de menor prioridade que se encontram
prontas para executar. Os processos tambm tm prioridade; entretanto, esta prioridade no
entra no clculo de qual thread dever executar. A prioridade do processo atua somente como
uma prioridade default para as threads que so criadas por aquele processo. Uma thread
pode mudar a prioridade de qualquer (ou todas) as threads dentro daquele processo atravs da
chamada DosSetPrty. Uma thread tambm pode alterar a prioridade default de threads em
outros processos, sem levar em conta se eles esto relacionados ao processo hierarquicamente.
Existem 4 classes de prioridade no sistema OS/2: tempo crtico, servidor, regular e inativo.
A classe servidora tambm denominada de classe de prioridade alta-xa (xed-high priority
class ). Cada classe de prioridade ainda dividida em 32 nveis de prioridade (gura 6.4).
As threads que se encontram na classe de prioridade mais alta (tempo crtico), possuem
restries de tempo. Um exemplo de uma thread de tempo crtico uma thread que espera
por dados enviados por um driver de dispositivo monitorando um dispositivo de comunicao
de alta velocidade. A maior parte das threads no sistema encontram-se na classe de prioridade
regular. A classe de prioridade servidora usada por programas que executam em um ambiente
contendo servidores. A classe servidora garante que programas clientes no sofrero degradao
no desempenho devido presena de programas na classe regular presentes no servidor.
Threads na classe prioridade inativa executaro somente quando no existirem threads nas
outras classes. Tipicamente, threads na classe inativa so threads que executam em background.
O algoritmo de escalonamento do tipo round-robin dentro do mesmo nvel de prioridade.
O quantum de tempo dirigido pelo relgio do sistema e o usurio pode congurar o quantum
de tempo de 32 a 248 milisegundos atravs da palavra chave TIMESLICE no arquivo CONFIG.SYS. A thread executa o seu quantum de tempo completamente a menos que ocorra uma
interrupo que resulte na execuo de uma outra thread de classe de prioridade mais alta.
Neste caso, a thread que se encontra em execuo sofre preempo. Caso contrrio, a thread
executa o seu quantum de tempo completamente a menos que realize uma chamada ao ncleo
que implique no seu bloqueio.
A verso OS/2 de 32 bits implementa opcionalmente o quantum dinmico que procura
maximizar a utilizao do processador para threads que executam no modo usurio.
111
6.3.2 Sumrio
Como o 8088 no oferece nunhum mecanismo de proteo memria ou E/S, no se
trata de uma plataforma para suportar multiprogamao. Devido ao esquema de memria
segmentada, m cdigo escrito para o 8088 transportvel somente para sistemas que possuam,
exatamente, a mesma semntica de segmento e esquema de endereamento. O modelo de
memria segmentada e o pequeno conjunto de registradores adiciona um nvel de complexidade
ao desenvolvimento de programas e ferramentas de programao de suporte ao 8088.
112
Descritores
A arquitetura do 80286 agrupa os descritores em tabelas de descritores. A tabela de descritores um segmento especial de comprimento varivel contendo at 8192 entradas para um
tamanho mximo de 64 Kb por segmento. Existem 2 tabelas bsicas de descritores: tabela de
descritor global (GDT) e tabela de descritor local (LDT). Esta caracterstica permite a implementao de um modelo de multiprogramao onde: na GDT so colocados os descritores para
segmentos que so globais a todos os processos; na LDT so colocados os segmentos que so
propriedade do processo, ou seja, existe uma LDT para cada processo presente no sistema e 1
GDT para todo o sistema. Os segmentos GDT e LDT so localizados atravs de 2 registradores
especiais GDTR e LDTR.
Seletores
113
entre si. O 80286 suporta um modelo de proteo que permite ao sistema operacional isolar-se
das aplicaes do usurio, isolar as aplicaes do usurio entre si e validar os acessos memria.
Sempre que a memria referenciada, o hardware da unidade de gerenciamento de memria
(MMU) no 80286 testa a referncia para vericar se ela satisfaz o critrio de proteo. Como
este teste feito antes que uma instruo se complete, qualquer violao proteo que ocorra
durante o teste far com que o 80286 provoque uma exceo. Os nveis de privilgio do 80286
so usados para proteger dados e cdigos crticos do sistema contra cdigo menos convel;
o sistema usa LDTs para isolar cada segmento de processo atravs da alocao de uma LDT
para cada um e pelo chaveamento de LDTs quando os processos so chaveados. Quando um
seletor que referencia um segmento carregado no registro de segmento, o processador carrega
no somente o endereo de base e o limite de segmento no cache de descritor mas, tambm, a
informao de proteo.
O bit de acesso desativado toda a vez que o seletor carregado no registrador de segmento;
ele ativado sempre que o segmento lido ou escrito, e pode ser usado pelo sistema operacional
para monitorar o uso do segmento. O bit Presente no descritor indica se o segmento se encontra
na memria permitindo que o sistema operacional gerencie a memria virtual.
Testes de Tipo e Limite
6.3.4 Sumrio
O modelo protegido do 80286 fornece as funes necessrias para implementao de um
sistema operacional baseado em memria virtual e multiprogramao. Devido limitao dos
114
O conjunto de registradores de propsito geral do 80286 foi estendido para 32 bits para
suportar aritmtica e endereamento de 32 bits. Esta extenso permite ao software um melhor
desempenho do que aquele encontrado nas arquiteturas de 16 bits. A gura 6.6 ilustra o
conjunto de registradores do 80386.
Contrrio ao 80286, qualquer um dos registradores pode ser utilizado como oset no clculo
do endereo da memria. Embora cada registrador possua 32 bits, a parte dos 16 bits utilizada
pelos programas 8088/8086 e 80286 podem ser acessadas em modo real, modo protegido e modo
8086 virtual. Os registradores de segmento so os mesmos que no 80286 exceto pela adio
de 2 novos registradores de segmento FS e GS. O registrador FLAGs foi estendido de modo a
incluir um bit para indicao de operao no modo 8086 virtual.
Anteriormente, a depurao atravs de pontos de parada (breakpoints) tinha de se implementada por software ; no caso do 80386, existem registradores que possibilitam a implementao
por hardware de pontos de parada para ns de depurao. O processador inclui registradores de sistema com o objetivo de facilitar o gerenciamento da memria, equivalentes aqueles
encontrados no 80286: GDTR, LDTR, IDTR e TR.
115
116
desativado de modo que o limite seja interpretado como 16 bits e tendo a granularidade de 1
byte.
Paginao
Conforme visto no captulo 4, paginao uma tcnica de gerenciamento da memria virtual utilizando blocos de tamanho xo (pginas) em oposio aos segmentos de tamanho variado
no caso dos sistemas segmentados. O 80386 utiliza a arquitetura de pginas para fornecer um
mecanismo de alocao de memria fsica em um sistema contendo grandes segmentos. Como
o 80386 permite segmentos que podem ser muito maiores do que 64 Kb, o gerenciamento da
memria sem utilizao de uma tcnica do tipo paginao seria muito difcil, na medida em
que o segmento deve residir em posies contguas da memria. Ainda, a permuta (swapping )
de segmentos de tamanho variado para a memria secundria poderia resultar em um baixo
desempenho do sistema. Desta forma, o esquema de paginao no 80386 permite que os segmentos residam em espaos no contnuos da memria e permite que a memria virtual seja
gerenciada em termos de blocos pequenos e de tamanho xo. Em sees anteriores, referiu-se
ao endereo de 32 bits resultante da traduo do endereo segmentado, como endereo fsico.
No 80386, entretanto, este endereo chamado de endereo linear. Caso o 80386 no tenha
o esquema de paginao habilitado, o endereo linear o mesmo que o endereo fsico. Entretanto, se o mecanismo estiver habilitado pelo bit de paginao no registrador CR0, ento o
endero linear no mais igual ao endereo fsico. Neste caso, o endereo linear de 32 bits
traduzido pela unidade de paginao do 80386 em um endereo fsico nal de 32 bits.
Quando a paginao encontra-se habilitada, o 80386 divide a memria em unidades de 4
Kb de endereos contguos (pginas). O endereo linear neste caso traduz uma tupla ordenada
que especica a tabela de pginas e o oset dentro da pgina. A gura 6.8 ilustra o formato
do endereo linear.
A unidade de paginao do 80386 realiza a traduo dinmica do endereo atravs de 2
mapeamentos diretos. A estrutura usada pela unidade de paginao para mapear endereos
a tabela de pginas (ver captulo 4). Esta tabela constitui-se reside numa pgina de 1K
entradas de 32 bits denominadas especicao de pgina. Dois nveis de tabelas de pginas so
utilizadas para enderear uma pgina da memria. O primeiro nvel o diretrio de pginas, o
qual localizado pelo registrador CR3. Este diretrio enderea at 1 K tabelas de pginas do
segundo nvel. Uma tabela de pginas do segundo nvel enderea at 1 K pginas. Portanto,
cada tabela de pgina do segundo nvel pode mapear 4 Mb (1 Kb * 4 Kb) de memria fsica
e um diretrio de pginas pode mapear 1 K * 4 Mb = 4 Gb de memria fsica. A gura 6.9
ilustra como o 80386 converte um endereo linear em um endereo fsico.
As entradas das tabelas de pginas possuem o mesmo formato sejam elas do primeiro ou
do segundo nvel. Como cada pgina limitada a 4 Kb, a entrada da tabela de pgina (PTE)
utiliza somente os 20 bits de mais alta ordem para designar uma pgina. Os outros 12 bits so
utilizados para denir os atributos da pgina. A gura 6.10 ilustra o formato de uma entrada
na tabela de pgina.
O bit present indica se a PTE pode ser usada na traduo do endereo. Caso o bit presente
no esteja ativado nas tabelas de pginas quando da ocorrncia de uma traduo de endereo,
o 80386 envia uma falha de pgina. O tratador neste caso pode trazer a pgina do disco para
a memria fsica e reiniciar a instruo. Isto pode ocorrer duas vezes para um dado acesso
memria caso a tabela de pginas no se encontre presente em memria. O bit accessed e o bit
dirty so usados em funo do uso de uma pgina. O 80386 ativa o bit accessed sempre que
uma referncia memria tenta ler ou escrever em um endereo mapeado por um PTE. O bit
117
dirty ativado somente quando se trata de escrita em um endereo mapeado por um PTE. O
80386 no desativa estes bits. O sistema operacional utiliza estes bits para determinar quais
pginas devero ser transferidas para o disco quando uma demanda de memria fsica excede
a memria disponvel.
Proteo de Pginas
O bit read/write e o bit user/supervisor so utilizados na proteo da pgina. O bit user/supervisor especica quais nveis de privilgio podem acessar a pgina. Caso o bit user/supervisor esteja desativado, a pgina trata-se de uma pgina de nvel supervisor; caso esteja
ativado trata-se de uma pgina de usurio. O nvel corrente de privilgio (CPL) utilizado
para determinar se o 80386 encontra-se executando no nvel de privilgio do supervisor ou
no nvel de privilgio do usurio. Se o CPL 0, 1 ou 2, o 80386 encontra-se executando
no nvel de privilgio do supervisor. Caso o CPL seja 3, a CPU encontra-se executando no
nvel de privilgio do usurio. Quando o 80386 encontra-se executando no nvel de privilgio
do supervisor, todas as pginas so endereveis; quando encontra-se executando no nvel de
privilgio do usurio, somente as pginas de usurio so endereveis.
O bit read/write determina o tipo de acesso de uma dada pgina. Caso o bit esteja desativado, a pgina somente pode ser lida; caso o bit esteja ativado a pgina pode ser lida e
escrita.
Como as tabelas de pginas encontram-se na memria fsica, uma referncia a uma posio
de memria requer vrios ciclos de memria para obter as informaes de endereo das estruturas de dados de paginao para realizar a traduo de endereo. Para aumentar o desempenho
desta operao crtica o 80386 usa uma cache denominada TLB (translation lookaside buer)
para armazenar em hardware as pginas mais recentemente utilizadas.
6.4.1 Sumrio
O microprocessador Intel 80386 possui um sosticado esquema de gerenciamento e proteo
de memria quando comparado com seus antecessores. Esta sosticao permite a construo
de sistemas operacionais modernos (Windows NT, OS/2 de 32 bits, etc) ou a migrao de
sistemas que outrora necessitavam de plataformas de hardware dispendiosas, como o caso do
UNIX.
118
alta prioridade
30
...
0
round-robin
baixa prioridade
alta prioridade
30
...
0
baixa prioridade
alta prioridade
30
round-robin
...
baixa prioridade
processos inativos
31
alta prioridade
30
...
0
round-robin
baixa prioridade
Fig. 6.4: Estrutura de prioridades no OS/2
119
16MB
seletor
....
offset
16-bit de offset
+
limite do
segmento
descritor
....
....
0
memria fsica
tabela de descritores
reservado
direitos de acesso
end. de base (B0-15)
end. de base (B16-23)
limite
registradores especiais
registradores
de segmento
32 bits
32 bits
32 bits
IP
CS
FLAGS
SS
EAX
AX
EIP
EBX
BX
EFLAGS
ECX
CX
DS
EDX
DX
ES
ESI
SI
FS
EDI
DI
GS
EBP
BP
ESP
SP
D/B
DPS
limite (B16-23)
legenda:
G: bit de granularidade
D/B: default/big bit
DPS: disponvel para o sistema
120
22
deslocamento
21
diretrio
12 11
pgina
especifica tabela de
pgina no diretrio
de pginas
offset
especifica pgina na
tabela de pginas
4 GB
seletor
offset
diretrio
pgina
offset
....
diretrio de pginas
tabela de pginas
pgina
descritor
....
pgina
tab. de pgina
....
tabela de descritores
0
CR3
memria fsica
registro de base
c/ diretrio de pginas
31
12
11
DS
0
00
00
U/S R/W
legenda:
P: bit "presente"
R/W: bit escrita/gravao
U/S bit "user/supervisor"
A: bit de acesso
D: bit "dirty"
DS: disponvel para o sistema
obs:
endero da pgina virtual = nmero da pgina virtual
Bibliograa
121