Você está na página 1de 14

Brian Ward

Novatec

Copyright 2014 by Brian Ward. Title of English-language original: How Linux Works, 2nd Edition,
ISBN 978-1-59327-567-9, published by No Starch Press. Portuguese-language edition copyright 2015
by Novatec Editora Ltda. All rights reserved.
Copyright 2014 por Brian Ward. Ttulo original em ingls: How Linux Works, 2nd Edition, ISBN 9781-59327-567-9, publicado pela No Starch Press. Edio em portugus copyright 2015 pela Novatec
Editora Ltda. Todos os direitos reservados.
Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998.
proibida a reproduo desta obra, mesmo parcial, por qualquer processo, sem prvia autorizao,
por escrito, do autor e da Editora.
Editor: Rubens Prates
Reviso gramatical: Marta Almeida de S
Editorao eletrnica: Carolina Kuwabata
Assistente editorial: Priscila A. Yoshimatsu
ISBN: 978-85-7522-419-9 VC20150212
Histrico de impresses:
Fevereiro/2015

Primeira edio

Novatec Editora Ltda.


Rua Lus Antnio dos Santos 110
02460-000 So Paulo, SP Brasil
Tel.: +55 11 2959-6529
E-mail: novatec@novatec.com.br
Site: novatec.com.br
Twitter: twitter.com/novateceditora
Facebook: facebook.com/novatec
LinkedIn: linkedin.com/in/novatec

captulo 1

Quadro geral

primeira vista, um sistema operacional moderno como o Linux bem complicado, com uma quantidade enorme de partes que se comunicam e executam
simultaneamente. Por exemplo, um servidor web pode conversar com um servidor
de banco de dados que, por sua vez, pode usar uma biblioteca compartilhada
utilizada por vrios outros programas. Mas como tudo isso funciona?
A maneira mais eficiente de entender o funcionamento de um sistema operacional
por meio de abstrao um modo elegante de dizer que podemos ignorar a maior
parte dos detalhes. Por exemplo, ao andar de carro, normalmente no precisamos
pensar em detalhes como nos parafusos que mantm o motor preso dentro do
carro ou nas pessoas que constroem e mantm a estrada em que o carro trafega.
Se voc for um passageiro em um carro, tudo o que voc realmente dever saber
o que o carro faz (transporta voc para outro lugar) e alguns aspectos bsicos
de como us-lo (como manusear a porta e o cinto de segurana).
Entretanto, se voc estiver dirigindo um carro, ser preciso saber mais. Voc dever
aprender a operar os controles (por exemplo, o volante e o pedal do acelerador)
e o que fazer quando algo der errado.
Por exemplo, vamos supor que a viagem de carro seja difcil. A abstrao referente
a um carro que trafega por uma estrada pode ser dividida em trs partes: um
carro, uma estrada e a maneira como voc est dirigindo. Isso ajuda a isolar o
problema: se a estrada tiver muitos desnveis, no culpe o carro nem a maneira
como voc est dirigindo. Em vez disso, pode ser que voc queira descobrir por
que a estrada se deteriorou ou, se ela for nova, por que os trabalhadores que a
construram fizeram um trabalho ruim.
Os desenvolvedores de software usam a abstrao como uma ferramenta ao criar
um sistema operacional e suas aplicaes. H vrios termos para uma subdiviso
que use abstraes em softwares de computador, incluindo subsistema, mdulo
e pacote, porm usaremos o termo componente neste captulo por causa de sua
16

Captulo 1 Quadro geral

17

simplicidade. Ao criar um componente de software, os desenvolvedores geralmente no pensam muito na estrutura interna dos outros componentes, porm
se preocupam com quais outros componentes eles podem usar e como utiliz-los.
Este captulo oferece uma viso bem geral dos componentes que constituem um
sistema Linux. Embora cada um deles tenha uma quantidade enorme de detalhes
tcnicos em sua constituio interna, iremos ignorar esses detalhes e nos concentraremos no que os componentes fazem em relao ao sistema como um todo.

1.1 Nveis e camadas de abstrao em um sistema Linux


Usar a abstrao para dividir os sistemas de computao em componentes ajuda
a compreender a situao, porm no funciona se no houver organizao. Os
componentes so organizados em camadas ou nveis. Uma camada ou nvel corresponde a uma classificao (ou agrupamento) de um componente de acordo
com a posio que esse componente ocupa entre o usurio e o hardware. Os
navegadores web, os jogos e itens desse tipo esto no nvel mais alto; na camada
mais baixa, temos a memria no hardware do computador os 0s e 1s. O sistema
operacional ocupa a maior parte das camadas intermedirias.
Um sistema Linux tem trs nveis principais. A figura 1.1 mostra esses nveis e alguns
dos componentes em cada nvel. O hardware est na base. Ele inclui a memria,
assim como uma ou mais CPUs (Central Processing Units, ou Unidades centrais de
processamento) para realizar processamentos, alm de ler e escrever na memria.
Dispositivos como discos e interfaces de rede tambm fazem parte do hardware.
O prximo nvel acima o kernel, que o ncleo do sistema operacional. O
kernel um software que reside na memria e diz CPU o que ela deve fazer.
Ele administra o hardware e atua principalmente como uma interface entre esse
e qualquer programa em execuo.
Os processos programas em execuo administrados pelo kernel formam
coletivamente o nvel mais alto do sistema, chamado de espao de usurio (user
space). (Um termo mais especfico para processo processo de usurio (user process),
independentemente de um usurio interagir ou no diretamente com o processo.
Por exemplo, todos os servidores web so executados como processos de usurio.)
H uma diferena muito importante entre as maneiras como o kernel e os
processos de usurio executam: o kernel executa em modo kernel (kernel mode)
e os processos de usurio executam em modo usurio (user mode). Um cdigo
executando em modo kernel tem acesso irrestrito ao processador e memria

18

Como o Linux Funciona

principal. um privilgio elevado, porm perigoso, que permite a um processo


do kernel provocar facilmente uma falha em todo o sistema. A rea que somente
o kernel pode acessar chama-se espao do kernel (kernel space).

Figura 1.1 Organizao geral do sistema Linux.

Em comparao, em modo usurio, o acesso restrito a um subconjunto (normalmente bem pequeno) de memria e de operaes seguras de CPU. O espao
de usurio refere-se s partes da memria principal que os processos de usurio
podem acessar. Se um processo cometer um erro e provocar falhas, as consequncias sero limitadas e podero ser limpas pelo kernel. Isso significa que se o
seu navegador web provocar uma falha, provavelmente ele no acabar com o
processamento cientfico que voc est executando em background h dias.
Teoricamente, um processo de usurio que perca o controle no poder causar
danos srios ao restante do sistema. Na verdade, isso depende do que voc considera danos srios bem como dos privilgios particulares do processo, pois
alguns processos tm permisso para fazer mais do que outros. Por exemplo,
um processo de usurio pode danificar completamente os dados em um disco?
Com as permisses corretas, sim e voc pode considerar isso como sendo bem
perigoso. Entretanto h medidas de segurana para evitar isso, e a maioria dos
processos simplesmente no ter permisso para provocar falhas dessa maneira.

Captulo 1 Quadro geral

19

1.2 Hardware: compreendendo a memria principal


De todo o hardware em um sistema de computador, a memria principal talvez
seja o mais importante. Em sua forma mais bruta, a memria principal somente
uma enorme rea de armazenamento para um conjunto de 0s e 1s. Cada 0 ou 1
chama-se bit. nesse local que o kernel e os processos em execuo residem eles
so simplesmente colees enormes de bits. Toda entrada e sada dos dispositivos
perifricos flui pela memria principal, tambm na forma de um conjunto de bits.
Uma CPU somente algo que executa operaes na memria: ela l instrues
e dados da memria e escreve dados de volta nela.
Com frequncia, voc ouvir o termo estado para se referir memria, aos processos, ao kernel e a outras partes de um sistema de computador. Estritamente
falando, um estado uma organizao particular de bits. Por exemplo, se voc tiver
quatro bits em sua memria, 0110, 0001 e 1011 representaro trs estados diferentes.
Ao considerar que um nico processo pode facilmente ser constitudo de milhes
de bits em memria, geralmente ser mais fcil usar termos abstratos para discutir esses estados. Em vez de descrever um estado usando bits, voc descrever
o que algo fez ou est fazendo no momento. Por exemplo, podemos dizer que o
processo est aguardando uma entrada ou que o processo est executando o
Estgio 2 de sua inicializao.
Observao: Pelo fato de ser comum referir-se ao estado em termos abstratos
&&
em vez de usar os bits propriamente ditos, o termo imagem refere-se a uma
organizao fsica em particular dos bits.

1.3 Kernel
Por que estamos falando de memria principal e de estados? Praticamente tudo
que o kernel faz gira em torno da memria principal. Uma das tarefas do kernel
consiste em separar a memria em vrias subdivises, e ele deve manter determinadas informaes de estado sobre essas subdivises o tempo todo. Cada processo
obtm sua prpria quota de memria, e o kernel deve garantir que cada processo
atenha-se sua quota.
O kernel responsvel pelo gerenciamento das tarefas em quatro reas gerais do
sistema:
Processos o kernel responsvel por determinar quais processos tm permisso para usar a CPU.

20

Como o Linux Funciona

Memria o kernel deve ajudar a monitorar toda a memria que parte est
alocada no momento para um processo em particular, que parte deve ser
compartilhada entre os processos e que parte est livre.
Device drivers o kernel atua como uma interface entre o hardware (por
exemplo, um disco) e os processos. Normalmente, operar o hardware uma
tarefa do kernel.
Chamadas de sistema e suporte os processos normalmente usam chamadas de
sistema para se comunicar com o kernel.
Iremos agora explorar rapidamente cada uma dessas reas.
Observao: se voc estiver interessado no funcionamento detalhado de um
&&

kernel, dois bons livros-texto so: Operating System Concepts, 9 edio, de


Abraham Silberschatz, Peter B. Galvin e Greg Gagne (Wiley, 2012), e Modern
Operating Systems, 4 edio, de Andrew S. Tanenbaum e Herbert Bos (Prentice
Hall, 2014).

1.3.1 Gerenciamento de processos


O gerenciamento de processos descreve a inicializao, a pausa, a retomada e o
trmino dos processos. Os conceitos por trs da inicializao e do trmino de
processos so bem simples, porm descrever como um processo utiliza a CPU em
seu curso normal de operao um pouco mais complicado.
Em qualquer sistema operacional moderno, muitos processos executam simultaneamente. Por exemplo, voc pode ter um navegador web e uma planilha abertos
em um computador desktop ao mesmo tempo. Entretanto a situao no o que
aparenta ser: os processos por trs dessas aplicaes normalmente no executam
exatamente ao mesmo tempo.
Considere um sistema com uma CPU. Muitos processos podem usar a CPU, porm
somente um processo realmente utilizar a CPU em um determinado instante.
Na prtica, cada processo utiliza a CPU durante uma pequena frao de segundo
e depois faz uma pausa; em seguida, outro processo usa a CPU durante outra
pequena frao de segundo e ento a vez de outro processo e assim por diante.
O ato de um processo passar o controle da CPU para outro processo chama-se
alternncia de contexto (context switch).
Cada poro de tempo chamada de time slice (fatia de tempo) d a um processo tempo suficiente para efetuar um processamento significativo (de fato, um
processo normalmente termina sua tarefa corrente em uma nica fatia de tempo).

Captulo 1 Quadro geral

21

No entanto, como as fatias de tempo so bem curtas, os seres humanos no


conseguem perceb-las e o sistema parecer estar executando vrios processos
ao mesmo tempo [uma capacidade conhecida como multitarefa (multitasking)].
O kernel responsvel pela alternncia de contexto. Para entender como isso
funciona, vamos pensar em uma situao em que um processo esteja executando
em modo usurio, porm seu time slice tenha esgotado. Eis o que acontece:
1. A CPU (o hardware propriamente dito) interrompe o processo corrente de
acordo com um temporizador interno, alterna para o modo kernel e devolve
o controle ao kernel.
2. O kernel registra os estados correntes da CPU e da memria, que sero
essenciais para retomar o processo que acabou de ser interrompido.
3. O kernel executa qualquer tarefa que possa ter surgido durante o time slice
anterior [por exemplo, coletar dados de operaes de entrada e sada (I/O)].
4. O kernel agora est pronto para deixar outro processo executar. Ele analisa
a lista de processos que esto prontos para executar e seleciona um.
5. O kernel prepara a memria para esse novo processo e, em seguida, prepara
a CPU.
6. O kernel informa CPU quanto tempo ir durar o time slice do novo processo.
7. O kernel muda a CPU para o modo usurio e passa o controle da CPU
para o processo.

A alternncia de contexto responde importante pergunta sobre quando o kernel


executado. A resposta que ele executa entre os time slices dos processos, durante
uma alternncia de contexto.
No caso de um sistema com vrias CPUs, a situao um pouco mais complicada,
pois o kernel no precisa ceder o controle de sua CPU corrente para permitir que
um processo execute em uma CPU diferente. No entanto, para maximizar o uso
de todas as CPUs disponveis, o kernel normalmente faz isso de qualquer modo
(e pode usar determinados truques para conseguir um pouco mais de tempo de
CPU para si mesmo).

1.3.2 Gerenciamento de memria


Como o kernel deve administrar a memria durante uma alternncia de contexto,
ele tem uma tarefa complexa de gerenciamento de memria. O trabalho do kernel
complicado porque as seguintes condies devem ser atendidas:

22

Como o Linux Funciona

O kernel deve ter sua prpria rea privada na memria, qual os processos
de usurio no devero ter acesso.
Cada processo de usurio deve ter sua prpria seo de memria.
Um processo de usurio no poder ter acesso memria privada de outro
processo.
Os processos de usurio podem compartilhar memria.
Partes da memria dos processos de usurio podem ser somente para leitura.
O sistema pode usar mais memria do que est fisicamente presente ao
usar o espao em disco como auxiliar.
Felizmente para o kernel, existe ajuda. As CPUs modernas incluem uma MMU
(Memory Management Unit, ou Unidade de gerenciamento de memria) que
permite ter um esquema de acesso memria chamado memria virtual. Ao usar a
memria virtual, um processo no acessa diretamente a memria por meio de sua
localizao fsica no hardware. Em vez disso, o kernel configura cada processo para
que atue como se ele tivesse todo o computador para si mesmo. Quando o processo acessa alguma parte de sua memria, a MMU intercepta o acesso e utiliza um
mapeamento de endereos de memria para traduzir o endereo de memria do
processo para um endereo realmente fsico na memria do computador. O kernel
deve ainda inicializar alm de continuamente manter e alterar esse mapeamento
de endereos de memria. Por exemplo, durante uma alternncia de contexto, o
kernel deve alterar o mapeamento, do processo de sada para o processo de entrada.
Observao: a implementao de um mapeamento de endereos de memria
&&
chama-se tabela de pginas (page table).

Voc aprender mais sobre como verificar o desempenho da memria no captulo 8.

1.3.3 Device drivers e gerenciamento de dispositivos


A funo do kernel em relao aos dispositivos bem simples. Um dispositivo
normalmente acessvel somente em modo kernel, pois acessos imprprios
(por exemplo, um processo de usurio que solicite um desligamento de energia)
poderiam provocar falhas no computador. Outro problema que dispositivos
diferentes raramente tm a mesma interface de programao, mesmo que os dispositivos realizem a mesma tarefa, por exemplo, duas placas de rede diferentes.

Captulo 1 Quadro geral

23

Sendo assim, os device drivers, tradicionalmente, tm feito parte do kernel e se


esforam em apresentar uma interface uniforme aos processos de usurio para
simplificar o trabalho dos desenvolvedores de software.

1.3.4 Chamadas de sistema e suporte


H vrios outros tipos de recurso disponibilizados pelo kernel aos processos de
usurio. Por exemplo, as chamadas de sistema (ou syscalls) executam tarefas especficas que um processo de usurio sozinho no poder efetuar ou no poder
faz-lo adequadamente. Por exemplo, todas as aes referentes a abrir, ler e escrever
em arquivos envolvem chamadas de sistema.
Duas chamadas de sistema, fork() e exec(), so importantes para entender como
os processos so inicializados:
fork() quando um processo chama fork(), o kernel cria uma cpia praticamente idntica do processo.
exec() quando um processo chama exec(programa), o kernel inicia programa,
substituindo o processo corrente.
Alm de init (veja o captulo 6), todos os processos de usurio em um sistema
Linux comeam como resultado de fork(), e, na maioria das vezes, voc tambm
executar exec() para iniciar um novo programa em vez de executar uma cpia
de um processo existente. Um exemplo bem simples qualquer programa que
seja executado na linha de comando, por exemplo, o comando ls para mostrar o
contedo de um diretrio. Ao digitar ls em uma janela de terminal, o shell que
estiver executando na janela do terminal chamar fork() para criar uma cpia
do shell e, em seguida, a nova cpia do shell chamar exec(ls) para executar ls. A
figura 1.2 mostra o fluxo dos processos e das chamadas de sistema para iniciar
um programa como o ls.
Observao: as chamadas de sistema normalmente so indicadas com parnteses.
&&
No exemplo mostrado na figura 1.2, o processo que est pedindo ao kernel que
crie outro processo deve executar uma chamada de sistema fork(). Essa notao
resulta da maneira como a chamada seria escrita na linguagem de programao
C. No preciso conhecer C para entender este livro; basta lembrar que uma
chamada de sistema consiste em uma interao entre um processo e o kernel.
Alm disso, este livro simplifica determinados grupos de chamadas de sistema.
Por exemplo, exec() se refere a toda uma famlia de chamadas de sistema que
realiza uma tarefa semelhante, porm difere quanto programao.

24

Como o Linux Funciona

Figura 1.2 Iniciando um novo processo.

O kernel tambm suporta processos de usurio com recursos diferentes das


chamadas de sistema tradicionais, e o mais comum deles so os pseudodispositivos
(pseudodevices). Os pseudodispositivos se parecem com os dispositivos para os
processos de usurio, porm so puramente implementados em software. Sendo
assim, tecnicamente, eles no precisariam estar no kernel, mas normalmente esto
l por razes prticas. Por exemplo, o dispositivo gerador de nmero aleatrio do
kernel (/dev/random) seria difcil de ser implementado de forma segura com um
processo de usurio.
Observao:
&&

tecnicamente, um processo de usurio que acesse um


pseudodispositivo deve continuar usando uma chamada de sistema para abrir
o dispositivo, portanto os processos no podero evitar totalmente as chamadas
de sistema.

1.4 Espao de usurio


Conforme mencionamos anteriormente, a memria principal que o kernel aloca
para os processos de usurio chama-se espao de usurio (user space). Como um
processo simplesmente um estado (ou uma imagem) em memria, o espao
de usurio tambm se refere memria para todo o conjunto de processos em
execuo. [Voc tambm poder ouvir o termo mais informal userland (territrio
do usurio) usado para se referir ao espao de usurio.]
A maior parte da verdadeira ao em um sistema Linux ocorre no espao de usurio. Embora todos os processos sejam essencialmente iguais do ponto de vista
do kernel, eles executam tarefas diferentes para os usurios. H uma estrutura
rudimentar de nveis (ou camadas) de servios para os tipos de componentes
de sistema que os processos de usurio representam. A figura 1.3 mostra como
um conjunto de componentes de exemplo se encaixa e interage em um sistema
Linux. Os servios bsicos esto no nvel inferior (mais prximos ao kernel), os
servios utilitrios esto no meio e as aplicaes em contato com os usurios
esto no nvel superior. A figura 1.3 um diagrama bastante simplificado, pois

Captulo 1 Quadro geral

25

somente seis componentes esto sendo mostrados; no entanto voc pode ver que
os componentes na parte superior esto mais prximos do usurio (a interface
de usurio e o navegador web); os componentes do nvel intermedirio contm
um servidor de emails utilizado pelo navegador web e h diversos componentes
menores na parte inferior.

Figura 1.3 Tipos de processo e interaes.

O nvel inferior tende a ser constitudo de pequenos componentes que realizam


tarefas nicas e descomplicadas. O nvel intermedirio contm componentes
maiores como emails, impresso e servios de banco de dados. Por fim, os componentes no nvel superior executam tarefas complexas, normalmente controladas
diretamente pelo usurio. Os componentes tambm usam outros componentes.
Em geral, se um componente quiser usar outro, o segundo componente estar no
mesmo nvel de servio ou abaixo dele.
Entretanto a figura 1.3 somente uma aproximao de uma organizao do espao
de usurio. Na realidade, no h regras nesse espao. Por exemplo, a maioria das
aplicaes e dos servios escreve mensagens de diagnstico conhecidas como logs.
Boa parte dos programas usa o servio-padro syslog para escrever mensagens
de log, porm algumas pessoas preferem fazer todo o logging por conta prpria.
Alm do mais, difcil classificar alguns componentes do espao de usurio. Os
componentes de servidor, como os servidores web e de banco de dados, podem ser
considerados como aplicaes de nvel bem alto, pois suas tarefas normalmente so
complexas, portanto voc poder coloc-los no nvel superior na figura 1.3. Entretanto as aplicaes de usurio podem depender desses servidores para realizar tarefas
que elas prefeririam no realizar por conta prpria, portanto seria possvel argumentar tambm que os servidores poderiam ser colocados no nvel intermedirio.

26

Como o Linux Funciona

1.5 Usurios
O kernel do Linux suporta o conceito tradicional de um usurio Unix. Um usurio
uma entidade que pode executar processos e ser dono de arquivos. Um usurio
est associado a um nome de usurio. Por exemplo, um sistema pode ter um usurio
chamado billyjoe. No entanto o kernel no administra os nomes de usurio; em
vez disso, ele identifica os usurios por meio de identificadores numricos simples
chamados de userids. (Voc aprender mais sobre a correspondncia entre nomes
de usurio e os userids no captulo 7.)
Os usurios existem principalmente para dar suporte a permisses e limitaes.
Todo processo no espao de usurio tem um usurio que o seu proprietrio
(owner), e dizemos que os processos executam como proprietrio. Um usurio
pode terminar ou modificar o comportamento de seus prprios processos (dentro
de determinados limites), porm no poder interferir nos processos de outros
usurios. Alm disso, os usurios podem ser proprietrios de arquivos e optar
por compartilh-los ou no com outros usurios.
Um sistema Linux normalmente tem diversos usurios, alm daqueles que correspondem a seres humanos de verdade que usem o sistema. Voc os ver com
mais detalhes no captulo 3, mas o usurio mais importante a se conhecer o root.
O usurio root uma exceo s regras anteriores, pois o root pode terminar e
alterar os processos de outros usurios, alm de ler qualquer arquivo do sistema
local. Por esse motivo, o root conhecido como superusurio (superuser). Dizemos
que uma pessoa que atue como root tem acesso de root e um administrador em
um sistema Unix tradicional.
Observao: atuar como root pode ser perigoso. Pode ser difcil identificar e
&&
corrigir erros, pois o sistema permitir que voc faa de tudo, mesmo que o que
voc fizer seja prejudicial ao sistema. Por esse motivo, os designers do sistema
tentam constantemente fazer com que o acesso de root seja to desnecessrio
quanto possvel, por exemplo, no exigindo esse tipo de acesso para alternar
entre redes wireless em um notebook. Alm disso, por mais poderoso que
seja o usurio root, ele continuar executando no modo usurio do sistema
operacional, e no em modo kernel.

Os grupos correspondem a conjuntos de usurios. O principal propsito dos


grupos permitir que um usurio compartilhe acesso a arquivos com outros
usurios em um grupo.

Captulo 1 Quadro geral

27

1.6 Prximos passos


At agora, voc viu o que compe um sistema Linux em execuo. Os processos
de usurio formam o ambiente com o qual voc interage diretamente; o kernel
administra os processos e o hardware. Tanto o kernel quanto os processos residem
na memria.
So informaes bsicas timas, porm voc no poder conhecer os detalhes de
um sistema Linux somente lendo a seu respeito; ser necessrio pr a mo na
massa. O prximo captulo dar incio sua jornada ao ensinar alguns conceitos
bsicos sobre o espao de usurio. Ao longo do caminho, voc conhecer uma
parte importante do sistema Linux que no foi discutida neste captulo o armazenamento de longo prazo (discos, arquivos etc.). Afinal de contas, voc dever
armazenar os seus programas e os dados em algum lugar.