A maioria dos sistemas operacionais tem algum método para exibir a utilização da CPU. No Windows, esse método é o Gerenciador de tarefas.
O uso da CPU é geralmente representado como uma porcentagem simples de Tempo de CPU gasto em tarefas não ociosas. Mas isso é um pouco simplificado. Em qualquer sistema operacional moderno, a CPU passa o tempo em dois modos muito distintos:
- Modo do kernel
No modo Kernel, o código em execução tem acesso completo e irrestrito ao hardware subjacente. Ele pode executar qualquer instrução da CPU e fazer referência a qualquer endereço de memória. O modo kernel é geralmente reservado para as funções de nível mais baixo e mais confiáveis do sistema operacional. Os travamentos no modo kernel são catastróficos; eles paralisam o PC inteiro.
- Modo do usuário
No modo de usuário, o código em execução não tem capacidade de diretamente acessar o hardware ou a memória de referência. O código executado no modo de usuário deve delegar às APIs do sistema o acesso ao hardware ou à memória. Devido à proteção proporcionada por esse tipo de isolamento, as falhas no modo de usuário são sempre recuperáveis. A maior parte do código em execução no seu computador será executada no modo de usuário.
É possível habilitar a exibição da hora do Kernel no Gerenciador de Tarefas, como fiz na captura de tela acima. O linha verde é o tempo total de CPU; a linha linha vermelha é o tempo do kernel. A diferença entre as duas é o tempo do usuário.
Esses dois modos não são meros rótulos; eles são impostos pelo hardware da CPU. Se o código executado no modo de usuário tentar fazer algo fora de sua alçada – como, por exemplo, acessar uma instrução privilegiada da CPU ou modificar a memória à qual não tem acesso -, será lançada uma exceção rastreável. Em vez de todo o sistema falhar, apenas esse aplicativo específico falha. Esse é o valor do modo de usuário.
O hardware da CPU x86 fornece, na verdade, quatro anéis de proteção: 0, 1, 2 e 3. Normalmente, apenas os anéis 0 (Kernel) e 3 (Usuário) são usados.
Se estivermos usando apenas dois anéis de isolamento, não está claro para onde os drivers de dispositivo devem ir: o código que nos permite usar nossas placas de vídeo, teclados, mouses, impressoras e assim por diante. Esses drivers são executados no modo Kernel, para obter o máximo desempenho, ou são executados no modo Usuário, para obter a máxima estabilidade? No Windows, pelo menos, a resposta é depende. Drivers de dispositivo podem ser executados no modo de usuário ou no modo kernel. Atualmente, a maioria dos drivers é desviada para o lado do usuário, com a notável exceção dos drivers de placa de vídeo, que precisam de desempenho no modo kernel. Mas até isso está mudando, no Windows Vista, os drivers de vídeo são segmentados em seções de usuário e de kernel. Talvez seja por isso que os jogadores reclamam que o Vista tem um desempenho cerca de 10% mais lento nos jogos.
A fronteira exata entre esses modos ainda não está clara. Qual código deve ser executado no modo de usuário? Que código deve ser executado no modo Kernel? Ou talvez apenas redefinamos o piso como o porão. O aumento da virtualização impulsionou a criação do um novo anel abaixo de todos os outros, o Anel -1, que agora conhecemos como virtualização de hardware x86.
O modo de usuário é claramente um bem público líquido, mas tem um custo. A transição entre os modos Usuário e Kernel é cara. Realmente caro. É por isso que a softwares que lançam exceções são lentos, por exemplo. As exceções implicam em transições de modo do kernel. Concedido, temos muito desempenho agora que raramente precisamos nos preocupar com o desempenho de transição, mas quando o senhor precisa do desempenho máximo, definitivamente começa a se preocupar com essas coisas.
Provavelmente, o exemplo mais público de redesenho da linha usuário/kernel está nos servidores da Web. O IIS 6 da Microsoft transferiu uma parte considerável de sua funcionalidade principal para o modo Kernelprincipalmente depois que o um servidor web de código aberto específico aproveitou o modo Kernel para criar um grande vitória de referência no setor. Na minha opinião, foi uma guerra inútil, pois as otimizações do kernel (em ambos os campos) só se aplicam ao conteúdo HTML estático. Mas é assim com todas as guerras, sejam elas de benchmark ou não.
A rigorosa segregação de código da CPU entre os modos Usuário e Kernel é completamente transparente para a maioria de nós, mas é literalmente a diferença entre um computador que trava o tempo todo e um computador que trava de forma catastrófica o tempo todo. Isso é o que nós, programadores que escrevem códigos extra-cráticos, gostamos de chamar de “progresso”. Portanto, em nome de todos os programadores de todo o mundo, eu gostaria de dizer obrigado Modo de usuário. O senhor é demais!