Você está na página 1de 11

1.

Linux

O Linux é o termo geralmente usado para designar qualquer sistema operativo que
utilize o núcleo Linux. Ele é um dos exemplos mais proeminentes de software livre.
O Linux é distribuído sob a licença GNU General Public License versão 2 (GPLv2),
mais licenças proprietárias para alguns borrões binários (binary blobs) controversos, e é
desenvolvido por colaboradores ao redor do mundo. O desenvolvimento diário ocorre a
partir da Linux kernel mailing list.
O Linux foi inicialmente concebido e criado pelo estudante do Departamento de Ciência
da Computação da Universidade de Helsinki naFinlândia, Linus Torvalds com a ajuda
de vários programadores voluntários por meio da Usenet em 1991. O Linux acumulou
rapidamente desenvolvedores e usuários que adoptavam código de outros projetos de
software Livre. O Linux têm recebido contribuições de milhares de programadores, e
muitas distribuições GNU/Linux foram lançadas baseados nele.

2. CARACTERÍSTICAS TECNICAS DO LINUX

Arquitectura
O Linux é um núcleo monolítico.  Controladores de dispositivos e extensões de núcleo
são executadas no espaço de núcleo  (anel 0 em muitas arquitecturas de CPU), com
acesso completo ao hardware, embora algumas excepções sejam executadas no espaço
de usuário. O sistema gráfico que a maioria das pessoas utiliza com o Linux não roda no
núcleo, em contraste com o encontrado no Microsoft Windows.

Preemptividade do modo de núcleo permite que controladores de dispositivos sejam


antecipados sob certas condições. Este recurso foi adicionado para lidar
com interrupções de hardware correctamente e melhorar o suporte
para multiprocessamento simétrico  (SMP). Preemptividade também melhora latência,
aumentando a responsabilidade e tornando o Linux mais apropriado para aplicações de
tempo real.
Pânico do Kernel

No Linux, um "pânico" é um erro irrecuperável no sistema, detectado pelo núcleo em


contraste a erros similares encontrados por código no espaço de usuário. É possível para
o código no núcleo indicar tal condição ao chamar a função panic, localizada no ficheiro
de cabeçalho file sys/system.h. No entanto, a maioria dos pânicos são resultado de uma
excepção do processador não tratada no código do núcleo, como referências a um
endereço inválido na memória. Tipicamente estes são indicadores de um defeito em
algum lugar na cadeia de chamada levando ao pânico. Eles também podem significar
uma falha de hardware, como uma célula de RAM falha ou erros em funções aritméticas
no processador, causados por defeito no processador, processador danificado/super
aquecido, ou um erro leve.

Kernel Oops

Um oops é um desvio de comportamento correcto do kernel do Linux, que produz um


log de erro certo. A mais conhecida kernel resultados pânico condição de muitos tipos
de oops, mas outros podem permitir a operação contínua com confiabilidade
comprometida. O termo não representa mais nada, senão que é um erro simples.
Quando o kernel detecta um problema, ele imprime uma mensagem de oops e mata
todos os processos ofensivos. A mensagem é utilizada por engenheiros do kernel do
Linux para depurar o estado que criou o oops e corrigir o erro de programação que a
causou.

Veja para várias dicas sobre as configurações logger que podem afectar a capacidade de
recolher mensagens oops. A documentação do kernel Linux oficial sobre mensagens
oops está na documentação do arquivo / opa-tracing.txt das fontes de kernel. Muitas
vezes klogd é referenciado como sendo responsável por extrair as informações oops dos
buffers de kernel, no entanto, em alguns sistemas, por exemplo, recente das
distribuições Debian, rsyslogd é usado em vez de klogd. Assim, a ausência do processo
klogd não necessariamente explicar a ausência de oops informações nos arquivos de
log.

Uma vez que o sistema teve um oops, alguns recursos internos podem não estar em
serviço. Mesmo que o sistema parece funcionar correctamente, efeitos colaterais
indesejáveis podem ter resultado da tarefa ativa de ser morto. Um kernel oops, muitas
vezes leva a um kernel panic quando o sistema tenta utilizar os recursos que tenham
sido perdidos. Kerneloops também se refere a um software para colectar e enviar oopses
kernel para o site kerneloops. Kerneloops.org fornece estatísticas de oopses .

Interactivo – O usuário requisita os comandos e obtém os resultados de sua execução


através do terminal.

Multitarefa – Um único usuário pode requisitar que sejam efectuados vários comandos
ao mesmo tempo em seu terminal. É responsabilidade do sistema UNIX controlar estas
execuções paralelas.
Quando um usuário executa mais de um comando ao mesmo tempo, geralmente é
somente um que necessita a interacção com o usuário. Os demais comandos executados
são na sua maioria comandos que não exigem a atenção do usuário, sendo tarefas
demoradas. Quando isto ocorre, dizemos que os programas que o usuário está
executando sem a interacção ficam em Background. O programa que o usuário está
executando e interagindo fica em Foreground.

Multi-usuário – O UNIX pode controlar o acesso ao sistema através de vários


terminais, virtuais ou reais, cada um pertencendo a um usuário. O UNIX aceita as
requisições de comandos de cada um dos usuários e gera as filas de controle e
prioridades para que haja uma distribuição correcta dos recursos de hardware
necessários a cada usuário.
Devido a característica de ser um sistema multi-usuário, o UNIX implementa um
sistema de segurança visando impedir o acesso aos arquivos e directórios de um usuário
por outro.

Linguagens de programação
O Linux é escrito na versão da linguagem de programação C suportada pelo GCC, que
introduziu inúmeras extensões e mudanças ao C padrão, aliado a várias secções de
código menores escritas na linguagem de montagem, na sintaxe e estilos do GCC e
"AT&T", da arquitectura alvo. Devido às extensões ao C que ele suporta, o GCC foi por
um longo período o único compilador capaz de compilar o Linux correctamente. Em
2004, a Intel disse ter modificado o Linux para que seu compilador C também pudesse
compilá-lo. Outro sucesso foi apresentado em 2009, com um 2.6,22 modificado.

Muitas outras linguagens foram usadas de algum modo, essencialmente em conexão


com o processo de compilação, os métodos pelos quais as imagens inicializáveis são
criadas através do código fonte. Estas incluem Perl, Python, e várias linguagens shell
script. Alguns controladores podem até ser escritos em C++, Fortran, ou outras
linguagens, mas isto é extremamente desencorajado. O sistema de compilação do Linux
oficialmente suporta apenas o GCC, como um compilador de núcleo e controladores.

Portabilidade
Enquanto o Linux não foi projectado inicialmente para ser portável, o Linux agora é o
núcleo de sistema operativo mais portado, executando em uma série de sistemas, desde
o computador de mão iPAQ ao servidor mainframe System z9 da IBM, capaz de
executar centenas e até milhares de instâncias do Linux simultâneas. O Linux executa
no sistema operativo principal no super computadores Blue Gene da IBM. Desde Junho
de 2009, o Linux é núcleo em mais de 88% dos sistemas na lista Top 500 de super
computadores. Além disso, o Linux foi portado para vários dispositivos móveis como o
TuxPhone e o iPod daApple.

Sistemas operativos como o Google Android, o MeeGo (fusão entre o Nokia Maemo e o
Intel Moblin), desenvolvidos para dispositivos móveis, utilizam versões modificadas do
Linux.

O Linux hoje funciona em dezenas de plataformas, desde mainframes até um relógio de


pulso, passando por várias arquitecturas: x86 (Intel, AMD), x86-64 (Intel EM64T,
AMD64), ARM, PowerPC, Alpha, SPARC etc., com grande penetração também em
sistemas embarcados, como handhelds, PVR, vídeo-jogos e centros multimídia, entre
outros.

3. Processos

Um processo é uma instância de um programa em execução. Todo processo no Linux


tem um pai (processo criador) e um número identificador (PID). O pai de todos os
processos num ambiente Linux é o init, cujo PID é:
1. Este processo é criado pelo processo 0, que é um encadeamento (thread) do
próprio núcleo. O processo init irá permanecer em execução até o desligamento
do sistema, e sua função é monitorar e criar os processos que implementam as
camadas exteriores do sistema operacional.

Os processos são criados pelas chamadas de sistema fork () (processos tradicionais


ou heavy weight) e clone ()  (processos leves ou light weight). Para optimizar a criação
de processos tradicionais, o Linux usa o recurso de copy-on-write: quando um processo
- filho é criado, ele compartilha as mesmas páginas de memória do pai. Quando um dos
dois tenta escrever na memória, é gerada uma interrupção para o núcleo, que então
copia o conteúdo das páginas de memória para novas molduras de páginas, e estas são
atribuídas ao processo que efectuou a escrita.

Para manter um ambiente multitarefa e possibilitar o multiprocessamento, o Linux


mantém algumas estruturas importantes, das quais podemos citar duas: (i) o descritor do
processo (task_struct), que contém todas as informações relativas ao processo; (ii) uma
fila (runqueue) de processos por processador. Quando o sistema possui mais de um
processador, o agendador do Linux faz o balanceamento de carga entre as filas.

3.1. Estados
Uma das coisas que o escalonador precisa ter ciência é em qual estado está cada
processo, na estrutura que armazena os dados de cada processo temos um array de
possíveis estados onde apenas uma das opções abaixo estará activa.
TASK RUNNING - Em execução ou aguardando para ser executado.
TASK INTERRUPTIBLE - O processo está suspenso até que determinada condição
se torne verdadeira.
TASK UNINTERRUPTIBLE - Como o estado anterior, excepto pelo fato de que o
seu estado não será modificado quando receber um sinal. ´E importante para os
processos que necessitam executar determinada tarefa sem ser interrompido.
TASK STOPPED - Execução do processo foi parada.
TASK ZOMBIE - O processo está terminado, mas o processo pai ainda não executou
uma chamada de sistema para retornar informações sobre o processo morto - “wait”, as
informações não são descartadas pois ainda podem ser utilizadas.
3.2. Limite de Recursos
Por padrão o Linux limita os recursos que cada processo pode ter. Isto é, quanto de
recursos do sistema ele pode utilizar. Isso é uma protecção para que caso o usurário faça
algo errado, não prejudique a estabilidade do sistema. Esses limites são:
RLIMIT AS - O tamanho máximo que um processo pode ter em bytes. O kernel checa
esse valor quando um processo utiliza a chamada de sistema “malloc” ou similar.
RLIMIT CORE - Quando um processo é abortado, o kernel pode gerar um arquivo
core contendo as informações desse aborto. Este valor é utilizando para limitar o
tamanho desse arquivo. Caso o valor seja zero O, o arquivo não é criado.
RLIMIT CPU - O tempo máximo em segundos que um processo pode ser executado.
Caso esse limite seja ultrapassado o kernel envia um sinal SIGXCPU para tentar
pacificamente finalizar sua execução, se isso não acontecer ele envia um SIGKILL e
mata o processo.
RLIMIT DATA - O tamanho máximo do heap ou memória de dados em bytes. O
kernel checa esse valor antes de expandir o heap de um processo.
RLIMIT FSIZE - O tamanho máximo em bytes permitido para um arquivo. Se o
processo tentar aumentar o tamanho de um arquivo que ultrapasse esse valor, o kernel
envia um SIGXFSZ.
RLIMIT LOCKS - O número máximo de arquivos que um processo pode dar lock.
Toda fez que o usuário tenta dar lock em um arquivo o kernel checa esse valor.
RLIMIT MEMLOCK - O tamanho máximo em bytes de memória que não permite
swap. O kernel checa esse valor toda vez são utilizadas as chamadas de sistema “mlock”
ou “mlockall”.
RLIMIT NOFILE - O número máximo de descritores de arquivos abertos. Toda vez
que um descritor for aberto ou duplicado o kernel checa este valor.
RLIMIT NPROC - O número máximo de processos que um usurário pode ter.
RLIMIT RSS - A quantidade máxima de memória física que um processo pode ter.
RLIMIT STACK - O tamanho máximo em bytes da stack. O kernel checa este valor
antes de expandi-la.

4. Preemptivo

Os processos do Linux são preemptivos, isso significa que quando um processo entra no
estado TASK RUNNING o kernel vai verificar se existem alguma prioridade maior do
que o processo corrente. Caso exista, o processo corrente é interrompido e o que tem
prioridade maior começa a rodar.

Imagine a seguinte situação onde o Sr. Génio dos Teclados utiliza apenas dois
processos.

O editor de textos Emacs para escrever o seu programa e ao mesmo tempo o gcc para
compilar a versão mais recente do programa Pogobol Light. Por ser um programa
interactivo o editor de textos tem uma prioridade maior do que o compilador, mesmo
assim ele ainda é suspenso diversas vezes para que o compilador possa rodar também. O
Sr. Génio dos Teclados digita algumas palavras e imediatamente após cada tecla
digitada o kernel suspende a execução do compilador para poder processar o Emacs e
assim o texto digitado aparecer na tela, isso acontece tão rápido que torna-se
imperceptível, então o Emacs é suspenso novamente para que o gcc possa voltar a
executar. Neste caso, quando dizemos que um processo foi suspenso, significa que ele
continua com o estado TASK RUNNING, porém não mais utilizando o CPU.

5. Política de Escalonamento

A prioridade de um processo no Linux está em constante alteração, o escalonador se


mantém informado sobre o que os processos estão fazendo e assim torna-se possível
ajustar a prioridade. Dessa maneira os processos que ficaram proibidos de utilizar o
CPU por um longo intervalo de tempo, tem sua prioridade incrementada
automaticamente, contrariamente os processos que passaram um longo período dentro
do CPU são penalizados tendo sua prioridade decrementada.
Quando tocamos no assunto escalonamento é importante notar que os processos são
classificados como da Forma E/S e Forma CPU. O primeiro faz uso extenso dos
recursos de entrada e saída, isso significa que grande parte do seu tempo é utilizado no
aguardo do conclusão das operações de Entrada e Saída, já o segundo são processos que
necessitam de um longo tempo dentro do CPU.
Uma classificação alternativa define três classes de processos:
Processos Interactivos Os processos que estão em constante interacção com o usuário,
sendo assim eles perdem grande parte do tempo esperando uma actividade do usuário,
como um clique do rato ou o aperto de uma tecla. Quando qualquer dessas acções for
recebida o sistema precisa responder de forma ágil suspendendo qualquer processo que
estiver rodando e colocar o processo interactivo no CPU para processar a requisição
solicitada pelo usuário, caso contrário ele pode pensar que o sistema não está
respondendo. Um bom tempo de resposta é em torno de 50 e 150 ms.
Processos em Lote Não necessitam de nenhuma interacção do usurário e por isso
muitas vezes rodam em background. Como são processos de baixa prioridade, são
frequentemente penalizados pelo escalonador. Programas de processamento em lote
comuns são editores de texto, compiladores e programas gráficos.
Processos em Tempo Real Esses processos nunca devem ser bloqueados por processos
de baixa prioridade, precisam de um tempo de resposta super rápido e com uma
variação bastante baixa. Alguns aplicativos que fazem uso do tempo real são som,
vídeo, controladores de robôs e equipamentos que envolvem a segurança humana.

5.1. Algoritmo de Escalonamento


O algoritmo de escalonamento do Linux funciona dividindo o tempo do CPU em fatias.
Em uma única fatia cada processo tem um tempo especifico de duração que é
computada assim que essa fatia inicia. Geralmente processos diferentes têm tempos de
execução diferentes. Quando o tempo de execução de um processo termina ele é
retirado do CPU e outro processo que está rodando é colocado no seu lugar. Uma fatia
termina quando todos os processos esgotaram seu tempo reservado de execução, assim
o escalonador é responsável por calcular o tempo de execução para todos os processos e
uma nova fatia inicia.
Para o Linux escolher qual processo deve rodar ele precisar escolher qual tem a
prioridade maior, existem dois tipos de prioridade:
Prioridades Estática Definido pelo usuário para processos que necessitam de tempo real,
os valores variam de 1 até 99 que nunca são modificados pelo escalonador.
Prioridade Dinâmica Esta é aplicada para os processos convencionais. A prioridade
dinâmica dos processos convencionais é sempre inferior aos processos com prioridade
estática.
Se existir um processo com prioridade estática no estado TASK RUNNING nenhum
processo dinâmico irá rodar até que ele pare de executar.
6. Gerência de memória

O Linux utiliza memória virtual, que possui, pelo menos, 4 funções básicas:

 Assegurar que cada aplicação (processo) tenha seu próprio espaço de


endereçamento, começando em zero-problema de relocação;
 Protecção de memória, para impedir que um processo utilize um endereço de
memória que não lhe pertença;
 Compartilhamento de memória-processos diferentes podem compartilhar
código ou dados;
 Possibilitar que uma aplicação utilize mais memória do que a fisicamente
existente (essa é a função mais óbvia).

Seu código divide-se em duas partes. Uma é dependente da arquitectura, onde são
definidos o endereçamento - virtual e físico, o tamanho de página e o tratamento das
tabelas de páginas. Na parte independente ficam o controle de alocação e liberação de
memória e o esquema de substituição páginas.

O Linux utiliza tamanhos de páginas de acordo com a arquitectura.

Os processadores x86 utilizam páginas de 4 KiB (padrão), 2 MiB (caso seja utilizado o
recurso de Extensão de Endereço de Página ((Page Address Extension PAE) – da Intel)
ou de 4 MiB. Nas arquitecturas RISC o tamanho padrão é de 8 KiB, mas não é o único.

O endereçamento virtual é dividido em espaço do usuário e espaço do núcleo. O


primeiro é privativo de cada processo, com início no endereço lógico zero e terminando
no endereço determinado pela macro PAGE_OFFSET . O espaço do núcleo é único e
começa depois do espaço do usuário. Na arquitectura x86 PAGE_OFFSET determina
um valor de 3 GiB para o espaço do usuário e 1 GiB para o espaço do núcleo.

O código do Linux é carregado no início do espaço do núcleo, sendo seguido pela área
fisicamente mapeável (mem_map, estrutura que indexa as páginas físicas, e as páginas
propriamente ditas). Na arquitectura x86, os últimos 128 MiB do espaço do núcleo são
reservados para alocação de memória não contígua e memória alta, limitando a memória
física endereçável pelo Linux, na compilação padrão, a 896 MiB.

Um endereço virtual no Linux, é dividido em 5 campos: directório de páginas (PGD),


directório superior de páginas (PUD), directório intermediário de páginas (PMD), tabela
de páginas (PTE) e deslocamento (offset). A arquitectura x86 possui um espaço de
endereçamento de 32 bits; quando são utilizadas páginas de 4 KiB (o padrão) o PUD e o
PMD não são utilizados; o PGD e o PTE usam 10 bits cada, e o deslocamento usa 12
bits.

O esquema de substituição de páginas no Linux usa o algoritmo LRU (por


aproximação) mantendo duas listas de envelhecimento (aging). A primeira (active_list)
contém as páginas actualmente em uso (as páginas mais recentemente referenciadas
estarão mais próximas do início da lista) e a segunda (inactive_list) contém as
candidatas a paginação (page out).

A paginação para disco pode ocorrer sob demanda, quando algum processo solicitar
página e não houver alguma disponível. Neste caso, a página no final da
lista inactive_list é liberada. Entretanto, existe um processo chamado kswapd,
inicializado pelo núcleo, que verifica, periodicamente, o número de páginas livres. Caso
este número seja menor que pages_low, kswapd é acordado para liberar páginas. Se o
valor chegar a pages_min,  kswapd entra num regime síncrono para agilizar a liberação.
Quando o valor de páginas livres atingir pages_high,  kswapd vai dormir.

7. Gerência de arquivos

A gerência de arquivos no Linux baseia-se num esquema de vários níveis, onde a


camada principal é o VFS (Virtual File System), que esconde da aplicação as
características dos diversos sistemas de arquivo reconhecidos pelo Linux. Quando uma
aplicação solicita uma operação sobre algum arquivo, essa solicitação é encaminhada
para o VFS, que reenvia a solicitação para um dos SA registados.

O VFS utiliza uma estrutura chamada super bloco para manter as informações referentes
aos diversos sistemas de arquivos montados (tipo, ponto de montagem, dispositivo de
bloco utilizado, arquivos abertos). Também utiliza nós-i, semelhantes aos nós-i do
EXT2, com as informações sobre os arquivos (permissões, blocos utilizados, dono,
etc.).

Os sistemas de arquivos registados no VFS podem ser classificados em 3 grupos:

 Dispositivos de blocos (EXT2, EXT3, Reiserfs, XFS, VFAT);


 Associados a rede (NFS, SMB);
 Dispositivos especiais (procfs, tempfs). Todos esses sistemas podem ser
carregados como módulos.

O Ext2 está deixando de ser o padrão, particularmente por sua deficiência quando
ocorre uma pane. Neste caso, o sistema operacional deve executar uma varredura
completa para verificar o estado do sistema (fsck). Outros sistemas foram criados para
sanar essa deficiência, utilizando um recurso chamado journaling, que é a utilização de
um registo (log) de alterações (journal). Os sistemas de arquivos desse tipo mais
importantes são: Ext3, Ext4, Reiserfs, XFS e JFS.

Você também pode gostar