terça-feira, 3 de janeiro de 2012



Anatomia de um kernel

… uma visão global.


O núcleo (kernel) de um sistema operacional é o responsável pela camada que faz a interface entre o hardware e os serviços principais do SO. No caso do Linux, ele tem uma estrutura derivada do MINIX do Tannenbaum [1], desenvolvido pelo Linus Torvalds ainda quando estudante. Torvalds tomou por base o microkernel MINIX e criou um kernel monolítico com cinco subsistemas [2]:

1. O Process scheduler (SCHED) que é responsável pelo controle de acesso dos processos à CPU. Ele cria as facilidades de interface entre hardware – CPU – processos. É o SCHED que controla os semáforos do sistema operacional Linux (veja o artigo sobre semáforos).

2. O Memory Manager (MM) que controla o uso da memória principal pelos processos de forma segura e eficiente. O MM suporta memórias virtuais que permite ao Linux rodar processos que usem mais memória do que disponível no sistema e, ainda, controla a paginação de segmentos de memória na área de SWAP.

3. O Virtual File System (VFS) que reune a diversidade de hardware em uma interface comum, criando uma abstração dos detalhes de cada tipo de dispositivo. O VFS também permite a utilização concomitante e simultânea de vários formatos de sistemas de arquivos (Mac, DOS, BSD etc.).

4. O Network Interface (NET) que disponibiliza e controla o acesso a dispositivos de rede, tais como placas de rede, MODEM, Bluetooth etc.

5. O Inter-Process Communication (IPC) é o subsistema que controla a interação entre os processos e prove a comunicação entre eles. É o IPC que é responsável pela preemptividade (ver meu artigo sobre preemptividade e multitarefa).

Figura 1 - Esquema de relações entre os subsistemas do kernel do Linux


Na figura 1 se observa que o subsistema principal ou centro do núcleo é o SCHED do qual dependem todos os outros processos pois ele é quem controla o tempo de execução de cada processo. O IPC depende do MM para alocar e compartilhar a memória pois isto permite que dois processos acessem a mesma área de memória comum. A relação entre o SCHED e o MM está ligada ao gerenciamento do mapa de memória do hardware para controle de acesso de cada processo em execução. Isto permite que os segmentos de memória sejam "paginados" e reconstituídos dependendo do processo em execução. O VFS usa o NET para suportar o dispositivo de ramdisk e o sistema de arquivo remoto (NFS) [3]

Além do subsistema MM depender do SCHED ele usa o subsistema VFS para suporte ao swap principalmente quando um processo precisa acessar um segmento que se encontra "paginado" (swapped).

A vantagem de um kernel monolítico está na performance. Embora um microkernel seja mais flexível, um kernel monolítico permite que o núcleo e todos os serviços rodem como um único processo, num espaço de endereçamento único possibilitando uma alta performance (serviços em um microkernel rodam e espaços de endereçamento separados).

Existem vantagens e desvantagens na comparação de um microkernel e um kernel monolítico. Por exemplo, em um microkernel a manutenção é mais simples porque qualquer modificação é feita em cada tarefa (task) do subsistema. Por outro lado, é necessário 2 vezes a chamada de TASK_SWITCH (uma para entrar no âmbito da tarefa e outro para retornar da função).

Os microkernels são bons exemplos didáticos de sistemas (e.g. Minix) mas não são otimizados. O kernel do Linux pode usar "threads" do kernel para implementar uma estrutura do tipo microkernel como, por exemplo, o daemon kswapd (kernel swap daemon) que é usado para recuperar as páginas de memória na área de swap e não tem problemas de performance pois a operação é lenta por natureza.


Referências:

[1] Tanenbaum, A. S. Modern Operating Systems, Prentice Hall, 1992

[2] Bovet, D. P. e Cesati, M. Understanding the Linux Kernel, O'Reilly, 2000

[3] Rubini, A. Linux Device Drivers, O'Reilly, 1998

Nenhum comentário:

Postar um comentário