Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
h>
#include <semaphore.h>
#define NUM_THREADS 100
#define NUM_STEPS 100000
int sum = 0, lock = 0 ;
void enter_cs (int *l)
{
// busy waiting using atomic add
Sistemas
Conceitos e Mecanismos
while Operacionais:
(__sync_fetch_and_add
(l, 1)) ;
}
Prof. Carlos A. Maziero, Dr.
leave_cs (int
DAINF *l)
UTFPR
void
{
(*l) = 0 ;
}
8 de agosto de 2014
Este texto est licenciado sob a Licena AttributionNonCommercial-ShareAlike 3.0 Unported da Creative Commons
(CC). Em resumo, voc deve creditar a obra da forma especificada pelo autor ou licenciante (mas no de maneira
que sugira que estes concedem qualquer aval a voc ou ao seu uso da obra). Voc
no pode usar esta obra para fins comerciais. Se voc alterar, transformar ou criar
com base nesta obra, voc poder distribuir a obra resultante apenas sob a mesma
licena, ou sob uma licena similar presente. Para ver uma cpia desta licena, visite
http://creativecommons.org/licenses/by-nc-sa/3.0/.
Este texto foi produzido usando exclusivamente software livre: Sistema Operacional
GNU/Linux (distribuies Fedora e Ubuntu), compilador de texto LATEX 2 , gerenciador
de referncias BibTeX, editor grfico Inkscape, criadores de grficos GNUPlot e GraphViz
e processador PS/PDF GhostScript, entre outros.
Prefcio
Os sistemas operacionais so elementos fundamentais para o funcionamento de
praticamente qualquer sistema de computao, dos minsculos sistemas embarcados
e telefones celulares aos gigantescos centros de processamento de dados das grandes
empresas. Apesar da imensa diversidade de sistemas operacionais existentes, eles
tentam resolvem problemas de mesma natureza e seguem basicamente os mesmos
princpios.
Conhecer Sistemas Operacionais a fundo no algo reservado a hackers, mas
importante para todo profissional de computao, pois os mecanismos implementados
pelo sistema operacional afetam diretamente o comportamento e o desempenho das
aplicaes. Alm disso, o sistema operacional uma pea chave na configurao de
servios de rede e na segurana do sistema.
Existem muitos livros de sistemas operacionais disponveis no mercado, quase
todos excelentes, escritos por profissionais reconhecidos mundialmente. Entretanto,
bons livros de Sistemas Operacionais podem custar centenas de reais, o que os torna
inacessveis a uma parcela significativa da populao. Este livro seria apenas mais uma
opo nas livrarias, no fosse por um pequeno detalhe: foi concebido como um Livro
Aberto, desde seu incio. Um Livro Aberto (do ingls Open Book) um livro amplamente
disponvel na Internet em formato digital, sem custo. No exterior, muitos open books
esto tambm disponveis nas livrarias, para aquisio em formato impresso.
Eu acredito que incluso digital no significa somente permitir o acesso a computadores parcela mais pobre da populao, mas tambm desmistificar o funcionamento
dessa tecnologia e incentivar seu estudo, para fomentar as prximas geraes de tcnicos,
engenheiros e cientistas da computao, vindas de todas as classes sociais. Nosso pas
no pode mais se dar ao luxo de desperdiar pessoas inteligentes s porque so pobres.
Prof. Carlos Maziero, Dr.
Curitiba PR, Outubro de 2011
iii
Agradecimentos
Este texto fruto de alguns anos de trabalho. Embora eu o tenha redigido sozinho,
ele nunca teria se tornado uma realidade sem a ajuda e o apoio de muitas pessoas, de
vrias formas. Em primeiro lugar, agradeo minha famlia, pelas incontveis horas em
que me subtra de seu convvio para me dedicar a este trabalho.
Agradeo tambm a todos os docentes e estudantes que utilizaram este material,
pelas inmeras correes e sugestes de melhoria. Em particular, meus agradecimentos
a Alexandre Koutton, Altair Santin, Carlos Silla, Diogo Olsen, Douglas da Costa, Fabiano
Beraldo, Jeferson Amend, Marcos Pchek Laureano, Paulo Resende, Rafael Hamasaki,
Richard Reichardt, Tadeu Ribeiro Reis, Thayse Solis, Thiago Ferreira, Urlan de Barros e
Vagner Sacramento.
Desejo expressar meu mais profundo respeito pelos autores dos grandes clssicos
de Sistemas Operacionais, como Andrew Tanenbaum e Abraham Silberschatz, que
iluminaram meus primeiros passos nesta rea e que seguem como referncias inequvocas
e incontornveis.
Agradeo Pontifcia Universidade Catlica do Paran, onde fui professor de
Sistemas Operacionais por 13 anos, pelas condies de trabalho que me permitiram
dedicar-me a esta empreitada. Tambm Universidade Tecnolgica Federal do Paran,
onde atuo desde julho de 2011, pelas mesmas razes.
Dedico o Captulo 8 deste livro aos colegas docentes e pesquisadores do Departamento de Tecnologias da Informao da Universidade de Milo em Crema, onde estive
em um ps-doutorado no ano de 2009, com uma bolsa CAPES/MEC1 . O Captulo 9 deste
livro dedicado equipe ADEPT IRISA/INRIA, Universit de Rennes 1 - Frana, na
qual pude passar trs meses agradveis e produtivos durante o inverno 2007-08, como
professor/pesquisador convidado2 .
Carlos Maziero
Curitiba PR, Outubro de 2011
iv
Sumrio
1
Conceitos bsicos
1.1 Objetivos . . . . . . . . . . . . . . . . . . . . .
1.1.1 Abstrao de recursos . . . . . . . . .
1.1.2 Gerncia de recursos . . . . . . . . . .
1.2 Tipos de sistemas operacionais . . . . . . . .
1.3 Funcionalidades . . . . . . . . . . . . . . . . .
1.4 Estrutura de um sistema operacional . . . . .
1.5 Conceitos de hardware . . . . . . . . . . . . .
1.5.1 Interrupes . . . . . . . . . . . . . . .
1.5.2 Proteo do ncleo . . . . . . . . . . .
1.5.3 Chamadas de sistema . . . . . . . . .
1.6 Arquiteturas de Sistemas Operacionais . . . .
1.6.1 Sistemas monolticos . . . . . . . . . .
1.6.2 Sistemas em camadas . . . . . . . . .
1.6.3 Sistemas micro-ncleo . . . . . . . . .
1.6.4 Mquinas virtuais . . . . . . . . . . .
1.7 Um breve histrico dos sistemas operacionais
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Gerncia de atividades
2.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 O conceito de tarefa . . . . . . . . . . . . . . . . . . . .
2.3 A gerncia de tarefas . . . . . . . . . . . . . . . . . . .
2.3.1 Sistemas mono-tarefa . . . . . . . . . . . . . .
2.3.2 Sistemas multi-tarefa . . . . . . . . . . . . . . .
2.3.3 Sistemas de tempo compartilhado . . . . . . .
2.3.4 Ciclo de vida das tarefas . . . . . . . . . . . . .
2.4 Implementao de tarefas . . . . . . . . . . . . . . . .
2.4.1 Contextos . . . . . . . . . . . . . . . . . . . . .
2.4.2 Trocas de contexto . . . . . . . . . . . . . . . .
2.4.3 Processos . . . . . . . . . . . . . . . . . . . . .
2.4.4 Threads . . . . . . . . . . . . . . . . . . . . . .
2.5 Escalonamento de tarefas . . . . . . . . . . . . . . . .
2.5.1 Objetivos e mtricas . . . . . . . . . . . . . . .
2.5.2 Escalonamento preemptivo e cooperativo . . .
2.5.3 Escalonamento FCFS (First-Come, First Served)
v
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
3
4
6
8
10
11
13
15
18
18
19
19
21
25
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
27
28
29
30
31
32
33
35
35
36
37
42
47
48
49
50
c Carlos Maziero
2.5.4
2.5.5
2.5.6
2.5.7
3
0: SUMRIO
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
54
62
63
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
65
65
66
67
67
68
69
71
72
73
74
74
77
78
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
82
82
82
85
86
87
87
88
89
89
91
91
95
97
99
99
101
103
105
107
108
109
vi
c Carlos Maziero
0: SUMRIO
Gerncia de memria
5.1 Estruturas de memria . . . . . . . . . . . . . .
5.2 Endereos, variveis e funes . . . . . . . . .
5.2.1 Endereos lgicos e fsicos . . . . . . . .
5.2.2 Modelo de memria dos processos . . .
5.3 Estratgias de alocao . . . . . . . . . . . . . .
5.3.1 Parties fixas . . . . . . . . . . . . . . .
5.3.2 Alocao contgua . . . . . . . . . . . .
5.3.3 Alocao por segmentos . . . . . . . . .
5.3.4 Alocao paginada . . . . . . . . . . . .
5.3.5 Alocao segmentada paginada . . . .
5.4 Localidade de referncias . . . . . . . . . . . .
5.5 Fragmentao . . . . . . . . . . . . . . . . . . .
5.6 Compartilhamento de memria . . . . . . . . .
5.7 Memria virtual . . . . . . . . . . . . . . . . . .
5.7.1 Mecanismo bsico . . . . . . . . . . . .
5.7.2 Eficincia de uso . . . . . . . . . . . . .
5.7.3 Algoritmos de substituio de pginas
5.7.4 Conjunto de trabalho . . . . . . . . . . .
5.7.5 A anomalia de Belady . . . . . . . . . .
5.7.6 Thrashing . . . . . . . . . . . . . . . . .
Gerncia de arquivos
6.1 Arquivos . . . . . . . . . . . . . . . . .
6.1.1 O conceito de arquivo . . . . .
6.1.2 Atributos . . . . . . . . . . . . .
6.1.3 Operaes . . . . . . . . . . . .
6.1.4 Formatos . . . . . . . . . . . . .
6.1.5 Arquivos especiais . . . . . . .
6.2 Uso de arquivos . . . . . . . . . . . . .
6.2.1 Abertura de um arquivo . . . .
6.2.2 Formas de acesso . . . . . . . .
6.2.3 Controle de acesso . . . . . . .
6.2.4 Compartilhamento de arquivos
6.2.5 Exemplo de interface . . . . . .
6.3 Organizao de volumes . . . . . . . .
6.3.1 Diretrios . . . . . . . . . . . .
6.3.2 Caminhos de acesso . . . . . .
6.3.3 Atalhos . . . . . . . . . . . . . .
6.3.4 Montagem de volumes . . . . .
6.4 Sistemas de arquivos . . . . . . . . . .
6.4.1 Arquitetura geral . . . . . . . .
6.4.2 Blocos fsicos e lgicos . . . . .
6.4.3 Alocao fsica de arquivos . .
6.4.4 O sistema de arquivos virtual .
vii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
114
114
116
118
120
121
121
123
124
127
136
136
139
143
145
146
149
150
157
159
160
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
163
163
163
164
165
166
170
171
171
173
174
176
178
180
181
183
186
187
188
189
190
191
203
c Carlos Maziero
6.5
7
0: SUMRIO
Gerncia de entrada/sada
7.1 Introduo . . . . . . . . . . . . . . . . .
7.2 Dispositivos de entrada/sada . . . . . .
7.2.1 Componentes de um dispositivo
7.2.2 Barramentos . . . . . . . . . . . .
7.2.3 Interface de acesso . . . . . . . .
7.2.4 Endereamento . . . . . . . . . .
7.2.5 Interrupes . . . . . . . . . . . .
7.3 Software de entrada/sada . . . . . . . .
7.3.1 Classes de dispositivos . . . . . .
7.3.2 Estratgias de interao . . . . .
7.4 Discos rgidos . . . . . . . . . . . . . . .
7.4.1 Estrutura fsica . . . . . . . . . .
7.4.2 Interface de hardware . . . . . .
7.4.3 Escalonamento de acessos . . . .
7.4.4 Caching de blocos . . . . . . . . .
7.4.5 Sistemas RAID . . . . . . . . . .
7.5 Interfaces de rede . . . . . . . . . . . . .
7.6 Dispositivos USB . . . . . . . . . . . . .
7.7 Interfaces de udio . . . . . . . . . . . .
7.8 Interface grfica . . . . . . . . . . . . . .
7.9 Mouse e teclado . . . . . . . . . . . . . .
7.10 Outros tpicos . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Segurana de sistemas
8.1 Introduo . . . . . . . . . . . . . . . . . . . . .
8.2 Conceitos bsicos . . . . . . . . . . . . . . . . .
8.2.1 Propriedades e princpios de segurana
8.2.2 Ameaas . . . . . . . . . . . . . . . . . .
8.2.3 Vulnerabilidades . . . . . . . . . . . . .
8.2.4 Ataques . . . . . . . . . . . . . . . . . .
8.2.5 Malwares . . . . . . . . . . . . . . . . .
8.2.6 Infraestrutura de segurana . . . . . . .
8.3 Fundamentos de criptografia . . . . . . . . . .
8.3.1 Cifragem e decifragem . . . . . . . . . .
8.3.2 Criptografia simtrica e assimtrica . .
8.3.3 Resumo criptogrfico . . . . . . . . . .
8.3.4 Assinatura digital . . . . . . . . . . . . .
8.3.5 Certificado de chave pblica . . . . . .
8.4 Autenticao . . . . . . . . . . . . . . . . . . . .
8.4.1 Usurios e grupos . . . . . . . . . . . .
8.4.2 Tcnicas de autenticao . . . . . . . . .
8.4.3 Senhas . . . . . . . . . . . . . . . . . . .
8.4.4 Senhas descartveis . . . . . . . . . . .
viii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
205
205
207
207
207
209
212
214
218
218
221
229
230
230
231
235
235
241
241
241
241
241
241
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
242
242
243
243
245
245
247
249
251
253
253
254
256
257
258
260
261
262
262
263
c Carlos Maziero
8.5
8.6
0: SUMRIO
Virtualizao de sistemas
9.1 Conceitos bsicos . . . . . . . . . . . . . . . . . .
9.1.1 Um breve histrico . . . . . . . . . . . . .
9.1.2 Interfaces de sistema . . . . . . . . . . . .
9.1.3 Compatibilidade entre interfaces . . . . .
9.1.4 Virtualizao de interfaces . . . . . . . . .
9.1.5 Virtualizao versus abstrao . . . . . .
9.2 A construo de mquinas virtuais . . . . . . . .
9.2.1 Definio formal . . . . . . . . . . . . . .
9.2.2 Suporte de hardware . . . . . . . . . . . .
9.2.3 Formas de virtualizao . . . . . . . . . .
9.3 Tipos de mquinas virtuais . . . . . . . . . . . .
9.3.1 Mquinas virtuais de processo . . . . . .
9.3.2 Mquinas virtuais de sistema operacional
9.3.3 Mquinas virtuais de sistema . . . . . . .
9.4 Tcnicas de virtualizao . . . . . . . . . . . . . .
9.4.1 Emulao completa . . . . . . . . . . . . .
9.4.2 Virtualizao da interface de sistema . . .
9.4.3 Traduo dinmica . . . . . . . . . . . . .
9.4.4 Paravirtualizao . . . . . . . . . . . . . .
9.4.5 Aspectos de desempenho . . . . . . . . .
9.5 Aplicaes da virtualizao . . . . . . . . . . . .
9.6 Ambientes de mquinas virtuais . . . . . . . . .
9.6.1 VMware . . . . . . . . . . . . . . . . . . .
9.6.2 FreeBSD Jails . . . . . . . . . . . . . . . .
9.6.3 Xen . . . . . . . . . . . . . . . . . . . . . .
9.6.4 User-Mode Linux . . . . . . . . . . . . . .
ix
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
264
265
267
267
270
271
272
273
278
280
282
283
290
293
293
296
297
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
299
299
299
300
301
303
305
307
307
309
312
313
314
317
319
321
321
322
323
324
325
327
329
329
330
331
333
c Carlos Maziero
9.6.5
9.6.6
9.6.7
0: SUMRIO
QEMU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Valgrind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
JVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Referncias Bibliogrficas
336
346
Captulo 1
Conceitos bsicos
Um sistema de computao constitudo basicamente por hardware e software.
O hardware composto por circuitos eletrnicos (processador, memria, portas
de entrada/sada, etc.) e perifricos eletro-ptico-mecnicos (teclados, mouses,
discos rgidos, unidades de disquete, CD ou DVD, dispositivos USB, etc.). Por
sua vez, o software de aplicao representado por programas destinados ao
usurio do sistema, que constituem a razo final de seu uso, como editores de
texto, navegadores Internet ou jogos. Entre os aplicativos e o hardware reside
uma camada de software multi-facetada e complexa, denominada genericamente
de Sistema Operacional. Neste captulo veremos quais os objetivos bsicos do
sistema operacional, quais desafios ele deve resolver e como ele estruturado para
alcanar seus objetivos.
1.1
Objetivos
c Carlos Maziero
1: Abstrao de recursos
editor de
textos
aplicativos
reprodutor
de mdia
Ad augusta per
angusta.
De omni re scibili, et
quibusdam aliis.
Felix qui potuit rerum
cognoscere causas.
In medio stat virtus.
Labor omnia vincit
improbus.
Non nova, sed nove.
Qui scribit bis legit.
editor
grco
sistema operacional
hardware
discos
memria
portas
USB
rede
1.1.1
Abstrao de recursos
c Carlos Maziero
1: Gerncia de recursos
1.1.2
Gerncia de recursos
c Carlos Maziero
1.2
c Carlos Maziero
c Carlos Maziero
1: Funcionalidades
1.3
Funcionalidades
Para cumprir seus objetivos de abstrao e gerncia, o sistema operacional deve atuar
em vrias frentes. Cada um dos recursos do sistema possui suas particularidades, o que
impe exigncias especficas para gerenciar e abstrair os mesmos. Sob esta perspectiva,
as principais funcionalidades implementadas por um sistema operacional tpico so:
Gerncia do processador : tambm conhecida como gerncia de processos ou de
atividades, esta funcionalidade visa distribuir a capacidade de processamento de
forma justa1 entre as aplicaes, evitando que uma aplicao monopolize esse
recurso e respeitando as prioridades dos usurios. O sistema operacional prov a
iluso de que existe um processador independente para cada tarefa, o que facilita
o trabalho dos programadores de aplicaes e permite a construo de sistemas
mais interativos. Tambm faz parte da gerncia de atividades fornecer abstraes
para sincronizar atividades inter-dependentes e prover formas de comunicao
entre elas.
Gerncia de memria : tem como objetivo fornecer a cada aplicao uma rea de
memria prpria, independente e isolada das demais aplicaes e inclusive do
ncleo do sistema. O isolamento das reas de memria das aplicaes melhora
a estabilidade e segurana do sistema como um todo, pois impede aplicaes
com erros (ou aplicaes maliciosas) de interferir no funcionamento das demais
aplicaes. Alm disso, caso a memria RAM existente seja insuficiente para
as aplicaes, o sistema operacional pode aument-la de forma transparente s
aplicaes, usando o espao disponvel em um meio de armazenamento secundrio
(como um disco rgido). Uma importante abstrao construda pela gerncia de
memria a noo de memria virtual, que desvincula os endereos de memria
vistos por cada aplicao dos endereos acessados pelo processador na memria
RAM. Com isso, uma aplicao pode ser carregada em qualquer posio livre da
memria, sem que seu programador tenha de se preocupar com os endereos de
memria onde ela ir executar.
1
c Carlos Maziero
1: Funcionalidades
c Carlos Maziero
gerncia do
processador
gerncia de
memria
suporte
de rede
gerncia de
dispositivos
ncleo
gerncia de
proteo
gerncia de
arquivos
interface
grca
etc
1.4
Na verdade essa regra to importante que deveria ser levada em conta na construo de qualquer
sistema computacional complexo.
c Carlos Maziero
programas
utilitrios
nvel de usurio
nvel de sistema
ncleo
software
cdigo de
inicializao
drivers de
dispositivos
controladoras de dispositivos
hardware
dispositivos fsicos
c Carlos Maziero
1.5
1: Conceitos de hardware
Conceitos de hardware
processador
MMU
mouse
teclado
controladora
USB
monitor
unidade
de disco
conexo
de rede
control.
de vdeo
control.
de disco
control.
de rede
dados
endereos
controle
c Carlos Maziero
1: Interrupes
1.5.1
Interrupes
c Carlos Maziero
programa
em execuo
1: Interrupes
Memria
1
rotina de
tratamento de
interrupo
5
6
rede
2
MMU
processador
dados
controladora
de rede
endereos
controle
c Carlos Maziero
1: Proteo do ncleo
1.5.2
Proteo do ncleo
c Carlos Maziero
1: Proteo do ncleo
Tabela 1.2: Vetor de Interrupes do processador Pentium [Patterson and Henessy, 2005]
IRQ
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19-31
32-255
Descrio
divide error
debug exception
null interrupt
breakpoint
INTO-detected overflow
bound range exception
invalid opcode
device not available
double fault
coprocessor segment overrun
invalid task state segment
segment not present
stack fault
general protection
page fault
Intel reserved
floating point error
alignment check
machine check
Intel reserved
maskable interrupts (devices & exceptions)
mas sempre atravs de pedidos ao sistema operacional, que avalia e intermedeia todos
os acessos ao hardware. Mas como impedir as aplicaes de acessar o hardware
diretamente?
Ncleo, drivers, utilitrios e aplicaes so constitudos basicamente de cdigo
de mquina. Todavia, devem ser diferenciados em sua capacidade de interagir com
o hardware: enquanto o ncleo e os drivers devem ter pleno acesso ao hardware,
para poder configur-lo e gerenci-lo, os utilitrios e os aplicativos devem ter acesso
mais restrito a ele, para no interferir nas configuraes e na gerncia, o que acabaria
desestabilizando o sistema inteiro. Alm disso, aplicaes com acesso pleno ao hardware
tornariam inteis os mecanismos de segurana e controle de acesso aos recursos (tais
como arquivos, diretrios e reas de memria).
Para permitir diferenciar os privilgios de execuo dos diferentes tipos de software,
os processadores modernos contam com dois ou mais nveis de privilgio de execuo. Esses
nveis so controlados por flags especiais nos processadores, e as formas de mudana
de um nvel de execuo para outro so controladas estritamente pelo processador. O
processador Pentium, por exemplo, conta com 4 nveis de privilgio (sendo 0 o nvel
mais privilegiado), embora a maioria dos sistemas operacionais construdos para esse
processador s use os nveis extremos (0 para o ncleo e drivers do sistema operacional
14
c Carlos Maziero
1: Chamadas de sistema
nvel
usurio
aplicao
aplicao
nvel
ncleo
aplicao
aplicao
ncleo
hardware
1.5.3
Chamadas de sistema
O confinamento de cada aplicao em sua rea de memria, imposto pelos mapeamentos de memria realizados pela MMU nos acessos em nvel usurio, prov robustez
15
c Carlos Maziero
1: Chamadas de sistema
e confiabilidade ao sistema, pois garante que uma aplicao no poder interferir nas
reas de memria de outras aplicaes ou do ncleo. Entretanto, essa proteo introduz
um novo problema: como chamar, a partir de uma aplicao, as rotinas oferecidas pelo
ncleo para o acesso ao hardware e suas abstraes? Em outras palavras, como uma
aplicao pode acessar a placa de rede para enviar/receber dados, se no tem privilgio
para acessar as portas de entrada/sada correspondentes nem pode invocar o cdigo do
ncleo que implementa esse acesso (pois esse cdigo reside em outra rea de memria)?
A resposta a esse problema est no mecanismo de interrupo, apresentado na Seo
1.5.1. Os processadores implementam uma instruo especial que permite acionar o
mecanismo de interrupo de forma intencional, sem depender de eventos externos ou
internos. Ao ser executada, essa instruo (int no Pentium, syscall no MIPS) comuta o
processador para o nvel privilegiado e procede de forma similar ao tratamento de uma
interrupo. Por essa razo, esse mecanismo denominado interrupo de software, ou
trap. Processadores modernos oferecem instrues especficas para entrar/sair do modo
privilegiado, como SYSCALL e SYSRET (nos processadores Intel 64 bits) e tambm um
conjunto de registradores especficos para essa operao, o que permite a transferncia
rpida do controle para o ncleo, com custo menor que o tratamento de uma interrupo.
A ativao de procedimentos do ncleo usando interrupes de software (ou outros
mecanismos correlatos) denominada chamada de sistema (system call ou syscall). Os
sistemas operacionais definem chamadas de sistema para todas as operaes envolvendo
o acesso a recursos de baixo nvel (perifricos, arquivos, alocao de memria, etc.)
ou abstraes lgicas (criao e finalizao de tarefas, operadores de sincronizao e
comunicao, etc.). Geralmente as chamadas de sistema so oferecidas para as aplicaes
em modo usurio atravs de uma biblioteca do sistema (system library), que prepara os
parmetros, invoca a interrupo de software e retorna aplicao os resultados obtidos.
A Figura 1.7 ilustra o funcionamento bsico de uma chamada de sistema (a chamada
read, que l dados de um arquivo previamente aberto). Os seguintes passos so
realizados:
1. No nvel usurio, a aplicao invoca a funo read(fd, &buffer, bytes) da
biblioteca de sistema (no Linux a biblioteca GNU C Library, ou glibc; no Windows,
essas funes so implementadas pela API Win32).
2. A funo read preenche uma rea de memria com os parmetros recebidos e
escreve o endereo dessa rea em um registrador da CPU. Em outro registrador,
ela escreve o cdigo da chamada de sistema desejada (no caso do Linux, seria 03h
para a syscall read).
3. A funo read invoca uma interrupo de software (no caso do Linux, sempre
invocada a interrupo 80h).
4. O processador comuta para o nvel privilegiado (kernel level) e transfere o controle
para a rotina apontada pela entrada 80h do vetor de interrupes.
5. A rotina obtm o endereo dos parmetros, verifica a validade de cada um deles e
realiza (ou agenda para execuo posterior) a operao desejada pela aplicao.
16
c Carlos Maziero
1: Chamadas de sistema
aplicao
read(...)
2
nvel usurio
nvel ncleo
chamada 5
de sistema
gerncia de
atividades
vetor de interrupes
79h
80h
81h
82h
17
c Carlos Maziero
1.6
1.6.1
Sistemas monolticos
aplicao
aplicao
memory
operations
le
operations
aplicao
process
manager
CPU
scheduler
aplicao
network
operations
memory
manager
access
control
nvel
ncleo
network
protocols
kernel data structures
NTFS
le system
MMU
control
block I/O
operations
USB
driver
VFAT
le system
SATA
driver
Bluetooth
driver
network
driver
hardware
c Carlos Maziero
1: Sistemas em camadas
1.6.2
Sistemas em camadas
Uma forma mais elegante de estruturar um sistema operacional faz uso da noo
de camadas: a camada mais baixa realiza a interface com o hardware, enquanto
as camadas intermedirias provem nveis de abstrao e gerncia cada vez mais
sofisticados. Por fim, a camada superior define a interface do ncleo para as aplicaes
(as chamadas de sistema). Essa abordagem de estruturao de software fez muito
sucesso no domnio das redes de computadores, atravs do modelo de referncia OSI
(Open Systems Interconnection) [Day, 1983], e tambm seria de se esperar sua adoo no
domnio dos sistemas operacionais. No entanto, alguns inconvenientes limitam sua
aceitao nesse contexto:
O empilhamento de vrias camadas de software faz com que cada pedido de uma
aplicao demore mais tempo para chegar at o dispositivo perifrico ou recurso a
ser acessado, prejudicando o desempenho do sistema.
No bvio como dividir as funcionalidades de um ncleo de sistema operacional
em camadas horizontais de abstrao crescente, pois essas funcionalidades so
inter-dependentes, embora tratem muitas vezes de recursos distintos.
Em decorrncia desses inconvenientes, a estruturao em camadas apenas parcialmente adotada hoje em dia. Muitos sistemas implementam uma camada inferior de
abstrao do hardware para interagir com os dispositivos (a camada HAL Hardware
Abstraction Layer, implementada no Windows NT e seus sucessores), e tambm organizam em camadas alguns sub-sistemas como a gerncia de arquivos e o suporte de
rede (seguindo o modelo OSI). Como exemplos de sistemas fortemente estruturados em
camadas podem ser citados o IBM OS/2 e o MULTICS [Corbat and Vyssotsky, 1965].
1.6.3
Sistemas micro-ncleo
c Carlos Maziero
1: Sistemas micro-ncleo
abordagem o cdigo de acesso aos blocos de um disco rgido seria mantido no ncleo,
enquanto as abstraes de arquivo e diretrio seriam criadas e mantidas por um cdigo
fora do ncleo, executando da mesma forma que uma aplicao do usurio.
Por fazer os ncleos de sistema ficarem menores, essa abordagem foi denominada
micro-ncleo (ou -kernel). Um micro-ncleo normalmente implementa somente a noo
de atividade, de espaos de memria protegidos e de comunicao entre atividades.
Todos os aspectos de alto nvel, como polticas de uso do processador e da memria,
o sistema de arquivos e o controle de acesso aos recursos so implementados fora do
ncleo, em processos que se comunicam usando as primitivas do ncleo. A Figura 1.9
ilustra essa abordagem.
user
application
user
application
user
application
aplicaes
sistema operacional
process
manager
memory
manager
MMU
control
le
system
protection
manager
network
protocols
block IO
operations
network
driver
disk
driver
nvel usurio
nvel ncleo
micro-kernel
hardware
c Carlos Maziero
1: Mquinas virtuais
1.6.4
Mquinas virtuais
Para que programas e bibliotecas possam executar sobre uma determinada plataforma
computacional, necessrio que tenham sido compilados para ela, respeitando o
conjunto de instrues do processador e o conjunto de chamadas do sistema operacional.
Da mesma forma, um sistema operacional s poder executar sobre uma plataforma de
hardware se for compatvel com ela. Nos sistemas atuais, as interfaces de baixo nvel
so pouco flexveis: geralmente no possvel criar novas instrues de processador ou
novas chamadas de sistema, ou mudar sua semntica. Por isso, um sistema operacional
s funciona sobre o hardware para o qual foi construdo, uma biblioteca s funciona
sobre o hardware e sistema operacional para os quais foi projetada e as aplicaes
tambm tm de obedecer a interfaces pr-definidas.
Todavia, possvel contornar os problemas de compatibilidade entre os componentes
de um sistema atravs de tcnicas de virtualizao. Usando os servios oferecidos por um
determinado componente do sistema, possvel construir uma camada de software que
oferea aos demais componentes servios com outra interface. Essa camada permitir
assim o acoplamento entre interfaces distintas, de forma que um programa desenvolvido
para uma plataforma A possa executar sobre uma plataforma distinta B. O sistema
computacional visto atravs dessa camada denominado mquina virtual.
A Figura 1.10, extrada de [Smith and Nair, 2004], mostra um exemplo de mquina
virtual, onde uma camada de virtualizao permite executar um sistema operacional
Windows e suas aplicaes sobre uma plataforma de hardware Sparc, distinta daquela
para a qual foi projetado (Intel/AMD).
sistema
convidado
monitor
sistema
hospedeiro
Aplics Windows
Aplics Windows
Windows
Windows
camada de
virtualizao
Sparc
x86
Mquina
Virtual
21
c Carlos Maziero
1: Mquinas virtuais
Um ambiente de mquina virtual consiste de trs partes bsicas, que podem ser
observadas na Figura 1.10:
O sistema real, ou sistema hospedeiro (host system), que contm os recursos reais
de hardware e software do sistema;
o sistema virtual, tambm denominado sistema convidado (guest system), que
executa sobre o sistema virtualizado; em alguns casos, vrios sistemas virtuais
podem coexistir, executando sobre o mesmo sistema real;
a camada de virtualizao, denominada hipervisor ou monitor de virtualizao (VMM
- Virtual Machine Monitor), que constri as interfaces virtuais a partir da interface
real.
Na dcada de 1970, os pesquisadores Popek & Goldberg formalizaram vrios
conceitos associados s mquinas virtuais, e definiram as condies necessrias
para que uma plataforma de hardware suporte de forma eficiente a virtualizao
[Popek and Goldberg, 1974]. Nessa mesma poca surgem as primeiras experincias
concretas de utilizao de mquinas virtuais para a execuo de aplicaes, com o
ambiente UCSD p-System, no qual programas Pascal so compilados para execuo
sobre um hardware abstrato denominado P-Machine. Com o aumento de desempenho e
funcionalidades do hardware PC e o surgimento da linguagem Java, no incio dos anos
90, o interesse pelas tecnologias de virtualizao voltou tona. Atualmente, as solues
de virtualizao de linguagens e de plataformas vm despertando grande interesse
do mercado. Vrias linguagens so compiladas para mquinas virtuais portveis e os
processadores mais recentes trazem um suporte nativo virtualizao de hardware,
finalmente respeitando as condies conceituais definidas no incio dos anos 70.
Existem diversas possibilidades de implementao de sistemas de mquinas virtuais.
De acordo com o tipo de sistema convidado suportado, os ambientes de mquinas
virtuais podem ser divididos em duas grandes famlias (Figura 1.11):
Mquinas virtuais de aplicao : so ambientes de mquinas virtuais destinados a
suportar apenas um processo ou aplicao convidada especfica. A mquina
virtual Java um exemplo desse tipo de ambiente.
Mquinas virtuais de sistema : so construdos para suportar sistemas operacionais
convidados completos, com aplicaes convidadas executando sobre eles. Como
exemplos podem ser citados os ambientes VMWare, Xen e VirtualBox.
As mquinas virtuais de aplicao so geralmente usadas como suporte de execuo de linguagens de programao. As primeiras experincias com linguagens
usando mquinas virtuais remontam aos anos 1970, com a linguagem UCSD Pascal
(da Universidade da Califrnia em San Diego). Na poca, um programa escrito em
Pascal era compilado em um cdigo binrio denominado P-Code, que executava sobre o
processador abstrato P-Machine. O interpretador de P-Codes era bastante compacto e
facilmente portvel, o que tornou o sistema P muito popular. Hoje, muitas linguagens
adotam estratgias similares, como Java, C#, Python, Perl, Lua e Ruby. Em C#, o
22
c Carlos Maziero
1: Mquinas virtuais
Espao de
usurio
Aplics Linux
Aplic
Java
Aplics Linux
Aplics Windows
ncleo Linux
ncleo Windows
JVM
ncleo Linux
hipervisor
hardware x86
hardware x86
VM de aplicao
VM de sistema
c Carlos Maziero
1: Mquinas virtuais
aplics
OS 1
aplics
aplics
aplics
guest OS
OS 2
host OS
hipervisor
hipervisor
hardware
hardware
hipervisor nativo
hipervisor convidado
24
c Carlos Maziero
1.7
c Carlos Maziero
26
Captulo 2
Gerncia de atividades
Um sistema de computao quase sempre tem mais atividades a executar que
o nmero de processadores disponveis. Assim, necessrio criar mtodos para
multiplexar o(s) processador(es) da mquina entre as atividades presentes. Alm
disso, como as diferentes tarefas tm necessidades distintas de processamento, e nem
sempre a capacidade de processamento existente suficiente para atender a todos,
estratgias precisam ser definidas para que cada tarefa receba uma quantidade de
processamento que atenda suas necessidades. Este mdulo apresenta os principais
conceitos, estratgias e mecanismos empregados na gesto do processador e das
atividades em execuo em um sistema de computao.
2.1
Objetivos
c Carlos Maziero
2: O conceito de tarefa
2.2
O conceito de tarefa
c Carlos Maziero
2: A gerncia de tarefas
tambm pode definir vrias sequncias de execuo inter-dependentes para atingir seus
objetivos. Por exemplo, o programa do navegador Web ilustrado na Figura 2.1 define
vrias tarefas que uma janela de navegador deve executar simultaneamente, para que o
usurio possa navegar na Internet:
4
2
1
3
Figura 2.1: Tarefas de um navegador Internet
1. Buscar via rede os vrios elementos que compem a pgina Web;
2. Receber, analisar e renderizar o cdigo HTML e os grficos recebidos;
3. Animar os diferentes elementos que compem a interface do navegador;
4. Receber e tratar os eventos do usurio (clicks) nos botes do navegador;
Dessa forma, as tarefas definem as atividades a serem realizadas dentro do sistema
de computao. Como geralmente h muito mais tarefas a realizar que processadores
disponveis, e as tarefas no tm todas a mesma importncia, a gerncia de tarefas tem
uma grande importncia dentro de um sistema operacional.
2.3
A gerncia de tarefas
c Carlos Maziero
2: Sistemas mono-tarefa
em que ordem faz-lo. Nesta seo ser estudada a organizao bsica do sistema de
gerncia de tarefas e sua evoluo histrica.
2.3.1
Sistemas mono-tarefa
Os primeiros sistemas de computao, nos anos 40, executavam apenas uma tarefa
de cada vez. Nestes sistemas, cada programa binrio era carregado do disco para a
memria e executado at sua concluso. Os dados de entrada da tarefa eram carregados
na memria juntamente com a mesma e os resultados obtidos no processamento eram
descarregados de volta no disco aps a concluso da tarefa. Todas as operaes de
transferncia de cdigo e dados entre o disco e a memria eram coordenados por um
operador humano. Esses sistemas primitivos eram usados sobretudo para aplicaes de
clculo numrico, muitas vezes com fins militares (problemas de trigonometria, balstica,
mecnica dos fluidos, etc.). A Figura 2.2 a seguir ilustra um sistema desse tipo.
disco
Memria
dados
tarefa
resultados
processador
control.
de disco
4
barramentos
Figura 2.2: Sistema mono-tarefa: 1) carga do cdigo na memria, 2) carga dos dados na
memria, 3) processamento, consumindo dados e produzindo resultados, 4) ao trmino
da execuo, a descarga dos resultados no disco.
Nesse mtodo de processamento de tarefas possvel delinear um diagrama de
estados para cada tarefa executada pelo sistema, que est representado na Figura 2.3.
nova
inicia a
execuo
executando
termina a
execuo
terminada
c Carlos Maziero
2: Sistemas multi-tarefa
2.3.2
Sistemas multi-tarefa
Essa diferena de velocidades permanece imensa nos sistemas atuais. Por exemplo, em um computador atual a velocidade de acesso memria de cerca de 10 nanossegundos (10 109 s), enquanto a
velocidade de acesso a dados em um disco rgido IDE de cerca de 10 milissegundos (10 103 s), ou seja,
um milho de vezes mais lento!
31
c Carlos Maziero
nova
inicia a
execuo
pronta
dado disponvel ou
evento ocorreu
executando
suspensa
termina a
execuo
terminada
2.3.3
1
2
3
4
5
6
7
A durao atual do quantum depende muito do tipo de sistema operacional; no Linux ela varia de 10
a 200 milissegundos, dependendo do tipo e prioridade da tarefa [Love, 2004].
32
c Carlos Maziero
ncleo
tarefa
c=20
...
tarefa
c=19
c=18
tarefa
c=2
tarefa
c=1
ncleo
c=0
nova
terminou de
ser carregada
em memria
recebe o
processador
pronta
dado disponvel ou
evento ocorreu
suspensa
executando
termina a
execuo
terminada
2.3.4
c Carlos Maziero
Nova : A tarefa est sendo criada, i.e. seu cdigo est sendo carregado em memria,
junto com as bibliotecas necessrias, e as estruturas de dados do ncleo esto
sendo atualizadas para permitir sua execuo.
Pronta : A tarefa est em memria, pronta para executar (ou para continuar sua
execuo), apenas aguardando a disponibilidade do processador. Todas as tarefas
prontas so organizadas em uma fila cuja ordem determinada por algoritmos de
escalonamento, que sero estudados na Seo 2.5.
Executando : O processador est dedicado tarefa, executando suas instrues e
fazendo avanar seu estado.
Suspensa : A tarefa no pode executar porque depende de dados externos ainda
no disponveis (do disco ou da rede, por exemplo), aguarda algum tipo de
sincronizao (o fim de outra tarefa ou a liberao de algum recurso compartilhado)
ou simplesmente espera o tempo passar (em uma operao sleeping, por exemplo).
Terminada : O processamento da tarefa foi encerrado e ela pode ser removida da
memria do sistema.
To importantes quanto os estados das tarefas apresentados na Figura 2.6 so as
transies entre esses estados, que so explicadas a seguir:
Nova : Esta transio ocorre quando uma nova tarefa admitida no sistema e
comea a ser preparada para executar.
Nova Pronta : ocorre quando a nova tarefa termina de ser carregada em memria,
juntamente com suas bibliotecas e dados, estando pronta para executar.
Pronta Executando : esta transio ocorre quando a tarefa escolhida pelo escalonador para ser executada, dentre as demais tarefas prontas.
Executando Pronta : esta transio ocorre quando se esgota a fatia de tempo destinada tarefa (ou seja, o fim do quantum); como nesse momento a tarefa no precisa
de outros recursos alm do processador, ela volta fila de tarefas prontas, para
esperar novamente o processador.
Executando Terminada : ocorre quando a tarefa encerra sua execuo ou abortada
em consequncia de algum erro (acesso invlido memria, instruo ilegal,
diviso por zero, etc.). Na maioria dos sistemas a tarefa que deseja encerrar avisa
o sistema operacional atravs de uma chamada de sistema (no Linux usada a
chamada exit).
Terminada : Uma tarefa terminada removida da memria e seus registros e
estruturas de controle no ncleo so apagadas.
Executando Suspensa : caso a tarefa em execuo solicite acesso a um recurso
no disponvel, como dados externos ou alguma sincronizao, ela abandona o
processador e fica suspensa at o recurso ficar disponvel.
34
c Carlos Maziero
2: Implementao de tarefas
Suspensa Pronta : quando o recurso solicitado pela tarefa se torna disponvel, ela
pode voltar a executar, portanto volta ao estado de pronta.
A estrutura do diagrama de ciclo de vida das tarefas pode variar de acordo com a
interpretao dos autores. Por exemplo, a forma apresentada neste texto condiz com a
apresentada em [Silberschatz et al., 2001] e outros autores. Por outro lado, o diagrama
apresentado em [Tanenbaum, 2003] divide o estado suspenso em dois subestados
separados: bloqueado, quando a tarefa aguarda a ocorrncia de algum evento (tempo,
entrada/sada, etc.) e suspenso, para tarefas bloqueadas que foram movidas da
memria RAM para a rea de troca pelo mecanismo de memria virtual (vide Seo
5.7). Todavia, tal distino de estados no faz mais sentido nos sistemas operacionais
atuais baseados em memria paginada, pois neles os processos podem executar mesmo
estando somente parcialmente carregados na memria.
2.4
Implementao de tarefas
2.4.1
Contextos
Na Seo 2.2 vimos que uma tarefa possui um estado interno bem definido, que
representa sua situao atual: a posio de cdigo que ela est executando, os valores
de suas variveis e os arquivos que ela utiliza, por exemplo. Esse estado se modifica
conforme a execuo da tarefa evolui. O estado de uma tarefa em um determinado
instante denominado contexto. Uma parte importante do contexto de uma tarefa
diz respeito ao estado interno do processador durante sua execuo, como o valor do
contador de programa (PC - Program Counter), do apontador de pilha (SP - Stack Pointer)
e demais registradores. Alm do estado interno do processador, o contexto de uma
tarefa tambm inclui informaes sobre os recursos usados por ela, como arquivos
abertos, conexes de rede e semforos.
Cada tarefa presente no sistema possui um descritor associado, ou seja, uma estrutura
de dados que a representa no ncleo. Nessa estrutura so armazenadas as informaes
relativas ao seu contexto e os demais dados necessrios sua gerncia. Essa estrutura
de dados geralmente chamada de TCB (do ingls Task Control Block) ou PCB (Process
Control Block). Um TCB tipicamente contm as seguintes informaes:
Identificador da tarefa (pode ser um nmero inteiro, um apontador, uma referncia
de objeto ou um identificador opaco);
Estado da tarefa (nova, pronta, executando, suspensa, terminada, ...);
35
c Carlos Maziero
2: Trocas de contexto
2.4.2
Trocas de contexto
c Carlos Maziero
2: Processos
Tarefa t1
tratador
de
interrupo
dispatcher
scheduler
Tarefa t2
dispatcher
t
salva contexto
restaura contexto
TCB(t1)
TCB(t2)
2.4.3
Processos
Alm de seu prprio cdigo executvel, cada tarefa ativa em um sistema de computao necessita de um conjunto de recursos para executar e cumprir seu objetivo. Entre
esses recursos esto as reas de memria usadas pela tarefa para armazenar seu cdigo,
dados e pilha, seus arquivos abertos, conexes de rede, etc. O conjunto dos recursos
alocados a uma tarefa para sua execuo denominado processo.
Historicamente, os conceitos de tarefa e processo se confundem, sobretudo porque
os sistemas operacionais mais antigos, at meados dos anos 80, somente suportavam
uma tarefa para cada processo (ou seja, uma atividade associada a cada contexto). Essa
viso vem sendo mantida por muitas referncias at os dias de hoje. Por exemplo,
os livros [Silberschatz et al., 2001] e [Tanenbaum, 2003] ainda apresentam processos
como equivalentes de tarefas. No entanto, quase todos os sistemas operacionais
contemporneos suportam mais de uma tarefa por processo, como o caso do Linux,
Windows XP e os UNIX mais recentes.
Os sistemas operacionais convencionais atuais associam por default uma tarefa a
cada processo, o que corresponde execuo de um programa sequencial (um nico
fluxo de instrues dentro do processo). Caso se deseje associar mais tarefas ao mesmo
contexto (para construir o navegador Internet da Figura 2.1, por exemplo), cabe ao
desenvolvedor escrever o cdigo necessrio para tal. Por essa razo, muitos livros ainda
37
c Carlos Maziero
2: Processos
arqs abertos
Processo pb
tarefas
memria
arqs abertos
conexes
memria
conexes
ncleo
c Carlos Maziero
2: Processos
Processo pai
Processo lho
tarefas
memria
tarefas
memria
tarefas
memria
arqs abertos
conexes
arqs abertos
conexes
arqs abertos
conexes
fork
return
ncleo
return
ncleo
Figura 2.9: A chamada de sistema fork: antes (esq) e depois (dir) de sua execuo pelo
ncleo do sistema UNIX.
A chamada de sistema fork invocada por um processo (o pai), mas dois processos
recebem seu retorno: o processo pai, que a invocou, e o processo filho, recm-criado, que
possui o mesmo estado interno que o pai (ele tambm est aguardando o retorno da
chamada de sistema). Ambos os processos tm os mesmos recursos associados, embora
em reas de memria distintas. Caso o processo filho deseje abandonar o fluxo de
execuo herdado do processo pai e executar outro cdigo, poder faz-lo atravs da
chamada de sistema execve. Essa chamada substitui o cdigo do processo que a invoca
pelo cdigo executvel contido em um arquivo informado como parmetro. A listagem
a seguir apresenta um exemplo de uso dessas duas chamadas de sistema:
39
c Carlos Maziero
1
2
3
4
5
#include
#include
#include
#include
#include
2: Processos
<unistd.h>
<sys/types.h>
<sys/wait.h>
<stdio.h>
<stdlib.h>
6
7
8
9
10
pid = fork () ;
11
/* replicao do processo */
12
if ( pid < 0 )
/* fork no funcionou */
{
perror ("Erro: ") ;
exit (-1) ;
/* encerra o processo */
}
else if ( pid > 0 ) /* sou o processo pai */
{
wait (0) ;
/* vou esperar meu filho concluir */
}
else
/* sou o processo filho*/
{
/* carrega outro cdigo binrio para executar */
execve ("/bin/date", argv, envp) ;
perror ("Erro: ") ; /* execve no funcionou */
}
printf ("Tchau !\n") ;
exit(0) ;
/* encerra o processo */
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
A chamada de sistema exit usada no exemplo acima serve para informar ao ncleo
do sistema operacional que o processo em questo no mais necessrio e pode ser
destrudo, liberando todos os recursos a ele associados (arquivos abertos, conexes de
rede, reas de memria, etc.). Processos podem solicitar ao ncleo o encerramento de
outros processos, mas essa operao s aplicvel a processos do mesmo usurio, ou se
o processo solicitante pertencer ao administrador do sistema.
Na operao de criao de processos do UNIX aparece de maneira bastante clara a
noo de hierarquia entre processos. medida em que processos so criados, forma-se
uma rvore de processos no sistema, que pode ser usada para gerenciar de forma coletiva
os processos ligados mesma aplicao ou mesma sesso de trabalho de um usurio,
pois iro constituir uma sub-rvore de processos. Por exemplo, quando um processo
encerra, seus filhos so informados sobre isso, e podem decidir se tambm encerram ou
se continuam a executar. Por outro, nos sistemas Windows, todos os processos tm o
mesmo nvel hierrquico, no havendo distino entre pais e filhos. O comando pstree
do Linux permite visualizar a rvore de processos do sistema, como mostra a listagem a
seguir.
40
c Carlos Maziero
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2: Processos
init-+-aacraid
|-ahc_dv_0
|-atd
|-avaliacao_horac
|-bdflush
|-crond
|-gpm
|-kdm-+-X
|
-kdm---kdm_greet
|-keventd
|-khubd
|-2*[kjournald]
|-klogd
|-ksoftirqd_CPU0
|-ksoftirqd_CPU1
|-kswapd
|-kupdated
|-lockd
|-login---bash
|-lpd---lpd---lpd
|-5*[mingetty]
|-8*[nfsd]
|-nmbd
|-nrpe
|-oafd
|-portmap
|-rhnsd
|-rpc.mountd
|-rpc.statd
|-rpciod
|-scsi_eh_0
|-scsi_eh_1
|-smbd
|-sshd-+-sshd---tcsh---top
|
|-sshd---bash
|
-sshd---tcsh---pstree
|-syslogd
|-xfs
|-xinetd
-ypbind---ypbind---2*[ypbind]
41
c Carlos Maziero
2.4.4
2: Threads
Threads
c Carlos Maziero
2: Threads
Processo pb
Processo pa
threads
threads
memria
biblioteca
biblioteca
thread de
ncleo
memria
ncleo
thread de
ncleo
43
c Carlos Maziero
2: Threads
Processo pb
Processo pa
threads
threads
memria
memria
ncleo
threads
de ncleo
Processo pb
Processo pa
threads
threads
memria
biblioteca
biblioteca
thread de
ncleo
memria
ncleo
threads
de ncleo
c Carlos Maziero
Modelo
Resumo
Local da implementao
Complexidade
Custo de gerncia para o ncleo
Escalabilidade
Suporte a vrios
processadores
Velocidade das
trocas de contexto entre threads
Diviso de recursos entre tarefas
Exemplos
2: Threads
N:1
1:1
Todos os N threads do Cada thread do proprocesso so mapea- cesso tem um thdos em um nico th- read correspondente
read de ncleo
no ncleo
bibliotecas no nvel dentro do ncleo
usurio
baixa
mdia
nulo
mdio
N:M
Os N threads do processo so mapeados
em um conjunto de
M threads de ncleo
em ambos
alta
no
baixa
sim
alta
sim
rpida
lenta
injusta
justa
alta
alto
45
c Carlos Maziero
2: Threads
No passado, cada sistema operacional definia sua prpria interface para a criao de
threads, o que levou a problemas de portabilidade das aplicaes. Em 1995 foi definido
o padro IEEE POSIX 1003.1c, mais conhecido como PThreads [Nichols et al., 1996], que
busca definir uma interface padronizada para a criao e manipulao de threads na
linguagem C. Esse padro amplamente difundido e suportado hoje em dia. A listagem
a seguir, extrada de [Barney, 2005], exemplifica o uso do padro PThreads (para compilar
deve ser usada a opo de ligao -lpthread).
1
2
3
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
4
5
#define NUM_THREADS 5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
O conceito de threads tambm pode ser utilizado em outras linguagens de programao, como Java, Python, Perl, C++ e C#. O cdigo a seguir traz um exemplo simples de
criao de threads em Java (extrado da documentao oficial da linguagem):
46
c Carlos Maziero
1
2
2: Escalonamento de tarefas
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
t1.start ();
t2.start ();
t3.start ();
20
21
22
23
24
2.5
Escalonamento de tarefas
c Carlos Maziero
2: Objetivos e mtricas
Tarefas em lote (batch) : so tarefas sem requisitos temporais explcitos, que normalmente executam sem interveno do usurio, como procedimentos de backup,
varreduras de anti-vrus, clculos numricos longos, renderizao de animaes,
etc.
Alm dessa classificao, as tarefas tambm podem ser classificadas de acordo com
seu comportamento no uso do processador:
Tarefas orientadas a processamento (CPU-bound tasks): so tarefas que usam intensivamente o processador na maior parte de sua existncia. Essas tarefas passam a
maior parte do tempo nos estados pronta ou executando. A converso de arquivos
de vdeo e outros processamentos numricos longos (como os feitos pelo projeto
SETI@home [Anderson et al., 2002]) so bons exemplos desta classe de tarefas.
Tarefas orientadas a entrada/sada (IO-bound tasks): so tarefas que dependem muito
mais dos dispositivos de entrada/sada que do processador. Essas tarefas despendem boa parte de suas existncias no estado suspenso, aguardando respostas s
suas solicitaes de leitura e/ou escrita de dados nos dispositivos de entrada/sada.
Exemplos desta classe de tarefas incluem editores, compiladores e servidores de
rede.
importante observar que uma tarefa pode mudar de comportamento ao longo de
sua execuo. Por exemplo, um conversor de arquivos de udio WAVMP3 alterna
constantemente entre fases de processamento e de entrada/sada, at concluir a converso
dos arquivos desejados.
2.5.1
Objetivos e mtricas
c Carlos Maziero
2.5.2
c Carlos Maziero
processador quando for reativada. Ncleos de sistema que oferecem essa possibilidade
so denominados ncleos preemptivos; Solaris, Linux 2.6 e Windows NT so exemplos
de ncleos preemptivos.
2.5.3
t1
0
5
t2
0
2
t3
1
4
t4
3
3
t
0
11
14
Tt =
Tw =
50
c Carlos Maziero
t
0
10
11
12
13
14
Tt =
Tw =
c Carlos Maziero
t2
t=0
t=2
t=3
t=4
t=5
t=6
t4
t1
t=7
t2
t1
t3
t2
t1
t1
t3
t2
t1
t3
t2
t4
t1
t3
t4
t1
t3
t3
t4
t1
t=0
t=1
t=8
t=9
t=10
t=11
t2
t=12
t=13
t3
t4
t1
t1
t3
t4
t1
t3
t4
t4
t1
t3
t4
t1
t3
t4
t1
t3
t4
t1
t=14
t4
E=
tq
tq + ttc
Por exemplo, um sistema no qual as trocas de contexto duram 1ms e cujo quantum
20
mdio de 20ms ter uma eficincia E = 20+1
= 95, 2%. Caso a durao do quantum
2
seja reduzida para 2ms, a eficincia cair para E = 2+1
= 66, 7%. A eficincia final da
gerncia de tarefas influenciada por vrios fatores, como a carga do sistema (mais
tarefas ativas implicam em mais tempo gasto pelo escalonador, aumentando ttc ) e o
perfil das aplicaes (aplicaes que fazem muita entrada/sada saem do processador
antes do final de seu quantum, diminuindo o valor mdio de tq ).
Deve-se observar que os algoritmos de escalonamento FCFS e RR no levam em
conta a importncia das tarefas nem seu comportamento em relao ao uso dos recursos.
Por exemplo, nesses algoritmos as tarefas orientadas a entrada/sada iro receber menos
tempo de processador que as tarefas orientadas a processamento (pois as primeiras
geralmente no usam integralmente seus quanta de tempo), o que pode ser prejudicial
para aplicaes interativas.
52
c Carlos Maziero
2.5.4
t
0
14
Tt =
Tw =
53
c Carlos Maziero
tempo, esse algoritmo pode ser de grande valia, sobretudo para tarefas orientadas a
entrada/sada.
Suponha uma tarefa orientada a entrada/sada em um sistema preemptivo com
tq = 10ms. Nas ltimas 3 vezes em que recebeu o processador, essa tarefa utilizou
3ms, 4ms e 4.5ms de cada quantum recebido. Com base nesses dados histricos,
possvel estimar qual a durao da execuo da tarefa na prxima vez em que receber
o processador. Essa estimativa pode ser feita por mdia simples (clculo mais rpido)
ou por extrapolao (clculo mais complexo, podendo influenciar o tempo de troca de
contexto ttc ).
A estimativa de uso do prximo quantum assim obtida pode ser usada como
base para a aplicao do algoritmo SJF, o que ir priorizar as tarefas orientadas a
entrada/sada, que usam menos o processador. Obviamente, uma tarefa pode mudar de
comportamento repentinamente, passando de uma fase de entrada/sada para uma fase
de processamento, ou vice-versa. Nesse caso, a estimativa de uso do prximo quantum
ser incorreta durante alguns ciclos, mas logo voltar a refletir o comportamento atual
da tarefa. Por essa razo, apenas a histria recente da tarefa deve ser considerada (3 a 5
ltimas ativaes).
Outro problema associado ao escalonamento SJF a possibilidade de inanio
(starvation) das tarefas mais longas. Caso o fluxo de tarefas curtas chegando ao sistema
seja elevado, as tarefas mais longas nunca sero escolhidas para receber o processador e
vo literalmente morrer de fome, esperando na fila sem poder executar. Esse problema
pode ser resolvido atravs de tcnicas de envelhecimento de tarefas, como a apresentada
na Seo 2.5.5.
2.5.5
Vrios critrios podem ser usados para ordenar a fila de tarefas prontas e escolher a
prxima tarefa a executar; a data de ingresso da tarefa (usada no FCFS) e sua durao
prevista (usada no SJF) so apenas dois deles. Inmeros outros critrios podem ser
especificados, como o comportamento da tarefa (em lote, interativa ou de tempo-real),
seu proprietrio (administrador, gerente, estagirio), seu grau de interatividade, etc.
No escalonamento por prioridades, a cada tarefa associada uma prioridade, geralmente na forma de um nmero inteiro. Os valores de prioridade so ento usados para
escolher a prxima tarefa a receber o processador, a cada troca de contexto. O algoritmo
de escalonamento por prioridades define um modelo genrico de escalonamento, que
permite modelar vrias abordagens, entre as quais o FCFS e o SJF.
Para ilustrar o funcionamento do escalonamento por prioridades, sero usadas as
tarefas descritas na tabela a seguir, que usam uma escala de prioridades positiva (ou
seja, onde valores maiores indicam uma prioridade maior):
tarefa
ingresso
durao
prioridade
t1
0
5
2
54
t2
0
2
3
t3
1
4
1
t4
3
3
4
c Carlos Maziero
t
0
10
14
Tt =
Tw =
t
0
10
55
14
c Carlos Maziero
Tt =
Tw =
Definio de prioridades
A definio da prioridade de uma tarefa influenciada por diversos fatores, que
podem ser classificados em dois grandes grupos:
Fatores externos : so informaes providas pelo usurio ou o administrador do
sistema, que o escalonador no conseguiria estimar sozinho. Os fatores externos
mais comuns so a classe do usurio (administrador, diretor, estagirio) o valor
pago pelo uso do sistema (servio bsico, servio premium) e a importncia da
tarefa em si (um detector de intruso, um script de reconfigurao emergencial,
etc.).
Fatores internos : so informaes que podem ser obtidas ou estimadas pelo escalonador, com base em dados disponveis no sistema local. Os fatores internos mais
utilizados so a idade da tarefa, sua durao estimada, sua interatividade, seu uso
de memria ou de outros recursos, etc.
Todos esses fatores devem ser combinados para produzir um valor de prioridade
para cada tarefa. Todos os fatores externos so expressos por valor inteiro denominado
prioridade esttica (ou prioridade de base), que resume a opinio do usurio ou
administrador sobre aquela tarefa. Os fatores internos mudam continuamente e devem
ser recalculados periodicamente pelo escalonador. A combinao da prioridade esttica
com os fatores internos resulta na prioridade dinmica ou final, que usada pelo
escalonador para ordenar as tarefas prontas. A Figura 2.19 resume esse procedimento.
Em geral, cada famlia de sistemas operacionais define sua prpria escala de
prioridades estticas. Alguns exemplos de escalas comuns so:
Windows 2000 e sucessores : processos e threads so associados a classes de prioridade
(6 classes para processos e 7 classes para threads); a prioridade final de uma thread
depende de sua prioridade de sua prpria classe de prioridade e da classe de
prioridade do processo ao qual est associada, assumindo valores entre 0 e 31.
As prioridades do processos, apresentadas aos usurios no Gerenciador de Tarefas,
apresentam os seguintes valores default:
4: baixa ou ociosa
56
c Carlos Maziero
classe do usurio
valor pago
importncia da tarefa
fatores externos
...
prioridade
esttica
prioridade
dinmica
idade da tarefa
durao estimada
grau de interatividade
fatores internos
c Carlos Maziero
prioridade, espera-se que cada uma receba 50% do processador e que ambas concluam ao
mesmo tempo. Caso o sistema receba trs tarefas: t1 com prioridade 1, t2 com prioridade
2 e t3 com prioridade 3, espera-se que t3 receba mais o processador que t2 , e esta mais
que t1 (assumindo uma escala de prioridades positiva). Entretanto, se aplicarmos o
algoritmo de prioridades bsico, as tarefas iro executar de forma sequencial, sem
distribuio proporcional do processador. Esse resultado indesejvel ocorre porque,
a cada fim de quantum, sempre a mesma tarefa escolhida para processar: a mais
prioritria. Essa situao est ilustrada na Figura 2.20.
t3
t2
t1
t
0
c Carlos Maziero
t
0
c Carlos Maziero
3. pb perde o processador, pois um processo com prioridade maior que a dele (pm ) foi
acordado devido a uma interrupo;
4. pb volta ao final da fila de tarefas prontas, aguardando o processador; enquanto
ele no voltar a executar, o recurso R permanecer alocado a ele e ningum poder
us-lo;
5. Um processo de alta prioridade pa recebe o processador e solicita acesso ao recurso
R; como o recurso est alocado ao processo pb , pa suspenso at que o processo de
baixa prioridade pb libere o recurso.
Neste momento, o processo de alta prioridade pa no pode continuar sua execuo,
porque o recurso de que necessita est nas mos do processo de baixa prioridade pb .
Dessa forma, pa deve esperar que pb execute e libere R, o que justifica o nome inverso de
prioridades. A espera de pa pode ser longa, pois pb tem baixa prioridade e pode demorar
a receber o processador novamente, caso existam outros processos em execuo no
sistema (como pm ). Como tarefas de alta prioridade so geralmente crticas para o
funcionamento de um sistema, a inverso de prioridades pode ter efeitos graves.
Pa acorda, solicita o recurso
e ca bloqueado esperando
inverso de prioridades!
Pa recebe o recurso
e o processador
Pm recebe o processador
Pa
R
Pm
Pb aloca um
recurso para si
Pb libera o recurso
bloqueado e
perde o processador
Pb
t
0
Pm libera o processador
60
c Carlos Maziero
Pm recebe o processador
Pa
R
Pm
Pb aloca um
recurso para si
Pb
t
0
c Carlos Maziero
tarefa
funo
prioridade durao
tg
gerncia da rea de transferncia
alta
curta
tm
coleta de dados meteorolgicos
baixa
curta
comunicao com a Terra
mdia
longa
tc
Tabela 2.2: Algumas tarefas do software da sonda Mars Pathfinder.
thread tg
watchdog
thread tm
sensores
meteorolgicos
e ambientais
thread tc
rea de
transferncia
rdio e
antena
outra
threads
2.5.6
Alm dos algoritmos de escalonamento vistos nesta seo, diversos outros podem
ser encontrados na literatura e em sistemas de mercado, como os escalonadores de
tempo-real [Farines et al., 2000], os escalonadores multimdia [Nieh and Lam, 1997], os
escalonadores justos [Kay and Lauder, 1988, Ford and Susarla, 1996], os escalonadores
multi-processador [Black, 1990] e multi-core [Boyd-Wickizer et al., 2009].
62
c Carlos Maziero
2.5.7
2: Um escalonador real
Um escalonador real
SCHED_FIFO
SCHED_RR
sched_yield / m de quantum
executando
sched_yield / m de quantum
SCHED_OTHER
suspensa
c Carlos Maziero
2: Um escalonador real
tarefas, ou seja, a grande maioria das aplicaes e comandos dos usurios, executa na
classe de escalonamento SCHED_OTHER.
64
Captulo 3
Comunicao entre tarefas
Muitas implementaes de sistemas complexos so estruturadas como vrias
tarefas inter-dependentes, que cooperam entre si para atingir os objetivos da
aplicao, como por exemplo em um navegador Web. Para que as vrias tarefas que
compem uma aplicao possam cooperar, elas precisam comunicar informaes
umas s outras e coordenar suas atividades, para garantir que os resultados
obtidos sejam coerentes. Este mdulo apresenta os principais conceitos, problemas
e solues referentes comunicao entre tarefas.
3.1
Objetivos
65
c Carlos Maziero
3: Escopo da comunicao
3.2
Escopo da comunicao
Tarefas cooperantes precisam trocar informaes entre si. Por exemplo, a tarefa
que gerencia os botes e menus de um navegador Web precisa informar rapidamente
as demais tarefas caso o usurio clique nos botes stop ou reload. Outra situao de
comunicao frequente ocorre quando o usurio seleciona um texto em uma pgina da
Internet e o arrasta para um editor de textos. Em ambos os casos ocorre a transferncia
de informao entre duas tarefas distintas.
Implementar a comunicao entre tarefas pode ser simples ou complexo, dependendo
da situao. Se as tarefas esto no mesmo processo, elas compartilham a mesma rea de
memria e a comunicao pode ento ser implementada facilmente, usando variveis
globais comuns. Entretanto, caso as tarefas pertenam a processos distintos, no existem
variveis compartilhadas; neste caso, a comunicao tem de ser feita por intermdio do
ncleo do sistema operacional, usando chamadas de sistema. Caso as tarefas estejam
em computadores distintos, o ncleo deve implementar mecanismos de comunicao
especficos, fazendo uso do suporte de rede disponvel. A Figura 3.1 ilustra essas trs
situaes.
Apesar da comunicao poder ocorrer entre threads, processos locais ou computadores
distintos, com ou sem o envolvimento do ncleo do sistema, os mecanismos de
comunicao so habitualmente denominados de forma genrica como mecanismos
de IPC (Inter-Process Communication mechanisms).
66
c Carlos Maziero
Computador 1
Computador 2
Processo pa
tarefa i
Processo pb
tarefa j
send
Processo pc
tarefa k
tarefa l
recv
rea
comum
send
send recv
recv
rea no ncleo
ncleo
ncleo
rea no ncleo
rede
3.3
3.3.1
De forma mais abstrata, a comunicao entre tarefas pode ser implementada por
duas primitivas bsicas: enviar (dados, destino), que envia os dados relacionados ao
destino indicado, e receber (dados, origem), que recebe os dados previamente enviados
pela origem indicada. Essa abordagem, na qual o emissor identifica claramente o
receptor e vice-versa, denominada comunicao direta.
Poucos sistemas empregam a comunicao direta; na prtica so utilizados mecanismos de comunicao indireta, por serem mais flexveis. Na comunicao indireta,
emissor e receptor no precisam se conhecer, pois no interagem diretamente entre
si. Eles se relacionam atravs de um canal de comunicao, que criado pelo sistema
operacional, geralmente a pedido de uma das partes. Neste caso, as primitivas de
comunicao no designam diretamente tarefas, mas canais de comunicao aos quais
67
c Carlos Maziero
3: Sincronismo
as tarefas esto associadas: enviar (dados, canal) e receber (dados, canal). A Figura 3.2
ilustra essas duas formas de comunicao.
receptor
emissor
receptor
emissor
canal
dados
enviar
dados
enviar
receber
dados
3.3.2
Sincronismo
emissor
receptor
emissor
enviar
receber
espera
espera
dados
dados
enviar
receber
c Carlos Maziero
3: Formato de envio
em que cada operao invocada, esta retorna imediatamente com uma indicao
de erro. Deve-se observar que, caso o emissor e o receptor operem ambos de forma
assncrona, torna-se necessrio criar um canal ou buffer para armazenar os dados
da comunicao entre eles. Sem esse canal, a comunicao se tornar invivel,
pois raramente ambos estaro prontos para comunicar ao mesmo tempo. Esta
forma de comunicao, tambm conhecida como comunicao no-bloqueante,
est representada no diagrama de tempo da Figura 3.4.
receptor
emissor
enviar
erro !
(ningum para receber)
receber
erro !
(nada a receber)
dados
enviar
receber
3.3.3
Formato de envio
c Carlos Maziero
3: Formato de envio
receptor
emissor
receptor
emissor
enviar
receber
prazo
prazo
erro !
(ningum para receber)
erro !
(nada a receber)
enviar
receber
dados
enviar
receber
dados
ab
1234
xyz
enviar
buer
receptor
ab
enviar
1234
enviar
ab
receber
ab
receber
1234
receber
xyz
xyz 1234
xyz
c Carlos Maziero
buer
ab
enviar
ab
1234
enviar
ab1234
xyz
enviar
receptor
receber
ab12
receber
34xy
34xyz
receber
3.3.4
c Carlos Maziero
m1
enviar
m2
enviar
m3
enviar
buer
m1
m2
receptor
m1
m2 m1
no h espao
m2
m3
m1
receber
m1
m3 m2
3.3.5
c Carlos Maziero
3: Nmero de participantes
3.3.6
Nmero de participantes
73
c Carlos Maziero
r1
m1
e1
m3
m4
m1
m2
mailbox
r2
m2
m4
e2
m3
r3
e1
e2
m3
m3
m2
m1
m3
m2
m1
m3
m2
m1
m1
r1
r2
m2
r3
3.4
3.4.1
c Carlos Maziero
75
c Carlos Maziero
1
2
3
4
5
6
7
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<mqueue.h>
<sys/stat.h>
8
9
10
11
12
13
14
15
16
17
18
19
20
21
umask (0) ;
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
76
c Carlos Maziero
1
2
3: Pipes
3
4
5
6
7
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<mqueue.h>
<unistd.h>
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for (;;)
{
msg = random() % 100 ; // valor entre 0 e 99
23
24
25
26
// envia a mensagem
if (mq_send (queue, (void*) &msg, sizeof(msg), 0) < 0)
{
perror ("mq_send");
exit (1);
}
printf ("Sent message with value %d\n", msg);
sleep (1) ;
27
28
29
30
31
32
33
34
35
36
3.4.2
Pipes
77
c Carlos Maziero
3: Memria compartilhada
padro (stdin) de outro comando, permitindo assim a comunicao entre eles. A linha
de comando a seguir traz um exemplo do uso de pipes:
# who | grep marcos | sort > login-marcos.txt
A sada do comando who uma listagem de usurios conectados ao computador.
Essa sada encaminhada atravs de um pipe (indicado pelo caractere |) ao comando
grep, que a filtra e gera como sada somente as linhas contendo a string marcos. Essa
sada encaminhada atravs de outro pipe ao comando sort, que ordena a listagem
recebida e a deposita no arquivo login-marcos.txt. Deve-se observar que todos os
processos envolvidos so lanados simultaneamente; suas aes so coordenadas pelo
comportamento sncrono dos pipes. A Figura 3.11 detalha essa sequncia de aes.
who
stdin
stdout
grep
pipe
stdout
stdin
sort
stdout
pipe
ncleo
arquivo
3.4.3
Memria compartilhada
A comunicao entre tarefas situadas em processos distintos deve ser feita atravs
do ncleo, usando chamadas de sistema, porque no existe a possibilidade de acesso
a variveis comuns a ambos. No entanto, essa abordagem pode ser ineficiente caso a
comunicao seja muito volumosa e frequente, ou envolva muitos processos. Para essas
situaes, seria conveniente ter uma rea de memria comum que possa ser acessada
direta e rapidamente pelos processos interessados, sem o custo da intermediao pelo
ncleo.
A maioria dos sistemas operacionais atuais oferece mecanismos para o compartilhamento de reas de memria entre processos (shared memory areas). As reas de memria
78
c Carlos Maziero
3: Memria compartilhada
79
c Carlos Maziero
3: Memria compartilhada
3
4
5
6
7
8
#include
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<fcntl.h>
<sys/stat.h>
<sys/mman.h>
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
for (;;) {
// Passo 5: escreve um valor aleatorio na area compartilhada
value = random () % 1000 ;
(*ptr) = value ;
printf ("Wrote value %i\n", value) ;
sleep (1);
34
35
36
37
38
39
40
41
42
43
44
45
46
80
c Carlos Maziero
3: Memria compartilhada
pa
pb
nova rea de
memria
passo 1)
criar
alocar
id
ncleo
reas alocadas
pa
pb
passos 2 e 3)
anexar
ptr
obter
id
ncleo
pa
passos 4 e 5)
pb
usar
usar
ptr
anexar
ncleo
Figura 3.12: Criao e uso de uma rea de memria compartilhada.
81
Captulo 4
Coordenao entre tarefas
Muitas implementaes de sistemas complexos so estruturadas como vrias
tarefas inter-dependentes, que cooperam entre si para atingir os objetivos da
aplicao, como por exemplo em um navegador Web. Para que as vrias tarefas que
compem uma aplicao possam cooperar, elas precisam comunicar informaes
umas s outras e coordenar suas atividades, para garantir que os resultados
obtidos sejam coerentes. Este mdulo apresenta os principais conceitos, problemas
e solues referentes coordenao entre tarefas.
4.1
Objetivos
4.2
Condies de disputa
82
c Carlos Maziero
1
2
3
4
5
4: Condies de disputa
6
7
8
9
10
0x8(%ebp),%ecx
0x8(%ebp),%edx
0xc(%ebp),%eax
(%edx),%eax
%eax,(%ecx)
leave
ret
#
#
#
#
#
mem(saldo)
mem(saldo)
mem(valor)
[reg1 , reg2 ]
[reg1 , reg2 ]
reg1
reg2
reg3
+ reg3 [reg1 , reg2 ]
mem(saldo)
Considere que a funo depositar faz parte de um sistema mais amplo de controle
de contas bancrias, que pode ser acessado simultaneamente por centenas ou milhares
de usurios em terminais distintos. Caso dois clientes em terminais diferentes tentem
depositar valores na mesma conta ao mesmo tempo, existiro duas tarefas acessando os
dados (variveis) da conta de forma concorrente. A Figura 4.1 ilustra esse cenrio.
aplicao
depositar
R$50
terminal 1
tarefa 1
tarefa 2
depositar
depositar
conta
depositar
R$1000
terminal 2
saldo inicial
R$0
c Carlos Maziero
4: Condies de disputa
t2
t1
t2
t1
saldo: R$ 0
saldo: R$ 0
reg1 = mem(saldo)
reg1 = mem(saldo)
reg2 = mem(valor)
reg2 = mem(valor)
mem(saldo) = reg1
mem(saldo) = reg1
saldo: R$ 1000
saldo: R$ 50
reg1 = mem(saldo)
reg1 = mem(saldo)
reg2 = mem(valor)
reg2 = mem(valor)
mem(saldo) = reg1
mem(saldo) = reg1
saldo: R$ 1050
t
saldo: R$ 1050
t
84
c Carlos Maziero
4: Sees crticas
t2
t1
t2
t1
saldo: R$ 0
saldo: R$ 0
reg1 = mem(saldo)
reg1 = mem(saldo)
reg1 = mem(saldo)
reg1 = mem(saldo)
reg2 = mem(valor)
reg2 = mem(valor)
reg2 = mem(valor)
reg2 = mem(valor)
reg1 = reg1 + reg2
mem(saldo) = reg1
mem(saldo) = reg1
saldo: R$ 50
saldo: R$ 1000
mem(saldo) = reg1
mem(saldo) = reg1
saldo: R$ 1000
t
saldo: R$ 50
t
4.3
Sees crticas
conta.saldo += valor ;
c Carlos Maziero
4: Inibio de interrupes
uma tarefa j esteja ocupando a seo crtica csi , as demais tarefas que tentarem entrar
devero aguardar at que a primeira libere a seo crtica, atravs da primitiva leave(csi ).
Usando as primitivas enter e leave, o cdigo da operao de depsito visto na Seo
4.2 pode ser reescrito como segue:
1
2
3
4
5
6
7
8
9
10
11
12
13
Nas prximas sees sero estudadas vrias solues para a implementao das
primitivas enter e leave, bem como abordagens alternativas. As solues propostas
devem atender a alguns critrios bsicos que so enumerados a seguir:
Excluso mtua : somente uma tarefa pode estar dentro da seo crtica em cada
instante.
Espera limitada : uma tarefa que aguarda acesso a uma seo crtica deve ter esse
acesso garantido em um tempo finito.
Independncia de outras tarefas : a deciso sobre o uso de uma seo crtica deve
depender somente das tarefas que esto tentando entrar na mesma. Outras tarefas
do sistema, que no momento no estejam interessadas em entrar na regio crtica,
no podem ter influncia sobre essa deciso.
Independncia de fatores fsicos : a soluo deve ser puramente lgica e no depender da velocidade de execuo das tarefas, de temporizaes, do nmero de
processadores no sistema ou de outros fatores fsicos.
4.4
Inibio de interrupes
Uma soluo simples para a implementao das primitivas enter e leave consiste em
impedir as trocas de contexto dentro da seo crtica. Ao entrar em uma seo crtica, a
tarefa desativa (mascara) as interrupes que possam provocar trocas de contexto, e as
reativa ao sair da seo crtica. Apesar de simples, essa soluo raramente usada para
a construo de aplicaes devido a vrios problemas:
Ao desligar as interrupes, a preempo por tempo ou por recursos deixa de
funcionar; caso a tarefa entre em um lao infinito dentro da seo crtica, o sistema
86
c Carlos Maziero
inteiro ser bloqueado. Uma tarefa mal-intencionada pode forar essa situao e
travar o sistema.
Enquanto as interrupes esto desativadas, os dispositivos de entrada/sada
deixam de ser atendidos pelo ncleo, o que pode causar perdas de dados ou outros
problemas. Por exemplo, uma placa de rede pode perder novos pacotes se seus
buffers estiverem cheios e no forem tratados pelo ncleo em tempo hbil.
A tarefa que est na seo crtica no pode realizar operaes de entrada/sada,
pois os dispositivos no iro responder.
Esta soluo s funciona em sistemas mono-processados; em uma mquina
multi-processada ou multi-core, duas tarefas concorrentes podem executar simultaneamente em processadores separados, acessando a seo crtica ao mesmo
tempo.
Devido a esses problemas, a inibio de interrupes uma operao privilegiada e
somente utilizada em algumas sees crticas dentro do ncleo do sistema operacional e
nunca pelas aplicaes.
4.5
4.5.1
A soluo bvia
Uma soluo aparentemente trivial para o problema da seo crtica consiste em usar
uma varivel busy para indicar se a seo crtica desejada est livre ou ocupada. Usando
essa abordagem, a implementao das primitivas enter e leave poderia ser escrita assim:
1
int busy = 0 ;
2
3
4
5
6
7
8
9
10
11
12
c Carlos Maziero
4: Alternncia de uso
momentos distintos; caso ocorra uma troca de contexto entre as linhas 5 e 6 do cdigo,
poder ocorrer uma condio de disputa envolvendo a varivel busy, que ter como
consequncia a violao da excluso mtua: duas ou mais tarefas podero entrar
simultaneamente na seo crtica (vide o diagrama de tempo da Figura 4.4). Em outras
palavras, as linhas 5 e 6 da implementao tambm formam uma seo crtica, que deve
ser protegida.
t2
t1
busy: 0
while(busy) { };
while(busy) { };
busy: 0
busy = 1
busy: 1
busy = 1
acesso
seo crtica
busy: 1
acesso
seo crtica
violao da
excluso
mtua !
t
4.5.2
Alternncia de uso
Outra soluo simples para a implementao das primitivas enter e leave consiste em
definir uma varivel turno, que indica de quem a vez de entrar na seo crtica. Essa
varivel deve ser ajustada cada vez que uma tarefa sai da seo crtica, para indicar a
prxima tarefa a us-la. A implementao das duas primitivas fica assim:
1
2
int turn = 0 ;
int num_tasks ;
3
4
5
6
7
8
9
10
11
12
13
14
15
88
c Carlos Maziero
4: O algoritmo de Peterson
Nessa soluo, cada tarefa aguarda seu turno de usar a seo crtica, em uma
sequncia circular: t0 t1 t2 tn1 t0 . Essa abordagem garante a excluso
mtua entre as tarefas e independe de fatores externos, mas no atende os demais
critrios: caso uma tarefa ti no deseje usar a seo crtica, todas as tarefas t j com j > i
ficaro impedidas de faz-lo, pois a varivel turno no ir evoluir.
4.5.3
O algoritmo de Peterson
Uma soluo correta para a excluso mtua no acesso a uma seo crtica por
duas tarefas foi proposta inicialmente por Dekker em 1965. Em 1981, Gary Peterson
props uma soluo mais simples e elegante para o mesmo problema [Raynal, 1986]. O
algoritmo de Peterson pode ser resumido no cdigo a seguir:
1
2
int turn = 0 ;
// indica de quem a vez
int wants[2] = {0, 0} ; // indica se a tarefa i quer acessar a seo crtica
3
4
5
6
7
8
9
10
11
12
13
14
15
4.5.4
Instrues Test-and-Set
O uso de uma varivel busy para controlar a entrada em uma seo crtica uma
idia interessante, que infelizmente no funciona porque o teste da varivel busy e seu
ajuste so feitos em momentos distintos do cdigo, permitindo condies de corrida.
Para resolver esse problema, projetistas de hardware criaram instrues em cdigo
de mquina que permitem testar e atribuir um valor a uma varivel de forma atmica
ou indivisvel, sem possibilidade de troca de contexto entre essas duas operaes. A
execuo atmica das operaes de teste e atribuio (Test & Set instructions) impede
a ocorrncia de condies de disputa. Uma implementao bsica dessa idia est
2
Este algoritmo pode falhar quando usado em algumas mquinas multi-ncleo ou multi-processadas,
pois algumas arquiteturas permitem acesso fora de ordem memria, ou seja, permitem que operaes
de leitura na memria se antecipem a operaes de escrita executadas posteriormente, para obter mais
desempenho. Este o caso dos processadores Pentium e AMD.
89
c Carlos Maziero
4: Instrues Test-and-Set
TSL(x) :
old x
x1
return(old)
int lock = 0 ;
// varivel de trava
2
3
4
5
6
7
8
9
10
11
Outros processadores oferecem uma instruo que efetua a troca atmica de contedo
(swapping) entre dois registradores, ou entre um registrador e uma posio de memria.
No caso da famlia de processadores Intel i386 (incluindo o Pentium e seus sucessores),
a instruo de troca se chama XCHG (do ingls exchange) e sua funcionalidade pode ser
resumida assim:
XCHG op1 , op2 : op1 op2
A implementao das primitivas enter e leave usando a instruo XCHG um pouco
mais complexa:
1
int lock ;
// varivel de trava
2
3
4
5
6
7
8
9
10
11
12
13
c Carlos Maziero
4: Problemas
4.5.5
Problemas
Apesar das solues para o problema de acesso seo crtica usando espera ocupada
garantirem a excluso mtua, elas sofrem de alguns problemas que impedem seu uso
em larga escala nas aplicaes de usurio:
Ineficincia : as tarefas que aguardam o acesso a uma seo crtica ficam testando
continuamente uma condio, consumindo tempo de processador sem necessidade.
O procedimento adequado seria suspender essas tarefas at que a seo crtica
solicitada seja liberada.
Injustia : no h garantia de ordem no acesso seo crtica; dependendo da durao
de quantum e da poltica de escalonamento, uma tarefa pode entrar e sair da seo
crtica vrias vezes, antes que outras tarefas consigam acess-la.
Por estas razes, as solues com espera ocupada so pouco usadas na construo
de aplicaes. Seu maior uso se encontra na programao de estruturas de controle de
concorrncia dentro do ncleo do sistema operacional (onde se chamam spinlocks), e
na construo de sistemas de computao dedicados, como controladores embarcados
mais simples.
4.6
Semforos
91
c Carlos Maziero
4: Semforos
92
c Carlos Maziero
typedef struct conta_t
{
int saldo ;
sem_t s = 1;
...
} conta_t ;
1
2
3
4
5
6
4: Semforos
8
9
10
11
12
13
A suspenso das tarefas que aguardam o acesso seo crtica elimina a espera
ocupada, o que torna esse mecanismo mais eficiente no uso do processador que os
anteriores. A fila de tarefas associada ao semforo contm todas as tarefas que foram
suspensas ao solicitar acesso seo crtica usando a chamada Down(s). Como a fila
obedece uma poltica FIFO, garante-se a tambm a justia no acesso seo crtica, pois
todos os processos que aguardam no semforo sero atendidos em sequncia4 . Por sua
vez, o valor inteiro associado ao semforo funciona como um contador de recursos: caso
seja positivo, indica quantas instncias daquele recurso esto disponveis. Caso seja
negativo, indica quantas tarefas esto aguardando para usar aquele recurso. Seu valor
inicial permite expressar diferentes situaes de sincronizao, como ser visto na Seo
4.9.
A listagem a seguir apresenta um exemplo hipottico de uso de um semforo para
controlar o acesso a um estacionamento. O valor inicial do semforo vagas representa
o nmero de vagas inicialmente livres no estacionamento (500). Quando um carro
deseja entrar no estacionamento ele solicita uma vaga; enquanto o semforo for positivo
no havero bloqueios, pois h vagas livres. Caso no existam mais vagas livres, a
chamada carro_entra() ficar bloqueada at que alguma vaga seja liberada, o que
ocorre quando outro carro acionar a chamada carro_sai(). Esta soluo simples pode
ser aplicada a um estacionamento com vrias entradas e vrias sadas simultneas.
4
93
c Carlos Maziero
1
4: Semforos
2
3
4
5
6
7
void carro_entra ()
{
down (vagas) ;
...
}
8
9
10
11
12
13
void carro_sai ()
{
up (vagas) ;
...
}
#include <semaphore.h>
2
3
4
5
6
7
// Operao Up(s)
int sem_post(sem_t *sem);
8
9
10
// Operao Down(s)
int sem_wait(sem_t *sem);
11
12
13
Os semforos nos quais o contador inteiro pode assumir qualquer valor so denominados semforos genricos e constituem um mecanismo de coordenao muito
poderoso. No entanto, Muitos ambientes de programao, bibliotecas de threads e at
mesmo ncleos de sistema provem uma verso simplificada de semforos, na qual
o contador s assume dois valores possveis: livre (1) ou ocupado (0). Esses semforos
simplificados so chamados de mutexes (uma abreviao de mutual exclusion) ou semforos binrios. Por exemplo, algumas das funes definidas pelo padro POSIX
[Gallmeister, 1994, Barney, 2005] para criar e usar mutexes so:
94
c Carlos Maziero
4: Variveis de condio
#include <pthread.h>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
4.7
Variveis de condio
Assim como os operadores sobre semforos, os operadores sobre variveis de condio tambm
devem ser implementados de forma atmica.
95
c Carlos Maziero
1
2
3
4
5
wait (c):
c.queue t
unlock (c.mutex)
suspend (t)
lock (c.mutex)
4: Variveis de condio
//
//
//
//
6
7
8
notify (c):
awake (first (c.queue)) // acorda a primeira tarefa da fila c.queue
9
10
11
broadcast (c):
awake (c.queue)
No exemplo a seguir, a tarefa A espera por uma condio que ser sinalizada pela
tarefa B. A condio de espera pode ser qualquer: um novo dado em um buffer de
entrada, a concluso de um procedimento externo, a liberao de espao em disco, etc.
1
2
3
4
5
6
7
8
9
10
Task A ()
{
...
lock (c.mutex)
while (not condition)
wait (c) ;
...
unlock (c.mutex)
...
}
11
12
13
14
15
16
17
18
19
20
Task B ()
{
...
lock (c.mutex)
condition = true
notify (c)
unlock (c.mutex)
...
}
96
c Carlos Maziero
4.8
4: Monitores
Monitores
Ao usar semforos, um programador define explicitamente os pontos de sincronizao necessrios em seu programa. Essa abordagem eficaz para programas pequenos
e problemas de sincronizao simples, mas se torna invivel e suscetvel a erros em
sistemas mais complexos. Por exemplo, se o programador esquecer de liberar um
semforo previamente alocado, o programa pode entrar em um impasse (vide Seo
4.10). Por outro lado, se ele esquecer de requisitar um semforo, a excluso mtua sobre
um recurso pode ser violada.
Em 1972, os cientistas Per Brinch Hansen e Charles Hoare definiram o conceito de
monitor [Lampson and Redell, 1980]. Um monitor uma estrutura de sincronizao que
requisita e libera a seo crtica associada a um recurso de forma transparente, sem que
o programador tenha de se preocupar com isso. Um monitor consiste de:
um recurso compartilhado, visto como um conjunto de variveis internas ao
monitor.
um conjunto de procedimentos que permitem o acesso a essas variveis;
um mutex ou semforo para controle de excluso mtua; cada procedimento de
acesso ao recurso deve obter o semforo antes de iniciar e liberar o semforo ao
concluir;
um invariante sobre o estado interno do recurso.
O pseudo-cdigo a seguir define um monitor para operaes sobre uma conta
bancria (observe sua semelhana com a definio de uma classe em programao
orientada a objetos):
1
2
3
monitor conta
{
float saldo = 0.0 ;
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
97
c Carlos Maziero
4: Monitores
class Conta
{
private float saldo = 0;
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Em Java, a clusula synchronized faz com que um semforo seja associado aos
mtodos indicados, para cada objeto (ou para cada classe, se forem mtodos de classe).
No exemplo anterior, apenas um depsito ou retirada de cada vez poder ser feito sobre
cada objeto da classe Conta.
Variveis de condio podem ser usadas no interior de monitores (na verdade, os
dois conceitos nasceram juntos). Todavia, devido s restries da semntica Mesa, um
procedimento que executa a operao notify em uma varivel de condio deve concluir
e sair imediatamente do monitor, para garantir que o invariante associado ao estado
interno do monitor seja respeitado [Birrell, 2004].
98
c Carlos Maziero
4.9
4.9.1
99
c Carlos Maziero
c1
C
p1
buer
L
p2
c2
A
c3
Figura 4.5: O problema dos produtores/consumidores.
A soluo para esse problema exige trs semforos, um para atender cada aspecto
de coordenao acima descrito. O cdigo a seguir ilustra de forma simplificada uma
soluo para esse problema, considerando um buffer com capacidade para N itens,
inicialmente vazio:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
produtor () {
while (1) {
...
sem_down(&vaga) ;
sem_down(&mutex) ;
...
sem_up(&mutex) ;
sem_up(&item) ;
}
}
//
//
//
//
//
//
produz um item
aguarda uma vaga no buffer
aguarda acesso exclusivo ao buffer
deposita o item no buffer
libera o acesso ao buffer
indica a presena de um novo item no buffer
consumidor () {
while (1) {
sem_down(&item) ;
sem_down(&mutex) ;
...
sem_up(&mutex) ;
sem_up(&vaga) ;
...
}
}
//
//
//
//
//
//
15
16
17
18
19
20
21
22
23
24
25
c Carlos Maziero
4.9.2
l1
M[3]?
e1
M[3]=2
M
3
e2
M?
1
l2
M[1]?
M=[2,1,0,6]
l3
escritores
leitores
101
c Carlos Maziero
1
sem_t mutex_area ;
2
3
4
5
6
7
8
9
10
leitor () {
while (1) {
sem_down (&mutex_area) ;
...
sem_up (&mutex_area) ;
...
}
}
11
12
13
14
15
16
17
18
19
escritor () {
while (1) {
sem_down (&mutex_area) ;
...
sem_up (&mutex_area) ;
...
}
}
102
c Carlos Maziero
1
2
3
sem_t mutex_area ;
int conta_leitores = 0 ;
sem_t mutex_conta ;
4
5
6
7
8
9
10
11
leitor () {
while (1) {
sem_down (&mutex_conta) ;
conta_leitores++ ;
if (conta_leitores == 1)
sem_down (&mutex_area) ;
sem_up (&mutex_conta) ;
//
//
//
//
//
12
13
...
sem_down (&mutex_conta) ;
conta_leitores-- ;
if (conta_leitores == 0)
sem_up (&mutex_area) ;
sem_up (&mutex_conta) ;
...
//
//
//
//
//
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
escritor () {
while (1) {
sem_down(&mutex_area) ;
...
sem_up(&mutex_area) ;
...
}
}
Essa soluo melhora o desempenho das operaes de leitura, mas introduz um novo
problema: a priorizao dos leitores. De fato, sempre que algum leitor estiver acessando
a rea compartilhada, outros leitores tambm podem acess-la, enquanto eventuais
escritores tm de esperar at a rea ficar livre (sem leitores). Caso existam muito leitores
em atividade, os escritores podem ficar impedidos de acessar a rea, pois ela nunca
ficar vazia. Solues com priorizao para os escritores e solues equitativas entre
ambos podem ser facilmente encontradas na literatura [Raynal, 1986, Ben-Ari, 1990].
O relacionamento de sincronizao leitor/escritor encontrado com muita frequncia
em aplicaes com mltiplas threads. O padro POSIX define mecanismos para a criao
e uso de travas com essa funcionalidade (com priorizao de escritores), acessveis
atravs de chamadas como pthread_rwlock_init, entre outras.
4.9.3
103
c Carlos Maziero
f4
p4
f3
p0
f0
p1
p3
f2
p2
f1
#define NUMFILO 5
sem_t hashi [NUMFILO] ; // um semforo para cada palito (iniciam em 1)
3
4
5
6
7
8
9
10
11
12
13
filosofo (int i) {
while (1) {
medita () ;
sem_down (&hashi [i]) ;
sem_down (&hashi [(i+1) % NUMFILO]) ;
come () ;
sem_up (&hashi [i]) ;
sem_up (&hashi [(i+1) % NUMFILO]) ;
}
}
104
// obtem palito i
// obtem palito i+1
// devolve palito i
// devolve palito i+1
c Carlos Maziero
4: Impasses
f4
p4
p0
f3
f0
p3
p1
f2
f1
p2
4.10
Impasses
c Carlos Maziero
4: Impasses
a consistncia dos mesmos. Para isso, a cada recurso associado um semforo ou outro
mecanismo equivalente. Assim, as tarefas solicitam e aguardam a liberao de cada
semforo para poder acessar o recurso correspondente.
Em alguns casos, o uso de semforos pode levar a situaes de impasse (ou deadlock),
nas quais todas as tarefas envolvidas ficam bloqueadas aguardando a liberao de
semforos, e nada mais acontece. Para ilustrar uma situao de impasse, ser utilizado
o exemplo de acesso a uma conta bancria apresentado na Seo 4.2. O cdigo a seguir
implementa uma operao de transferncia de fundos entre duas contas bancrias. A
cada conta est associado um semforo, usado para prover acesso exclusivo aos dados
da conta e assim evitar condies de disputa:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Caso dois clientes do banco (representados por duas tarefas t1 e t2 ) resolvam fazer
simultaneamente operaes de transferncia entre suas contas (t1 transfere um valor v1
de c1 para c2 e t2 transfere um valor v2 de c2 para c1 ), poder ocorrer uma situao de
impasse, como mostra o diagrama de tempo da Figura 4.9.
Nessa situao, a tarefa t1 detm o semforo de c1 e solicita o semforo de c2 , enquanto
t2 detm o semforo de c2 e solicita o semforo de c1 . Como nenhuma das duas tarefas
poder prosseguir sem obter o semforo desejado, nem poder liberar o semforo de
sua conta antes de obter o outro semforo e realizar a transferncia, se estabelece um
impasse (ou deadlock).
Impasses so situaes muito frequentes em programas concorrentes, mas tambm
podem ocorrer em sistemas distribudos. Antes de conhecer as tcnicas de tratamento
de impasses, importante compreender suas principais causas e saber caracteriz-los
adequadamente, o que ser estudado nas prximas sees.
106
c Carlos Maziero
4: Caracterizao de impasses
t2
t1
sem_down (c1->lock)
(semforo obtido)
sem_down (c2->lock)
(semforo obtido)
sem_down (c2->lock)
sem_down (c1->lock)
impasse
t
4.10.1
Caracterizao de impasses
107
c Carlos Maziero
4.10.2
t1 detm c1
c1
t2
t1
t1 requer c2
t2 requer c1
c2
t2 detm c2
c Carlos Maziero
t1
r3
r4
t2
r2
t3
t4
4.10.3
Como os impasses paralisam tarefas que detm recursos, sua ocorrncia pode
incorrer em consequncias graves, como a paralisao gradativa de todas as tarefas que
dependam dos recursos envolvidos, o que pode levar paralisao de todo o sistema.
Devido a esse risco, diversas tcnicas de tratamento de impasses foram propostas. Essas
tcnicas podem definir regras estruturais que previnam impasses, podem atuar de
forma pr-ativa, se antecipando aos impasses e impedindo sua ocorrncia, ou podem
agir de forma reativa, detectando os impasses que se formam no sistema e tomando
medidas para resolv-los.
Embora o risco de impasses seja uma questo importante, os sistemas operacionais
de mercado (Windows, Linux, Solaris, etc.) adotam a soluo mais simples: ignorar o
risco, na maioria das situaes. Devido ao custo computacional necessrio ao tratamento
de impasses e sua forte dependncia da lgica das aplicaes envolvidas, os projetistas
109
c Carlos Maziero
c Carlos Maziero
111
c Carlos Maziero
E1
E2
E3
E4
E5
E6
E7
E20
E8
E21
E16
E22
E17
E9
E14
E10
Estados
inseguros
E23
E18
E15
E12
E13
E19
E11
impasse
112
c Carlos Maziero
aplicar essa tcnica, duas questes importantes devem ser respondidas: como detectar
os impasses? E como resolv-los?
A deteco de impasses pode ser feita atravs da inspeo do grafo de alocao de
recursos (Seo 4.10.2), que deve ser mantido pelo sistema e atualizado a cada alocao
ou liberao de recurso. Um algoritmo de deteco de ciclos no grafo deve ser executado
periodicamente, para verificar a presena das dependncias cclicas que podem indicar
impasses.
Alguns problemas decorrentes dessa estratgia so o custo de manuteno contnua
do grafo de alocao e, sobretudo, o custo de sua anlise: algoritmos de busca de
ciclos em grafos tm custo computacional elevado, portanto sua ativao com muita
frequncia poder prejudicar o desempenho do sistema. Por outro lado, se a deteco for
ativada apenas esporadicamente, impasses podem demorar muito para ser detectados,
o que tambm ruim para o desempenho.
Uma vez detectado um impasse e identificadas as tarefas e recursos envolvidos, o
sistema deve proceder sua resoluo, que pode ser feita de duas formas:
Eliminar tarefas : uma ou mais tarefas envolvidas no impasse so eliminadas, liberando
seus recursos para que as demais tarefas possam prosseguir. A escolha das tarefas
a eliminar deve levar em conta vrios fatores, como o tempo de vida de cada uma,
a quantidade de recursos que cada tarefa detm, o prejuzo para os usurios, etc.
Retroceder tarefas : uma ou mais tarefas envolvidas no impasse tm sua execuo
parcialmente desfeita, de forma a fazer o sistema retornar a um estado seguro
anterior ao impasse. Para retroceder a execuo de uma tarefa, necessrio salvar
periodicamente seu estado, de forma a poder recuperar um estado anterior quando
necessrio6 . Alm disso, operaes envolvendo a rede ou interaes com o usurio
podem ser muito difceis ou mesmo impossveis de retroceder: como desfazer o
envio de um pacote de rede, ou a reproduo de um arquivo de udio?
A deteco e resoluo de impasses uma abordagem interessante, mas relativamente
pouco usada fora de situaes muito especficas, porque o custo de deteco pode ser
elevado e as alternativas de resoluo sempre implicam perder tarefas ou parte das
execues j realizadas.
Essa tcnica conhecida como checkpointing e os estados anteriores salvos so denominados checkpoints.
113
Captulo 5
Gerncia de memria
A memria principal um componente fundamental em qualquer sistema de
computao. Ela constitui o espao de trabalho do sistema, no qual so mantidos
os processos, threads, bibliotecas compartilhadas e canais de comunicao, alm
do prprio ncleo do sistema operacional, com seu cdigo e suas estruturas de
dados. O hardware de memria pode ser bastante complexo, envolvendo diversas
estruturas, como caches, unidade de gerncia, etc, o que exige um esforo de
gerncia significativo por parte do sistema operacional.
Uma gerncia adequada da memria essencial para o bom desempenho de
um computador. Neste captulo sero estudados os elementos de hardware que
compe a memria de um sistema computacional e os mecanismos implementados
ou controlados pelo sistema operacional para a gerncia da memria.
5.1
Estruturas de memria
c Carlos Maziero
5: Estruturas de memria
registradores
velocidade,
custo e
consumo
de energia
cache L1
cache L2
memria RAM
voltil
no-voltil
memria Flash
disco rgido
capacidade
DVD-ROM
Tempo de acesso
1 ns
60 ns
2 ms
10 ms (tempo necessrio para o
deslocamento da cabea de leitura e rotao do disco at o setor
desejado)
de 100 ms a vrios minutos (caso
a gaveta do leitor esteja aberta ou
o disco no esteja no leitor)
Tabela 5.1:
Tempos de
[Patterson and Henessy, 2005].
acesso
taxas
Taxa de transferncia
1 GB/s (1 ns/byte)
1 GB/s (1 ns/byte)
10 MB/s (100 ns/byte)
80 MB/s (12 ns/byte)
de
transferncia
tpicas
c Carlos Maziero
5.2
#include <stdlib.h>
#include <stdio.h>
3
4
5
6
int main ()
{
int i, soma = 0 ;
8
9
10
11
12
13
14
116
c Carlos Maziero
00000000
0: 8d
4: 83
7: ff
a: 55
b: 89
d: 51
e: 83
11: c7
18: c7
1f: eb
21: 8b
24: 01
27: 83
2a: ff
2d: ff
30: 68
35: e8
3a: 83
3d: ff
40: 83
44: 7e
46: 83
49: 6a
4b: e8
<main>:
4c 24 04
e4 f0
71 fc
e5
ec
45
45
1f
45
45
ec
75
75
00
fc
c4
45
7d
db
ec
00
fc
14
f4 00 00 00 00
f8 00 00 00 00
f8
f4
04
f4
f8
00 00 00
ff ff ff
10
f8
f8 04
0c
ff ff ff
lea
and
pushl
push
mov
push
sub
movl
movl
jmp
mov
add
sub
pushl
pushl
push
call
add
incl
cmpl
jle
sub
push
call
0x4(%esp),%ecx
$0xfffffff0,%esp
-0x4(%ecx)
%ebp
%esp,%ebp
%ecx
$0x14,%esp
$0x0,-0xc(%ebp)
$0x0,-0x8(%ebp)
40 <main+0x40>
-0x8(%ebp),%eax
%eax,-0xc(%ebp)
$0x4,%esp
-0xc(%ebp)
-0x8(%ebp)
$0x0
36 <main+0x36>
$0x10,%esp
-0x8(%ebp)
$0x4,-0x8(%ebp)
21 <main+0x21>
$0xc,%esp
$0x0
4c <main+0x4c>
Dessa forma, os endereos das variveis e trechos de cdigo usados por um programa
devem ser definidos em algum momento entre a escrita do cdigo e sua execuo pelo
processador, que pode ser:
Durante a edio : o programador escolhe a posio de cada uma das variveis e do
cdigo do programa na memria. Esta abordagem normalmente s usada na
programao de sistemas embarcados simples, programados diretamente em
linguagem de mquina.
Durante a compilao : o compilador escolhe as posies das variveis na memria.
Para isso, todos os cdigos-fonte que fazem parte do programa devem ser conhecidos no momento da compilao, para evitar conflitos de endereos entre variveis.
Uma outra tcnica bastante usada a gerao de cdigo independente de posio
(PIC - Position-Independent Code), no qual todas as referncias a variveis so feitas
usando endereos relativos (como 3.471 bytes aps o incio do mdulo, ou 15
bytes aps o program counter, por exemplo).
Durante a ligao : o compilador gera smbolos que representam as variveis mas
no define seus endereos finais, gerando um arquivo que contm as instrues
em linguagem de mquina e as definies das variveis utilizadas, denominado
117
c Carlos Maziero
5.2.1
Arquivos-objeto so formatos de arquivo projetados para conter cdigo binrio e dados provenientes
de uma compilao de cdigo-fonte. Existem diversos formatos de arquivos-objeto; os mais simples,
como os arquivos .com do DOS, apenas definem uma sequncia de bytes a carregar em uma posio fixa
da memria; os mais complexos, como os formatos UNIX ELF (Executable and Library Format) e Microsoft
PE (Portable Executable Format), permitem definir sees internas, tabelas de relocao, informao de
depurao, etc. [Levine, 2000].
118
c Carlos Maziero
cdigo
fonte
arq.c
lib.c
biblioteca
fonte
compilao
cdigo
objeto
arq.o
biblioteca
esttica
lib.a
ligao
cdigo
executvel
lib.so
lib.dll
arq.exe
biblioteca
dinmica
carga
execuo
processo
memria
processador
endereo
lgico
interrupo
MMU
endereo
fsico
endereo
fsico
dados
barramentos
endereos
c Carlos Maziero
5.2.2
Cada processo visto pelo sistema operacional como uma cpsula isolada, ou seja,
uma rea de memria exclusiva que s ele e o ncleo do sistema podem acessar. Essa
rea de memria contm todas as informaes necessrias execuo do processo,
divididas nas seguintes sees:
TEXT : contm o cdigo a ser executado pelo processo, gerado durante a compilao
e a ligao com as bibliotecas. Esta rea tem tamanho fixo, calculado durante a
compilao, e normalmente s deve estar acessvel para leitura e execuo.
DATA : esta rea contm os dados estticos usados pelo programa, ou seja, suas
variveis globais e as variveis locais estticas (na linguagem C, so as variveis
definidas como static dentro das funes). Como o tamanho dessas variveis
pode ser determinado durante a compilao, esta rea tem tamanho fixo; deve
estar acessvel para leituras e escritas, mas no para execuo.
HEAP : rea usada para armazenar dados atravs de alocao dinmica, usando
operadores como malloc e free ou similares. Esta rea tem tamanho varivel,
podendo aumentar/diminuir conforme as alocaes/liberaes de memria feitas
pelo processo. Ao longo do uso, esta rea pode se tornar fragmentada, ou seja,
pode conter lacunas entre os blocos de memria alocados. So necessrios ento
algoritmos de alocao que minimizem sua fragmentao.
STACK : rea usada para manter a pilha de execuo do processo, ou seja, a estrutura
responsvel por gerenciar o fluxo de execuo nas chamadas de funo e tambm
para armazenar os parmetros, variveis locais e o valor de retorno das funes.
Geralmente a pilha cresce para baixo, ou seja, inicia em endereos elevados e
cresce em direo aos endereos menores da memria. No caso de programas com
mltiplas threads, esta rea contm somente a pilha do programa principal. Como
threads podem ser criadas e destrudas dinamicamente, a pilha de cada thread
mantida em uma rea prpria, geralmente alocada no heap.
A Figura 5.4 apresenta a organizao da memria de um processo. Nela, observa-se
que as duas reas de tamanho varivel (stack e heap) esto dispostas em posies opostas
e vizinhas memria livre (no alocada). Dessa forma, a memria livre disponvel ao
processo pode ser aproveitada da melhor forma possvel, tanto pelo heap quanto pelo
stack, ou por ambos.
120
c Carlos Maziero
5: Estratgias de alocao
rea no alocada
max
TEXT
STACK
HEAP
DATA
variveis dinmicas
(malloc/free)
programa principal
funes
bibliotecas estticas
variveis globais
variveis locais estticas
buers internos
5.3
Estratgias de alocao
max
vetor de interrupes
5.3.1
Parties fixas
c Carlos Maziero
5: Parties fixas
cada partio pode ser carregado um processo. Nesse esquema, a traduo entre os
endereos lgicos vistos pelos processos e os endereos fsicos feita atravs de um
simples registrador de relocao, cujo valor somado ao endereo lgico gerado pelo
processador, a fim de obter o endereo fsico correspondente. Endereos lgicos maiores
que o tamanho da partio em uso so simplesmente rejeitados pela MMU. O exemplo da
Figura 5.6 ilustra essa estratgia. No exemplo, o processo da partio 3 est executando
e deseja acessar o endereo lgico 14.257. A MMU recebe esse endereo e o soma ao
valor do registrador de relocao (110.000) para obter o endereo fsico 124.257, que
ento acessado. Deve-se observar que o valor contido no registrador de relocao o
endereo de incio da partio ativa (partio 3); esse registrador deve ser atualizado a
cada troca de processo ativo.
processo na particao 3
20.000
30.000
60.000
110.000
200.000
partio
ativa
registrador
de relocao
110.000
MMU
124.257 (endereo fsico)
ncleo
0
part 0
part 1
part 2
part 3
part 4
max
c Carlos Maziero
5.3.2
5: Alocao contgua
Alocao contgua
A estratgia anterior, com parties fixas, pode ser tornar bem mais flexvel caso o
tamanho de cada partio possa ser ajustado para se adequar demanda especfica
de cada processo. Nesse caso, a MMU deve ser projetada para trabalhar com dois
registradores prprios: um registrador base, que define o endereo inicial da partio
ativa, e um registrador limite, que define o tamanho em bytes dessa partio. O algoritmo
de traduo de endereos lgicos em fsicos bem simples: cada endereo lgico gerado
pelo processo em execuo comparado ao valor do registrador limite; caso seja maior
ou igual a este, uma interrupo gerada pela MMU de volta para o processador,
indicando um endereo invlido. Caso contrrio, o endereo lgico somado ao valor
do registrador base, para a obteno do endereo fsico correspondente. A Figura 5.7
apresenta uma viso geral dessa estratgia. Na Figura, o processo p3 tenta acessar o
endereo lgico 14.257.
TCB(P3)
processo P3
base
limite
limite
45.000
registradores
atualizados na
troca de contexto
que ativou P3
el<lim
no
Erro: endereo
invlido (IRQ)
sim
base
110.000
MMU
124.257 (endereo fsico)
Memria RAM
ncleo
P1
P2
P3
P4
P5
rea acessvel a P3
110.000
(base)
max
154.999
(base+limite-1)
c Carlos Maziero
5.3.3
S5
S1
S4
S2
S6
S4
S3
S3
S2
P2
Memria RAM
ncleo
0
P1.S5
P2.S2
P2.S4
P1.S1
P2.S1
P1.S6
P1.S3
P1.S4
P1.S2
P2.S3
max
c Carlos Maziero
outras palavras, este modelo usa endereos lgicos bidimensionais, compostos por pares
[segmento:offset], onde segmento indica o nmero do segmento desejado e offset indica
a posio desejada dentro do segmento. Os valores de offset variam de 0 (zero) ao
tamanho do segmento. A Figura 5.9 mostra alguns exemplos de endereos lgicos
usando alocao por segmentos.
P1
S1
S3
[3:1204]
[1:5317]
[2:5799]
6000 0
4000
S2
10000
c Carlos Maziero
TCB(P3)
processo P3
Segment
Table
address
S4
registrador atualizado
na troca de contexto
que ativou P3
ST reg
Tabela de segmentos
(em memria RAM)
base
limite
1.200
5.500
8.000
4.200
15.000
10.500
27.500
32.300
8.750
45.000
12.000
87.000
7.600
...
...
offset
6.914
no
o<lim
8.750
1.500
segmento
Erro: violao de
segmento (IRQ)
sim
32.300
MMU
39.214 (endereo fsico)
Memria RAM
ncleo
P3.S4
max
32.300
(base)
41.049
(base+limite-1)
126
c Carlos Maziero
5: Alocao paginada
DS, ES, FS e GS: Data Segments, indicam quatro segmentos com dados usados
pelo processo atual, que podem conter variveis globais, vetores ou reas alocadas
dinamicamente. Esses registradores podem ser ajustados em caso de necessidade,
para acessar outros segmentos de dados.
O contedo desses registradores preservado no TCB (Task Control Block) de cada
processo a cada troca de contexto, tornando o acesso memria bastante eficiente caso
poucos segmentos sejam usados simultaneamente. Portanto, o compilador tem uma
grande responsabilidade na gerao de cdigo executvel: minimizar o nmero de
segmentos necessrios execuo do processo a cada instante, para no prejudicar o
desempenho de acesso memria.
Exemplos de processadores que utilizam a alocao por segmentos incluem o 80.386
e seus sucessores (486, Pentium, Athlon e processadores correlatos).
5.3.4
Alocao paginada
Conforme visto na Seo anterior, a alocao de memria por segmentos exige o uso
de endereos bidimensionais na forma [segmento:offset], o que pouco intuitivo para o
programador e torna mais complexa a construo de compiladores. Alm disso, uma
forma de alocao bastante suscetvel fragmentao externa, conforme ser discutido
na Seo 5.5. Essas deficincias levaram os projetistas de hardware a desenvolver outras
tcnicas para a alocao da memria principal.
Na alocao de memria por pginas, ou alocao paginada, o espao de endereamento
lgico dos processos mantido linear e unidimensional (ao contrrio da alocao por
segmentos, que usa endereos bidimensionais). Internamente, e de forma transparente
para os processos, o espao de endereos lgicos dividido em pequenos blocos de
mesmo tamanho, denominados pginas. Nas arquiteturas atuais, as pginas geralmente
tm 4 Kbytes (4.096 bytes), mas podem ser encontradas arquiteturas com pginas
de outros tamanhos2 . O espao de memria fsica destinado aos processos tambm
dividido em blocos de mesmo tamanho que as pginas, denominados quadros (do
ingls frames). A alocao dos processos na memria fsica ento feita simplesmente
indicando em que quadro da memria fsica se encontra cada pgina de cada processo,
conforme ilustra a Figura 5.11. importante observar que as pginas de um processo
podem estar em qualquer posio da memria fsica disponvel aos processos, ou seja,
podem estar associadas a quaisquer quadros, o que permite uma grande flexibilidade de
alocao. Alm disso, as pginas no usadas pelo processo no precisam estar mapeadas
na memria fsica, o que proporciona maior eficincia no uso da mesma.
O mapeamento entre as pginas de um processo e os quadros correspondentes
na memria fsica feita atravs de uma tabela de pginas (page table), na qual cada
entrada corresponde a uma pgina e contm o nmero do quadro onde ela se encontra.
Cada processo possui sua prpria tabela de pginas; a tabela de pginas ativa, que
2
127
c Carlos Maziero
5: Alocao paginada
pginas
processo P1
processo P2
Memria RAM
ncleo
rea no-paginada
quadros
128
c Carlos Maziero
5: Alocao paginada
TCB(P3)
registrador atualizado
na troca de contexto
que ativou P3
PTBR
PTBR
pgina
offset
0 13
Pginas no-mapeadas
Tabela de pginas
(em memria RAM)
A7
2F
4B
0000 5
E9A
Erro: falta de
pgina (IRQ)
0002 F
quadro
offset
...
7 1A
MMU
0002 FE9A (endereo fsico)
Memria RAM
ncleo
rea no-paginada
47
Flags de controle
Como o espao de endereamento lgico de um processo pode ser extremamente
grande (por exemplo, o espao de endereos lgicos de cada processo em uma arquitetura
129
c Carlos Maziero
5: Alocao paginada
de 32 bits pode ir at 232 bytes), uma parte significativa das pginas de um processo
pode no estar mapeada em quadros de memria fsica. reas de memria no usadas
por um processo no precisam estar mapeadas na memria fsica, o que permite um
uso mais eficiente da memria. Assim, a tabela de pginas de cada processo indica as
reas no mapeadas com um flag adequado (vlido/invlido). Cada entrada da tabela de
pginas de um processo contm o nmero do quadro correspondente e um conjunto de
flags (bits) de controle, com diversas finalidades:
Presena: indica se a pgina est presente (mapeada) no espao de endereamento
daquele processo;
Proteo: bits indicando os direitos de acesso do processo pgina (basicamente
leitura, escrita e/ou execuo);
Referncia: indica se a pgina foi referenciada (acessada) recentemente, sendo
ajustado para 1 pelo prprio hardware a cada acesso pgina. Este bit usado
pelos algoritmos de memria virtual (apresentados na Seo 5.7);
Modificao: tambm chamado de dirty bit, ajustado para 1 pelo hardware a cada
escrita na pgina, indicando se a pgina foi modificada aps ser carregada na
memria; usado pelos algoritmos de memria virtual.
Alm destes, podem ser definidos outros bits, indicando a poltica de caching da
pgina, se uma pgina de usurio ou de sistema, se a pgina pode ser movida para
disco, o tamanho da pgina (no caso de sistemas que permitam mais de um tamanho
de pgina), etc. O contedo exato de cada entrada da tabela de pginas depende da
arquitetura do hardware considerado.
Tabelas multi-nveis
Em uma arquitetura de 32 bits com pginas de 4 Kbytes, cada entrada na tabela de
pginas ocupa cerca de 32 bits, ou 4 bytes (20 bits para o nmero de quadro e os 12 bits
restantes para flags). Considerando que cada tabela de pginas tem 220 pginas, cada
tabela ocupar 4 Mbytes de memria (4 220 bytes) se for armazenada de forma linear
na memria. No caso de processos pequenos, com muitas pginas no mapeadas, uma
tabela de pginas linear ocupar mais espao na memria que o prprio processo, como
mostra a Figura 5.13, o que torna seu uso pouco interessante.
Para resolver esse problema, so usadas tabelas de pginas multi-nveis, estruturadas
na forma de rvores: uma tabela de pginas de primeiro nvel (ou diretrio de pginas) contm
ponteiros para tabelas de pginas de segundo nvel, e assim por diante, at chegar tabela
que contm os nmeros dos quadros desejados. Para percorrer essa rvore, o nmero
de pgina dividido em duas ou mais partes, que so usadas de forma sequencial, um
para cada nvel de tabela, at encontrar o nmero de quadro desejado. O nmero de
nveis da tabela depende da arquitetura considerada: os processadores Intel 80.386 usam
tabelas com dois nveis, os processadores Sun Sparc e DEC Alpha usam tabelas com 3
nveis; processadores mais recentes, como Intel Itanium, podem usar tabelas com 3 ou 4
nveis.
130
c Carlos Maziero
5: Alocao paginada
TCB(P3)
1.048.576 pginas
(espao de endereamento lgico)
PTBR
100 pginas mapeadas
(CODE, DATA, HEAP)
1.048.456 pginas
no-mapeadas
20 pginas mapeadas
(STACK)
c Carlos Maziero
5: Alocao paginada
processo P3
TCB(P3)
registrador atualizado
na troca de contexto
que ativou P3
PTBR
2B
22
31
3 1A 3B
offset
E9A
...
005
6C 21
4 17 13
4E
5 8E A4
2F
19
71 9A
7F
12
16
2C
0002F
quadro
offset
MMU
...
...
...
...
pg2
7
-
1 14
6 10
006
0 5C
pg 1
PTBR
Tabela de pginas
(em memria RAM)
Memria RAM
ncleo
rea no-paginada
47
c Carlos Maziero
5: Alocao paginada
Nvel 1
...
Nvel 2
RAM (quadros)
Nvel 1
...
Nvel 2
...
...
...
RAM (quadros)
Esse fenmeno conhecido como localidade de referncias e ser detalhado na Seo 5.4.
133
c Carlos Maziero
5: Alocao paginada
TCB(P3)
pg 1
Tabela de pginas
(em memria RAM)
2
PTBR
registrador atualizado
na troca de contexto
que ativou P3
PTBR
pg2
offset
006
E9A
...
01805
TLB
p1,p2
0 5C
2B
1 14
22
31
3 1A 3B
4E
5 8E A4
2F
19
71 9A
7F
12
16
2C
0002F
0002F
quadro
offset
MMU
...
...
...
...
update
6C 21
4 17 13
6 10
005
Memria RAM
ncleo
rea no-paginada
47
134
c Carlos Maziero
5: Alocao paginada
fcil perceber que, quanto maior a taxa de acertos do TLB (cache hit ratio), melhor
o desempenho dos acessos memria fsica. O tempo mdio de acesso memria
pode ento ser determinado pela mdia ponderada entre o tempo de acesso com acerto
de cache e o tempo de acesso no caso de erro. Por exemplo, considerando um sistema
operando a 2 GHz (relgio de 0,5 ns) com tempo de acesso RAM de 50 ns, tabelas de
pginas com 3 nveis e um TLB com custo de acerto de 0,5 ns (um ciclo de relgio), custo
de erro de 10 ns (20 ciclos de relgio) e taxa de acerto de 95%, o tempo mdio de acesso
memria pode ser estimado como segue:
tmdio = 95% 0, 5ns
+ 5% (10ns + 3 50ns)
+ 50ns
// em caso de acerto
// em caso de erro, consultar as tabelas
// acesso ao quadro desejado
c Carlos Maziero
5.3.5
Cada uma das principais formas de alocao de memria vistas at agora tem suas
vantagens: a alocao contgua prima pela simplicidade e rapidez; a alocao por
segmentos oferece mltiplos espaos de endereamento para cada processo, oferecendo
flexibilidade ao programador; a alocao por pginas oferece um grande espao de
endereamento linear, enquanto elimina a fragmentao externa. Alguns processadores
oferecem mais de uma forma de alocao, deixando aos projetistas do sistema operacional
a escolha da forma mais adequada de organizar a memria usada por seus processos.
Vrios processadores permitem combinar mais de uma forma de alocao. Por
exemplo, os processadores Intel i386 permitem combinar a alocao com segmentos com
a alocao por pginas, visando oferecer a flexibilidade da alocao por segmentos com
a baixa fragmentao da alocao por pginas.
Nessa abordagem, os processos vem a memria estruturada em segmentos, conforme indicado na Figura 5.9. O hardware da MMU converte os endereos lgicos na
forma [segmento:offset] para endereos lgicos lineares (unidimensionais), usando as
tabelas de descritores de segmentos (Seo 5.3.3). Em seguida, esse endereos lgicos
lineares so convertidos nos endereos fsicos correspondentes atravs do hardware de
paginao (tabelas de pginas e TLB), visando obter o endereo fsico correspondente.
Apesar do processador Intel i386 oferece as duas formas de alocao de memria,
a maioria dos sistemas operacionais que o suportam no fazem uso de todas as suas
possibilidades: os sistemas da famlia Windows NT (2000, XP, Vista) e tambm os da
famlia UNIX (Linux, FreeBSD) usam somente a alocao por pginas. O antigo DOS
e o Windows 3.* usavam somente a alocao por segmentos. O OS/2 da IBM foi um
dos poucos sistemas operacionais comerciais a fazer uso pleno das possibilidades de
alocao de memria nessa arquitetura, combinando segmentos e pginas.
5.4
Localidade de referncias
c Carlos Maziero
5: Localidade de referncias
2
3
4
5
int main ()
{
int i, j ;
7
8
9
10
Outra implementao possvel seria percorrer a matriz coluna por coluna, conforme
o cdigo a seguir:
1
2
3
4
5
int main ()
{
int i, j ;
7
8
9
10
137
c Carlos Maziero
i
5: Localidade de referncias
pginas
4095
1
2
3
4
4095
Como a execuo total de cada cdigo gera mais de 500 milhes de referncias memria, foi feita
uma amostragem da execuo para construir os grficos.
138
c Carlos Maziero
5: Fragmentao
Figura 5.19: Distribuio dos acessos memria do programa gThumb: viso geral (
esquerda) e detalhe da parte inferior ( direita).
A localidade de referncia de uma implementao depende de um conjunto de
fatores, que incluem:
As estruturas de dados usadas pelo programa: estruturas como vetores e matrizes tm seus elementos alocados de forma contgua na memria, o que leva a
uma localidade de referncias maior que estruturas mais dispersas, como listas
encadeadas e rvores;
Os algoritmos usados pelo programa: o comportamento do programa no acesso
memria definido pelos algoritmos que ele implementa;
A qualidade do compilador: cabe ao compilador analisar quais variveis e trechos
de cdigo so usadas com frequncia juntos e coloc-los nas mesmas pginas de
memria, para aumentar a localidade de referncias do cdigo gerado.
A localidade de referncias uma propriedade importante para a construo
de programas eficientes. Ela tambm til em outras reas da computao, como a
gerncia das pginas armazenadas nos caches de navegadores web e servidores proxy, nos
mecanismos de otimizao de leituras/escritas em sistemas de arquivos, na construo
da lista arquivos recentes dos menus de muitas aplicaes interativas, etc.
5.5
Fragmentao
c Carlos Maziero
5: Fragmentao
ncleo
A2: 8M
P1
24M
P3
P2
40M
60M
A3: 12M
72M
80M
88M
A4: 28M
P4
100M
116M
144M
c Carlos Maziero
5: Fragmentao
alocao de 10M
rst-t
best-t
A1: 20M
ncleo
A2: 8M
P1
24M
40M
60M
A3: 12M
P3
P2
72M
worst-t
80M
88M
A4: 28M
P4
100M
116M
144M
ncleo
P1
P3
P2
30M
40M
20M
30M
40M
20M
ncleo
P1
P3
P2
ncleo
P1
P3
P2
ncleo
P3
P1
P2
c Carlos Maziero
5: Fragmentao
alocada exatamente a rea solicitada pelo processo (situao A), sobrar um fragmento
residual com 100 Kbytes, que praticamente intil para o sistema, pois muito pequeno
para acomodar novos processos. Alm disso, essa rea residual de 100 Kbytes deve ser
includa na lista de reas livres, o que representa um custo de gerncia desnecessrio.
Outra possibilidade consiste em arredondar o tamanho da rea solicitada pelo processo
para 5.000 Kbytes, ocupando totalmente aquela rea livre (situao B). Assim, haver
uma pequena rea de 100 Kbytes no final da memria do processo, que provavelmente
no ser usada por ele.
situao inicial
5.000 Kbytes
Soluo 1:
aloca 4.900 Kbytes
Soluo 2:
aloca 5.000 Kbytes
4.900 Kbytes
5.000 Kbytes
fragmentao externa
fragmentao interna
142
c Carlos Maziero
5.6
5: Compartilhamento de memria
Compartilhamento de memria
A memria RAM um recurso escasso, que deve ser usado de forma eficiente. Nos
sistemas atuais, comum ter vrias instncias do mesmo programa em execuo, como
vrias instncias de editores de texto, de navegadores, etc. Em servidores, essa situao
pode ser ainda mais frequente, com centenas ou milhares de instncias do mesmo
programa carregadas na memria. Por exemplo, em um servidor de e-mail UNIX,
cada cliente que se conecta atravs dos protocolos POP3 ou IMAP ter um processo
correspondente no servidor, para atender suas consultas de e-mail (Figura 5.24). Todos
esses processos operam com dados distintos (pois atendem a usurios distintos), mas
executam o mesmo cdigo. Assim, centenas ou milhares de cpias do mesmo cdigo
executvel podero coexistir na memria do sistema.
cliente 1
code
code
code
code
cliente 3
cliente 5
cliente 2
cliente 4
code
code
...
servidor de e-mail
cliente n
c Carlos Maziero
5: Compartilhamento de memria
S4
S4
S3
S2
S4
S3
S2
S1
S3
S2
P2
S1
S1
P1
P3
Memria RAM
ncleo
P1.S2
P1.S3
P2.S4
P*.S1
P3.S3
P3.S4
P1.S3
P3.S2
P2.S3
max
P1.S4
processo P2
Memria RAM
ncleo
rea no-paginada
144
c Carlos Maziero
5: Memria virtual
5.7
Memria virtual
c Carlos Maziero
5: Mecanismo bsico
5.7.1
Mecanismo bsico
Estes valores so apenas indicativos, variando de acordo com o fabricante e a tecnologia envolvida.
146
c Carlos Maziero
5: Mecanismo bsico
processo P2
processo P1
0
rea de troca
Memria RAM
ncleo
rea no-paginada
147
c Carlos Maziero
5: Mecanismo bsico
sim
a pgina X
est presente?
no
MMU gera interrupo (falta de pgina)
a pgina X
existe?
no
sim
suspende o processo P
h espao
na memria?
no
sim
carrega a pgina X na memria,
ajusta a tabela de pginas de P,
acorda o processo P
P acessa a pgina X
148
c Carlos Maziero
5.7.2
5: Eficincia de uso
Eficincia de uso
tmdio =
tmdio = 66ns
Caso a memria esteja saturada, o tempo mdio ser maior:
(999.999 60ns) + 2 6ms + 60ns
1.000.000
6
10 60 109 + 2 6 103
=
106
tmdio =
tmdio = 72ns
Caso a frequncia de falta de pginas aumente para uma falta a cada 100.000 acessos
(105 acessos), o tempo mdio de acesso memria subir para 180 ns, ou seja, trs vezes
mais lento. A frequncia de faltas de pgina depende de vrios fatores, como:
O tamanho da memria RAM, em relao demanda dos processos em execuo:
sistemas com memria insuficiente, ou muito carregados, podem gerar muitas
faltas de pgina, prejudicando o seu desempenho e podendo ocasionar o fenmeno
conhecido como thrashing (Seo 5.7.6).
o comportamento dos processos em relao ao uso da memria: processos que
agrupem seus acessos a poucas pginas em cada momento, respeitando a localidade
149
c Carlos Maziero
5.7.3
c Carlos Maziero
151
c Carlos Maziero
t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
qo
0
0
0
3
3
3
6
6
6
4
4
4
4
4
4
4
1
1
1
1
1
1
1
antes
q1
2
2
2
5
5
5
3
3
3
3
3
3
5
5
5
5
5
5
7
7
7
7
q2
1
1
1
4
4
4
7
7
7
7
7
7
7
3
3
3
3
3
3
3
4
pgina
0
2
1
3
5
4
6
3
7
4
7
3
3
5
5
3
1
1
1
7
1
3
4
1
qo
0
0
0
3
3
3
6
6
6
4
4
4
4
4
4
4
1
1
1
1
1
1
1
1
depois
q1
2
2
2
5
5
5
3
3
3
3
3
3
5
5
5
5
5
5
7
7
7
7
7
q2
1
1
1
4
4
4
7
7
7
7
7
7
7
3
3
3
3
3
3
3
4
4
faltas
?
?
?
?
?
?
?
?
?
?
?
?
?
ao realizada
p0 carregada no quadro vazio q0
p2 carregada em q1
p1 carregada em q2
p3 substitui p0 (a mais antiga na memria)
p5 substitui p2 (idem)
p4 substitui p1
p6 substitui p3
p3 substitui p5
p7 substitui p4
p4 substitui p6
p7 est na memria
p3 est na memria
p3 est na memria
p5 substitui p3
p5 est na memria
p3 substitui p7
p1 substitui p4
p1 est na memria
p1 est na memria
p7 substitui p5
p1 est na memria
p3 est na memria
p4 substitui p3
p1 est na memria
c Carlos Maziero
t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
qo
0
0
0
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
4
antes
q1
2
2
2
5
5
6
6
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
q2
1
1
1
4
4
4
4
4
4
4
4
5
5
5
1
1
1
1
1
1
1
pgina
0
2
1
3
5
4
6
3
7
4
7
3
3
5
5
3
1
1
1
7
1
3
4
1
qo
0
0
0
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
4
4
depois
q1
2
2
2
5
5
6
6
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
q2
1
1
1
4
4
4
4
4
4
4
4
5
5
5
1
1
1
1
1
1
1
1
faltas
?
?
?
?
?
?
?
?
ao realizada
p0 carregada no quadro vazio q0
p2 carregada em q1
p1 carregada em q2
p3 substitui p0 (no ser mais acessada)
p5 substitui p2 (no ser mais acessada)
p4 substitui p1 (s ser acessada em t = 17)
p6 substitui p5 (s ser acessada em t = 14)
p3 est na memria
p7 substitui p6 (no ser mais acessada)
p4 est na memria
p7 est na memria
p3 est na memria
p3 est na memria
p5 substitui p4 (s ser acessada em t = 23)
p5 est na memria
p3 est na memria
p1 substitui p5 (no ser mais acessada)
p1 est na memria
p1 est na memria
p7 est na memria
p1 est na memria
p3 est na memria
p4 substitui p3 (no ser mais acessada)
p1 est na memria
153
c Carlos Maziero
t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
qo
0
0
0
3
3
3
6
6
6
4
4
4
4
5
5
5
5
5
5
7
7
7
4
antes
q1
2
2
2
5
5
5
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
q2
1
1
1
4
4
4
7
7
7
7
7
7
7
7
1
1
1
1
1
1
1
pgina
0
2
1
3
5
4
6
3
7
4
7
3
3
5
5
3
1
1
1
7
1
3
4
1
qo
0
0
0
3
3
3
6
6
6
4
4
4
4
5
5
5
5
5
5
7
7
7
4
4
depois
q1
2
2
2
5
5
5
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
q2
1
1
1
4
4
4
7
7
7
7
7
7
7
7
1
1
1
1
1
1
1
1
faltas
?
?
?
?
?
?
?
?
?
?
ao realizada
p0 carregada no quadro vazio q0
p2 carregada em q1
p1 carregada em q2
p3 substitui p0 (h mais tempo sem acessos)
p5 substitui p2 (idem)
p4 substitui p1 (...)
p6 substitui p3
p3 substitui p5
p7 substitui p4
p4 substitui p6
p7 est na memria
p3 est na memria
p3 est na memria
p5 substitui p4
p5 est na memria
p3 est na memria
p1 substitui p7
p1 est na memria
p1 est na memria
p7 substitui p5
p1 est na memria
p3 est na memria
p4 substitui p7
p1 est na memria
c Carlos Maziero
20
OPT
FIFO
LRU
Faltas de pgina
15
10
0
1
4
Nmero de quadros de RAM
3
1
12
2
11
26
prxima
vtima
42
18
14
33
11
bits de
referncia
17
0
26
1
1
14
33
155
18
nmeros
de pgina
nova
pgina
23
2
0
12
ajustados
para zero
21
17
c Carlos Maziero
Algoritmo NRU
O algoritmo da segunda chance leva em conta somente o bit de referncia de cada
pgina ao escolher as vtimas para substituio. O algoritmo NRU (Not Recently Used, ou
no usada recentemente) melhora essa escolha, ao considerar tambm o bit de modificao
(dirty bit, vide Seo 5.3.4), que indica se o contedo de uma pgina foi modificado aps
ela ter sido carregada na memria.
Usando os bits R (referncia) e M (modificao), possvel classificar as pginas em
memria em quatro nveis de importncia:
00 (R = 0, M = 0): pginas que no foram referenciadas recentemente e cujo
contedo no foi modificado. So as melhores candidatas substituio, pois
podem ser simplesmente retiradas da memria.
01 (R = 0, M = 1): pginas que no foram referenciadas recentemente, mas cujo
contedo j foi modificado. No so escolhas to boas, porque tero de ser
gravadas na rea de troca antes de serem substitudas.
10 (R = 1, M = 0): pginas referenciadas recentemente, cujo contedo permanece inalterado. So provavelmente pginas de cdigo que esto sendo usadas
ativamente e sero referenciadas novamente em breve.
11 (R = 1, M = 1): pginas referenciadas recentemente e cujo contedo foi
modificado. So a pior escolha, porque tero de ser gravadas na rea de troca e
provavelmente sero necessrias em breve.
O algoritmo NRU consiste simplesmente em tentar substituir primeiro pginas do
nvel 0; caso no encontre, procura candidatas no nvel 1 e assim sucessivamente. Pode
ser necessrio percorrer vrias vezes a lista circular at encontrar uma pgina adequada
para substituio.
Algoritmo do envelhecimento
Outra possibilidade de melhoria do algoritmo da segunda chance consiste em usar
os bits de referncia das pginas para construir contadores de acesso s mesmas. A cada
pgina associado um contador inteiro com N bits (geralmente 8 bits so suficientes).
Periodicamente, o algoritmo varre as tabelas de pginas, l os bits de referncia e agrega
seus valores aos contadores de acessos das respectivas pginas. Uma vez lidos, os
bits de referncia so ajustados para zero, para registrar as referncias de pginas que
ocorrero durante prximo perodo.
O valor lido de cada bit de referncia no deve ser simplesmente somado ao contador,
por duas razes: o contador chegaria rapidamente ao seu valor mximo (overflow) e a
simples soma no permitiria diferenciar acessos recentes dos mais antigos. Por isso,
outra soluo foi encontrada: cada contador deslocado para a direita 1 bit, descartando
o bit menos significativo (LSB - Least Significant Bit). Em seguida, o valor do bit de
referncia colocado na primeira posio esquerda do contador, ou seja, em seu
bit mais significativo (MSB - Most Significant Bit). Dessa forma, acessos mais recentes
156
c Carlos Maziero
5: Conjunto de trabalho
tm um peso maior que acessos mais antigos, e o contador nunca ultrapassa seu valor
mximo.
O exemplo a seguir mostra a evoluo dos contadores para quatro pginas distintas,
usando os valores dos respectivos bits de referncia R. Os valores decimais dos
contadores esto indicados entre parnteses, para facilitar a comparao. Observe que
as pginas acessadas no ltimo perodo (p2 e p4 ) tm seus contadores aumentados,
enquanto aquelas no acessadas (p1 e p3 ) tm seus contadores diminudos.
p1
p2
p3
p4
R
0
1
0
1
contadores
0000 0011
1010 1000
1110 0011
(3)
(61) =
(168)
(227)
R
0
0
0
0
contadores
0000 0001
e 1001 1110
0101 0100
1111 0001
(1)
(158)
(84)
(241)
5.7.4
Conjunto de trabalho
A localidade de referncias (estudada na Seo 5.4) mostra que os processos normalmente acessam apenas uma pequena frao de suas pginas a cada instante. O
conjunto de pginas acessadas na histria recente de um processo chamado Conjunto
de Trabalho (Working Set, ou ws) [Denning, 1980, Denning, 2006]. A composio do
conjunto de trabalho dinmica, variando medida em que o processo executa e evolui
seu comportamento, acessando novas pginas e deixando de acessar outras. Para
ilustrar esse conceito, consideremos a cadeia de referncias apresentada na Seo 5.7.3.
Considerando como histria recente as ltimas n pginas acessadas pelo processo, a
evoluo do conjunto de trabalho ws do processo que gerou aquela cadeia apresentada
na Tabela 5.5.
O tamanho e a composio do conjunto de trabalho dependem do nmero de pginas
consideradas em sua histria recente (o valor n na Tabela 5.5). Em sistemas reais, essa
dependncia no linear, mas segue uma proporo exponencial inversa, devido
localidade de referncias. Por essa razo, a escolha precisa do tamanho da histria
recente a considerar no crtica. Esse fenmeno pode ser observado na Tabela 5.5:
assim que a localidade de referncias se torna mais forte (a partir de t = 12), os trs
conjuntos de trabalho ficam muito similares. Outro exemplo apresentado na Figura
5.31, que mostra o tamanho mdio dos conjuntos de trabalhos observados na execuo
do programa gThumb (analisado na Seo 5.4), em funo do tamanho da histria recente
considerada (em nmero de pginas referenciadas).
Se um processo tiver todas as pginas de seu conjunto de trabalho carregadas na
memria, ele sofrer poucas faltas de pgina, pois somente acessos a novas pginas
podero gerar faltas. Essa constatao permite delinear um algoritmo simples para
157
c Carlos Maziero
5: Conjunto de trabalho
t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pgina
0
2
1
3
5
4
6
3
7
4
7
3
3
5
5
3
1
1
1
7
1
3
4
1
ws(n = 3)
{0}
{0, 2}
{0, 2, 1}
{2, 1, 3}
{1, 3, 5}
{3, 5, 4}
{5, 4, 6}
{4, 6, 3}
{6, 3, 7}
{3, 7, 4}
{4, 7}
{4, 7, 3}
{7, 3}
{3, 5}
{3, 5}
{5, 3}
{5, 3, 1}
{3, 1}
{1}
{1, 7}
{7, 1}
{7, 1, 3}
{1, 3, 4}
{3, 4, 1}
ws(n = 4)
{0}
{0, 2}
{0, 2, 1}
{0, 2, 1, 3}
{2, 1, 3, 5}
{1, 3, 5, 4}
{3, 5, 4, 6}
{5, 4, 6, 3}
{4, 6, 3, 7}
{6, 3, 7, 4}
{3, 4, 7}
{4, 7, 3}
{4, 7, 3}
{7, 3, 5}
{3, 5}
{5, 3}
{5, 3, 1}
{5, 3, 1}
{3, 1}
{1, 7}
{7, 1}
{7, 1, 3}
{7, 1, 3, 4}
{3, 4, 1}
ws(n = 5)
{0}
{0, 2}
{0, 2, 1}
{0, 2, 1, 3}
{0, 2, 1, 3, 5}
{2, 1, 3, 5, 4}
{1, 3, 5, 4, 6}
{5, 4, 6, 3}
{5, 4, 6, 3, 7}
{6, 3, 7, 4}
{6, 3, 4, 7}
{4, 7, 3}
{4, 7, 3}
{4, 7, 3, 5}
{7, 3, 5}
{5, 3}
{5, 3, 1}
{5, 3, 1}
{5, 3, 1}
{3, 1, 7}
{3, 7, 1}
{7, 1, 3}
{7, 1, 3, 4}
{7, 3, 4, 1}
350
300
250
200
150
100
50
0
0
1000
2000
3000
4000
5000
6000
Tamanho da histria recente (pginas)
7000
8000
9000
158
c Carlos Maziero
5: A anomalia de Belady
5.7.5
A anomalia de Belady
Espera-se que, quanto mais memria fsica um sistema possua, menos faltas de
pgina ocorram. Todavia, esse comportamento intuitivo no se verifica em todos
os algoritmos de substituio de pginas. Alguns algoritmos, como o FIFO, podem
apresentar um comportamento estranho: ao aumentar o nmero de quadros de memria,
159
c Carlos Maziero
5: Thrashing
o nmero de faltas de pgina geradas pelo algoritmo aumenta, ao invs de diminuir. Esse
comportamento atpico de alguns algoritmos foi estudado pelo matemtico hngaro
Laslo Belady nos anos 60, sendo por isso denominado anomalia de Belady.
A seguinte cadeia de referncias permite observar esse fenmeno; o comportamento
dos algoritmos OPT, FIFO e LRU ao processar essa cadeia pode ser visto na Figura 5.32,
que exibe o nmero de faltas de pgina em funo do nmero de quadros de memria
disponveis no sistema. A anomalia pode ser observada no algoritmo FIFO: ao aumentar
a memria de 4 para 5 quadros, esse algoritmo passa de 22 para 24 faltas de pgina.
0, 1, 2, 3, 4, 0, 1, 2, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 0, 1, 2, 5, 0, 1, 2, 3, 4, 5
30
OPT
FIFO
LRU
25
Faltas de pgina
20
15
10
0
1
4
Nmero de quadros de RAM
5.7.6
Thrashing
Na Seo 5.7.2, foi demonstrado que o tempo mdio de acesso memria RAM
aumenta significativamente medida em que aumenta a frequncia de faltas de pgina.
Caso a frequncia de faltas de pginas seja muito elevada, o desempenho do sistema
como um todo pode ser severamente prejudicado.
Conforme discutido na Seo 5.7.4, cada processo tem um conjunto de trabalho, ou
seja, um conjunto de pginas que devem estar na memria para sua execuo naquele
momento. Se o processo tiver uma boa localidade de referncia, esse conjunto pequeno
e varia lentamente. Caso a localidade de referncia seja ruim, o conjunto de trabalho
160
c Carlos Maziero
5: Thrashing
sistema ideal
sistema real
situao normal
thrashing
c Carlos Maziero
5: Thrashing
dos processos durante o thrashing, para evitar a competio pela memria disponvel.
Vrios sistemas operacionais adotam medidas especiais para situaes de thrashing,
como suspender em massa os processos ativos, adotar uma poltica de escalonamento
de processador que considere o uso da memria, aumentar o quantum de processador
para cada processo ativo, ou simplesmente abortar os processos com maior alocao de
memria ou com maior atividade de paginao.
162
Captulo 6
Gerncia de arquivos
Um sistema operacional tem por finalidade permitir que o usurios do
computador executem aplicaes, como editores de texto, jogos, reprodutores de
udio e vdeo, etc. Essas aplicaes processam informaes como textos, msicas e
filmes, armazenados sob a forma de arquivos em um disco rgido ou outro meio.
Este mdulo apresenta a noo de arquivo, suas principais caractersticas e formas
de acesso, a organizao de arquivos em diretrios e as tcnicas usadas para criar
e gerenciar arquivos nos dispositivos de armazenamento.
6.1
Arquivos
6.1.1
O conceito de arquivo
c Carlos Maziero
6: Atributos
bin
home
ls
usr
bin
daniel
henrique
gcc
cp
arq1.txt
relat.pdf
firefox
mv
play.mp3
foto.jpg
perl
diretrios
ooffice
arquivos
6.1.2
Atributos
Conforme apresentado, um arquivo uma unidade de armazenamento de informaes que podem ser dados, cdigo executvel, etc. Cada arquivo caracterizado por um
conjunto de atributos, que podem variar de acordo com o sistema de arquivos utilizado.
Os atributos mais usuais so:
Nome: string de caracteres que identifica o arquivo para o usurio, como foto1.jpg,
relatrio.pdf, hello.c, etc.;
Tipo: indicao do formato dos dados contidos no arquivo, como udio, vdeo, imagem,
texto, etc. Muitos sistemas operacionais usam parte do nome do arquivo para
identificar o tipo de seu contedo, na forma de uma extenso: .doc, .jpg,
.mp3, etc.;
Tamanho: indicao do tamanho do contedo do arquivo, em bytes ou registros;
Datas: para fins de gerncia, importante manter as datas mais importantes relacionadas
ao arquivo, como suas datas de criao, de ltimo acesso e de ltima modificao
do contedo;
164
c Carlos Maziero
6: Operaes
6.1.3
Operaes
Alguns sistemas operacionais, como o TOPS-20 e o OpenVMS, possuem sistemas de arquivos com
suporte automtico a mltiplas verses do mesmo arquivo.
165
c Carlos Maziero
6: Formatos
Mudar atributos: para modificar outras caractersticas do arquivo, como nome, localizao, proprietrio, permisses, etc.
Fechar: ao concluir o uso do arquivo, a aplicao deve informar ao sistema operacional
que o mesmo no mais necessrio, a fim de liberar as estruturas de gerncia do
arquivo na memria do ncleo;
Remover: para eliminar o arquivo do dispositivo, descartando seus dados e liberando
o espao ocupado por ele.
Alm dessas operaes bsicas, outras operaes podem ser definidas, como truncar,
copiar, mover ou renomear arquivos. Todavia, essas operaes geralmente podem ser
construdas usando as operaes bsicas.
6.1.4
Formatos
c Carlos Maziero
6: Formatos
reg1
reg2
reg3
reg4
reg5
reg6
reg7
struct
char
char
int
int
int
}
{
nome[40];
CPF[10];
idade;
peso;
altura;
nome (chave)
telefone (valor)
daniel
marina
henrique
gabriel
renata
andressa
guilherme
9977-1173
9876-5432
8781-9750
8858-8286
9663-9293
8779-5538
9979-4166
1
2
3
4
5
0000
2
3
0010
4
5
0020
6
7
0030
69
i
72
r
72
r
30
0
6e
n
69
i
6c
l
29
)
74
t
6e
n
64
d
3b
;
20 6d
m
74 66
t f
5c 6e
\ n
0a 7d
\n }
61 69 6e 28 29 0a 7b 0a 20 20 70
a i n ( ) \n { \n
p
28 22 48 65 6c 6c 6f 2c 20 77 6f
( " H e l l o ,
w o
22 29 3b 0a 20 20 65 78 69 74 28
" ) ; \n
e x i t (
0a
\n
167
c Carlos Maziero
6: Formatos
Por outro lado, o mesmo arquivo hello.c seria armazenado da seguinte forma em
um sistema DOS/Windows:
1
0000
2
3
0010
4
5
0020
6
7
8
0030
69 6e 74
i n t
20 70 72
p r
77 6f 72
w o r
69 74 28
i t (
20 6d
m
69 6e
i n
6c 64
l d
30 29
0 )
61
a
74
t
5c
\
3b
;
69
i
66
f
6e
n
0d
\r
6e
n
28
(
22
"
0a
\n
28
(
22
"
29
)
7d
}
29
)
48
H
3b
;
0d
\r
0d
\r
65
e
0d
\r
0a
\n
0a 7b 0d 0a 20
\n { \r \n
6c 6c 6f 2c 20
l l o ,
0a 20 20 65 78
\n
e x
c Carlos Maziero
6: Formatos
ELF header
Sections
Program
header table
Segments
Section
header table
Figura 6.3: Estrutura interna de um arquivo executvel em formato ELF [Levine, 2000].
pode ser visto como uma simples sequncia de bytes, como possvel saber que tipo
de informao essa sequncia representa? Uma soluo simples para esse problema
consiste em indicar o tipo do contedo como parte do nome do arquivo: um arquivo
praia.jpg provavelmente contm uma imagem em formato JPEG, enquanto um
arquivo entrevista.mp3 contm udio em formato MP3. Essa estratgia, amplamente utilizada em muitos sistemas operacionais, foi introduzida nos anos 1980 pelo
sistema operacional DOS. Naquele sistema, os arquivos eram nomeados segundo uma
abordagem denominada 8.3, ou seja, 8 caracteres seguidos de um ponto (.) e mais 3
caracteres de extenso, para definir o tipo do arquivo.
Outra abordagem, frequentemente usada em sistemas UNIX, o uso de alguns
bytes no incio de cada arquivo para a definio de seu tipo. Esses bytes iniciais so
denominados nmeros mgicos (magic numbers), e so usados em muitos tipos de
arquivos, como exemplificado na Tabela 6.1:
Tabela 6.1: Nmeros mgicos de alguns tipos de arquivos
Tipo de arquivo
Documento PostScript
Imagem GIF
Msica MIDI
bytes iniciais
%!
GIF89a
MThd
Tipo de arquivo
Documento PDF
Imagem JPEG
Classes Java (JAR)
bytes iniciais
%PDF
0xFFD8
0xCAFEBABE
Nos sistema UNIX, o utilitrio file permite identificar o tipo de arquivo atravs
da anlise de seus bytes iniciais e do restante de sua estrutura interna, sem levar em
conta o nome do arquivo. Por isso, constitui uma ferramenta importante para identificar
arquivos desconhecidos ou com extenso errada.
Alm do uso de extenses no nome do arquivo e de nmeros mgicos, alguns
sistemas operacionais definem atributos adicionais no sistema de arquivos para indicar
o contedo de cada arquivo. Por exemplo, o sistema operacional MacOS 9 definia um
atributo com 4 bytes para identificar o tipo de cada arquivo (file type), e outro atributo
169
c Carlos Maziero
6: Arquivos especiais
com 4 bytes para indicar a aplicao que o criou (creator application). Os tipos de arquivos
e aplicaes so definidos em uma tabela mantida pelo fabricante do sistema. Assim,
quando o usurio solicitar a abertura de um determinado arquivo, o sistema ir escolher
a aplicao que o criou, se ela estiver presente. Caso contrrio, pode indicar ao usurio
uma relao de aplicaes aptas a abrir aquele tipo de arquivo.
Recentemente, a necessidade de transferir arquivos atravs de e-mail e de pginas
Web levou definio de um padro de tipagem de arquivos conhecido como Tipos
MIME (da sigla Multipurpose Internet Mail Extensions) [Freed and Borenstein, 1996]. O
padro MIME define tipos de arquivos atravs de uma notao uniformizada na forma
tipo/subtipo. Alguns exemplos de tipos de arquivos definidos segundo o padro
MIME so apresentados na Tabela 6.2.
Tabela 6.2: Tipos MIME correspondentes a alguns formatos de arquivos
Tipo MIME
application/java-archive
application/msword
application/vnd.oasis.opendocument.text
audio/midi
audio/mpeg
image/jpeg
image/png
text/csv
text/html
text/plain
text/rtf
text/x-csrc
video/quicktime
Significado
Arquivo de classes Java (JAR)
Documento do Microsoft Word
Documento do OpenOffice
udio em formato MIDI
udio em formato MP3
Imagem em formato JPEG
Imagem em formato PNG
Texto em formato CSV (Comma-separated Values)
Texto HTML
Texto puro
Texto em formato RTF (Rich Text Format)
Cdigo-fonte em C
Vdeo no formato Quicktime
6.1.5
Arquivos especiais
170
c Carlos Maziero
6: Uso de arquivos
Abstrao de interfaces do ncleo: em sistemas UNIX, os diretrios /proc e /sys permitem consultar e/ou modificar informaes internas do ncleo do sistema operacional, dos processos em execuo e dos drivers de dispositivos. Por exemplo,
alguns arquivos oferecidos pelo Linux:
/proc/cpuinfo: informaes sobre os processadores disponveis no sistema;
/proc/3754/maps: disposio das reas de memria alocadas para o processo
cujo identificador (PID) 3754;
/sys/block/sda/queue/scheduler: definio da poltica de escalonamento
de disco (vide Seo 7.4.3) a ser usada no acesso ao disco /dev/sda.
Canais de comunicao: na famlia de protocolos de rede TCP/IP, a metfora de arquivo
usada como interface para os canais de comunicao: uma conexo TCP
apresentada aos dois processos envolvidos como um arquivo, sobre o qual eles
podem escrever (enviar) e ler (receber) dados entre si. Vrios mecanismos de
comunicao local entre processos de um sistema tambm usam a metfora do
arquivo, como o caso dos pipes em UNIX.
Em alguns sistemas operacionais experimentais, como o Plan 9 [Pike et al., 1993,
Pike et al., 1995] e o Inferno [Dorward et al., 1997], todos os recursos e entidades fsicas
e lgicas do sistema so mapeadas sob a forma de arquivos: processos, threads, conexes
de rede, usurios, sesses de usurios, janelas grficas, reas de memria alocadas,
etc. Assim, para finalizar um determinado processo, encerrar uma conexo de rede ou
desconectar um usurio, basta remover o arquivo correspondente.
Embora o foco deste texto esteja concentrado em arquivos convencionais, que visam o
armazenamento de informaes (bytes ou registros), muitos dos conceitos aqui expostos
so igualmente aplicveis aos arquivos no-convencionais descritos nesta seo.
6.2
Uso de arquivos
Arquivos so usados por processos para ler e escrever dados de forma no-voltil.
Para usar arquivos, um processo tem sua disposio uma interface de acesso, que
depende da linguagem utilizada e do sistema operacional subjacente. Essa interface
normalmente composta por uma representao lgica de cada arquivo usado pelo
processo (uma referncia ao arquivo) e por um conjunto de funes (ou mtodos) para
realizar operaes sobre esses arquivos. Atravs dessa interface, os processos podem
localizar arquivos no disco, ler e modificar seu contedo, entre outras operaes.
Na sequncia desta seo sero discutidos aspectos relativos ao uso de arquivos,
como a abertura do arquivo, as formas de acesso aos seus dados, o controle de acesso e
problemas associados ao compartilhamento de arquivos entre vrios processos.
6.2.1
Abertura de um arquivo
Para poder ler ou escrever dados em um arquivo, cada aplicao precisa antes
abr-lo. A abertura de um arquivo consiste basicamente em preparar as estruturas de
171
c Carlos Maziero
6: Abertura de um arquivo
memria necessrias para acessar os dados do arquivo em questo. Assim, para abrir
um arquivo, o ncleo do sistema operacional deve realizar as seguintes operaes:
1. Localizar o arquivo no dispositivo fsico, usando seu nome e caminho de acesso
(vide Seo 6.3.2);
2. Verificar se a aplicao tem permisso para usar aquele arquivo da forma desejada
(leitura e/ou escrita);
3. Criar uma estrutura na memria do ncleo para representar o arquivo aberto;
4. Inserir uma referncia a essa estrutura na lista de arquivos abertos mantida pelo
sistema, para fins de gerncia;
5. Devolver aplicao uma referncia a essa estrutura, para ser usada nos acessos
subsequentes ao arquivo recm-aberto.
Concluda a abertura do arquivo, o processo solicitante recebe do ncleo uma
referncia para o arquivo recm-aberto, que deve ser informada pelo processo em
suas operaes subsequentes envolvendo aquele arquivo. Assim que o processo tiver
terminado de usar um arquivo, ele deve solicitar ao ncleo o fechamento do arquivo,
que implica em concluir as operaes de escrita eventualmente pendentes e remover da
memria do ncleo as estruturas de gerncia criadas durante sua abertura. Normalmente,
os arquivos abertos so automaticamente fechados quando do encerramento do processo,
mas pode ser necessrio fech-los antes disso, caso seja um processo com vida longa,
como um daemon servidor de pginas Web, ou que abra muitos arquivos, como um
compilador.
As referncias a arquivos abertos usadas pelas aplicaes dependem da linguagem
de programao utilizada para constru-las. Por exemplo, em um programa escrito na
linguagem C, cada arquivo aberto representado por uma varivel dinmica do tipo
FILE*, que denominada um ponteiro de arquivo (file pointer). Essa varivel dinmica
alocada no momento da abertura do arquivo e serve como uma referncia ao mesmo
nas operaes de acesso subsequentes. J em Java, as referncias a arquivos abertos so
objetos instanciados a partir da classe File. Na linguagem Python existem os file objects,
criados a partir da chamada open.
Por outro lado, cada sistema operacional tem sua prpria conveno para a representao de arquivos abertos. Por exemplo, em sistemas Windows os arquivos abertos por
um processo so representados pelo ncleo por referncias de arquivos (file handles), que
so estruturas de dados criadas pelo ncleo para representar cada arquivo aberto. Por
outro lado, em sistemas UNIX os arquivos abertos por um processo so representados
por descritores de arquivos (file descriptors). Um descritor de arquivo aberto um nmero inteiro no-negativo, usado como ndice em uma tabela que relaciona os arquivos
abertos por aquele processo, mantida pelo ncleo. Dessa forma, cabe s bibliotecas e ao
suporte de execuo de cada linguagem de programao mapear a representao de
arquivo aberto fornecida pelo ncleo do sistema operacional subjacente na referncia
de arquivo aberto usada por aquela linguagem. Esse mapeamento necessrio para
garantir que as aplicaes que usam arquivos (ou seja, quase todas elas) sejam portveis
entre sistemas operacionais distintos.
172
c Carlos Maziero
6.2.2
6: Formas de acesso
Formas de acesso
Uma vez aberto um arquivo, a aplicao pode ler os dados contidos nele, modific-los
ou escrever novos dados. H vrias formas de se ler ou escrever dados em um arquivo,
que dependem da estrutura interna do mesmo. Considerando apenas arquivos simples,
vistos como uma sequncia de bytes, duas formas de acesso so usuais: o acesso sequencial
e o acesso direto (ou acesso aleatrio).
No acesso sequencial, os dados so sempre lidos e/ou escritos em sequncia, do
incio ao final do arquivo. Para cada arquivo aberto por uma aplicao definido um
ponteiro de acesso, que inicialmente aponta para a primeira posio do arquivo. A cada
leitura ou escrita, esse ponteiro incrementado e passa a indicar a posio da prxima
leitura ou escrita. Quando esse ponteiro atinge o final do arquivo, as leituras no so
mais permitidas, mas as escritas ainda o so, permitindo acrescentar dados ao final
do mesmo. A chegada do ponteiro ao final do arquivo normalmente sinalizada ao
processo atravs de um flag de fim de arquivo (EoF - End-of-File).
A Figura 6.4 traz um exemplo de acesso sequencial em leitura a um arquivo,
mostrando a evoluo do ponteiro do arquivo durante uma sequncia de leituras.
A primeira leitura no arquivo traz a string Qui scribit bis, a segunda leitura
traz legit. , e assim sucessivamente. O acesso sequencial implementado em
praticamente todos os sistemas operacionais de mercado e constitui a forma mais usual
de acesso a arquivos, usada pela maioria das aplicaes.
0
15
23
35
45
60
leituras
Qui scribit bis legit. Non nova, sed nove. Felix qui potuit rerum...
c Carlos Maziero
6: Controle de acesso
do vetor ainda no acessada lida, gerada uma falta de pgina. Nesse momento,
o mecanismo de paginao da memria virtual intercepta o acesso memria, l o
contedo correspondente no arquivo e o deposita no vetor, de forma transparente
aplicao. Escritas no vetor so transferidas para o arquivo por um procedimento
similar. Caso o arquivo seja muito grande, pode-se mapear em memria apenas partes
dele. A Figura 6.5 ilustra essa forma de acesso.
processo
acessos
vetor de bytes
pginas
lidas
pginas
escritas
arquivo em disco
6.2.3
Controle de acesso
174
c Carlos Maziero
6: Controle de acesso
No entanto, essa abordagem se mostra pouco prtica caso o sistema tenha muitos
usurios e/ou arquivos, pois as listas podem ficar muito extensas e difceis de gerenciar.
O UNIX usa uma abordagem bem mais simplificada para controle de acesso, que
considera basicamente trs tipos de usurios e trs tipos de permisses:
Usurios: o proprietrio do arquivo (User), um grupo de usurios associado ao
arquivo (Group) e os demais usurios (Others).
Permisses: ler (Read), escrever (Write) e executar (eXecute).
Dessa forma, no UNIX so necessrios apenas 9 bits para definir as permisses de
acesso a cada arquivo ou diretrio. Por exemplo, considerando a seguinte listagem de
diretrio em um sistema UNIX (editada para facilitar sua leitura):
1
2
3
4
5
6
7
host:~> ls -l
d rwx --- --- rwx r-x --- rw- r-- r-- rw- --- --- rw- r-- r-- rw- --- ---
2
1
1
1
1
1
maziero
maziero
maziero
maziero
maziero
maziero
prof
prof
prof
prof
prof
prof
4096
7248
54
59
195780
40494
2008-09-27
2008-08-23
2008-08-23
2008-08-23
2008-09-26
2008-09-27
08:43
09:54
09:54
09:49
22:08
08:44
figuras
hello-unix
hello-unix.c
hello-windows.c
main.pdf
main.tex
c Carlos Maziero
6: Compartilhamento de arquivos
6.2.4
Compartilhamento de arquivos
176
c Carlos Maziero
6: Compartilhamento de arquivos
c Carlos Maziero
6: Exemplo de interface
71
open
p4
close
read
39
close
read
23
23
close
read
23
39
write
71
open
p2
write
open
p3
p1
12
read
write
39
open
close
read
write
read
t
Figura 6.6: Compartilhamento de arquivo usando a semntica de sesso.
6.2.5
Exemplo de interface
Como visto na Seo 6.2.1, cada linguagem de programao define sua prpria forma
de representar arquivos abertos e as funes ou mtodos usados para manipul-los.
A ttulo de exemplo, ser apresentada uma viso geral da interface para arquivos
oferecida pela linguagem C no padro ANSI [Kernighan and Ritchie, 1989]. Em C, cada
arquivo aberto representado por uma varivel dinmica do tipo FILE*, criada pela
funo fopen. As funes de acesso a arquivos so definidas na Biblioteca Padro de
178
c Carlos Maziero
6: Exemplo de interface
179
c Carlos Maziero
1
2
6: Organizao de volumes
#include <stdio.h>
#include <stdlib.h>
3
4
5
6
7
9
10
11
12
13
14
15
16
while (1)
{
c = getc (arq) ; /* le um caractere do arquivo */
if (feof (arq)) /* chegou ao final do arquivo? */
break ;
putchar(c) ;
/* imprime o caractere na tela */
}
17
18
19
20
21
22
23
24
fclose (arq) ;
exit (0) ;
25
26
27
/* fecha o arquivo */
6.3
Organizao de volumes
180
c Carlos Maziero
6: Diretrios
bloco de inicializao ou VBR - Volume Boot Record. O restante dos blocos da partio est
disponvel para o armazenamento de arquivos. A Figura 6.7 ilustra a organizao bsica
do espao de armazenamento em um dispositivo de blocos tpico: um disco rgido.
reas de armazenamento de dados
partio 1
partio 2
partio 3
6.3.1
Diretrios
c Carlos Maziero
6: Diretrios
sistema Linux, cuja estrutura definida nas normas Filesystem Hierarchy Standard
[Russell et al., 2004].
bin
etc
home
lib
proc
root
tmp
usr
var
bin
lib
include
opt
sgml
skel
X11
X11
X11
asm
linux
g++
X11R6
bin
include
lib
local
man
share
src
tmp
adm
cache
cron
lib
local
log
mail
run
spool
X11
gcc-lib
groff
uucp
bin
doc
etc
include
lib
man
share
at
cron
lpd
mail
news
smail
doc
games
info
locale
man
zoneinfo
c Carlos Maziero
6: Caminhos de acesso
/
.
..
bin
etc
home
lib
usr
var
0101011
110000110
001101011
101110100
110000010
100011111
010110100
0101011
110000110
001101011
101110100
110000010
100011111
010110100
bin
.
..
cp
ls
mv
D
D
A
A
A
home
.
..
daniel
ike
D
D
D
D
lib
.
..
X11
lib.a
lib.so
0101011
110000110
001101011
101110100
110000010
100011111
010110100
daniel
.
..
arq1
arq2
1111010
101010101
011010101
111110100
000100111
010101010
111100000
D
D
A
A
1100110
110011001
100110011
111110011
111110011
111111111
000000000
0000000
000000000
111100000
111111111
111111111
111000011
000010101
1100110
110011001
100110011
111110011
111110011
111111111
000000000
D
D
D
A
A
X11
.
D
..
D
libX.a A
0101011
110000110
001101011
101110100
110000010
100011111
010110100
6.3.2
Caminhos de acesso
c Carlos Maziero
6: Caminhos de acesso
prova1.doc
materiais.pdf
uma-bela-foto.jpg
\Windows\system32\drivers\etc\hosts.lm
/usr/local/share/fortunes/brasil.dat
\Documents and Settings\Carlos Maziero\..\All Users\notas.xls
/home/maziero/bin/scripts/../../docs/proj1.pdf
imagens\satelite\brasil\geral.jpg
..\users\maziero\documentos\prova-2.doc
public_html/static/fotografias/rennes.jpg
../../../share/icons/128x128/calculator.svg
184
c Carlos Maziero
6: Caminhos de acesso
185
c Carlos Maziero
6.3.3
6: Atalhos
Atalhos
186
c Carlos Maziero
VBR
/
.
..
bin
etc
home
lib
usr
6: Montagem de volumes
D
D
D
D
D
L
D
bin
.
..
cp
ls
rm
shell
0101011
110000110
001101011
101110100
110000010
100011111
010110100
D
D
A
A
A
L
link to:
/usr/bin/sh
link to:
/usr/lib
usr
.
..
bin
lib
D
D
D
D
bin
.
..
copy
cut
dir
sh
D
D
L
A
A
A
lib
.
..
X11
lib.a
lib.so
D
D
D
A
A
0101011
110000110
001101011
101110100
110000010
100011111
010110100
link to:
/bin/cp
0101011
110000110
001101011
101110100
110000010
100011111
010110100
6.3.4
Montagem de volumes
c Carlos Maziero
6: Sistemas de arquivos
home
dout
Disco rgido 2
espec
grad
alcides
mest
maziero
prof
santin
/
apagar
lib
media
usr
Disco rgido 1
var
backup
fotos
Pendrive USB
livro
cdrom
CD-ROM
bin
html
docs
extras
txt
install
6.4
Sistemas de arquivos
c Carlos Maziero
6: Arquitetura geral
6.4.1
Arquitetura geral
biblioteca de E/S
espao de usurio
chamadas de sistema
ncleo
sistema de arquivos virtual
alocao de arquivos
alocao de arquivos
gerncia de blocos
driver de dispositivo
driver de dispositivo
controlador
controlador
dispositivo
dispositivo
software
hardware
189
c Carlos Maziero
Os controladores de dispositivos so configurados e acessados pelo ncleo do sistema operacional atravs de drivers de dispositivos, que so componentes de software
capazes de interagir com os controladores. Os drivers usam portas de entrada/sada,
interrupes e canais de acesso direto memria (DMA) para interagir com os controladores e realizar as operaes de controle e de entrada/sada de dados. Como cada
controlador define sua prpria interface, tambm possui um driver especfico. Os drivers
ocultam essas interfaces e fornecem s camadas superiores do ncleo uma interface
padronizada para acesso aos dispositivos de armazenamento. Desta forma, os detalhes
tecnolgicos e particularidades de cada dispositivo so isolados, tornando o restante do
sistema operacional independente da tecnologia subjacente.
Acima dos drivers est a camada de gerncia de blocos, que gerencia o fluxo de
blocos de dados entre a memria e os dispositivos de armazenamento. importante
lembrar que os discos so dispositivos orientados a blocos, ou seja, as operaes de
leitura e escrita de dados so sempre feitas com blocos de dados, e nunca com bytes
individuais. As funes mais importantes desta camada so efetuar o mapeamento
de blocos lgicos nos blocos fsicos do dispositivo, oferecer s camadas superiores a
abstrao de cada dispositivo fsico como sendo um imenso vetor de blocos lgicos,
independente de sua configurao real, e tambm efetuar o caching/buffering de blocos
(Seo 7.4.4).
A seguir est a camada de alocao de arquivos, que tem como funo principal
alocar os arquivos sobre os blocos lgicos oferecidos pela gerncia de blocos. Cada
arquivo visto como uma sequncia de blocos lgicos que deve ser armazenada nos
blocos dos dispositivos de forma eficiente, robusta e flexvel. As principais tcnicas de
alocao de arquivos so discutidas na Seo 6.4.3.
Acima da alocao de arquivos est o sistema de arquivos virtual (VFS - Virtual File
System), que prov uma interface de acesso a arquivos independente dos dispositivos
fsicos e das estratgias de alocao de arquivos empregadas pelas camadas inferiores. O
sistema de arquivos virtual normalmente gerencia as permisses associadas aos arquivos
e as travas de acesso compartilhado, alm de construir as abstraes de diretrios e
atalhos. Outra responsabilidade importante desta camada manter informaes sobre
cada arquivo aberto pelos processos, como a posio da ltima operao no arquivo,
o modo de abertura usado e o nmero de processos que esto usando o arquivo. A
interface de acesso ao sistema de arquivos virtual oferecida aos processos atravs de
um conjunto de chamadas de sistema.
Finalmente, as bibliotecas de entrada/sada usam as chamadas de sistema oferecidas
pelo sistema operacional para construir funes padronizadas de acesso a arquivos
para cada linguagem de programao, como aquelas apresentadas na Seo 6.2.5 para a
linguagem C ANSI.
6.4.2
c Carlos Maziero
6.4.3
191
c Carlos Maziero
foto1.jpg
0
relat.pdf
blocos do dispositivo
instruc.txt
6
sinfonia.mp3
0
7 ...
192
c Carlos Maziero
Tabela de diretrio
01
nome
02
03
foto1.jpg
10417
relat.pdf
28211
13
6214
20
06
19116
24
07
instruc.txt
sinfonia.mp3
04
05
08
09
10
11
12
13
14
15
bloco em uso
16
17
bloco livre
18
19
20
21
22
23
24
25
26
27
28
29
193
c Carlos Maziero
c Carlos Maziero
Tabela de diretrio
01
02
foto1.jpg
10417
03
relat.pdf
28211
13
6214
20
06
19116
24
07
nome
instruc.txt
sinfonia.mp3
04
05
08
09
10
11
12
13
14
15
bloco em uso
16
17
bloco livre
18
19
20
21
22
23
24
25
26
27
28
29
c Carlos Maziero
196
c Carlos Maziero
00
01
02
foto1.jpg
10417
03
relat.pdf
28211
13
04
02
05
6214
20
06
19116
24
07
04
08
Tabela de diretrio
nome
instruc.txt
sinfonia.mp3
bloco em uso
bloco livre
09
10
12
11
12
13
16
14
15
16
17
17
19
18
19
22
20
21
21
22
10
23
24
26
25
26
27
27
28
28
29
197
c Carlos Maziero
Tabela de diretrio
nome
i-node
foto1.jpg
relat.pdf
instruc.txt
10
sinfonia.mp3
31
10417
...
i-node 5
bloco em uso
19
bloco livre
ponteiros
de dados
22
10
12
null
null
null
max =
+
+
+
=
max
4096 12
4096 1024
4096 1024 1024
4096 1024 1024 1024
4.402.345.721.856 bytes
4T bytes
198
(ponteiros diretos)
(ponteiro indireto)
(ponteiro indireto duplo)
(ponteiro indireto triplo)
c Carlos Maziero
i-node
12
meta-dados
do arquivo
13
blocos de dados
0
1035
1
2
1036
12 ponteiros
diretos
1037
10
2059
11
ponteiro 1-indireto
ponteiro 2-indireto
ponteiro 3-indireto
blocos com
1024 ponteiros
de 4 bytes
c Carlos Maziero
oi = i mod B
baux = i B
if baux < 12 then // ponteiros diretos
// o endereo do bloco bi o prprio valor do ponteiro
bi = ptr[baux ]
else
baux = baux 12
if baux < 1024 then // ponteiro indireto simples
// ler bloco de ponteiros de nvel 1
block1 = read_block (ptr[12])
// encontrar o endereo do bloco bi
bi = block1 [baux ]
else
baux = baux 1024
if baux < 1024 1024 then // ponteiro indireto duplo
// ler bloco de ponteiros de nvel 1
block1 = read_block (ptr[13])
// ler bloco de ponteiros de nvel 2
block2 = read_block (block1 [baux 1024])
// encontrar o endereo do bloco bi
bi = block2 [baux mod 1024]
else // ponteiro indireto triplo
baux = baux (1024 1024)
// ler bloco de ponteiros de nvel 1
block1 = read_block (ptr[14])
// ler bloco de ponteiros de nvel 2
block2 = read_block (block1 [baux (1024 1024)])
// ler bloco de ponteiros de nvel 3
block3 = read_block (block2 [(baux 1024) mod 1024])
// encontrar o endereo do bloco bi
bi = block3 [baux mod 1024]
end if
end if
end if
return (bi , oi )
200
c Carlos Maziero
i-node
disco
blocos de disco
efetivamente alocados
Anlise comparativa
A Tabela 6.3 traz um comparativo entre as principais formas de alocao estudadas
aqui, sob a tica de suas caractersticas de rapidez, robustez e flexibilidade de uso.
Gerncia de espao livre
Alm de manter informaes sobre que blocos so usados por cada arquivo no disco,
a camada de alocao de arquivos deve manter um registro atualizado de quais blocos
esto livres, ou seja no esto ocupados por nenhum arquivo ou meta-dado. Duas
201
c Carlos Maziero
Estratgia
Contgua
Rapidez
Robustez
Alta, pois acessos se- Alta, pois blocos defeiquencial e direto r- tuosos no impedem o
pidos, pois os blocos acesso aos demais blodo arquivo esto pr- cos do arquivo.
ximos no disco.
Encadeada
FAT
Indexada
Flexibilidade
Baixa, pois o tamanho
mximo dos arquivos
deve ser conhecido a
priori; nem sempre
possvel aumentar o tamanho de um arquivo
existente.
Baixa, pois um bloco Alta, pois arquivos podefeituoso leva perda dem ser criados em
dos dados daquele qualquer local do disco,
bloco e de todos os blo- sem risco de fragmencos subsequentes, at o tao externa.
fim do arquivo.
c Carlos Maziero
arquivos. Outra melhoria simples consiste em armazenar em cada bloco livre um vetor
de ponteiros para outros blocos livres; o ltimo ponteiro desse vetor apontaria para
um novo bloco livre contendo mais um vetor de ponteiros, e assim sucessivamente.
Essa abordagem permite obter um grande nmero de blocos livre a cada acesso a disco.
Outra melhoria similar consiste em armazenar uma tabela de extenses de blocos livres,
ou seja, a localizao e o tamanho de um conjunto de blocos livres consecutivos no disco,
de forma similar alocao contgua (Seo 6.4.3).
6.4.4
203
c Carlos Maziero
6: Tpicos avanados
referncias de arquivos abertos
P1
P2
P3
nvel usurio
ncleo
tabelas locais de
arquivos abertos
tabela global de
arquivos abertos
sistemas
de arquivos
especcos
Sistema de
Arquivos Virtual
alocao
de arquivos
alocao
de arquivos
driver
driver
dispositivo
dispositivo
6.5
Tpicos avanados
Journaling FS
Extents
Log-structured Fyle Systems
204
Captulo 7
Gerncia de entrada/sada
Este contedo est em elaborao. Ainda h muito o que escrever aqui...
7.1
Introduo
c Carlos Maziero
7: Introduo
206
c Carlos Maziero
7.2
7: Dispositivos de entrada/sada
Dispositivos de entrada/sada
7.2.1
Componentes de um dispositivo
7.2.2
Barramentos
207
c Carlos Maziero
7: Barramentos
CPU
dados
controlador de barramento
01001010
01001010
dados
01101010
buer
01101010
buer
sinal digital
conversor
digitalanalgico
conversor
analgicodigital
sinal analgico
sensor
amplicador
atuador
amplicador
controlador de dispositivo
208
c Carlos Maziero
7: Interface de acesso
Por outro lado, a south bridge o controlador responsvel pelos barramentos e portas
de baixa ou mdia velocidade do computador, como as portas seriais e paralelas, e pelos
barramentos dedicados como o PCI padro, o USB e o SATA. Alm disso, a south bridge
costuma integrar outros componentes importantes do computador, como controladores
de udio e rede on-board, controlador de interrupes, controlador DMA (Direct Memory
Access), relgio de tempo real (responsvel pelas interrupes de tempo usadas pelo
escalonador de processos), controle de energia e acesso memria BIOS. O processador
se comunica com a south bridge indiretamente, atravs da north bridge.
A Figura 7.3 traz uma viso da arquitetura tpica de um computador pessoal
moderno. A estrutura detalhada e o funcionamento dos barramentos e seus respectivos
controladores esto fora do escopo deste texto; informaes mais detalhadas podem ser
encontradas em [Patterson and Henessy, 2005].
7.2.3
Interface de acesso
Para o sistema operacional, o aspecto mais relevante de um dispositivo de entrada/sada sua interface de acesso, ou seja, a abordagem a ser usada para acessar o
dispositivo, configur-lo e enviar dados para ele (ou receber dados dele). Normalmente,
cada dispositivo oferece um conjunto de registradores acessveis atravs do barramento,
tambm denominados portas de entrada/sada, que so usados para a comunicao
entre o dispositivo e o processador. As portas oferecidas para acesso a cada dispositivo
de entrada/sada podem ser divididas nos seguintes grupos (conforme ilustrado na
Figura 7.4):
Portas de entrada (data-in ports): usadas pelo processador para receber dados
provindos do dispositivo; so escritas pelo dispositivo e lidas pelo processador;
Portas de sada (data-out ports): usadas pelo processador para enviar dados ao
dispositivo; essas portas so escritas pelo processador e lidas pelo dispositivo;
209
c Carlos Maziero
7: Interface de acesso
processor
North bridge
(memory
controller hub)
AGP port
LPC bus
RAM
onboard ethernet
BIOS
RAM
South bridge
(I/O controller
hub)
onboard audio
power management
real-time clock
SATA
PCI
USB
standard buses
c Carlos Maziero
7: Interface de acesso
CPU
data-in
data-out
status
control
device controller
c Carlos Maziero
7: Endereamento
aguarda um
novo dado
P2.strobe?
informa que
o controlador
est ocupado
P1.busy = 1
l e trata o
dado recebido
l P0
informa que
o dado foi
processado
gera pulso
em P1.ack
gera
interrupo?
P2.enable_IRQ?
ack
gera IRQ
0
informa que
o controlador
est livre
P1.busy = 0
7.2.4
Endereamento
c Carlos Maziero
7: Endereamento
c Carlos Maziero
7: Interrupes
Processing Unit) realiza a parte mais pesada do processamento da sada de vdeo, como a
renderizao de imagens em 3 dimenses e texturas, deixando o processador principal
livre para outras tarefas.
7.2.5
Interrupes
214
c Carlos Maziero
7: Interrupes
1: excuo
normal
4: a execuo desviada
rotina de
tratamento de
interrupo
6: retorno ao
fluxo anterior
programa
em
execuo
buer
CPU
3: o controlador gera
uma interrupo
5: dados do controlador
transferidos para a memria
registers
keyboard controller
buer
c Carlos Maziero
7: Interrupes
Descrio
divide error
breakpoint
bound range exception
invalid opcode
coprocessor segment overrun
segment not present
stack fault
general protection
page fault
floating point error
c Carlos Maziero
7: Interrupes
CPU
IRQ
registers
registers
interrupt
controller
IRQ
disk
controller
control
status
data
registers
IRQ
...
network
controller
registers
USB
controller
IRQ
registers
touchscreen
controller
IRQ
217
c Carlos Maziero
7.3
7: Software de entrada/sada
Software de entrada/sada
O sistema operacional responsvel por oferecer acesso aos dispositivos de entrada/sada s aplicaes e, em ltima instncia, aos usurios do sistema. Prover acesso
eficiente, rpido e confivel a um conjunto de perifricos com caractersticas diversas de
comportamento, velocidade de transferncia, volume de dados produzidos/consumidos
e diferentes interfaces de hardware um imenso desafio. Alm disso, como cada
dispositivo define sua prpria interface e modo de operao, o ncleo do sistema
operacional deve implementar cdigo de baixo nvel para interagir com milhares de
tipos de dispositivos distintos. Como exemplo, cerca de 60% das 12 milhes de linhas
de cdigo do ncleo Linux 2.6.31 pertencem a cdigo de drivers de dispositivos de
entrada/sada.
Para simplificar o acesso e a gerncia dos dispositivos de entrada/sada, o cdigo do
sistema operacional estruturado em camadas, que levam das portas de entrada/sada,
interrupes de operaes de DMA a interfaces de acesso abstratas, como arquivos e
sockets de rede. Uma viso conceitual dessa estrutura em camadas pode ser vista na
Figura 7.8. Nessa figura, a camada inferior corresponde aos dispositivos perifricos propriamente ditos, como discos rgidos, teclados, etc. A camada logo acima, implementada
em hardware, corresponde ao controlador especfico de cada dispositivo (controlador
IDE, SCSI, SATA, etc.) e aos controladores de DMA e de interrupes, pertencentes ao
chipset do computador.
A primeira camada de software corresponde s rotinas de tratamento de interrupes
(interrupt handles)e aos drivers de entrada/sada. As rotinas de tratamento de interrupo
so acionadas pelo mecanismo de interrupo do processador a cada interrupo
provinda do controlador de interrupes e servem basicamente para registrar sua
ocorrncia. A execuo dessas rotinas deve ser muito breve, pois durante o tratamento
de uma interrupo o processador desabilita a ocorrncia de novas interrupes,
conforme discutido na Seo 7.2.5. Assim, quando uma rotina acionada, ela apenas
reconhece a interrupo ocorrida junto ao controlador, cria um descritor de evento
(event handler) contendo os dados da interrupo, o insere em uma fila de eventos
pendentes mantida pelo driver do dispositivo, notifica o driver e conclui.
Os eventos da fila de eventos pendentes mantida por cada driver so tratados
posterior, quando o processador estiver livre. A separao do tratamento de interrupes
em dois nveis de urgncia levar a estruturar o cdigo de tratamento de cada interrupo
tambm em dois nveis: o bottom-half, que compreende as aes imediatas a executar
quando a interrupo ocorre, e o o top-half, que compreende o restante das aes de
tratamento da interrupo.
7.3.1
Classes de dispositivos
218
c Carlos Maziero
7: Classes de dispositivos
processos de aplicao
nvel de usurio
data
control
nvel de ncleo
Input/output API
data
control
IRQ
interrupt
handler
device driver
software
hardware
control
IRQ
interrupt
controller
data/control
IRQ
device
controller
DMA
controller
IRQ
data/control
I/O device
219
c Carlos Maziero
sentido dos fluxos:
granularidade
exemplos:
acesso
exemplos:
persistncia:
exemplos:
7: Classes de dispositivos
entrada
sada
caractere: os dados so envia- bloco: os dados so enviados/dos ou recebidos byte por byte recebidos em blocos de tamanho fixo
terminais, portas paralelas e discos rgidos, interfaces de
seriais, mouses, teclados
rede (pacotes), fitas magnticas
sequencial: os dados so envi- direto: a cada dado enviado
ados ou recebidos em sequn- ou recebido associado um
cia, um aps o outro
endereo (respectivamente de
destino ou de origem)
porta paralela/serial, mouse, disco rgido, interface de rede
teclado, fita magntica
persistente, se o dado envi- voltil, se o dado enviado
ado pode ser resgatado dire- consumido pelo dispositivo,
tamente (ou, em outras pala- ou se o dado recebido do disvras, se os dados lidos do dis- positivo foi produzido por
positivo foram anteriormente ele e no anteriormente depoescritos nele por aquele com- sitado nele.
putador ou algum outro)
fita magntica, disco rgido
interface de rede, porta serial/paralela
c Carlos Maziero
7.3.2
7: Estratgias de interao
Estratgias de interao
221
c Carlos Maziero
1
2
3
4
// portas da
#define P0
#define P1
#define P2
7: Estratgias de interao
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
polling_output ()
{
for (i = 0 ; i < BUFSIZE ; i++)
{
// espera o controlador ficar livre (bit BUSY deve ser zero).
while (in (P1) & BUSY) ;
20
21
22
23
// gera pulso de 1
// para indicar ao
out (P2, in (P2) |
usleep (1) ;
out (P2, in (P2) &
24
25
26
27
28
29
30
31
32
33
Em conjunto, processador e controlador executam aes coordenadas e complementares: o processador espera que o controlador esteja livre antes de enviar um novo dado;
por sua vez, o controlador espera que o processador lhe envie um novo dado para
processar. Essa interao ilustrada na Figura 7.9. O controlador pode ficar esperando
por novos dados, pois s precisa trabalhar quando h dados a processar, ou seja, quando
o bit strobe de sua porta P2 indicar que h um novo dado em sua porta P0 . Entretanto,
manter o processador esperando at que a operao seja concluda indesejvel, sobretudo se a operao solicitada for demorada. Alm de constituir uma situao clssica
de desperdcio de recursos por espera ocupada, manter o processador esperando pela
resposta do controlador pode prejudicar o andamento de outras atividades importantes
do sistema, como a interao com o usurio.
O problema da espera ocupada torna a estratgia de entrada/sada por programa
pouco eficiente, sobretudo se o tempo de resposta do dispositivo for longo, sendo por
isso pouco usada em sistemas operacionais de propsito geral. Seu uso se concentra
3
Como o bit BUSY da porta P1 deve retornar ao valor zero (0) aps o pulso no bit ACK, o pseudo-cdigo
poderia ser simplificado, eliminando o lao de espera sobre ACK; contudo, esse lao foi mantido para
maior clareza didtica.
222
c Carlos Maziero
7: Estratgias de interao
processador
espera
controlador
ficar livre
controlador
wait (!busy)
busy=0
wait (!strobe)
prepara e
envia byte
interface
data=byte
espera
novo byte
strobe=0
busy=1
espera
byte ser
recebido
wait (!ack)
recebe e
processa
novo byte
ack=0
busy=0
c Carlos Maziero
7: Estratgias de interao
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
c Carlos Maziero
7: Estratgias de interao
Enable_IRQ de sua porta de controle (porta P2 , Seo 7.2.3). O diagrama da Figura 7.10
ilustra de forma simplificada a estratgia de entrada/sada usando interrupes.
processador
espera
controlador
ficar livre
controlador
wait (!busy)
busy=0
wait (!strobe)
prepara e
envia byte
interface
data=byte
strobe=0
schedule()
tratador de
interrupo
raise IRQ
wait (!strobe)
data=byte
espera
novo
byte
recebe e
processa
byte
espera
novo
byte
strobe=0
processo
suspenso
raise IRQ
wait (!strobe)
data=byte
recebe e
processa
byte
espera
novo
byte
strobe=0
raise IRQ
recebe e
processa
byte
resume()
t
225
c Carlos Maziero
7: Estratgias de interao
buffer tem uma capacidade limitada. Por essa razo, o tratamento das interrupes
deve ser feito de forma muito rpida.
A maioria dos sistemas operacionais implementa o tratamento de interrupes
em dois nveis distintos: um tratador primrio (FLIH - First-Level Interrupt Handler) e
um tratador secundrio (SLIH - Second-Level Interrupt Handler). O tratador primrio,
tambm chamado hard/fast interrupt handler ou ainda top-half handler, lanado quando
a interrupo ocorre e deve executar rapidamente, pois as demais interrupes esto
inibidas. Sua atividade se restringe a aes essenciais, como reconhecer a ocorrncia
da interrupo junto ao controlador e registrar dados sobre a mesma em uma fila de
eventos pendentes, para tratamento posterior.
Por sua vez, o tratador secundrio, tambm conhecido como soft/slow interrupt
handler ou ainda bottom-half handler, tem por objetivo tratar a fila de eventos pendentes
registrados pelo tratador primrio, quando o processador estiver disponvel. Ele
pode ser escalonado e suspenso da mesma forma que um processo ou thread, embora
normalmente execute com maior prioridade. Embora mais complexa, esta estrutura
em dois nvel traz algumas vantagens: ao permitir um tratamento mais rpido de cada
interrupo, minimiza o risco de perder interrupes concomitantes; alm disso, a fila
de eventos pendentes pode ser analisada para remover eventos redundantes (como
atualizaes consecutivas de posio do mouse).
No Linux, cada interrupo possui sua prpria fila de eventos pendentes e seus
prprios top-half e bottom-half. Os tratadores secundrios so lanados pelos respectivos
tratadores primrios, sob a forma de threads de ncleo especiais (denominadas tasklets
ou workqueues) [Bovet and Cesati, 2005]. O ncleo Windows NT e seus sucessores
implementam o tratamento primrio atravs de rotinas de servio de interrupo (ISR Interrupt Service Routine). Ao final de sua execuo, cada ISR agenda o tratamento secundrio da interrupo atravs de um procedimento postergado (DPC - Deferred Procedure
Call) [Russinovich and Solomon, 2004]. O sistema Symbian usa uma abordagem similar
a esta.
Por outro lado, os sistemas Solaris, FreeBSD e MacOS X usam uma abordagem
denominada interrupt threads [Mauro and McDougall, 2006]. Cada interrupo provoca
o lanamento de uma thread de ncleo, que escalonada e compete pelo uso do
processador de acordo com sua prioridade. As interrupes tm prioridades que podem
estar acima da prioridade do escalonador ou abaixo dela. Como o prprio escalonador
tambm uma thread, interrupes de baixa prioridade podem ser interrompidas pelo
escalonador ou por outras interrupes. Por outro lado, interrupes de alta prioridade
no so interrompidas pelo escalonador, por isso devem executar rapidamente.
Acesso direto memria
Na maioria das vezes, o tratamento de operaes de entrada/sada uma operao
lenta, pois os dispositivos so mais lentos que o processador. Alm disso, o uso do
processador principal para intermediar essas operaes ineficiente, pois implica em
transferncias adicionais (e desnecessrias) de dados: por exemplo, para transportar
um byte de um buffer da memria para a interface paralela, esse byte precisa antes
ser carregado em um registrador do processador, para em seguida ser enviado ao
226
c Carlos Maziero
7: Estratgias de interao
Obviamente pode existir uma conteno (disputa) entre o processador e os controladores no acesso
aos barramentos e memria principal, mas esse problema atenuado pelo fato do processador poder
acessar o contedo das memrias cache enquanto a transferncia DMA executada. Alm disso, circuitos
de arbitragem intermedeiam o acesso memoria para evitar conflitos. Mais detalhes sobre conteno de
acesso memria durante operaes de DMA podem ser obtidos em [Patterson and Henessy, 2005].
227
c Carlos Maziero
7: Estratgias de interao
processador
memria RAM
5: interrupt request
barramento
1: DMA request
2: transfer request
3: data transfer
controlador
de disco rgido
controlador
de DMA
hardware do dispositivo
8
9
10
11
12
13
14
15
16
17
18
19
20
228
c Carlos Maziero
7: Discos rgidos
7.4
Discos rgidos
229
c Carlos Maziero
7.4.1
7: Estrutura fsica
Estrutura fsica
Um disco rgido composto por um ou mais discos metlicos que giram juntos
em alta velocidade (entre 4.200 e 15.000 RPM), acionados por um motor eltrico. Para
cada face de cada disco h uma cabea de leitura, responsvel por ler e escrever dados
atravs da magnetizao de pequenas reas da superfcie metlica. Cada face dividida
logicamente em trilhas e setores; a interseo de uma trilha e um setor em uma face
define um bloco fsico, que a unidade bsica de armazenamento e transferncia de
dados no disco. Os discos rgidos atuais (at 2010) usam blocos de 512 bytes, mas
o padro da industria est migrando para blocos fsicos de 4.096 bytes. A Figura
7.12 apresenta os principais elementos que compem a estrutura de um disco rgido.
Um disco tpico comporta milhares de trilhas e centenas de setores por face de disco
[Patterson and Henessy, 2005].
setores
trilhas
blocos
faces
cabeas
Figura 7.12: Elementos da estrutura de um disco rgido.
Por serem dispositivos eletromecnicos, os discos rgidos so extremamente lentos,
se comparados velocidade da memria ou do processador. Para cada bloco a ser
lido/escrito, a cabea de leitura deve se posicionar na trilha desejada e aguardar o disco
girar at encontrar o setor desejado. Esses dois passos definem o tempo de busca (ts
seek time), que o tempo necessrio para a cabea de leitura se posicionar sobre uma
determinada trilha, e a latncia rotacional (tr rotation latency), que o tempo necessrio
para o disco girar at que o setor desejado esteja sob a cabea de leitura. Valores mdios
tpicos desses atrasos para discos de uso domstico so ts 10ms e tr 5ms. Juntos,
esses dois atrasos podem ter um forte impacto no desempenho do acesso a disco.
7.4.2
Interface de hardware
c Carlos Maziero
7: Escalonamento de acessos
IDE: Integrated Drive Electronics, padro tambm conhecido como PATA (Parallell
ATA - Advanced Technology Attachment); surgiu nos anos 1980 e durante muito
tempo foi o padro de interface de discos mais usado em computadores pessoais.
Suporta velocidades de at 133 MB/s, atravs de cabos paralelos de 40 ou 80
vias. Cada barramento IDE suporta at dois dispositivos, em uma configurao
mestre/escravo.
SATA: Serial ATA, o padro de interface de discos em desktops e notebooks atuais.
A transmisso dos dados entre o disco e a controladora serial, atingindo taxas
entre 150 MB/s e 300 MB/s atravs de cabos com 7 vias.
SCSI: Small Computer System Interface, padro de interface desenvolvida nos anos
1980, foi muito usada em servidores e estaes de trabalho de alto desempenho.
Um barramento SCSI suporta at 16 dispositivos e atinge taxas de transferncia de
at 640 MB/s (divididos entre os dispositivos conectados no mesmo barramento).
SAS: Serial Attached SCSI, uma evoluo do padro SCSI, permitindo atingir taxas
de transferncia de at 600 MB/s em cada dispositivo conectado controladora.
usado em equipamentos de alto desempenho.
importante observar que esses padres de interface no so de uso exclusivo em
discos rgidos, muito pelo contrrio. H vrios tipos de dispositivos que se conectam
ao computador atravs dessas interfaces, como discos de estado slido (SSD), leitores
ticos (CD, DVD), unidades de fita magntica, scanners, etc.
7.4.3
Escalonamento de acessos
c Carlos Maziero
7: Escalonamento de acessos
524
189
335
324
659
498
161
286
447
376
71
843
914
636
278
bloco
222
500
200
400
600
800
c Carlos Maziero
7: Escalonamento de acessos
255
914
659
588
90
117
161
57
278
335
200
112
bloco
77
447
524
500
24
400
600
800
255
135
914
659
524
453
71
90
161
117
278
57
335
112
200
bloco
53
447
500
400
600
800
c Carlos Maziero
7: Escalonamento de acessos
desempenho ser pior que o do algoritmo do elevador clssico, sua maior vantagem
prover um tempo de espera mais homogneo aos pedidos pendentes, o que
importante em servidores. Este algoritmo tambm conhecido como C-SCAN ou
C-LOOK.
524
135
659
255
914
843
161
117
278
57
335
112
200
bloco
53
447
500
400
600
800
c Carlos Maziero
7: Caching de blocos
CFQ (Completely Fair Queuing): os pedidos dos processos so divididos em vrias filas
(64 filas por default); cada fila recebe uma fatia de tempo para acesso ao disco,
que varia de acordo com a prioridade de entrada/sada dos processos contidos na
mesma. Este o escalonador default do Linux na maioria das distribuies atuais.
7.4.4
Caching de blocos
7.4.5
Sistemas RAID
c Carlos Maziero
7: Sistemas RAID
read-behind
t1
read-ahead
t2
cache
t2
cache
cache
cache
t1
dispositivo
dispositivo
write-through
t1
write-back
t1
t2
cache
cache
cache
cache
t2
dispositivo
dispositivo
Figura 7.17: Estratgias de caching de blocos (t1 e t2 indicam dois instantes de tempo).
Entretanto, o desempenho dos discos rgidos evolui a uma velocidade muito menor
que que a observada nos demais componentes dos computadores, como processadores,
memrias e barramentos. Com isso, o acesso aos discos constitui um dos maiores
gargalos de desempenhos nos sistemas de computao. Boa parte do baixo desempenho
no acesso aos discos devida aos aspectos mecnicos do disco, como a latncia
rotacional e o tempo de posicionamento da cabea de leitura do disco (vide Seo 7.4.3)
[Chen et al., 1994].
Outro problema relevante associado aos discos rgidos diz respeito sua confiabilidade. Os componentes internos do disco podem falhar, levando perda de dados. Essas
falhas podem estar localizadas no meio magntico, ficando restritas a alguns setores, ou
podem estar nos componentes mecnicos/eletrnicos do disco, levando corrupo ou
mesmo perda total dos dados armazenados.
Buscando solues eficientes para os problemas de desempenho e confiabilidade dos
discos rgidos, pesquisadores da Universidade de Berkeley, na Califrnia, propuseram
em 1988 a construo de discos virtuais compostos por conjuntos de discos fsicos, que
eles denominaram RAID Redundant Array of Inexpensive Disks5 [Patterson et al., 1988],
que em portugus pode ser traduzido como Conjunto Redundante de Discos Econmicos.
5
Mais recentemente alguns autores adotaram a expresso Redundant Array of Independent Disks para a
sigla RAID, buscando evitar a subjetividade da palavra Inexpensive (econmico).
236
c Carlos Maziero
7: Sistemas RAID
c Carlos Maziero
bloco 0
7: Sistemas RAID
bloco 1
bloco 2
bloco 3
bloco 4
bloco 5
bloco 6
bloco 7
bloco 8
bloco 9
bloco 10
bloco 11
bloco 12
bloco 13
bloco 14
bloco 15
bloco 16
bloco 17
Controladora RAID
faixa
bloco 0
bloco 1
bloco 4
bloco 5
bloco 8
bloco 9
bloco 2
bloco 3
bloco 6
bloco 7
bloco 10
bloco 11
bloco 18
bloco 19
bloco 20
bloco 21
bloco 12
bloco 13
bloco 16
bloco 17
bloco 20
bloco 21
bloco 22
bloco 23
bloco 14
bloco 15
bloco 18
bloco 19
bloco 22
bloco 23
disco lgico
bloco 0
bloco 1
bloco 2
bloco 3
bloco 4
bloco 5
bloco 6
bloco 7
bloco 8
bloco 9
bloco 10
bloco 11
bloco 12
bloco 13
Controladora RAID
bloco 14
bloco 15
bloco 0
bloco 1
bloco 10
bloco 11
bloco 20
bloco 21
bloco 16
bloco 17
bloco 2
bloco 3
bloco 12
bloco 13
bloco 22
bloco 23
bloco 18
bloco 19
bloco 4
bloco 5
bloco 14
bloco 15
bloco 20
bloco 21
bloco 6
bloco 7
bloco 16
bloco 17
bloco 22
bloco 23
bloco 8
bloco 9
bloco 18
bloco 19
disco lgico
238
c Carlos Maziero
bloco 0
7: Sistemas RAID
bloco 1
bloco 2
bloco 3
bloco 4
bloco 5
bloco 6
bloco 7
bloco 8
bloco 9
Controladora RAID
disco lgico
bloco 0
bloco 1
bloco 0
bloco 1
bloco 2
bloco 3
bloco 2
bloco 3
bloco 4
bloco 5
bloco 4
bloco 5
bloco 6
bloco 7
bloco 6
bloco 7
bloco 8
bloco 9
bloco 8
bloco 9
bloco 0
bloco 1
bloco 2
bloco 3
bloco 4
bloco 5
bloco 6
bloco 7
bloco 8
bloco 9
bloco 10
bloco 11
bloco 12
bloco 13
bloco 14
bloco 15
bloco 16
bloco 17
bloco 18
bloco 19
bloco 20
bloco 21
bloco 22
bloco 23
disco lgico
Controladora RAID
byte 0
byte 3
byte 1
byte 4
byte 2
byte 5
par 0-2
par 3-5
byte 6
byte 9
byte 7
byte 10
byte 8
byte 11
par 6-8
par 9-11
byte 12
byte 15
byte 13
byte 16
byte 14
byte 17
byte 18
byte 21
byte 19
byte 22
byte 20
byte 23
byte 24
byte 27
byte 25
byte 28
byte 26
byte 29
c Carlos Maziero
bloco 0
7: Sistemas RAID
bloco 1
bloco 2
bloco 3
bloco 4
bloco 5
bloco 6
bloco 7
bloco 8
bloco 9
bloco 10
bloco 11
bloco 12
bloco 13
bloco 14
bloco 15
bloco 16
bloco 17
bloco 18
bloco 19
bloco 20
bloco 21
bloco 22
bloco 23
Controladora RAID
disco lgico
bloco 0
bloco 3
bloco 1
bloco 4
bloco 2
bloco 5
par 0-2
par 3-5
bloco 6
bloco 9
bloco 7
bloco 10
bloco 8
bloco 11
par 6-8
par 9-11
bloco 12
bloco 15
bloco 13
bloco 16
bloco 14
bloco 17
bloco 18
bloco 21
bloco 19
bloco 22
bloco 20
bloco 23
bloco 0
bloco 1
bloco 2
bloco 3
bloco 4
bloco 5
bloco 6
bloco 7
bloco 8
bloco 9
bloco 10
bloco 11
bloco 12
bloco 13
bloco 14
bloco 15
bloco 16
bloco 17
Controladora RAID
faixa
bloco 0
bloco 1
bloco 4
bloco 5
bloco 8
bloco 9
par (0,4,8)
par (1,5,9)
bloco 2
bloco 3
bloco 6
bloco 7
bloco 10
bloco 11
par (2,6,10)
par (3,7,11)
bloco 18
bloco 19
bloco 20
bloco 21
bloco 12
bloco 13
bloco 16
bloco 17
bloco 20
bloco 21
bloco 22
bloco 23
bloco 14
bloco 15
bloco 18
bloco 19
bloco 22
bloco 23
bloco 24
bloco 25
bloco 26
bloco 27
bloco 24
bloco 25
bloco 28
bloco 29
bloco 32
bloco 33
bloco 28
bloco 29
bloco 26
bloco 27
bloco 30
bloco 31
bloco 34
bloco 35
bloco 30
bloco 31
bloco 32
bloco 33
...
disco lgico
bloco 36
bloco 37
bloco 40
bloco 41
bloco 44
bloco 45
bloco 38
bloco 39
bloco 42
bloco 43
bloco 46
bloco 47
disco fsico 0
disco fsico 1
disco fsico 2
disco fsico 3
c Carlos Maziero
7: Interfaces de rede
que os vrios nveis de RAID no tm necessariamente uma relao hierrquica entre si,
ou seja, um sistema RAID 3 no necessariamente melhor que um sistema RAID 2. Uma
descrio mais aprofundada dos vrios nveis RAID, de suas variantes e caractersticas
pode ser encontrada em [Chen et al., 1994] e [SNIA, 2009].
7.5
Interfaces de rede
7.6
Dispositivos USB
7.7
Interfaces de udio
7.8
Interface grfica
7.9
Mouse e teclado
7.10
Outros tpicos
241
Captulo 8
Segurana de sistemas
Este mdulo trata dos principais aspectos de segurana envolvidos na construo e utilizao de um sistema operacional. Inicialmente so apresentados
conceitos bsicos de segurana e criptografia; em seguida, so descritos aspectos
conceituais e mecanismos relacionados autenticao de usurios, controle de
acesso a recursos e servios, integridade e privacidade do sistema operacional,
das aplicaes e dos dados armazenados. Grande parte dos tpicos de segurana
apresentados neste captulo no so exclusivos de sistemas operacionais, mas se
aplicam a sistemas de computao em geral.
8.1
Introduo
c Carlos Maziero
8: Conceitos bsicos
8.2
Conceitos bsicos
8.2.1
c Carlos Maziero
c Carlos Maziero
8: Ameaas
8.2.2
Ameaas
Como ameaa, pode ser considerada qualquer ao que coloque em risco as propriedades de segurana do sistema descritas na seo anterior. Alguns exemplos de
ameaas s propriedades bsicas de segurana seriam:
Ameaas confidencialidade: um processo vasculhar as reas de memria de outros
processos, arquivos de outros usurios, trfego de rede nas interfaces locais ou
reas do ncleo do sistema, buscando dados sensveis como nmeros de carto de
crdito, senhas, e-mails privados, etc.;
Ameaas integridade: um processo alterar as senhas de outros usurios, instalar
programas, drivers ou mdulos de ncleo maliciosos, visando obter o controle do
sistema, roubar informaes ou impedir o acesso de outros usurios;
Ameaas disponibilidade: um usurio alocar para si todos os recursos do sistema,
como a memria, o processador ou o espao em disco, para impedir que outros
usurios possam utiliz-lo.
Obviamente, para cada ameaa possvel, devem existir estruturas no sistema operacional que impeam sua ocorrncia, como controles de acesso s reas de memria
e arquivos, quotas de uso de memria e processador, verificao de autenticidade de
drivers e outros softwares, etc.
As ameaas podem ou no se concretizar, dependendo da existncia e da correo
dos mecanismos construdos para evit-las ou impedi-las. As ameaas podem se tornar
realidade medida em que existam vulnerabilidades que permitam sua ocorrncia.
8.2.3
Vulnerabilidades
Uma vulnerabilidade um defeito ou problema presente na especificao, implementao, configurao ou operao de um software ou sistema, que possa ser
explorado para violar as propriedades de segurana do mesmo. Alguns exemplos de
vulnerabilidades so descritos a seguir:
245
c Carlos Maziero
8: Vulnerabilidades
#include <stdio.h>
#include <stdlib.h>
3
4
5
6
7
8
int main()
{
i = j = k = 0 ;
10
11
12
13
14
return(0);
15
16
246
c Carlos Maziero
1
2
3
4
5
8: Ataques
8.2.4
Ataques
Um ataque o ato de utilizar (ou explorar) uma vulnerabilidade para violar uma
propriedade de segurana do sistema. De acordo com [Pfleeger and Pfleeger, 2006],
existem basicamente quatro tipos de ataques, representados na Figura 8.1:
Interrupo : consiste em impedir o fluxo normal das informaes ou acessos; um
ataque disponibilidade do sistema;
Interceptao : consiste em obter acesso indevido a um fluxo de informaes, sem
necessariamente modific-las; um ataque confidencialidade;
Modificao : consiste em modificar de forma indevida informaes ou partes do
sistema, violando sua integridade;
1
247
c Carlos Maziero
8: Ataques
Fabricao : consiste em produzir informaes falsas ou introduzir mdulos ou componentes maliciosos no sistema; um ataque autenticidade.
interceptao
interrupo
fonte
fonte
destino
atacante
atacante
fabricao
modificao
fonte
destino
fonte
destino
destino
atacante
atacante
Figura 8.1: Tipos bsicos de ataques (inspirado em [Pfleeger and Pfleeger, 2006]).
Existem ataques passivos, que visam capturar informaes confidenciais, e ataques
ativos, que visam introduzir modificaes no sistema para beneficiar o atacante ou
impedir seu uso pelos usurios vlidos. Alm disso, os ataques a um sistema operacional
podem ser locais, quando executados por usurios vlidos do sistema, ou remotos,
quando so realizados atravs da rede, sem fazer uso de uma conta de usurio local. Um
programa especialmente construdo para explorar uma determinada vulnerabilidade
de sistema e realizar um ataque denominado exploit.
A maioria dos ataques a sistemas operacionais visa aumentar o poder do atacante
dentro do sistema, o que denominado elevao de privilgios (privilege escalation). Esses
ataques geralmente exploram vulnerabilidades em programas do sistema (que executam
com mais privilgios), ou do prprio ncleo, atravs de chamadas de sistema, para
receber os privilgios do administrador.
Por outro lado, os ataques de negao de servios (DoS Denial of Service) visam
prejudicar a disponibilidade do sistema, impedindo que os usurios vlidos do sistema
possam utiliz-lo, ou seja, que o sistema execute suas funes. Esse tipo de ataque
muito comum em ambientes de rede, com a inteno de impedir o acesso a servidores
Web, DNS e de e-mail. Em um sistema operacional, ataques de negao de servio
podem ser feitos com o objetivo de consumir todos os recursos locais, como processador,
memria, arquivos abertos, sockets de rede ou semforos, dificultando ou mesmo
impedindo o uso desses recursos pelos demais usurios.
O antigo ataque fork bomb dos sistemas UNIX um exemplo trivial de ataque DoS
local: ao executar, o processo atacante se reproduz rapidamente, usando a chamada de
248
c Carlos Maziero
8: Malwares
sistema fork (vide cdigo a seguir). Cada processo filho continua executando o mesmo
cdigo do processo pai, criando novos processos filhos, e assim sucessivamente. Em
consequncia, a tabela de processos do sistema rapidamente preenchida, impedindo a
criao de processos pelos demais usurios. Alm disso, o grande nmero de processos
solicitando chamadas de sistema mantm o ncleo ocupado, impedindo os a execuo
dos demais processos.
1
#include <unistd.h>
2
3
4
5
6
7
int main()
{
while (1)
fork() ;
}
// lao infinito
// reproduz o processo
Ataques similares ao fork bomb podem ser construdos para outros recursos do
sistema operacional, como memria, descritores de arquivos abertos, sockets de rede e
espao em disco. Cabe ao sistema operacional impor limites mximos (quotas) de uso
de recursos para cada usurio e definir mecanismos para detectar e conter processos
excessivamente gulosos.
Recentemente tm ganho ateno os ataques confidencialidade, que visam roubar
informaes sigilosas dos usurios. Com o aumento do uso da Internet para operaes
financeiras, como acesso a sistemas bancrios e servios de compras online, o sistema
operacional e os navegadores manipulam informaes sensveis, como nmeros de
cartes de crdito, senhas de acesso a contas bancrias e outras informaes pessoais.
Programas construdos com a finalidade especfica de realizar esse tipo de ataque so
denominados spyware.
Deve ficar clara a distino entre ataques e incidentes de segurana. Um incidente
de segurana qualquer fato intencional ou acidental que comprometa uma das
propriedades de segurana do sistema. A intruso de um sistema ou um ataque de
negao de servios so considerados incidentes de segurana, assim como o vazamento
acidental de informaes confidenciais.
8.2.5
Malwares
Denomina-se genericamente malware todo programa cuja inteno realizar atividades ilcitas, como realizar ataques, roubar informaes ou dissimular a presena de
intrusos em um sistema. Existe uma grande diversidade de malwares, destinados s
mais diversas finalidades [Shirey, 2000, Pfleeger and Pfleeger, 2006], como:
Vrus : um vrus de computador um trecho de cdigo que se infiltra em programas
executveis existentes no sistema operacional, usando-os como suporte para sua
execuo e replicao2 . Quando um programa infectado executado, o vrus
tambm se executa, infectando outros executveis e eventualmente executando
outras aes danosas. Alguns tipos de vrus so programados usando macros de
2
De forma anloga, um vrus biolgico precisa de uma clula hospedeira, pois usa o material celular
como suporte para sua existncia e replicao.
249
c Carlos Maziero
8: Malwares
c Carlos Maziero
8: Infraestrutura de segurana
Backdoor : uma porta dos fundos um programa que facilita a entrada posterior
do atacante em um sistema j invadido. Geralmente a porta dos fundos criada
atravs um processo servidor de conexes remotas (usando SSH, telnet ou um
protocolo ad-hoc). Muitos backdoors so instalados a partir de trojans, vermes ou
rootkits.
Deve-se ter em mente que h na mdia e na literatura muita confuso em relao
nomenclatura de malwares; alm disso, muitos malwares tm vrias funcionalidades e se
encaixam em mais de uma categoria. Esta seo teve como objetivo dar uma definio
tecnicamente precisa de cada categoria, sem a preocupao de mapear os exemplos reais
nessas categorias.
8.2.6
Infraestrutura de segurana
De forma genrica, o conjunto de todos os elementos de hardware e software considerados crticos para a segurana de um sistema so denominados Base Computacional
Confivel (TCB Trusted Computing Base) ou ncleo de segurana (security kernel).
Fazem parte da TCB todos os elementos do sistema cuja falha possa representar um
risco sua segurana. Os elementos tpicos de uma base de computao confivel
incluem os mecanismos de proteo do hardware (tabelas de pginas/segmentos, modo
usurio/ncleo do processador, instrues privilegiadas, etc.) e os diversos subsistemas
do sistema operacional que visam garantir as propriedades bsicas de segurana, como
o controle de acesso aos arquivos, acesso s portas de rede, etc.
O sistema operacional emprega vrias tcnicas complementares para garantir a
segurana de um sistema operacional. Essas tcnicas esto classificadas nas seguintes
grandes reas:
Autenticao : conjunto de tcnicas usadas para identificar inequivocamente usurios
e recursos em um sistema; podem ir de simples pares login/senha at esquemas
sofisticados de biometria ou certificados criptogrficos. No processo bsico de
autenticao, um usurio externo se identifica para o sistema atravs de um
procedimento de autenticao; no caso da autenticao ser bem sucedida,
aberta uma sesso, na qual so criados uma ou mais entidades (processos, threads,
transaes, etc.) para representar aquele usurio dentro do sistema.
Controle de acesso : tcnicas usadas para definir quais aes so permitidas e quais
so negadas no sistema; para cada usurio do sistema, devem ser definidas regras
descrevendo as aes que este pode realizar no sistema, ou seja, que recursos
este pode acessar e sob que condies. Normalmente, essas regras so definidas
atravs de uma poltica de controle de acesso, que imposta a todos os acessos que os
usurios efetuam sobre os recursos do sistema.
Auditoria : tcnicas usadas para manter um registro das atividades efetuadas no
sistema, visando a contabilizao de uso dos recursos, a anlise posterior de
situaes de uso indevido ou a identificao de comportamento suspeitos.
251
c Carlos Maziero
8: Infraestrutura de segurana
A Figura 8.2 ilustra alguns dos conceitos vistos at agora. Nessa figura, as partes
indicadas em cinza e os mecanismos utilizados para implement-las constituem a base
de computao confivel do sistema.
auditoria
auditoria
evento
humanos
autenticao
sistemas
externos
usurios
dados de
auditoria
evento
processos
threads
transaes
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
arquivos
outros
sujeitos
ou
sistemas
controle
de acesso
dados de
autenticao
polticas
de controle
de acesso
autenticao
controle de acesso
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
registros
recursos
c Carlos Maziero
8: Fundamentos de criptografia
8.3
Fundamentos de criptografia
8.3.1
Cifragem e decifragem
Uma das mais antigas tcnicas criptogrficas conhecidas o cifrador de Csar, usado
pelo imperador romano Jlio Csar para se comunicar com seus generais. O algoritmo
usado nesse cifrador bem simples: cada caractere do texto aberto substitudo pelo
k-simo caractere sucessivo no alfabeto. Assim, considerando k = 2, a letra A seria
substituda pela letra C, a letra R pela T, e assim por diante. Usando esse
algoritmo, a mensagem secreta Reunir todos os generais para o ataque seria cifrada
da seguinte forma:
mensagem aberta:
mensagem cifrada com k = 1:
mensagem cifrada com k = 2:
mensagem cifrada com k = 3:
Reunir
Sfvojs
Tgwpkt
Uhxqlu
todos
upept
vqfqu
wrgrv
os
pt
qu
rv
generais
hfofsbjt
igpgtcku
jhqhudlv
para
qbsb
rctc
sdud
o
p
q
r
ataque
bubrvf
cvcswg
dwdtxh
c Carlos Maziero
chaves de 128 bits, oferece um espao de chaves com 2128 possibilidades, ou seja,
340.282.366.920.938.463.463.374.607.431.768.211.456 chaves diferentes... Se pudssemos
analisar um bilho de chaves por segundo, ainda assim seriam necessrios 10 sextilhes
de anos para testar todas as chaves possveis!
No restante do texto, a operao de cifragem de um contedo x usando uma chave k
ser representada por {x}k e a decifragem de um contedo x usando uma chave k ser
representada por {x}1
.
k
8.3.2
texto aberto
texto cifrado
cifrar
chave secreta
6d034072696a6e6461656c2d31
3238002000636263006d63727970
742d7368613100157290d14234f6
fce39f0908827c54cdf58890687f
7368613100ff56dfb2015aae6f33
86a6acbd051a33562699a2d97623
ca974d8cc5d986b6c48fba534eab
2eb4d39273910b72c869c54521c1
c5df85cb3a37d2aaa6f19b560ead
a9eb92c5e8e95
decifrar
chave secreta
c Carlos Maziero
texto aberto
texto cifrado
cifrar
6d034072696a6e6461656c2d31
3238002000636263006d63727970
742d7368613100157290d14234f6
fce39f0908827c54cdf58890687f
7368613100ff56dfb2015aae6f33
86a6acbd051a33562699a2d97623
ca974d8cc5d986b6c48fba534eab
2eb4d39273910b72c869c54521c1
c5df85cb3a37d2aaa6f19b560ead
a9eb92c5e8e95
chave pblica
decifrar
chave privada
255
c Carlos Maziero
8: Resumo criptogrfico
pode ser um servidor Web, por exemplo) e a usa para cifrar o documento que ser
enviado a Beto. Somente Beto poder decifrar esse documento, pois s ele possui a
chave privada correspondente chave pblica usada para cifr-lo. Outros usurios
podero at ter acesso ao documento cifrado, mas no conseguiro decifr-lo.
texto cifrado
Alice
Ille nihil dubitat qui
nullam scientiam habet
(Nada duvida quem nada sabe)
texto aberto
3: cifrar
6d034072696a6e6461656c2d31
3238002000636263006d63727970
742d7368613100157290d14234f6
fce39f0908827c54cdf58890687f
7368613100ff56dfb2015aae6f33
86a6acbd051a33562699a2d97623
ca974d8cc5d986b6c48fba534eab
2eb4d39273910b72c869c54521c1
c5df85cb3a37d2aaa6f19b560ead
a9eb92c5e8e95
Beto
Ille nihil dubitat qui
nullam scientiam habet
(Nada duvida quem nada sabe)
texto aberto
5: decifrar
Chaveiro pblico
Alice
1: Beto divulga
sua chave pblica
8.3.3
Resumo criptogrfico
Um resumo criptogrfico (cryptographic hash) [Menezes et al., 1996] uma funo que
gera uma sequncia de bytes de tamanho pequeno e fixo (algumas dezenas ou centenas
256
c Carlos Maziero
8: Assinatura digital
maziero:~> md5sum *
62ec3f9ff87f4409925a582120a40131
0920785a312bd88668930f761de740bf
45acbba4b57317f3395c011fbd43d68d
6c332adb037265a2019077e09a024d0c
header.tex
main.pdf
main.tex
main.tex~
6
7
8
9
10
11
maziero:~> sha1sum *
742c437692369ace4bf0661a8fe5741f03ecb31a
9f9f52f48b75fd2f12fa297bdd5e1b13769a3139
d6973a71e5c30d0c05d762e9bc26bb073d377a0b
cf1670f22910da3b9abf06821e44b4ad7efb5460
8.3.4
header.tex
main.pdf
main.tex
main.tex~
Assinatura digital
Em 2005, um grupo de pesquisadores alemes fatorizou um inteiro com 200 dgitos, usando 80
processadores Opteron calculando durante mais de de cinco meses.
257
c Carlos Maziero
sendo por isso o mecanismo bsico utilizado na construo dos certificados digitais,
amplamente empregados para a autenticao de servidores na Internet.
Em termos gerais, a assinatura digital de um documento um resumo digital do
mesmo, cifrado usando a chave privada de seu autor (ou de quem o est assinando).
Sendo um documento d emitido pelo usurio u, sua assinatura digital s(d, u) definida
por
s(d, u) = {hash(d)}kv(u)
onde hash(x) uma funo de resumo criptogrfico conhecida, {x}k indica a cifragem de x
usando uma chave k e kv(u) a chave privada do usurio u. Para verificar a validade da
assinatura, basta calcular novamente o resumo r0 = hash(d) e compar-lo com o resumo
obtido da assinatura, decifrada usando a chave pblica de u (r00 = {s}1
). Se ambos
kp(u)
0
00
forem iguais (r = r ), o documento foi realmente assinado por u e est ntegro, ou seja,
no foi modificado desde que u o assinou [Menezes et al., 1996].
A Figura 8.6 ilustra o processo de assinatura digital e verificao de um documento.
Os passos do processo so:
1. Alice divulga sua chave pblica kpa em um repositrio acessvel publicamente;
2. Alice calcula o resumo digital r do documento d a ser assinado;
3. Alice cifra o resumo r usando sua chave privada kva , obtendo uma assinatura
digital s;
4. A assinatura s e o documento original d, em conjunto, constituem o documento
assinado por Alice: [d, s];
5. Beto obtm o documento assinado por Alice ([d0 , s0 ], com d0 = d e s0 = s se ambos
estiverem ntegros);
6. Beto recalcula o resumo digital r0 = hash(d0 ) do documento, usando o mesmo
algoritmo empregado por Alice;
7. Beto obtm a chave pblica kpa de Alice e a usa para decifrar a assinatura s0 do
documento, obtendo um resumo r00 (r00 = r se s foi realmente cifrado com a chave
kva e se s0 = s) ;
8. Beto compara o resumo r0 do documento com o resumo r00 obtido da assinatura
digital; se ambos forem iguais (r0 = r00 ), o documento foi assinado por Alice e est
ntegro, assim como sua assinatura.
8.3.5
c Carlos Maziero
Ille nihil
dubitat qui
nullam
scientiam
habet
(Nada duvida
quem
nada sabe)
Ille nihil
dubitat qui
nullam
scientiam
habet
(Nada duvida
quem
nada sabe)
d'
hash
3423a2e67ba6fc
5b432c2d9f0588
4aef7f7362a74d
hash
6fce39f0908827
ca54cdf5889068
7f734aef674d2a
r'=r'' ?
r'
sim
assinatura
vlida
s'
6fce39f0908827
ca54cdf5889068
7f734aef674d2a
r''
cifrar
Alice
decifrar
Chaveiro pblico
chave
privada
chave
pblica
6fce39f0908827
ca54cdf5889068
7f734aef674d2a
documento
assinado
por Alice
resumo
Deve-se ressaltar que um certificado pode pertencer a um usurio humano, a um sistema computacional ou qualquer mdulo de software que precise ser identificado de forma inequvoca.
259
c Carlos Maziero
8: Autenticao
Todo certificado deve ser assinado por alguma entidade considerada confivel
pelos usurios do sistema. Essas entidades so normalmente denominadas Autoridades
Certificadoras (AC ou CA Certification Authorities). Como as chaves pblicas das ACs
devem ser usadas para verificar a validade de um certificado, surge um problema:
como garantir que uma chave pblica realmente pertence a uma dada autoridade
certificadora? A soluo simples: basta criar um certificado para essa AC, assinado
por outra AC ainda mais confivel. Dessa forma, pode-se construir uma estrutura
hierrquica de certificao, na qual a AC de ordem mais elevada (denominada AC
raiz) assina os certificados de outras ACs, e assim sucessivamente, at chegar aos
certificados dos usurios e demais entidades do sistema, como mostra o exemplo da
Figura 8.7. Uma estrutura de certificao se chama Infra-estrutura de Chaves Pblicas (ICP
ou PKI - Public-Key Infrastructure). Em uma ICP convencional (hierrquica), a chave
pblica da AC raiz deve ser conhecida de todos e considerada ntegra [Mollin, 2000].
chave pblica
AC raiz
identificao
d s lj k l s
assinatura
29-05-2009
lsd jsfhd
dfh kds
ks
lk
d sk
f dsjh
ACs
secundrias
dfh kds
ks
f dsjh
dfh kds
ks
d sk
f dsjh
dfh kds
ks
lsd jsfhd
lsd jsfhd
d sk
f dsjh
d sk
f dsjh
dfh kds
ks
d s lj k l s
d
lk
29-05-2009
d sk
dfh kds
ks
lsd jsfhd
d s lj k l s
29-05-2009
lsd jsfhd
29-05-2009
lk
d s lj k l s
d
lk
lsd jsfhd
d sk
f dsjh
dfh kds
ks
d s lj k l s
d
lsd jsfhd
d s lj k l s
d
lk
29-05-2009
lk
29-05-2009
d s lj k l s
d
lk
29-05-2009
d sk
f dsjh
8.4
Autenticao
260
c Carlos Maziero
8: Usurios e grupos
sistema comprova que ele/a realmente quem afirma ser. Para tal podem ser usadas
vrias tcnicas, sendo as mais relevantes apresentadas nesta seo.
Inicialmente, a autenticao visava apenas identificar usurios, para garantir que
somente usurios devidamente credenciados teriam acesso ao sistema. Atualmente, em
muitas circunstncias tambm necessrio o oposto, ou seja, identificar o sistema para
o usurio, ou mesmo sistemas entre si. Por exemplo, quando um usurio acessa um
servio bancrio via Internet, deseja ter certeza de que o sistema acessado realmente
aquele do banco desejado, e no um sistema falso, construdo para roubar seus dados
bancrios. Outro exemplo ocorre durante a instalao de componentes de software
como drivers: o sistema operacional deve assegurar-se que o software a ser instalado
provm de uma fonte confivel e no foi corrompido por algum contedo malicioso.
8.4.1
Usurios e grupos
261
c Carlos Maziero
8.4.2
8: Tcnicas de autenticao
Tcnicas de autenticao
8.4.3
Senhas
262
c Carlos Maziero
8: Senhas descartveis
A autenticao por senha simples mas muito frgil, pois implica no armazenamento
das senhas em aberto no sistema, em um arquivo ou base de dados. Caso o arquivo
ou base seja exposto devido a algum erro ou descuido, as senhas dos usurios estaro
visveis. Para evitar o risco de exposio indevida das senhas, so usadas funes
unidirecionais para armazen-las, como os resumos criptogrficos (Seo 8.3.3).
A autenticao por senhas usando um resumo criptogrfico bem simples: ao
registrar a senha s de um novo usurio, o sistema calcula seu resumo (r = hash(s)), e o
armazena. Mais tarde, quando esse usurio solicitar sua autenticao, ele informar uma
senha s0 ; o sistema ento calcular novamente seu resumo r0 = hash(s0 ) e ir compar-lo
ao resumo previamente armazenado (r0 = r). Se ambos forem iguais, a senha informada
pelo usurio considerada autntica e o acesso do usurio ao sistema permitido.
Com essa estratgia, as senhas no precisam ser armazenadas em aberto no sistema,
aumentando sua segurana.
Caso um intruso tenha acesso aos resumos das senhas dos usurios, ele no conseguir
calcular de volta as senhas originais (pois o resumo foi calculado por uma funo
unidirecional), mas pode tentar obter as senhas indiretamente, atravs do ataque do
dicionrio. Nesse ataque, o invasor usa o algoritmo de resumo para cifrar palavras
conhecidas ou combinaes delas, comparando os resumo obtidos com aqueles presentes
no arquivo de senhas. Caso detecte algum resumo coincidente, ter encontrado a senha
correspondente. O ataque do dicionrio permite encontrar senhas consideradas fracas,
por serem muito curtas ou baseadas em palavras conhecidas. Por isso, muitos sistemas
operacionais definem polticas rgidas para as senhas, impedindo o registro de senhas
bvias ou muito curtas e restringindo o acesso ao repositrio dos resumos de senhas.
8.4.4
Senhas descartveis
c Carlos Maziero
8: Tcnicas biomtricas
8.4.5
Tcnicas biomtricas
c Carlos Maziero
8: Desafio-resposta
As caractersticas biomtricas usadas em autenticao podem ser fsicas ou comportamentais. Como caractersticas fsicas so consideradas, por exemplo, o DNA, a geometria
das mos, do rosto ou das orelhas, impresses digitais, o padro da ris (padres na
parte colorida do olho) ou da retina (padres de vasos sanguneos no fundo do olho).
Como caractersticas comportamentais so consideradas a assinatura, o padro de voz e
a dinmica de digitao (intervalos de tempo entre teclas digitadas), por exemplo.
Os sistemas mais populares de autenticao biomtrica atualmente so os baseados
em impresses digitais e no padro de ris. Esses sistemas so considerados confiveis,
por apresentarem taxas de erro relativamente baixas, custo de implantao/operao
baixo e facilidade de coleta dos dados biomtricos. A Figura 8.9 apresenta alguns
exemplos de caractersticas biomtricas empregadas nos sistemas atuais.
iris
retina
retina e ris
padro de voz
impresso digital
8.4.6
Desafio-resposta
265
c Carlos Maziero
dados
biomtricos
8: Desafio-resposta
dados
biomtricos
sensor
sistema biomtrico
extrator de
caractersticas
coleta/registro
caractersticas
relevantes
humanos
senha
carto
etc.
autenticador
identidade
usurios
cadastrados
comparador
base de
dados
Servidor
solicita acesso
desao(d)
senha s'
dene d
aleatrio
r=hash(s||d)
resposta(r)
aceito/recusado
r'=hash(s'||d)
aceito se r'=r
(implica s'=s)
266
c Carlos Maziero
8: Certificados de autenticao
8.4.7
Certificados de autenticao
Uma forma cada vez mais frequente de autenticao envolve o uso de certificados
digitais. Conforme apresentado na Seo 8.3.5, um certificado digital um documento
assinado digitalmente, atravs de tcnicas de criptografia assimtrica e resumo criptogrfico. Os padres de certificados PGP e X.509 definem certificados de autenticao (ou
de identidade), cujo objetivo identificar entidades atravs de suas chaves pblicas. Um
certificado de autenticao conforme o padro X.509 contm as seguintes informaes
[Mollin, 2000]:
Nmero de verso do padro X.509 usado no certificado;
Chave pblica do proprietrio do certificado e indicao do algoritmo de criptografia ao qual ela est associada e eventuais parmetros;
Nmero serial nico, definido pelo emissor do certificado (quem o assinou);
Identificao detalhada do proprietrio do certificado, definida de acordo com
normas do padro X.509;
Perodo de validade do certificado (datas de incio e final de validade);
Identificao da Autoridade Certificadora que emitiu/assinou o certificado;
Assinatura digital do certificado e indicao do algoritmo usado na assinatura e
eventuais parmetros;
Os certificados digitais so o principal mecanismo usado para verificar a autenticidade
de servios acessveis atravs da Internet, como bancos e comrcio eletrnico. Nesse
caso, eles so usados para autenticar os sistemas para os usurios. No entanto, cada
vez mais frequente o uso de certificados para autenticar os prprios usurios. Nesse
caso, um smartcard ou um dispositivo USB contendo o certificado conectado ao sistema
para permitir a autenticao do usurio.
8.4.8
Kerberos
c Carlos Maziero
8: Kerberos
client
3
Authentication
Service
Ticket
Granting
Service
T1
T2
6
T2
users/keys
database
server
c Carlos Maziero
8: Kerberos
O ticket Tctgs fornecido pelo AS para permitir o acesso ao TGS chamado TGT
(Ticket Granting Ticket), e possui um prazo de validade limitado (geralmente de
algumas horas). Ao receber m2 , o cliente tem acesso chave de sesso kctgs e ao
ticket TGT. Todavia, esse ticket cifrado com a chave ktgs e portanto somente o
TGS poder abr-lo.
3. A seguir, o cliente envia uma solicitao ao TGS (mensagem m3 ) para obter um
ticket de acesso ao servidor desejado s. Essa solicitao contm a identidade do
cliente (c) e a data atual (t), ambos cifrados com a chave de sesso kctgs , o ticket
TGT recebido em m2 , a identidade do servidor s e um nmero aleatrio n2 :
m3 = [{c t}kctgs Tctgs s n2 ]
4. Aps verificar a validade do ticket TGT, o TGS devolve ao cliente uma mensagem
m4 contendo a chave de sesso kcs a ser usada no acesso ao servidor s e o nmero
aleatrio n2 informado em m3 , ambos cifrados com a chave de sesso kctgs , e um
ticket Tcs cifrado, que deve ser apresentado ao servidor s:
m4 = [{kcs n}kctgs Tcs ]
5. O cliente usa a chave de sesso kcs e o ticket Tcs para se autenticar junto ao
servidor s atravs da mensagem m5 . Essa mensagem contm a identidade do
cliente (c) e a data atual (t), ambos cifrados com a chave de sesso kcs , o ticket Tcs
recebido em m4 e o pedido de servio ao servidor (request), que dependente da
aplicao:
m5 = [{c t}kcs Tcs request]
6. Ao receber m5 , o servidor s decifra o ticket Tcs para obter a chave de sesso kcs e
a usa para decifrar a primeira parte da mensagem e confirmar a identidade do
cliente. Feito isso, o servidor pode atender a solicitao e responder ao cliente,
cifrando sua resposta com a chave de sesso kcs :
m6 = [{reply}kcs ]
269
c Carlos Maziero
8: Infra-estruturas de autenticao
Enquanto o ticket de servio Tcs for vlido, o cliente pode enviar solicitaes ao
servidor sem a necessidade de se reautenticar. Da mesma forma, enquanto o ticket Tctgs
for vlido, o cliente pode solicitar tickets de acesso a outros servidores sem precisar se
reautenticar. Pode-se observar que em nenhum momento as chaves de sesso kctgs e kcs
circularam em aberto atravs da rede. Alm disso, a presena de prazos de validade para
as chaves permite minimizar os riscos de uma eventual captura da chave. Informaes
mais detalhadas sobre o funcionamento do protocolo Kerberos 5 podem ser encontradas
em [Neuman et al., 2005].
8.4.9
Infra-estruturas de autenticao
c Carlos Maziero
8: Controle de acesso
...
endereo IP
biometria
certificados
login/senha
API padronizada
8.5
Controle de acesso
271
c Carlos Maziero
8.5.1
Uma poltica de controle de acesso uma viso abstrata das possibilidades de acesso
a recursos (objetos) pelos usurios (sujeitos) de um sistema. Essa poltica consiste
basicamente de um conjunto de regras definindo os acessos possveis aos recursos do
sistema e eventuais condies necessrias para permitir cada acesso. Por exemplo, as
regras a seguir poderiam constituir parte da poltica de segurana de um sistema de
informaes mdicas:
Mdicos podem consultar os pronturios de seus pacientes;
Mdicos podem modificar os pronturios de seus pacientes enquanto estes estiverem internados;
O supervisor geral pode consultar os pronturios de todos os pacientes;
Enfermeiros podem consultar apenas os pronturios dos pacientes de sua seo e
somente durante seu perodo de turno;
Assistentes no podem consultar pronturios;
Pronturios de pacientes de planos de sade privados podem ser consultados pelo
responsvel pelo respectivo plano de sade no hospital;
Pacientes podem consultar seus prprios pronturios (aceitar no mximo 30
pacientes simultneos).
As regras ou definies individuais de uma poltica so denominadas autorizaes.
Uma poltica de controle de acesso pode ter autorizaes baseadas em identidades
(como sujeitos e objetos) ou em outros atributos (como idade, sexo, tipo, preo, etc.); as
autorizaes podem ser individuais (a sujeitos) ou coletivas (a grupos); tambm podem
existir autorizaes positivas (permitindo o acesso) ou negativas (negando o acesso);
por fim, uma poltica pode ter autorizaes dependentes de condies externas (como o
tempo ou a carga do sistema). Alm da poltica de acesso aos objetos, tambm deve
ser definida uma poltica administrativa, que define quem pode modificar/gerenciar as
polticas vigentes no sistema [Samarati and De Capitani di Vimercati, 2001].
O conjunto de autorizaes de uma poltica deve ser ao mesmo tempo completo,
cobrindo todas as possibilidades de acesso que vierem a ocorrer no sistema, e consistente,
sem regras conflitantes entre si (por exemplo, uma regra que permita um acesso e
outra que negue esse mesmo acesso). Alm disso, toda poltica deve buscar respeitar o
princpio do privilgio mnimo [Saltzer and Schroeder, 1975], segundo o qual um usurio
nunca deve receber mais autorizaes que aquelas que necessita para cumprir sua
tarefa. A construo e validao de polticas de controle de acesso um tema complexo,
que est fora do escopo deste texto, sendo melhor descrito em [di Vimercati et al., 2005,
di Vimercati et al., 2007].
As polticas de controle de acesso definem de forma abstrata como os sujeitos
podem acessar os objetos do sistema. Existem muitas formas de se definir uma
272
c Carlos Maziero
8: Polticas discricionrias
poltica, que podem ser classificadas em quatro grandes classes: polticas discricionrias, polticas obrigatrias, polticas baseadas em domnios e polticas baseadas em papis
[Samarati and De Capitani di Vimercati, 2001]. As prximas sees apresentam com
mais detalhe cada uma dessas classes de polticas.
Geralmente a descrio de uma poltica de controle de acesso muito abstrata e
informal. Para sua implementao em um sistema real, ela precisa ser descrita de uma
forma precisa, atravs de um modelo de controle de acesso. Um modelo de controle de
acesso uma representao lgica ou matemtica da poltica, de forma a facilitar sua
implementao e permitir a anlise de eventuais erros. Em um modelo de controle
de acesso, as autorizaes de uma poltica so definidas como relaes lgicas entre
atributos do sujeito (como seus identificadores de usurio e grupo) atributos do objeto
(como seu caminho de acesso ou seu proprietrio) e eventuais condies externas (como
o horrio ou a carga do sistema). Nas prximas sees, para cada classe de polticas de
controle de acesso apresentada sero discutidos alguns modelos aplicveis mesma.
Por fim, os mecanismos de controle de acesso so as estruturas necessrias implementao de um determinado modelo em um sistema real. Como bem sabido,
de fundamental importncia a separao entre polticas e mecanismos, para permitir
a substituio ou modificao de polticas de controle de acesso de um sistema sem
incorrer em custos de modificao de sua implementao. Assim, um mecanismo de
controle de acesso ideal deveria ser capaz de suportar qualquer poltica de controle de
acesso.
8.5.2
Polticas discricionrias
Muitas polticas de controle de acesso discricionrias so baseadas na noo de que cada recurso
do sistema possui um proprietrio, que decide quem pode acessar o recurso. Isso ocorre por exemplo
nos sistemas de arquivos, onde as permisses de acesso a cada arquivo ou diretrio so definidas pelo
respectivo proprietrio. Contudo, a noo de proprietrio de um recurso no essencial para a
construo de polticas discricionrias [Shirey, 2000].
273
c Carlos Maziero
8: Polticas discricionrias
Alice
Beto
f ile1
read
write
remove
read
write
Carol
Davi
read
f ile2
read
write
program1
execute
read
write
remove
read
read
execute
append
read
socket1
write
read
write
read
append
c Carlos Maziero
8: Polticas discricionrias
Alice
Beto
f ile1
read
write
remove
owner
read
write
Carol
Davi
read
f ile2
read
write
program1
execute
read
write
remove
owner
read
read
owner
execute
write
read
socket1
write
read
write
read
write
owner
c Carlos Maziero
8: Polticas discricionrias
Sujeito
Alice
Alice
Alice
Alice
Alice
Alice
Alice
Alice
Beto
Beto
Beto
Beto
Beto
Beto
Beto
Beto
Carol
Carol
Carol
Carol
Davi
Davi
Davi
Davi
Davi
Davi
Objeto
f ile1
f ile1
f ile1
f ile1
f ile2
f ile2
program1
socket1
f ile1
f ile1
f ile2
f ile2
f ile2
f ile2
program1
socket1
f ile2
program1
socket1
socket1
f ile1
f ile2
program1
socket1
socket1
socket1
Ao
read
write
remove
owner
read
write
execute
write
read
write
read
write
remove
owner
read
owner
read
execute
read
write
read
write
read
read
write
owner
276
c Carlos Maziero
8: Polticas discricionrias
Esta forma de implementao a mais frequentemente usada em sistemas operacionais, por ser simples de implementar e bastante robusta. Por exemplo, o sistema
de arquivos associa uma ACL a cada arquivo ou diretrio, para indicar quem so os
sujeitos autorizados a acess-lo. Em geral, somente o proprietrio do arquivo pode
modificar sua ACL, para incluir ou remover permisses de acesso.
Listas de capacidades
Uma terceira abordagem possvel para a implementao da matriz de controle de
acesso a Lista de Capacidades (CL - Capability List), ou seja, uma lista de objetos que
um dado sujeito pode acessar e suas respectivas permisses sobre os mesmos. Cada lista
de capacidades corresponde a uma linha da matriz de acesso. Como exemplo, as listas
de capacidades correspondentes matriz de controle de acesso da Tabela 8.2 seriam:
CL(Alice) = { f ile1 : (read, write, remove, owner),
f ile2 : (read, write),
program1 : (execute),
socket1 : (write) }
CL(Beto) = { f ile1 : (read, write),
f ile2 : (read, write, remove, owner),
program1 : (read, owner) }
CL(Carol) = { f ile2 : (read),
program1 : (execute),
socket1 : (read, write) }
CL(Davi) = { f ile1 : (read),
f ile2 : (write),
program1 : (read),
socket1 : (read, write, owner) }
Uma capacidade pode ser vista como uma ficha ou token: sua posse d ao proprietrio
o direito de acesso ao objeto em questo. Capacidades so pouco usadas em sistemas
277
c Carlos Maziero
8: Polticas obrigatrias
8.5.3
Polticas obrigatrias
278
c Carlos Maziero
8: Polticas obrigatrias
Modelo de Bell-LaPadula
Um modelo de controle de acesso que permite formalizar polticas multi-nvel o
de Bell-LaPadula [Bell and LaPadula, 1974], usado para garantir a confidencialidade das
informaes. Esse modelo consiste basicamente de duas regras:
No-Read-Up (no ler acima, ou propriedade simples): impede que um sujeito leia
objetos que se encontrem em nveis de segurana acima do seu. Por exemplo, um
sujeito habilitado como confidencial (C) somente pode ler objetos cuja classificao
seja confidencial (C), reservada (R) ou pblica (U). Considerando um sujeito s e
um objeto o, formalmente temos:
request(s, o, read) h(s) c(o)
No-Write-Down (no escrever abaixo, ou propriedade ?): impede que um sujeito
escreva em objetos abaixo de seu nvel de segurana, para evitar o vazamento
de informaes dos nveis superiores para os inferiores. Por exemplo, um sujeito
habilitado como confidencial somente pode escrever em objetos cuja classificao
seja confidencial, secreta ou ultrassecreta. Formalmente, temos:
request(s, o, write) h(s) c(o)
Pode-se perceber facilmente que a poltica obrigatria representada pelo modelo de
Bell-LaPadula visa proteger a confidencialidade das informaes do sistema, evitando que
estas fluam dos nveis superiores para os inferiores. Todavia, nada impede um sujeito
com baixa habilitao escrever sobre um objeto de alta classificao, destruindo seu
contedo.
Modelo de Biba
Para garantir a integridade das informaes, um modelo dual ao de Bell-LaPadula
foi proposto por Biba [Biba, 1977]. Esse modelo define nveis de integridade i(x) para
sujeitos e objetos (como Baixa, Mdia, Alta e Sistema, com B < M < A < S), e tambm
possui duas regras bsicas:
No-Write-Up (no escrever acima, ou propriedade simples de integridade): impede
que um sujeito escreva em objetos acima de seu nvel de integridade, preservandoos ntegros. Por exemplo, um sujeito de integridade mdia (M) somente pode
escrever em objetos de integridade baixa (B) ou mdia (M). Formalmente, temos:
request(s, o, write) i(s) i(o)
No-Read-Down (no ler abaixo, ou propriedade ? de integridade): impede que
um sujeito leia objetos em nveis de integridade abaixo do seu, para no correr o
risco de ler informao duvidosa. Por exemplo, um sujeito com integridade alta (A)
279
c Carlos Maziero
somente pode ler objetos com integridade alta (A) ou de sistema (S). Formalmente,
temos:
request(s, o, read) i(s) i(o)
A poltica obrigatria definida atravs do modelo de Biba evita violaes de integridade, mas no garante a confidencialidade das informaes. Para que as duas polticas
(confidencialidade e integridade) possam funcionar em conjunto, necessrio portanto
associar a cada sujeito e objeto do sistema um nvel de confidencialidade e um nvel de
integridade, possivelmente distintos.
importante observar que, na maioria dos sistemas reais, as polticas obrigatrias
no substituem as polticas discricionrias, mas as complementam. Em um sistema
que usa polticas obrigatrias, cada acesso a recurso verificado usando a politica
obrigatria e tambm uma politica discricionria; o acesso permitido somente se
ambas as politicas o autorizarem. A ordem de avaliao das polticas MAC e DAC
obviamente no afeta o resultado final, mas pode ter impacto sobre o desempenho do
sistema. Por isso, deve-se primeiro avaliar a poltica mais restritiva, ou seja, aquela que
tem mais probabilidades de negar o acesso.
Categorias
Uma extenso frequente s polticas multi-nvel a noo de categorias ou compartimentos. Uma categoria define uma rea funcional dentro do sistema computacional,
como pessoal, projetos, financeiro, suporte, etc. Normalmente o conjunto de
categorias esttico no h uma ordem hierrquica entre elas. Cada sujeito e cada
objeto do sistema so rotulados com uma ou mais categorias; a poltica ento consiste
em restringir o acesso de um sujeito somente aos objetos pertencentes s mesmas
categorias dele, ou a um sub-conjunto destas. Dessa forma, um sujeito com as categorias {suporte, f inanceiro} s pode acessar objetos rotulados como {suporte, f inanceiro},
{suporte}, { f inanceiro} ou {}. Formalmente: sendo C(s) o conjunto de categorias associadas a um sujeito s e C(o) o conjunto de categorias associadas a um objeto o, s s pode
acessar o se C(s) C(o) [Samarati and De Capitani di Vimercati, 2001].
8.5.4
O domnio de segurana de um sujeito define o conjunto de objetos que ele pode acessar
e como pode acess-los. Muitas vezes esse domnio est definido implicitamente nas
regras das polticas obrigatrias ou na matriz de controle de acesso de uma poltica
discricionria. As polticas baseadas em domnios e tipos (DTE - Domain/Type Enforcement
policies) [Boebert and Kain, 1985] tornam explcito esse conceito: cada sujeito s do
sistema rotulado com um atributo constante definindo seu domnio domain(s) e cada
objeto o associado a um tipo type(o), tambm constante.
No modelo de implementao de uma poltica DTE definido em [Badger et al., 1995],
as permisses de acesso de sujeitos a objetos so definidas em uma tabela global chamada
Tabela de Definio de Domnios (DDT - Domain Definition Table), na qual cada linha
280
c Carlos Maziero
/* type definitions
type unix_t,
/*
specs_t,
/*
budget_t,
/*
rates_t;
/*
*/
normal UNIX files, programs, etc. */
engineering specifications */
budget projections */
labor rates */
6
7
8
9
10
11
12
13
14
15
/* domain definitions */
domain engineer_d = DEFAULT, (rwd->specs_t);
domain project_d = DEFAULT, (rwd->budget_t), (rd->rates_t);
domain accounting_d = DEFAULT, (rd->budget_t), (rwd->rates_t);
domain system_d = (/etc/init), (rwxd->unix_t), (auto->login_d);
domain login_d
= (/bin/login), (rwxd->unix_t),
(exec-> engineer_d, project_d, accounting_d);
16
17
18
19
20
21
22
23
/* assign
assign -r
assign -r
assign -r
assign -r
A implementao direta desse modelo sobre um sistema real pode ser invivel,
pois exige a classificao de todos os sujeitos e objetos do mesmo em domnios e tipos.
Para atenuar esse problema, [Badger et al., 1995, Cowan et al., 2000] propem o uso de
tipagem implcita: todos os objetos que satisfazem um certo critrio (como por exemplo ter
como caminho /usr/local/*) so automaticamente classificados em um dado tipo. Da
mesma forma, os domnios podem ser definidos pelos nomes dos programas executveis
281
c Carlos Maziero
system_d
transies
*_t tipos
init
*_d domnios
pontos de entrada
login_d
accounting_d
engineer_d
sh
sh
login
edit
csh
rwxd
rwxd
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
unix_t
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
r-x
csh
rd
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
cad
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
budget_t
r-x
rxd
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
rwd
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
specs_t
8.5.5
c Carlos Maziero
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
professor
diretor
aluno
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
arquivos
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
outros
sujeitos
ou
sistemas
suporte
registros
usurios
ativaes
papis
permisses
objetos
8.5.6
283
c Carlos Maziero
Infra-estrutura bsica
A arquitetura bsica de uma infra-estrutura de controle de acesso tpica composta
pelos seguintes elementos (Figura 8.16):
Bases de sujeitos e objetos (User/Object Bases): relao dos sujeitos e objetos que compem o sistema, com seus respectivos atributos;
Base de polticas (Policy Base): base de dados contendo as regras que definem como e
quando os objetos podem ser acessados pelos sujeitos, ou como/quando os sujeitos
podem interagir entre si;
Monitor de referncias (Reference monitor): elemento que julga a pertinncia de cada
pedido de acesso. Com base em atributos do sujeito e do objeto (como suas
respectivas identidades), nas regras da base de polticas e possivelmente em
informaes externas (como horrio, carga do sistema, etc.), o monitor decide se
um acesso deve ser permitido ou negado;
Mediador (impositor ou Enforcer): elemento que medeia a interao entre sujeitos e
objetos; a cada pedido de acesso a um objeto, o mediador consulta o monitor de
referncias e permite/nega o acesso, conforme a deciso deste ltimo.
importante observar que os elementos dessa estrutura so componentes lgicos,
que no impem uma forma de implementao rgida. Por exemplo, em um sistema
operacional convencional, o sistema de arquivos possui sua prpria estrutura de
controle de acesso, com permisses de acesso armazenadas nos prprios arquivos, e um
pequeno monitor/mediador associado a algumas chamadas de sistema, como open e
mmap. Outros recursos (como reas de memria ou semforos) possuem suas prprias
regras e estruturas de controle de acesso, organizadas de forma diversa.
Controle de acesso em UNIX
Os sistemas operacionais do mundo UNIX implementam um sistema de ACLs bsico
bastante rudimentar, no qual existem apenas trs sujeitos: user (o dono do recurso),
group (um grupo de usurios ao qual o recurso est associado) e others (todos os demais
usurios do sistema). Para cada objeto existem trs possibilidades de acesso: read, write
e execute, cuja semntica depende do tipo de objeto (arquivo, diretrio, socket de rede,
rea de memria compartilhada, etc.). Dessa forma, so necessrios apenas 9 bits por
arquivo para definir suas permisses bsicas de acesso.
A Figura 8.17 apresenta uma listagem de diretrio tpica em UNIX. Nessa listagem,
o arquivo hello-unix.c pode ser acessado em leitura e escrita por seu proprietrio
(o usurio maziero, com permisses rw-), em leitura pelos usurios do grupo prof
(permisses r--) e em leitura pelos demais usurios do sistema (permisses r--). J o
arquivo hello-unix pode ser acessado em leitura, escrita e execuo por seu proprietrio
(permisses rwx), em leitura e execuo pelos usurios do grupo prof (permisses r-x)
e no pode ser acessado pelos demais usurios (permisses ---). No caso de diretrios,
a permisso de leitura autoriza a listagem do diretrio, a permisso de escrita autoriza
284
c Carlos Maziero
sujeitos
objetos
permite
acessos
mediador
aes
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
outros
sujeitos
ou
sistemas
nega
processos
threads
transaes
informaes externas
(horrio, etc)
base de
sujeitos
sujeito,
objeto,
ao
arquivos
deciso
monitor de
referncias
base de
polticas
eventos
para os registros
de auditoria
base de
objetos
c Carlos Maziero
tamanho em bytes
data/hora da ltima modificao
nome
286
c Carlos Maziero
1
2
host:~> ll
-rw-r--r-- 1 maziero prof 2450791 2009-06-18 10:47 main.pdf
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
287
c Carlos Maziero
Por outro lado, cada objeto do sistema est associado a um descritor de segurana (SD Security Descriptor). Como objetos, so considerados arquivos e diretrios, processos,
impressoras, servios e chaves de registros, por exemplo. Um descritor de segurana
indica o proprietrio e o grupo primrio do objeto, uma lista de controle de acesso de
sistema (SACL - System ACL), uma lista de controle de acesso discricionria (DACL Discretionary ACL) e algumas informaes de controle.
A DACL contm uma lista de regras de controle de acesso ao objeto, na forma
de ACEs (Access Control Entries). Cada ACE contm um identificador de usurio ou
grupo, um modo de autorizao (positiva ou negativa), um conjunto de permisses (ler,
escrever, executar, remover, etc.), sob a forma de um mapa de bits. Quando um sujeito
solicita acesso a um recurso, o SRM (Security Reference Monitor) compara o token de
acesso do sujeito com as entradas da DACL do objeto, para permitir ou negar o acesso.
Como sujeitos podem pertencer a mais de um grupo e as ACEs podem ser positivas ou
negativas, podem ocorrer conflitos entre as ACEs. Por isso, um mecanismo de resoluo
de conflitos acionado a cada acesso solicitado ao objeto.
A SACL define que tipo de operaes sobre o objeto devem ser registradas pelo
sistema, sendo usada basicamente para para fins de auditoria (Seo 8.6). A estrutura
das ACEs de auditoria similar das ACEs da DACL, embora defina quais aes sobre
o objeto em questo devem ser registradas para quais sujeitos. A Figura 8.18 ilustra
alguns dos componentes da estrutura de controle de acesso dos sistemas Windows.
usurio
recurso
sujeito
logon
Local
Security
Authority
Subsystem
processo
ou
thread
solicitao
de acesso
Security
Reference
Monitor
acesso
autorizado
AT
eventos
registros
de
auditoria
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
SD
eventos
access
token
Token ID
Owner SID
Group1 SID
Group2 SID
...
Flags
Privileges
...
registros
de
auditoria
security
descriptor
Revision number
Owner SID
Group SID
Flags
DACL
ACE
ACE
ACE
ACE
...
SACL
ACE
ACE
ACE
ACE
...
Outros mecanismos
As polticas de segurana bsicas utilizadas na maioria dos sistemas operacionais
so discricionrias, baseadas nas identidades dos usurios e em listas de controle de
288
c Carlos Maziero
c Carlos Maziero
8: Mudana de privilgios
8.5.7
Mudana de privilgios
290
c Carlos Maziero
8: Mudana de privilgios
O padro POSIX usou indevidamente o termo capacidade para definir o que na verdade so
privilgios associados aos processos. O uso indevido do termo POSIX Capabilities perdura at hoje em
vrios sistemas, como o caso do Linux.
291
c Carlos Maziero
processo pai
8: Mudana de privilgios
arquivo executvel
processo filho
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
Illenihild
ubitatquin
ullamscientiam
habet(Nadaduvi
daquemnadasabe
)Illenihildubi
tatquinullamsc
ientiamhabet(N
adaduvidaquemn
adasabe)Illeni
hildubitatquin
ullamscientiam
habet(Nadaduvi
c Carlos Maziero
8: Auditoria
Para cada processo so definidos trs conjuntos de privilgios: Permitidos (P), Efetivos
(E) e Herdveis (H). Os privilgios permitidos so aqueles que o processo pode ativar
quando desejar, enquanto os efetivos so aqueles ativados no momento (respeitando-se
E P). O conjunto de privilgios herdveis H usado no clculo dos privilgios
transmitidos aos processos filhos. Os privilgios POSIX tambm podem ser atribudos
a programas executveis em disco, substituindo os tradicionais (e perigosos) flags
setuid e setgid. Assim, quando um executvel for lanado, o novo processo recebe
um conjunto de privilgios calculado a partir dos privilgios atribudos ao arquivo
executvel e aqueles herdados do processo-pai que o criou [Bovet and Cesati, 2005].
Um caso especial de mudana de credenciais ocorre em algumas circunstncias,
quando necessrio reduzir as permisses de um processo. Por exemplo, o processo
responsvel pela autenticao de usurios em um sistema operacional deve criar novos
processos para iniciar a sesso de trabalho de cada usurio. O processo autenticador
geralmente executa com privilgios elevados, para poder acessar a bases de dados
de autenticao dos usurios, enquanto os novos processos devem receber as credenciais do usurio autenticado, que normalmente tem menos privilgios. Em UNIX,
um processo pode solicitar a mudana de suas credenciais atravs da chamada de
sistema setuid(), entre outras. Em Windows, o mecanismo conhecido como impersonation permite a um processo ou thread abandonar temporariamente seu token de
acesso e assumir outro, para realizar uma tarefa em nome do sujeito correspondente
[Russinovich and Solomon, 2004].
8.6
Auditoria
8.6.1
Coleta de dados
293
c Carlos Maziero
8: Coleta de dados
pginas no encontradas, erros de autenticao, pedidos de operaes no suportadas, etc. Normalmente esses eventos so registrados pela prpria aplicao,
muitas vezes usando formatos prprios para os dados.
Sub-sistema : eventos no especficos a uma aplicao, mas que ocorrem no espao
de usurio do sistema operacional. Exemplos desses eventos so a autenticao
de usurios (ou erros de autenticao), lanamento ou encerramento de servios
do sistema, atualizaes de softwares ou de bibliotecas, criao ou remoo de
usurios, etc. O registro desses eventos normalmente fica a cargo dos processos
ou bibliotecas responsveis pelos respectivos sub-sistemas.
Ncleo : eventos que ocorrem dentro do ncleo do sistema, sendo inacessveis aos
processos. o caso dos eventos envolvendo o hardware, como a deteco de
erros ou mudana de configuraes, e de outros eventos internos do ncleo,
como a criao de sockets de rede, semforos, rea de memria compartilhada,
reinicializao do sistema, etc.
Um aspecto importante da coleta de dados para auditoria sua forma de representao. A abordagem mais antiga e comum, amplamente disseminada, o uso de
arquivos de registro (logfiles). Um arquivo de registro contm uma sequncia cronolgica
de descries textuais de eventos associados a uma fonte de dados, geralmente uma
linha por evento. Um exemplo clssico dessa abordagem so os arquivos de registro
do sistema UNIX; a listagem a seguir apresenta um trecho do contedo do arquivo
/var/log/security, geralmente usado para reportar eventos associados autenticao
de usurios:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
...
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
...
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
23:02:09
23:19:57
23:34:14
23:57:16
00:08:16
00:35:24
00:42:19
00:49:06
00:53:40
00:53:55
01:08:43
01:12:41
01:12:41
01:12:41
01:38:26
02:18:29
02:18:29
02:18:29
09:06:33
06:06:34
06:06:34
06:06:57
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
espec
Processo que executa em segundo plano, sem estar associado a uma interface com o usurio, como
um terminal ou janela.
294
c Carlos Maziero
8: Coleta de dados
e um socket UDP para receber mensagens descrevendo eventos, geradas pelos demais
sub-sistemas e aplicaes atravs de uma biblioteca especfica. Os eventos so descritos
por mensagens de texto e so rotulados por suas fontes em servios (AUTH, KERN, MAIL, etc.)
e nveis (INFO, WARNING, ALERT, etc.). A partir de seu arquivo de configurao, o processo
syslogd registra a data de cada evento recebido e decide seu destino: armazenar em
um arquivo, enviar a um terminal, avisar o administrador, ativar um programa externo
ou enviar o evento a um daemon em outro computador so as principais possibilidades.
A Figura 8.20 apresenta os principais componentes dessa arquitetura.
terminal
servio
de e-mail
servio
SSH
servio de
autenticao
syslogd
rede
eventos
kernel
logger
servio de
impresso
eventos do
ncleo
ncleo
root:~>
syslog: system reboot
syslog:
shutdown now
terminal
logfiles
Illenihild
ubitatquin
Illenihild
ullamscientiam
ubitatquin
habet(Nadaduvi
Illenihild
ullamscientiam
daquemnadasabe
ubitatquin
habet(Nadaduvi
)Illenihildubi
ullamscientiam
daquemnadasabe
tatquinullamsc
habet(Nadaduvi
)Illenihildubi
ientiamhabet(N
daquemnadasabe
tatquinullamsc
adaduvidaquemn
)Illenihildubi
ientiamhabet(N
adasabe)Illeni
tatquinullamsc
adaduvidaquemn
hildubitatquin
ientiamhabet(N
adasabe)Illeni
ullamscientiam
adaduvidaquemn
hildubitatquin
habet(Nadaduvi
adasabe)Illeni
ullamscientiam
hildubitatquin
habet(Nadaduvi
ullamscientiam
habet(Nadaduvi
syslogd
c Carlos Maziero
8: Anlise de dados
8.6.2
Anlise de dados
c Carlos Maziero
8: Auditoria preventiva
8.6.3
Auditoria preventiva
c Carlos Maziero
8: Auditoria preventiva
298
Captulo 9
Virtualizao de sistemas
As tecnologias de virtualizao do ambiente de execuo de aplicaes ou de
plataformas de hardware tm sido objeto da ateno crescente de pesquisadores,
fabricantes de hardware/software, administradores de sistemas e usurios avanados. Os recentes avanos nessa rea permitem usar mquinas virtuais com os
mais diversos objetivos, como a segurana, a compatibilidade de aplicaes legadas
ou a consolidao de servidores. Este captulo apresenta os principais conceitos,
arquiteturas e implementaes de ambientes virtuais de execuo, como mquinas
virtuais, emuladores e contineres.
9.1
Conceitos bsicos
9.1.1
Um breve histrico
c Carlos Maziero
9: Interfaces de sistema
9.1.2
Interfaces de sistema
Uma mquina real formada por vrios componentes fsicos que fornecem operaes
para o sistema operacional e suas aplicaes. Iniciando pelo ncleo do sistema real, o
processador central (CPU) e o chipset da placa-me fornecem um conjunto de instrues
e outros elementos fundamentais para o processamento de dados, alocao de memria
e processamento de entrada/sada. Os sistemas de computadores so projetados com
basicamente trs componentes: hardware, sistema operacional e aplicaes. O papel
do hardware executar as operaes solicitadas pelas aplicaes atravs do sistema
operacional. O sistema operacional recebe as solicitaes das operaes (por meio das
chamadas de sistema) e controla o acesso ao hardware principalmente nos casos em
que os componentes so compartilhados, como o sistema de memria e os dispositivos
de entrada/sada.
Os sistemas de computao convencionais so caracterizados por nveis de abstrao
crescentes e interfaces bem definidas entre eles. As abstraes oferecidas pelo sistema
s aplicaes so construdas de forma incremental, em nveis separados por interfaces
bem definidas e relativamente padronizadas. Cada interface encapsula as abstraes
dos nveis inferiores, permitindo assim o desenvolvimento independente dos vrios
nveis, o que simplifica a construo e evoluo dos sistemas. As interfaces existentes
entre os componentes de um sistema de computao tpico so:
Conjunto de instrues (ISA Instruction Set Architecture): a interface bsica entre o
hardware e o software, sendo constituda pelas instrues em cdigo de mquina
aceitas pelo processador e todas as operaes de acesso aos recursos do hardware
300
c Carlos Maziero
chamadas de biblioteca
chamadas de sistema
bibliotecas
system ISA
ncleo do SO
user ISA
hardware
9.1.3
Para que programas e bibliotecas possam executar sobre uma determinada plataforma, necessrio que tenham sido compilados para ela, respeitando o conjunto de
instrues do processador em modo usurio (User ISA) e o conjunto de chamadas de
sistema oferecido pelo sistema operacional. A viso conjunta dessas duas interfaces
(User ISA + syscalls) denominada Interface Binria de Aplicao (ABI Application Binary
301
c Carlos Maziero
aplicaes de usurio
bibliotecas
bibliotecas
ABI
ncleo do SO
ncleo do SO
ISA
hardware
hardware
Figura 9.2: Interfaces de sistema ISA e ABI [Smith and Nair, 2004].
Nos sistemas computacionais de mercado atuais, as interfaces de baixo nvel ISA e
ABI so normalmente fixas, ou pouco flexveis. Geralmente no possvel criar novas
instrues de processador ou novas chamadas de sistema operacional, ou mesmo mudar
sua semntica para atender s necessidades especficas de uma determinada aplicao.
Mesmo se isso fosse possvel, teria de ser feito com cautela, para no comprometer o
funcionamento de outras aplicaes.
Os sistemas operacionais, assim como as aplicaes, so projetados para aproveitar o
mximo dos recursos que o hardware fornece. Normalmente os projetistas de hardware,
sistema operacional e aplicaes trabalham de forma independente (em empresas e
tempos diferentes). Por isso, esses trabalhos independentes geraram, ao longo dos anos,
vrias plataformas computacionais diferentes e incompatveis entre si.
Observa-se ento que, embora a definio de interfaces seja til, por facilitar o
desenvolvimento independente dos vrios componentes do sistema, torna pouco
flexveis as interaes entre eles: um sistema operacional s funciona sobre o hardware
(ISA) para o qual foi construdo, uma biblioteca s funciona sobre a ABI para a qual foi
projetada e uma aplicao tem de obedecer a ABIs/APIs pr-definidas. A Figura 9.3,
extrada de [Smith and Nair, 2004], ilustra esses problemas de compatibilidade entre
interfaces.
A baixa flexibilidade na interao entre as interfaces dos componentes de um sistema
computacional traz vrios problemas [Smith and Nair, 2004]:
Baixa portabilidade: a mobilidade de cdigo e sua interoperabilidade so requisitos
importantes dos sistemas atuais, que apresentam grande conectividade de rede e
diversidade de plataformas. A rigidez das interfaces de sistema atuais dificulta sua
construo, por acoplar excessivamente as aplicaes aos sistemas operacionais e
aos componentes do hardware.
Barreiras de inovao: a presena de interfaces rgidas dificulta a construo de
novas formas de interao entre as aplicaes e os dispositivos de hardware (e com
os usurios, por consequncia). Alm disso, as interfaces apresentam uma grande
inrcia evoluo, por conta da necessidade de suporte s aplicaes j existentes.
302
c Carlos Maziero
9: Virtualizao de interfaces
Aplics Solaris
Aplics Windows
Aplics Linux
Solaris
Windows
Linux
Sparc
x86
Aplics Windows
Windows
x86
Aplics Windows
Problemas!
Linux
Sparc
x86
Figura 9.3: Problemas de compatibilidade entre interfaces [Smith and Nair, 2004].
Otimizaes inter-componentes: aplicaes, bibliotecas, sistemas operacionais e
hardware so desenvolvidos por grupos distintos, geralmente com pouca interao
entre eles. A presena de interfaces rgidas a respeitar entre os componentes leva
cada grupo a trabalhar de forma isolada, o que diminui a possibilidade de
otimizaes que envolvam mais de um componente.
Essas dificuldades levaram investigao de outras formas de relacionamento entre
os componentes de um sistema computacional. Uma das abordagens mais promissoras
nesse sentido o uso da virtualizao, que ser apresentada na prxima seo.
9.1.4
Virtualizao de interfaces
c Carlos Maziero
9: Virtualizao de interfaces
dos componentes de sistema que faro uso dela. A nova interface de sistema, vista
atravs dessa camada de virtualizao, denominada mquina virtual. A camada de
virtualizao em si denominada hipervisor ou monitor de mquina virtual.
A Figura 9.4, extrada de [Smith and Nair, 2004], apresenta um exemplo de mquina
virtual, onde um hipervisor permite executar um sistema operacional Windows e suas
aplicaes sobre uma plataforma de hardware Sparc, distinta daquela para a qual esse
sistema operacional foi projetado (Intel/AMD).
sistema
convidado
monitor
sistema
hospedeiro
Aplics Windows
Aplics Windows
Windows
Windows
camada de
virtualizao
Sparc
x86
Mquina
Virtual
304
c Carlos Maziero
Aplicaes
Aplicaes
Aplics
hipervisor
OS 1
Aplics
OS 2
SO
hipervisor
hv
SO
Sparc 1
hardware
hardware 2
hardware 2
emulao
de hardware
emulao do SO
otimizao dinmica
hipervisor
hardware 2
replicao
de hardware
9.1.5
Embora a virtualizao possa ser vista como um tipo de abstrao, existe uma
clara diferena entre os termos abstrao e virtualizao, no contexto de sistemas
operacionais [Smith and Nair, 2004]. Um dos principais objetivos dos sistemas operacionais oferecer uma viso de alto nvel dos recursos de hardware, que seja mais
simples de usar e menos dependente das tecnologias subjacentes. Essa viso abstrata
dos recursos construda de forma incremental, em nveis de abstrao crescentes.
Exemplos tpicos dessa estruturao em nveis de abstrao so os subsistemas de
rede e de disco em um sistema operacional convencional. No sub-sistema de arquivos,
cada nvel de abstrao trata de um problema: interao com o dispositivo fsico de
armazenamento, escalonamento de acessos ao dispositivo, gerncia de buffers e caches,
alocao de arquivos, diretrios, controle de acesso, etc. A Figura 9.6 apresenta os nveis
de abstrao de um subsistema de gerncia de disco tpico.
Por outro lado, a virtualizao consiste em criar novas interfaces a partir das interfaces
existentes. Na virtualizao, os detalhes de baixo nvel da plataforma real no so
necessariamente ocultos, como ocorre na abstrao de recursos. A Figura 9.7 ilustra essa
diferena: atravs da virtualizao, um processador Sparc pode ser visto pelo sistema
convidado como um processador Intel. Da mesma forma, um disco real no padro
SATA pode ser visto como vrios discos menores independentes, com a mesma interface
(SATA) ou outra interface (IDE).
A Figura 9.8 ilustra outro exemplo dessa diferena no contexto do armazenamento em
disco. A abstrao prov s aplicaes o conceito de arquivo, sobre o qual estas podem
executar operaes simples como read ou write, por exemplo. J a virtualizao fornece
para a camada superior apenas um disco virtual, construdo a partir de um arquivo
do sistema operacional real subjacente. Esse disco virtual ter de ser particionado e
formatado para seu uso, da mesma forma que um disco real.
305
c Carlos Maziero
aplicao
open
write
close
read
abstrao
de arquivo
estratgias de
alocao de arquivos
buering, caching,
escalonamento de disco
Operaes de E/S
tratamento de interrupes
Controle de E/S
dispositivos fsicos
e controladores
i386
camada de virtualizao
disco''
camada de virtualizao
dispositivos
reais
sparc
disco'
disco real
SO convid
SO convid
arquivos
discos
virtuais
Sist Operacional
Hipervisor
disco
disco real
c Carlos Maziero
9.2
9.2.1
Definio formal
Em 1974, os pesquisadores americanos Gerald Popek (UCLA) e Robert Goldberg (Harvard) definiram uma mquina virtual da seguinte forma [Popek and Goldberg, 1974]:
Uma mquina virtual vista como uma duplicata eficiente e isolada de uma mquina
real. Essa abstrao construda por um monitor de mquina virtual (VMM Virtual Machine Monitor).
O hipervisor ou monitor de mquina virtual descrito por Popek/Goldberg corresponde camada de virtualizao apresentada na Seo 9.1.4. Para funcionar de forma
correta e eficiente, o hipervisor deve atender a alguns requisitos bsicos: ele deve prover
um ambiente de execuo aos programas essencialmente idntico ao da mquina real,
do ponto de vista lgico. Programas executando sobre uma mquina virtual devem
apresentar, no pior caso, leves degradaes de desempenho. Alm disso, o hipervisor
deve ter controle completo sobre os recursos do sistema real (o sistema hospedeiro). A
partir desses requisitos, foram estabelecidas as seguintes propriedades a serem satisfeitas
por um hipervisor ideal:
Equivalncia : um hipervisor prov um ambiente de execuo quase idntico ao da
mquina real original. Todo programa executando em uma mquina virtual deve
se comportar da mesma forma que o faria em uma mquina real; excees podem
resultar somente de diferenas nos recursos disponveis (memria, disco, etc.),
dependncias de temporizao e a existncia dos dispositivos de entrada/sada
necessrios aplicao.
Controle de recursos : o hipervisor deve possuir o controle completo dos recursos da
mquina real: nenhum programa executando na mquina virtual deve possuir
acesso a recursos que no tenham sido explicitamente alocados a ele pelo hipervisor,
que deve intermediar todos os acessos. Alm disso, a qualquer instante o hipervisor
pode retirar recursos previamente alocados mquina virtual.
307
c Carlos Maziero
9: Definio formal
c Carlos Maziero
9: Suporte de hardware
De acordo com esse teorema, toda instruo sensvel deve ser tambm privilegiada.
Assim, quando uma instruo sensvel for executada por um programa no-privilegiado
(um ncleo convidado ou uma aplicao convidada), provocar a ocorrncia de uma
interrupo. Essa interrupo pode ser usada para ativar uma rotina de interpretao
dentro do hipervisor, que ir simular o efeito da instruo sensvel (ou seja, interpretla), de acordo com o contexto onde sua execuo foi solicitada (mquina virtual ou
hipervisor). Obviamente, quanto maior o nmero de instrues sensveis, maior o
volume de interpretao de cdigo a realizar, e menor o desempenho da mquina
virtual.
No caso de processadores que no atendam as restries de Popek/Goldberg, podem
existir instrues sensveis que executem sem gerar interrupes, o que impede o
hipervisor de intercept-las e interpret-las. Uma soluo possvel para esse problema
a traduo dinmica das instrues sensveis presentes nos programas de usurio: ao
carregar um programa na memria, o hipervisor analisa seu cdigo e substitui essas
instrues sensveis por chamadas a rotinas que as interpretam dentro do hipervisor.
Isso implica em um tempo maior para o lanamento de programas, mas torna possvel
a virtualizao. Outra tcnica possvel para resolver o problema a para-virtualizao,
que se baseia em reescrever parte do sistema convidado para no usar essas instrues
sensveis. Ambas as tcnicas so discutidas a seguir.
9.2.2
Suporte de hardware
309
c Carlos Maziero
9: Suporte de hardware
virtualizao com
modelo 0/1/3
virtualizao com
modelo 0/2/3
aplicaes
aplicaes
3 aplicaes
no usado
no usado
2 ncleo convidado
no usado
ncleo convidado
no usado
ncleo do SO
hipervisor
hipervisor
310
c Carlos Maziero
9: Suporte de hardware
rea VMCS
l e salva
o estado do
processador
aplicaes
aplicaes
2 no usado
3 aplicaes
2 no usado
1 no usado
2 no usado
1 no usado
0 ncleo convidado
1 no usado
0 ncleo convidado
3
no usado
no usado
no usado
hipervisor
VM entry
VM exit
ncleo convidado
modo non-root
modo root
c Carlos Maziero
9.2.3
9: Formas de virtualizao
Formas de virtualizao
c Carlos Maziero
9.3
c Carlos Maziero
Aplics Solaris
Espao de
usurio
Espao de
usurio
Aplic
Java
Aplics Linux
Espao de
usurio
Aplics Linux
JVM
Aplics Windows
Aplics Linux
ncleo Linux ncleo Windows
ncleo Solaris
ncleo Linux
hipervisor
hardware Sparc
hardware x86
hardware x86
VM de processo
VM de sistema
operacional
VM de sistema
(hardware)
9.3.1
c Carlos Maziero
c Carlos Maziero
Wine
Chamadas de
sistema UNIX
Linux
Instrues Intel
PC Intel
316
c Carlos Maziero
9.3.2
317
c Carlos Maziero
domain 1
domain 2
domain 3
host OS kernel
hardware
Figura 9.13: Mquinas virtuais de sistema operacional.
H vrias implementaes disponveis de mecanismos para a criao de domnios
virtuais. A tcnica mais antiga implementada pela chamada de sistema chroot,
disponvel na maioria dos sistemas UNIX. Essa chamada de sistema atua exclusivamente
sobre o acesso de um processo ao sistema de arquivos: o processo que a executa tem seu
acesso ao sistema de arquivos restrito a uma sub-rvore da hierarquia de diretrios, ou
seja, ele fica confinado a essa sub-rvore. Os filhos desse processo herdam a mesma
viso do sistema de arquivos, que no pode ser revertida. Por exemplo, um processo que
executa a chamada chroot ("/var/spool/postfix") passa a ver somente a hierarquia
de diretrios a partir do diretrio /var/spool/postfix, que passa a ser seu diretrio
raiz. A Figura 9.14 ilustra essa operao.
/
postx
etc
lib
var
etc
lib
var
c Carlos Maziero
9.3.3
Uma mquina virtual de sistema (ou de hardware) prov uma interface de hardware
completa para um ou mais sistemas operacionais convidados, com suas respectivas
aplicaes, que executam de forma isolada e independente. Cada sistema operacional
convidado tem a iluso de executar sozinho sobre uma plataforma de hardware exclusiva.
O hipervisor de sistema fornece aos sistemas operacionais convidados uma interface de
sistema ISA virtual, que pode ser idntica ao hardware real, ou distinta. Alm disso, ele
virtualiza o acesso aos recursos, para que cada sistema operacional convidado tenha um
conjunto de recursos virtuais prprio, construdo a partir dos recursos fsicos existentes
319
c Carlos Maziero
na mquina real. Assim, cada mquina virtual ter sua prpria interface de rede, seu
prprio disco, sua prpria memria RAM, etc.
Em um ambiente virtual, os sistemas operacionais convidados so fortemente
isolados uns dos outros, e normalmente s podem interagir atravs dos mecanismos
de rede, como se estivessem em computadores separados. Todavia, alguns sistemas
de mquinas virtuais permitem o compartilhamento controlado de certos recursos.
Por exemplo, os sistemas VMware Workstation e VirtualBox permitem a definio de
diretrios compartilhados no sistema de arquivos real, que podem ser acessados pelas
mquinas virtuais.
As mquinas virtuais de sistema constituem a primeira abordagem usada para a
construo de hipervisores, desenvolvida na dcada de 1960 e formalizada por Popek
e Goldberg (conforme apresentado na Seo 9.2.1). Naquela poca, a tendncia de
desenvolvimento de sistemas computacionais buscava fornecer a cada usurio uma
mquina virtual com seus recursos virtuais prprios, sobre a qual o usurio executava
um sistema operacional mono-tarefa e suas aplicaes. Assim, o compartilhamento de
recursos no era responsabilidade do sistema operacional convidado, mas do hipervisor
subjacente. No entanto, ao longo dos anos 70, como o desenvolvimento de sistemas
operacionais multi-tarefas eficientes e robustos como MULTICS e UNIX, as mquinas
virtuais de sistema perderam gradativamente seu interesse. Somente no final dos
anos 90, com o aumento do poder de processamento dos micro-processadores e o
surgimento de novas possibilidades de aplicao, as mquinas virtuais de sistema foram
redescobertas.
Existem basicamente duas arquiteturas de hipervisores de sistema, apresentados na
Figura 9.15:
Hipervisores nativos (ou de tipo I): nesta categoria, o hipervisor executa diretamente
sobre o hardware do computador real, sem um sistema operacional subjacente.
A funo do hipervisor virtualizar os recursos do hardware (memria, discos,
interfaces de rede, etc.) de forma que cada mquina virtual veja um conjunto de
recursos prprio e independente. Assim, cada mquina virtual se comporta como
um computador completo que pode executar o seu prprio sistema operacional.
Esta a forma mais antiga de virtualizao, encontrada nos sistemas computacionais de grande porte dos anos 1960-70. Alguns exemplos de sistemas que
empregam esta abordagem so o IBM OS/370, o VMware ESX Server e o ambiente
Xen.
Hipervisores convidados (ou de tipo II): nesta categoria, o hipervisor executa como um
processo normal sobre um sistema operacional nativo subjacente. O hipervisor
utiliza os recursos oferecidos pelo sistema operacional nativo para oferecer recursos
virtuais ao sistema operacional convidado que executa sobre ele. Normalmente,
um hipervisor convidado suporta apenas uma mquina virtual com uma instncia
de sistema operacional convidado. Caso mais mquinas sejam necessrias, mais
hipervisores devem ser lanados, como processos separados. Exemplos de sistemas
que adotam esta estrutura incluem o VMware Workstation, o QEMU e o VirtualBox.
Pode-se afirmar que os hipervisores convidados so mais flexveis que os hipervisores
nativos, pois podem ser facilmente instalados/removidos em mquinas com sistemas
320
c Carlos Maziero
9: Tcnicas de virtualizao
aplics
OS 1
aplics
aplics
aplics
guest OS
OS 2
host OS
hipervisor
hipervisor
hardware
hardware
hipervisor nativo
hipervisor convidado
9.4
Tcnicas de virtualizao
9.4.1
Emulao completa
321
c Carlos Maziero
SO
convidado
rea de
memria
separada
hipervisor
tradutor
cache
hardware
ISA de
alto nvel
ISA de
baixo nvel
9.4.2
322
c Carlos Maziero
9: Traduo dinmica
9.4.3
Traduo dinmica
c Carlos Maziero
9: Paravirtualizao
9.4.4
Paravirtualizao
A Seo 9.2.2 mostrou que as arquiteturas de alguns processadores, como o Intel x86,
podem ser difceis de virtualizar, porque algumas instrues sensveis no podem ser
interceptadas pelo hipervisor. Essas instrues sensveis devem ser ento detectadas e
interpretadas pelo hipervisor, em tempo de carga do cdigo na memria.
Alm das instrues sensveis em si, outros aspectos da interface software/hardware
trazem dificuldades ao desenvolvimento de mquinas virtuais de sistema eficientes.
Uma dessas reas o mecanismo de entrega e tratamento de interrupes pelo processador, baseado na noo de um vetor de interrupes, que contm uma funo registrada
para cada tipo de interrupo a tratar. Outra rea da interface software/hardware que
pode trazer dificuldades a gerncia de memria, pois o TLB (Translation Lookaside
Buffer, Seo 5.3.4) dos processadores x86 gerenciado diretamente pelo hardware, sem
possibilidade de interveno direta do hipervisor no caso de uma falta de pgina.
Em meados dos anos 2000, alguns pesquisadores investigaram a possibilidade
de modificar a interface entre o hipervisor e os sistemas operacionais convidados,
oferecendo a estes um hardware virtual que similar, mas no idntico ao hardware real.
Essa abordagem, denominada paravirtualizao, permite um melhor acoplamento entre
os sistemas convidados e o hipervisor, o que leva a um desempenho significativamente
melhor das mquinas virtuais. As modificaes na interface de sistema do hardware
virtual (system ISA) exigem uma adaptao dos sistemas operacionais convidados, para
que estes possam executar sobre a plataforma virtual. Em particular, o hipervisor define
uma API denominada chamadas de hipervisor (hypercalls), que cada sistema convidado
deve usar para acessar a interface de sistema do hardware virtual. Todavia, a interface de
usurio (user ISA) do hardware preservada, permitindo que as aplicaes convidadas
executem sem necessidade de modificaes. A Figura 9.17 ilustra esse conceito.
aplicaes
aplicaes
Sistema
operacional
modicado
Sistema
operacional
standard
hypercalls
hipervisor
hipervisor
hardware
hardware
hardware
virtualizao
clssica
paravirtualizao
324
c Carlos Maziero
9: Aspectos de desempenho
9.4.5
Aspectos de desempenho
325
c Carlos Maziero
9: Aspectos de desempenho
aplics
OS 1
aplics
aplics
aplics
guest OS
OS 2
1
monitor
host OS
monitor
hardware
hardware
monitor convidado
(tipo II)
monitor nativo
(tipo I)
326
c Carlos Maziero
9: Aplicaes da virtualizao
VM nativa
arquivos no
SO convidado
SO convidado
VM convidada
VM hbrida
arquivos no
SO convidado
arquivos no
SO convidado
SO convidado
SO convidado
disco virtual
disco virtual
disco virtual
Hipervisor
Hipervisor
Hipervisor
arquivo no
SO hospedeiro
driver
SO hospedeiro
disco real
disco real
SO hospedeiro
disco real
9.5
Aplicaes da virtualizao
c Carlos Maziero
9: Aplicaes da virtualizao
328
c Carlos Maziero
9.6
9.6.1
VMware
c Carlos Maziero
9: FreeBSD Jails
9.6.2
FreeBSD Jails
c Carlos Maziero
9: Xen
(arquivos, conexes de rede) que pode ser gerenciado de forma autnoma, como se
fosse um sistema separado [McKusick and Neville-Neil, 2005].
Cada domnio criado a partir de um diretrio previamente preparado no sistema
de arquivos. Um processo que executa a chamada de sistema jail cria uma nova cela e
colocado dentro dela, de onde no pode mais sair, nem seus filhos. Alm disso, os
processos em um domnio no podem:
Reconfigurar o ncleo (atravs da chamada sysctl, por exemplo);
Carregar/retirar mdulos do ncleo;
Mudar configuraes de rede (interfaces e rotas);
Montar/desmontar sistemas de arquivos;
Criar novos devices;
Realizar modificaes de configuraes do ncleo em tempo de execuo;
Acessar recursos que no pertenam ao seu prprio domnio.
Essas restries se aplicam mesmo a processos que estejam executando com privilgios de administrador (root).
Pode-se considerar que o sistema FreeBSD Jails virtualiza somente partes do sistema
hospedeiro, como a rvore de diretrios (cada domnio tem sua prpria viso do sistema
de arquivos), espaos de nomes (cada domnio mantm seus prprios identificadores
de usurios, processos e recursos de IPC) e interfaces de rede (cada domnio tem sua
interface virtual, com endereo de rede prprio). Os demais recursos (como as instrues
de mquina e chamadas de sistema) so preservadas, ou melhor, podem ser usadas
diretamente. Essa virtualizao parcial demanda um custo computacional muito baixo,
mas exige que todos os sistemas convidados executem sobre o mesmo ncleo.
9.6.3
Xen
c Carlos Maziero
9: Xen
VM 1
VM n
aplics de
gerncia
aplicaes
convidadas
aplicaes
convidadas
...
Linux convidado
driver
nativo
driver
back-end
SO convidado
SO convidado
driver
front-end
driver
front-end
Hipervisor Xen
hardware x86
332
c Carlos Maziero
9.6.4
9: User-Mode Linux
User-Mode Linux
O User-Mode Linux foi proposto por Jeff Dike em 2000, como uma alternativa de
uso de mquinas virtuais no ambiente Linux [Dike, 2000]. O ncleo do Linux foi
portado de forma a poder executar sobre si mesmo, como um processo do prprio
Linux. O resultado um user space separado e isolado na forma de uma mquina
virtual, que utiliza dispositivos de hardware virtualizados a partir dos servios providos
pelo sistema hospedeiro. Essa mquina virtual capaz de executar todos os servios e
aplicaes disponveis para o sistema hospedeiro. Alm disso, o custo de processamento
e de memria das mquinas virtuais User-Mode Linux geralmente menor que aquele
imposto por outros hipervisores mais complexos.
O User-Mode Linux hipervisor convidado, ou seja, executa na forma de um processo
no sistema hospedeiro. Os processos em execuo na mquina virtual no tm acesso
direto aos recursos do sistema hospedeiro. A maior dificuldade na implementao do
User-Mode Linux foi encontrar formas de virtualizar as funcionalidades do hardware
para as chamadas de sistema do Linux, sobretudo a distino entre o modo privilegiado
do ncleo e o modo no-privilegiado de usurio. Um cdigo somente pode estar em
modo privilegiado se confivel o suficiente para ter pleno acesso ao hardware, como o
prprio ncleo do sistema operacional. O User-Mode Linux deve possuir uma distino
de privilgios equivalente para permitir que o seu ncleo tenha acesso s chamadas
de sistema do sistema hospedeiro quando os seus prprios processos solicitarem este
acesso, ao mesmo tempo em que impede os mesmos de acessar diretamente os recursos
reais subjacentes.
No hipervisor, a distino de privilgios foi implementada com o mecanismo
de interceptao de chamadas do prprio Linux, fornecido pela chamada de sistema
ptrace1 . Usando a chamada ptrace, o hipervisor recebe o controle de todas as chamadas
de sistema de entrada/sada geradas pelas mquinas virtuais. Todos os sinais gerados ou
enviados s mquinas virtuais tambm so interceptados. A chamada ptrace tambm
utilizada para manipular o contexto do sistema convidado.
O User-Mode Linux utiliza o sistema hospedeiro para operaes de entrada/sada.
Como a mquina virtual um processo no sistema hospedeiro, a troca de contexto entre
duas instncias de mquinas virtuais rpida, assim como a troca entre dois processos do
sistema hospedeiro. Entretanto, modificaes no sistema convidado foram necessrias
para a otimizao da troca de contexto. A virtualizao das chamadas de sistema
implementada pelo uso de uma thread de rastreamento que intercepta e redireciona todas
as chamadas de sistema para o ncleo virtual. Este identifica a chamada de sistema e os
seus argumentos, cancela a chamada e modifica estas informaes no hospedeiro, onde
o processo troca de contexto e executa a chamada na pilha do ncleo.
O User-Mode Linux est disponvel na verso 2.6 do ncleo Linux, ou seja, ele foi
assimilado rvore oficial de desenvolvimento do ncleo, portanto melhorias na sua
arquitetura devero surgir no futuro, ampliando seu uso em diversos contextos de
aplicao.
1
Chamada de sistema que permite observar e controlar a execuo de outros processos; o comando
strace do Linux permite ter uma noo de como a chamada de sistema ptrace funciona.
333
c Carlos Maziero
9.6.5
9: QEMU
QEMU
9.6.6
Valgrind
c Carlos Maziero
9: JVM
9.6.7
JVM
comum a implementao do suporte de execuo de uma linguagem de programao usando uma mquina virtual. Um bom exemplo dessa abordagem ocorre na
linguagem Java. Tendo sido originalmente concebida para o desenvolvimento de pequenos aplicativos e programas de controle de aparelhos eletroeletrnicos, a linguagem
Java mostrou-se ideal para ser usada na Internet. O que o torna to atraente o fato
de programas escritos em Java poderem ser executados em praticamente qualquer
plataforma. A virtualizao o fator responsvel pela independncia dos programas
Java do hardware e dos sistemas operacionais: um programa escrito em Java, ao ser
compilado, gera um cdigo binrio especfico para uma mquina abstrata denominada
mquina virtual Java (JVM - Java Virtual Machine). A linguagem de mquina executada
pela mquina virtual Java denominada bytecode Java, e no corresponde a instrues de
nenhum processador real. A mquina virtual deve ento interpretar todas as operaes
do bytecode, utilizando as instrues da mquina real subjacente para execut-las.
A vantagem mais significativa da abordagem adotada por Java a portabilidade do
cdigo executvel: para que uma aplicao Java possa executar sobre uma determinada
plataforma, basta que a mquina virtual Java esteja disponvel ali (na forma de um
suporte de execuo denominado JRE - Java Runtime Environment). Assim, a portabilidade
dos programas Java depende unicamente da portabilidade da prpria mquina virtual
Java. O suporte de execuo Java pode estar associado a um navegador Web, o que
permite que cdigo Java seja associado a pginas Web, na forma de pequenas aplicaes
denominadas applets, que so trazidas junto com os demais componentes de pgina Web
e executam localmente no navegador. A Figura 9.21 mostra os principais componentes
da plataforma Java.
Cdigo
fonte
Java
.java
aplicao
em
bytecode
compilao
aplicao
em
bytecode
JVM
JVM
carga
Windows
x86
carga
.jar
distribuio
bytecode
distribuio
Solaris
Sparc
c Carlos Maziero
9: JVM
336
Referncias Bibliogrficas
[Amoroso, 1994] Amoroso, E. (1994). Fundamentals of Computer Security Technology.
Prentice Hall PTR.
[Anderson et al., 2002] Anderson, D., Cobb, J., Korpela, E., Lebofsky, M., and Werthimer,
D. (2002). SETI@home: An experiment in public-resource computing. Communications
of the ACM, 45(11):5661.
[Anderson et al., 1992] Anderson, T., Bershad, B., Lazowska, E., and Levy, H. (1992).
Scheduler activations: effective kernel support for the user-level management of
parallelism. ACM Transactions on Computer Systems, 10(1):5379.
[Arpaci-Dusseau et al., 2003] Arpaci-Dusseau, A., Arpaci-Dusseau, R., Burnett, N.,
Denehy, T., Engle, T., Gunawi, H., Nugent, J., and Popovici, F. (2003). Transforming
policies into mechanisms with InfoKernel. In 19th ACM Symposium on Operating
Systems Principles.
[Avizienis et al., 2004] Avizienis, A., Laprie, J.-C., Randell, B., and Landwehr, C. (2004).
Basic Concepts and Taxonomy of Dependable and Secure Computing. IEEE Transactions on Dependable and Secure Computing, 1(1).
[Bach, 1986] Bach, M. J. (1986). The design of the UNIX operating System. Prentice-Hall.
[Badger et al., 1995] Badger, L., Sterne, D., Sherman, D., Walker, K., and Haghighat, S.
(1995). Practical Domain and Type Enforcement for UNIX. In IEEE Symposium on
Security and Privacy, pages 6677.
[Bansal and Modha, 2004] Bansal, S. and Modha, D. (2004). CAR: Clock with adaptive
replacement. In USENIX Conference on File and Storage Technologies.
[Barham et al., 2003] Barham, P., Dragovic, B., Fraser, K., Hand, S., Harris, T., Ho, A.,
Neugebauer, R., Pratt, I., and Warfield, A. (2003). Xen and the art of virtualization. In
ACM Symposium on Operating Systems Principles, pages 164177.
[Barney, 2005] Barney,
B.
(2005).
POSIX
http://www.llnl.gov/computing/tutorials/pthreads.
threads
programming.
[Bell and LaPadula, 1974] Bell, D. E. and LaPadula, L. J. (1974). Secure computer
systems. mathematical foundations and model. Technical Report M74-244, MITRE
Corporation.
337
c Carlos Maziero
9: REFERNCIAS BIBLIOGRFICAS
[Bellard, 2005] Bellard, F. (2005). QEMU, a fast and portable dynamic translator. In
USENIX Annual Technical Conference.
[Ben-Ari, 1990] Ben-Ari, M. (1990). Principles of Concurrent and Distributed Programming.
Prentice-Hall.
[Biba, 1977] Biba, K. (1977). Integrity considerations for secure computing systems.
Technical Report MTR-3153, MITRE Corporation.
[Birrell, 2004] Birrell, A. (2004). Implementing condition variables with semaphores.
Computer Systems Theory, Technology, and Applications, pages 2937.
[Black, 1990] Black, D. L. (1990). Scheduling and resource management techniques
for multiprocessors. Technical Report CMU-CS-90-152, Carnegie-Mellon University,
Computer Science Dept.
[Blunden, 2002] Blunden, B. (2002). Virtual Machine Design and Implementation in C/C++.
Worldware Publishing.
[Boebert and Kain, 1985] Boebert, W. and Kain, R. (1985). A practical alternative to
hierarchical integrity policies. In 8th National Conference on Computer Security, pages
1827.
[Bomberger et al., 1992] Bomberger, A., Frantz, A., Frantz, W., Hardy, A., Hardy, N.,
Landau, C., and Shapiro, J. (1992). The KeyKOS nanokernel architecture. In USENIX
Workshop on Micro-Kernels and Other Kernel Architectures, pages 95112.
[Bovet and Cesati, 2005] Bovet, D. and Cesati, M. (2005). Understanding the Linux Kernel,
3rd edition. OReilly Media, Inc.
[Boyd-Wickizer et al., 2009] Boyd-Wickizer, S., Morris, R., and Kaashoek, M. (2009).
Reinventing scheduling for multicore systems. In 12th conference on Hot topics in
operating systems, page 21. USENIX Association.
[Brown, 2000] Brown, K. (2000). Programming Windows Security. Addison-Wesley
Professional.
[Burns and Wellings, 1997] Burns, A. and Wellings, A. (1997). Real-Time Systems and
Programming Languages, 2nd edition. Addison-Wesley.
[Carr and Hennessy, 1981] Carr, R. and Hennessy, J. (1981). WSclock - a simple and
effective algorithm for virtual memory management. In ACM symposium on Operating
systems principles.
[Chen et al., 1994] Chen, P. M., Lee, E. K., Gibson, G. A., Katz, R. H., and Patterson,
D. A. (1994). RAID: high-performance, reliable secondary storage. ACM Computing
Surveys, 26:145185.
[Clark et al., 2005] Clark, C., Fraser, K., Hand, S., Hansen, J., Jul, E., Limpach, C., Pratt,
I., and Warfield, A. (2005). Live migration of virtual machines. In Symposium on
Networked Systems Design and Implementation.
338
c Carlos Maziero
9: REFERNCIAS BIBLIOGRFICAS
[Coffman et al., 1971] Coffman, E., Elphick, M., and Shoshani, A. (1971). System
deadlocks. ACM Computing Surveys, 3(2):6778.
[Corbat, 1963] Corbat, F. (1963). The Compatible Time-Sharing System: A Programmers
Guide. MIT Press.
[Corbat et al., 1962] Corbat, F., Daggett, M., and Daley, R. (1962). An experimental
time-sharing system. In Proceedings of the Spring Joint Computer Conference.
[Corbat and Vyssotsky, 1965] Corbat, F. J. and Vyssotsky, V. A. (1965). Introduction
and overview of the Multics system. In AFIPS Conference Proceedings, pages 185196.
[Corbet et al., 2005] Corbet, J., Rubini, A., and Kroah-Hartman, G. (2005). Linux Device
Drivers, 3rd Edition. OReilly Media, Inc.
[Cowan et al., 2000] Cowan, C., Beattie, S., Kroah-Hartman, G., Pu, C., Wagle, P., and
Gligor, V. (2000). SubDomain: Parsimonious server security. In 14th USENIX Systems
Administration Conference.
[Dasgupta et al., 1991] Dasgupta, P., Richard J. LeBlanc, J., Ahamad, M., and Ramachandran, U. (1991). The Clouds distributed operating system. Computer, 24(11):3444.
[Day, 1983] Day, J. (1983). The OSI reference model. Proceedings of the IEEE.
[Denning, 1980] Denning, P. (1980). Working sets past and present. IEEE Transactions
on Software Engineering, 6(1):6484.
[Denning, 2006] Denning, P. J. (2006). The locality principle. In Barria, J., editor,
Communication Networks and Computer Systems, chapter 4, pages 4367. Imperial
College Press.
[di Vimercati et al., 2007] di Vimercati, S., Foresti, S., Jajodia, S., and Samarati, P. (2007).
Access control policies and languages in open environments. In Yu, T. and Jajodia, S.,
editors, Secure Data Management in Decentralized Systems, volume 33 of Advances in
Information Security, pages 2158. Springer.
[di Vimercati et al., 2005] di Vimercati, S., Samarati, P., and Jajodia, S. (2005). Policies,
Models, and Languages for Access Control. In Workshop on Databases in Networked
Information Systems, volume LNCS 3433, pages 225237. Springer-Verlag.
[Dike, 2000] Dike, J. (2000). A user-mode port of the Linux kernel. In Proceedings of the
4th Annual Linux Showcase & Conference.
[Dorward et al., 1997] Dorward, S., Pike, R., Presotto, D., Ritchie, D., Trickey, H., and
Winterbottom, P. (1997). The Inferno operating system. Bell Labs Technical Journal,
2(1):518.
[Downey, 2008] Downey, A. (2008). The Little Book of Semaphores. Green Tea Press.
[Duesterwald, 2005] Duesterwald, E. (2005). Design and engineering of a dynamic
binary optimizer. Proceedings of the IEEE, 93(2):436448.
339
c Carlos Maziero
9: REFERNCIAS BIBLIOGRFICAS
The
GNU
Portable
Threads.
[Evans and Elischer, 2003] Evans, J. and Elischer, J. (2003). Kernel-scheduled entities
for FreeBSD. http://www.aims.net.au/chris/kse.
[Farines et al., 2000] Farines, J.-M., da Silva Fraga, J., and de Oliveira, R. S. (2000).
Sistemas de Tempo Real 12a Escola de Computao da SBC. Sociedade Brasileira de
Computao.
[Ford and Susarla, 1996] Ford, B. and Susarla, S. (1996). CPU Inheritance Scheduling.
In Usenix Association Second Symposium on Operating Systems Design and Implementation
(OSDI), pages 91105.
[Foundation, 2005] Foundation,
http://www.wikipedia.org.
W. (2005).
[Freed and Borenstein, 1996] Freed, N. and Borenstein, N. (1996). RFC 2046: Multipurpose Internet Mail Extensions (MIME) part two: Media types.
[Gallmeister, 1994] Gallmeister, B. (1994). POSIX.4: Programming for the Real World.
OReilly Media, Inc.
[Gnome, 2005] Gnome (2005).
http://www.gnome.org.
Gnome:
340
c Carlos Maziero
9: REFERNCIAS BIBLIOGRFICAS
[Johnstone and Wilson, 1999] Johnstone, M. S. and Wilson, P. R. (1999). The memory
fragmentation problem: solved? ACM SIGPLAN Notices, 34(3):2636.
[Jones, 1997] Jones, M. (1997). What really happened on Mars Rover Pathfinder. ACM
Risks-Forum Digest, 19(49).
[Kay and Lauder, 1988] Kay, J. and Lauder, P. (1988). A fair share scheduler. Communications of the ACM, 31(1):4455.
[KDE, 2005] KDE (2005). KDE desktop project. http://www.kde.org.
[Kernighan and Ritchie, 1989] Kernighan, B. and Ritchie, D. (1989). C: a Linguagem de
Programao - Padro ANSI. Campus/Elsevier.
[King et al., 2003] King, S., Dunlap, G., and Chen, P. (2003). Operating system support
for virtual machines. In Proceedings of the USENIX Technical Conference.
[Klein et al., 2009] Klein, G., Elphinstone, K., Heiser, G., Andronick, J., Cock, D., Derrin,
P., Elkaduwe, D., Engelhardt, K., Kolanski, R., Norrish, M., Sewell, T., Tuch, H.,
and Winwood, S. (2009). SeL4: Formal verification of an OS kernel. In 22nd ACM
Symposium on Operating Systems Principles, Big Sky, MT, USA.
[Lamport, 1974] Lamport, L. (1974). A new solution of Dijkstras concurrent programming problem. Communications of the ACM, 17(8):453455.
[Lampson, 1971] Lampson, B. (1971). Protection. In 5th Princeton Conference on Information Sciences and Systems. Reprinted in ACM Operating Systems Rev. 8, 1 (Jan. 1974),
pp 18-24.
[Lampson and Redell, 1980] Lampson, B. and Redell, D. (1980). Experience with processes and monitors in Mesa. Communications of the ACM.
[Levine, 2000] Levine, J. (2000). Linkers and Loaders. Morgan Kaufmann.
[Lichtenstein, 1997] Lichtenstein, S. (1997). A review of information security principles.
Computer Audit Update, 1997(12):924.
[Liedtke, 1996] Liedtke, J. (1996). Toward real microkernels. Communications of the ACM,
39(9):7077.
[Loscocco and Smalley, 2001] Loscocco, P. and Smalley, S. (2001). Integrating Flexible
Support for Security Policies into the Linux Operating System. In USENIX Annual
Technical Conference, pages 2942.
[Love, 2004] Love, R. (2004). Linux Kernel Development. Sams Publishing Developers
Library.
[Mauro and McDougall, 2006] Mauro, J. and McDougall, R. (2006). Solaris Internals:
Solaris 10 and OpenSolaris Kernel Architecture. Prentice-Hall PTR.
341
c Carlos Maziero
9: REFERNCIAS BIBLIOGRFICAS
c Carlos Maziero
9: REFERNCIAS BIBLIOGRFICAS
[Petzold, 1998] Petzold, C. (1998). Programming Windows, 5th edition. Microsoft Press.
[Pfleeger and Pfleeger, 2006] Pfleeger, C. and Pfleeger, S. L. (2006). Security in Computing,
4th Edition. Prentice Hall PTR.
[Pike et al., 1995] Pike, R., Presotto, D., Dorward, S., Flandrena, B., Thompson, K.,
Trickey, H., and Winterbottom, P. (1995). Plan 9 from Bell Labs. Journal of Computing
Systems, 8(3):221254.
[Pike et al., 1993] Pike, R., Presotto, D., Thompson, K., Trickey, H., and Winterbottom, P.
(1993). The use of name spaces in Plan 9. Operating Systems Review, 27(2):7276.
[Popek and Goldberg, 1974] Popek, G. and Goldberg, R. (1974). Formal requirements
for virtualizable third generation architectures. Communications of the ACM, 17(7):412
421.
[Price and Tucker, 2004] Price, D. and Tucker, A. (2004). Solaris zones: Operating
system support for consolidating commercial workloads. In 18th USENIX conference
on System administration, pages 241254.
[Provos et al., 2003] Provos, N., Friedl, M., and Honeyman, P. (2003). Preventing
privilege escalation. In 12th USENIX Security Symposium.
[Rashid et al., 1989] Rashid, R., Julin, D., Orr, D., Sanzi, R., Baron, R., Forin, A., Golub,
D., and Jones, M. B. (1989). Mach: a system software kernel. In Proceedings of the 1989
IEEE International Conference, COMPCON, pages 176178, San Francisco, CA, USA.
IEEE Comput. Soc. Press.
[Raynal, 1986] Raynal, M. (1986). Algorithms for Mutual Exclusion. The MIT Press.
[Rice, 2000] Rice, L. (2000). Introduction to OpenVMS. Elsevier Science & Technology
Books.
[Robbins and Robbins, 2003] Robbins, K. and Robbins, S. (2003). UNIX Systems Programming. Prentice-Hall.
[Robin and Irvine, 2000] Robin, J. and Irvine, C. (2000). Analysis of the Intel Pentiums
ability to support a secure virtual machine monitor. In 9th USENIX Security Symposium.
[Rosenblum, 2004] Rosenblum, M. (2004). The reincarnation of virtual machines. Queue
Focus - ACM Press, pages 3440.
[Rosenblum and Garfinkel, 2005] Rosenblum, M. and Garfinkel, T. (2005). Virtual
machine monitors: Current technology and future trends. IEEE Computer.
[Rozier et al., 1992] Rozier, M., Abrossimov, V., Armand, F., Boule, I., Gien, M., Guillemont, M., Herrman, F., Kaiser, C., Langlois, S., Lonard, P., and Neuhauser, W. (1992).
Overview of the Chorus distributed operating system. In Workshop on Micro-Kernels
and Other Kernel Architectures, pages 3970, Seattle WA (USA).
343
c Carlos Maziero
9: REFERNCIAS BIBLIOGRFICAS
[Russell et al., 2004] Russell, R., Quinlan, D., and Yeoh, C. (2004). Filesystem Hierarchy
Standard.
[Russinovich and Solomon, 2004] Russinovich, M. and Solomon, D. (2004). Microsoft
Windows Internals, Fourth Edition: Microsoft Windows Server 2003, Windows XP, and
Windows 2000. Microsoft Press.
[Saltzer and Schroeder, 1975] Saltzer, J. and Schroeder, M. (1975). The protection of
information in computer systems. Proceedings of the IEEE, 63(9):1278 1308.
[Samarati and De Capitani di Vimercati, 2001] Samarati, P. and De Capitani di Vimercati, S. (2001). Access control: Policies, models, and mechanisms. In Focardi, R. and
Gorrieri, R., editors, Foundations of Security Analysis and Design, volume 2171 of LNCS.
Springer-Verlag.
[Sandhu et al., 1996] Sandhu, R., Coyne, E., Feinstein, H., and Youman, C. (1996).
Role-based access control models. IEEE Computer, 29(2):3847.
[Sandhu and Samarati, 1996] Sandhu, R. and Samarati, P. (1996). Authentication, access
control, and audit. ACM Computing Surveys, 28(1).
[Seward and Nethercote, 2005] Seward, J. and Nethercote, N. (2005). Using Valgrind
to detect undefined value errors with bit-precision. In USENIX Annual Technical
Conference.
[Sha et al., 1990] Sha, L., Rajkumar, R., and Lehoczky, J. (1990). Priority inheritance
protocols: An approach to real-time synchronization. IEEE Transactions on Computers,
39(9):11751185.
[Shapiro and Hardy, 2002] Shapiro, J. and Hardy, N. (2002). Eros: a principle-driven
operating system from the ground up. Software, IEEE, 19(1):2633.
[Shirey, 2000] Shirey, R. (2000). RFC 2828: Internet security glossary.
[Silberschatz et al., 2001] Silberschatz, A., Galvin, P., and Gagne, G. (2001). Sistemas
Operacionais Conceitos e Aplicaes. Campus.
[Smith and Nair, 2004] Smith, J. and Nair, R. (2004). Virtual Machines: Architectures,
Implementations and Applications. Morgan Kaufmann.
[SNIA, 2009] SNIA (2009). Common RAID Disk Data Format Specification. SNIA Storage
Networking Industry Association. Version 2.0 Revision 19.
[Spencer et al., 1999] Spencer, R., Smalley, S., Loscocco, P., Hibler, M., Andersen, D.,
and Lepreau, J. (1999). The Flask security architecture: System support for diverse
security policies. In 8th USENIX Security Symposium, pages 123139.
[Stevens, 1998] Stevens, R. (1998). UNIX Network Programming. Prentice-Hall.
344
c Carlos Maziero
: REFERNCIAS BIBLIOGRFICAS
[Sugerman et al., 2001] Sugerman, J., Venkitachalam, G., and Lim, B. H. (2001). Virtualizing I/O devices on VMware workstations hosted virtual machine monitor. In
USENIX Annual Technical Conference, pages 114.
[Sun Microsystems, 2000] Sun Microsystems (2000). Trusted Solaris Users Guide. Sun
Microsystems, Inc.
[Tanenbaum, 2003] Tanenbaum, A. (2003). Sistemas Operacionais Modernos, 2a edio.
Pearson Prentice-Hall.
[Tanenbaum et al., 1991] Tanenbaum, A., Kaashoek, M., van Renesse, R., and Bal, H.
(1991). The Amoeba distributed operating system a status report. Computer
Communications, 14:324335.
[Tripwire, 2003] Tripwire (2003).
http://www.tripwire.org.
The
Tripwire
open
source
project.
[Uhlig and Mudge, 1997] Uhlig, R. and Mudge, T. (1997). Trace-driven memory simulation: a survey. ACM Computing Surveys, 29(2):128170.
[Uhlig et al., 2005] Uhlig, R., Neiger, G., Rodgers, D., Santoni, A., Martins, F., Anderson,
A., Bennett, S., Kgi, A., Leung, F., and Smith, L. (2005). Intel virtualization technology.
IEEE Computer.
[Ung and Cifuentes, 2006] Ung, D. and Cifuentes, C. (2006). Dynamic re-engineering of
binary code with run-time feedbacks. Science of Computer Programming, 60(2):189204.
[Vahalia, 1996] Vahalia, U. (1996). UNIX Internals The New Frontiers. Prentice-Hall.
[VirtualBox, 2008] VirtualBox,
I. (2008).
The VirtualBox
http://www.virtualbox.org/wiki/VirtualBox_architecture.
architecture.
[VMware, 2000] VMware (2000). VMware technical white paper. Technical report,
VMware, Palo Alto, CA - USA.
[Watson, 2001] Watson, R. (2001). TrustedBSD: Adding trusted operating system
features to FreeBSD. In USENIX Technical Conference.
[Whitaker et al., 2002] Whitaker, A., Shaw, M., and Gribble, S. (2002). Denali: A scalable
isolation kernel. In ACM SIGOPS European Workshop.
[Yen, 2007] Yen, C.-H. (2007). Solaris operating system - hardware virtualization product
architecture. Technical Report 820-3703-10, Sun Microsystems.
345
Apndice A
O Task Control Block do Linux
A estrutura em linguagem C apresentada a seguir constitui o descritor de tarefas
(Task Control Block) do Linux (estudado na Seo 2.4.1). Ela foi extrada do arquivo
include/linux/sched.h do cdigo-fonte do ncleo Linux 2.6.12 (o arquivo inteiro
contm mais de 1.200 linhas de cdigo em C).
1
2
3
4
5
6
struct task_struct {
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
struct thread_info *thread_info;
atomic_t usage;
unsigned long flags; /* per process flags, defined below */
unsigned long ptrace;
7
8
int lock_depth;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifdef CONFIG_SCHEDSTATS
struct sched_info sched_info;
#endif
26
27
28
29
30
31
32
33
34
346
c Carlos Maziero
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* task state */
struct linux_binfmt *binfmt;
long exit_state;
int exit_code, exit_signal;
int pdeath_signal; /* The signal sent when the parent dies */
/* ??? */
unsigned long personality;
unsigned did_exec:1;
pid_t pid;
pid_t tgid;
/*
* pointers to (original) parent process, youngest child, younger sibling,
* older sibling, respectively. (p->father can be replaced with
* p->parent->pid)
*/
struct task_struct *real_parent; /* real parent process (when being debugged) */
struct task_struct *parent; /* parent process */
/*
* children/sibling forms the list of my children plus the
* tasks Im ptracing.
*/
struct list_head children; /* list of my children */
struct list_head sibling; /* linkage in my parents children list */
struct task_struct *group_leader; /* threadgroup leader */
61
62
63
64
65
66
67
/* for vfork() */
/* CLONE_CHILD_SETTID */
/* CLONE_CHILD_CLEARTID */
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* process credentials */
uid_t uid,euid,suid,fsuid;
gid_t gid,egid,sgid,fsgid;
struct group_info *group_info;
kernel_cap_t cap_effective, cap_inheritable, cap_permitted;
unsigned keep_capabilities:1;
struct user_struct *user;
#ifdef CONFIG_KEYS
struct key *thread_keyring; /* keyring private to this thread */
#endif
347
c Carlos Maziero
90
91
92
93
94
95
/*
96
97
/*
98
99
/*
100
101
/*
102
103
/*
104
105
/*
106
107
108
109
/*
110
111
112
113
114
115
116
117
118
119
120
121
122
void *security;
struct audit_context *audit_context;
seccomp_t seccomp;
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/* VM state */
struct reclaim_state *reclaim_state;
139
140
141
142
143
144
348
c Carlos Maziero
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
349