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