1 1.0 – Kernel O kernel (núcleo) representa o coração do Sistema

Propaganda
1
1.0 – Kernel
O kernel (núcleo) representa o coração do Sistema Operacional.
Atribuições do kernel:
- gerenciamento dos arquivos em disco;
- inicializar programas e executá-los;
- alocar e gerenciar memória para os processos;
- gerenciamento de E/S;
- gerenciamento de comunicação em redes: recebimento, validação e envio de pacotes pela rede;
Na realidade o kernel faz muito pouco sozinho, ele apenas provê ferramentas com os quais os
serviços podem ser desenvolvidos.
Ele evita que se possa acessar diretamente os componentes de hardware, forçando o uso das
ferramentas.
As ferramentas disponibilizadas pelo kernel são utilizadas através das CHAMADAS AO SISTEMA
(SYSTEM CALLS).
Os programas de sistema utilizam as ferramentas disponibilizadas pelo kernel para implementar os
diversos serviços necessários ao Sistema Operacional.
Programas de sistemas e todos os demais programas são executados sobre o kernel, o qual é
denominado MODO USUÁRIO (USER MODE).
1.1 - Programas de sistema e aplicações
A diferença está no seu objetivo final.
Programas de sistema: são necessários para manter o Sistema Operacional funcionando (ex:
daemons e etc.).
Aplicações: tem por objetivo executar uma determinada aplicação, ou seja, são os programas que
executamos no SO, por exemplo, um editor de texto, uma planilha eletrônica, um jogo e etc.
Usuários
Interface do usuário
Aplicativos e programas
dos usuários
2
Interface das bibliotecas
Modo
usuário
Funções das bibliotecas padrão
(open, close, read, write, fork, etc.)
Interface de
chamadas de sistema
Kernel – gerenciamento de processos,
memória, sistema de arquivos, I/O, etc.
Modo
Kernel
Hardware – CPU, memória, discos, terminais, etc.
Fig. 1.1.b – Outro modelo de funcionamento do Kernel do Linux;
2.0 - Kernel do Linux
Como funcionalidades típicas do kernel de um sistema operacional podemos citar as seguintes:
- gerenciamento de processos: criação e término de processos, escalonamento e controle de
processos, sincronização de processos e suporte a comunicação inter-processos, alocação de
espaço de endereçamento aos processos, gerenciamento de bloco de processos (Process Control
Blocks – PCB) ;
- gerenciador de memória: swapping, gerenciamento de páginas e segmentos;
- gerenciamento de E/S: gerencimanto de dispositivos de E/S, gerenciamento de buffers de E/S,
alocação de canais de E/S e de devices aos processos;
- controle de dispositivos de hardware;
- gerenciamento de sistemas de arquivos;
- gerenciamento de rede;
- manipulação de interrupções;
- monitoramento do sistema;
- etc.;
3
As partes mais importantes do Kernel (nada funciona sem elas) são:
- gerenciador de memória;
- gerenciador de processos;
- gerenciador de memória: é o responsável pela atribuição de áreas de memória e áreas de troca
(swap) para os processos, para os demais componentes do kernel e para o cache de disco;
- gerenciador de processos: cria processos e implementa
multitarefa através de troca dos
processos ativos no processador;
No nível mais baixo o kernel contém controladores para cada tipo de hardware suportado, como o
número de hardwares é grande, então o numero de controladores também é grande.
Alguns softwares disponibilizados pelo kernel têm propriedades similares e podem ser também
derivados em classes, por exemplo, os diversos protocolos de rede foram abstraídos em uma
interface de programação, a biblioteca BSD de SOCKET.
Outro exemplo de similaridade é a camada de sistema virtual de arquivos (VFS), a qual abstrai as
operações dos diversos sistemas de arquivos de suas implementações. Quando alguma entidade
tenta utilizar um sistema de arquivos, a requisição é direcionada ao VFS, o qual a reencaminha
para o controlador adequado de arquivos solicitado.
Dentre as características do Kernel do Linux, podem ser destacadas as seguintes:
-
permite Copy-on-write (cópia por escrita): tal processo consiste na utilização de códigos
executáveis compartilhados, ou seja, caso haja várias instâncias de um certo programa, o seu
código é carregado na memória apenas uma vez;
-
utilização de Unified Memory Pool (Associação da memória unificada): essa técnica permite
que todo o espaço livre da memória RAM seja utilizado como cache de disco;
-
suporte a Demand Paging (demanda de paginação): isso denota que apenas as seções
necessárias de um programa são carregadas na memória RAM, permitindo-se manipulação
mais eficiente de um número maior de processos;
-
utilização intensa de Dinamically Shared Libraries – DLLs (Compatilhamento dinâmico de
Bibliotecas): mapeamento das bibliotecas dinâmicas de uma região específica da memória
denominada Common Library Section, implicando na redução do tamanho do código das
aplicações uma vez que as funções da biblioteca não são link-editadas ao restante da
codificação. Mas, para manter compatibilidade e, em certos casos, conveniência, o Linux
também admite a utilização de bibliotecas estáticas;
3.0 – Características do Kernel do Linux
3.1 – Sistema Operacional Multitarefa
Em um sistema operacional multitarefa vários programas são executados “simultaneamente”. Na
verdade, vários processos (programas em execução pela CPU – Unidade Central de
Processamento) são executados seqüencialmente. O kernel escalona a execução deles e reservalhes recursos do computador (intervalo de tempo, espaço em memória RAM e espaço em disco
4
rígido). Enquanto o número de programas for razoável, o computador possuir memória suficiente,
um disco rígido de tamanho razoável e for rápido o bastante, teremos a impressão de que todos os
programas estarão em execução simultânea.
O Linux é um sistema operacional de multitarefa preemptiva; isso significa que o seu kernel reserva
um intervalo de tempo para cada processo ser executado (geralmente 20 milisegundos), um
espaço em memória RAM e espaço em disco rígido. Quando esse intervalo de tempo termina, o
kernel suspende a execução do processo, salva o seu contexto (informações necessárias para
execução do processo), para que ele possa ser retomado posteriormente e carrega o contexto do
próximo processo na fila de espera a fim de executá-lo.
O Linux também determina quando cada processo será executado, a duração de sua execução e a
sua prioridade sobre os outros (podem-se executar processos com uma determinada prioridade ou
alterá-la manualmente, por meio dos comando nice e renice).
3.2 – Sistema Operacional Multiusuário
O Linux permite que mais de um usuário acesse o computador simultaneamente. Neste caso, isso
poderá ser feito no mesmo computador, por meio dos terminais virtuais, ou remotamente, por meio
de terminais físicos ou outros computadores operando como terminais.
Por se tratar de um SO multiusuário, cada usuário possui prioridade de arquivo e autorizações
relacionadas a ele. Quaisquer arquivos criados pelo usuário conservarão essa prioridade e essas
autorizações. Por meio dessas autorizações, os programas também estarão limitados em termos
de quais arquivos eles poderão acessar.
Há dois tipos de usuários no Linux/UNIX:
-
root (raiz - superusuário): pode manipular todos os recursos do sistema operacional e é
indicado no prompt pelo caractere # ;
-
usuário comum: sofrem as restrições do parágrafo anterior, é indicado no prompt pelo
caractere $ ;
3.3 – Memória Virtual no Linux
O Linux é um SO com memória virtual paginada, isto quer dizer que podemos ter programas em
execução cujo tamanho é maior que a memória física disponível para executá-los.
O sistema operacional passa a ser responsável por manter na memória as partes dos programas
efetivamente em uso, deixando o resto no disco rígido.
Ex:
-
Um programa de 16 MB pode ser executado em uma máquina de 4 MB de memória, com o
sistema operacional selecionando os 4 MB que deverão ser mantidos na memória a cada
instante, com suas partes sendo copiadas do disco rígido para a memória e vice-versa, quando
necessário;
5
-
Ou mesmo, oito programas de 16 MB sendo alocados em seções de 4 MB de memória, com o
sistema operacional novamente selecionando os 4 MB de cada programa que deverão ser
mantidos nas seções de memória a cada instante, , com suas partes sendo copiadas do disco
rígido para a memória e vice-versa, quando necessário;
A utilização da memória virtual deixa o computador mais lento, embora faça com que ele aparente
ter mais memória do que realmente tem.
4.0 – Número da versão do Kernel
O número da versão do Kernel segue sempre um esquema de composto por três valores, no
formato: maior.menor.release.
Por exemplo, no caso do kernel 2.5.22, o número maior é 2, o menor é 5 e o release é 22.
O número maior não muda com freqüência, por exemplo, o número 0 saiu em 1.991, em 1.994 saiu
a 1 e estamos atualmente no 2 desde 1.996.
O número menor muda a intervalos irregulares, mas não tão longos. Ele tem uma característica
importante, quando é número par, indica uma versão de produção e quando é ímpar indica uma
versão de desenvolvimento.
O terceiro número é o de release, que vem do inglês “lançamento” pode ser interpretado como
“atualização” também, portanto o terceiro número refere-se às atualizações do kernel que são
lançadas, ou para testes, ou em definitivo.
Atualmente foi lançado e liberado por Linus Torvalds a versão 2.6.1.
5.0 – Evolução do Kernel
O kernel do Linux é um software cujo desenvolvimento foi iniciado em 1.991 por Linus Torvalds,
mas ele nem sempre foi tão seguro e estável como hoje, assim como todo software sofreu
evoluções e continua amadurecendo a cada versão, acompanhando as evoluções tecnológicas.
Abaixo apresentamos um quadro comparativo da evolução do kernel do Linux desde a sua criação:
Ano
1.991
1.994
1.995
1.996
1.999
2.001
2.003
Versão
0.01
1.0
1.2
2.0
2.2
2.4
2.6
Linhas de código
7.500
156.000
277.00
649.000
1.536.000
2.888.000
4.200.000
Fig. 5.a – Evolução do Kernel durante os anos;
6
6.0 – Mapa do Kernel
Fig. 6.a – Vista geral do Kernel do Linux;
7.0 – Micro-kernel e kernel monolítico
Existe uma discussão célebre na história de criação do Linux, sobre estruturas de microkernel ou
monolíticas para desenvolvimento de um Sistema Operacional. Isso foi objeto de ferrenha
discussão entre Torvalds e Tanenbaum, nas primeiras versões do Linux e que de tempos em
tempos é trazida à tona (como recentemente no lançamento de um SO baseado em microkernel).
Em 1992, a discussão envolveu o Linux, um kernel monolítico, e o Minix, um microkernel. Na época
a memória era pequena.
7
Um kernel monolítico ocupa menos espaço do que um microkernel e também podia ser mais
rápido.
O Linux, tinha um kernel monolítico que estava disponível, gratuito e funcionava. O Minix não era
gratuito e não funcionava corretamente devido a problemas de multitarefa no kernel.
Naquela época escolheria o kernel monolítico. Recentemente, retornou a discussão. A capacidade
de processamento e de memória aumentou muito em relação a 1992.
Devido ao aumento de funcionalidades aumentou a dificuldade de implementação do kernel
monolítico.
Tanenbaum reconhece que o Minix foi escrito para servir como ferramenta de estudo. Mas agora
tem o Minix 3, que é baseado em microkernel, está disponível, é gratuito e open source.
Outro exemplo de microkernel é o QNX que a Cisco está usando em seus roteadores. Em 2004, foi
divulgado que o microkernel, QNX Neutrino, controlava o roteador mais rápido do mundo da Cisco.
Com certeza, este microkernel fornece alto desempenho, confiabilidade e segurança.
Além destes dois existem outros disponíveis. Agora o microkernel é uma realidade. Devido a maior
facilidade de implementação e maior segurança a atual escolha de kernel é o microkernel.
7.1 - Kernel monolíticos
Têm como principal característica o fato de integrarem todas as funcionalidades possíveis do
sistema em um grande "bloco" de software. A adição de novas funcionalidades implica na
recompilação de todo o núcleo. Se um driver apresentar problema pode até travar o sistema.
é estruturado de forma a prover todos os recursos de gerenciamento de aplicações, periféricos,
quando o sistema é inicializado, mantendo-os carregados na memória.
Ex. Linux e BSD
7.2 - Microkernel
É um termo usado para caracterizar um núcleo de sistema cujas funcionalidades não-essenciais ao
seu funcionamento são transferidas para servidores, que se comunicam com o núcleo mínimo
através do “kernel space” (local onde o programa tem acesso a todas as instruções da CPU e a
8
todas as interrupções de hardware), deixando o máximo de recursos rodando no “user space”.
Quando o processador trabalha no “user space”, uma aplicação só pode executar instruções nãoprivilegiadas, tendo acesso a um número reduzido de instruções.
A maior vantagem de um sistema microkernel é sua modularidade. Assim, cada parte do sistema
operacional tem uma função bem definida e bem específica, gerando códigos pequenos e mais
reutilizáveis. O sistema é dividido em partes, sendo cada uma, responsável por um determinado
serviço do computador. Para instalar um driver novo para determinado dispositivo, não é preciso
reiniciar o sistema, reinicializa-se apenas o serviço referente ao driver. Se o driver apresentar
problema, este só iria interferir no serviço correspondente.
O kernel monolítico não ocupa "menos espaço". A questão da modularidade não implica apenas
em "funções bem definidas". A grande diferença é que parte dos processos executam em modo
usuário, como processos de usuário.
Desenvolvido para prover as funções básicas de gerenciamento do sistema rodando em modo
protegido, e o acesso aos recursos como periféricos são feitos através de módulos gerenciadores
(no diagrama abaixo – servers).
Ex: Minix
7.3 - Vantagens do microkernel:
-Interface modular para cada serviço.
-Simplicidade na mudança ou adcionamento de um serviço.
-Flexibilidade.
7.4 - Vantagens do Kernel monolítico:
-Desempenho
Download