Os sistemas operacionais mais comuns têm algum método de exibição da utilização da CPU. No Windows, este é o Task Manager.
A utilização da CPU é geralmente representada como uma simples percentagem do tempo gasto pela CPU em tarefas não-idles. Mas isto é um pouco simplificado. Em qualquer sistema operacional moderno, a CPU está realmente gastando tempo em dois modos muito distintos:
- Modo Kernel
No modo Kernel, o código de execução tem acesso completo e irrestrito ao hardware subjacente. Ele pode executar qualquer instrução da CPU e referenciar qualquer endereço de memória. O modo Kernel é geralmente reservado para o nível mais baixo, as funções mais confiáveis do sistema operacional. Crashes em modo kernel são catastróficos; eles irão parar o PC inteiro.
- Modo Usuário
Em modo Usuário, o código de execução não tem capacidade de acessar diretamente o hardware ou a memória de referência. O código em modo usuário deve ser delegado às APIs do sistema para acessar o hardware ou a memória. Devido à proteção proporcionada por este tipo de isolamento, as falhas no modo usuário são sempre recuperáveis. A maioria do código em execução no seu computador será executado em modo usuário.
É possível habilitar a exibição do tempo do Kernel no Gerenciador de Tarefas, como eu tenho na captura de tela acima. A linha verde é o tempo total da CPU; a linha vermelha é o tempo do Kernel. O intervalo entre os dois é o tempo do usuário.
Estes dois modos não são meros rótulos; eles são aplicados pelo hardware da CPU. Se o código executado em modo Usuário tenta fazer algo fora de seu alcance — como, por exemplo, acessar uma instrução privilegiada da CPU ou modificar a memória à qual ela não tem acesso — uma exceção trappable é lançada. Ao invés de todo o seu sistema travar, apenas aquela aplicação em particular trava. Esse é o valor do modo Usuário.
x86 O hardware da CPU na verdade fornece quatro anéis de proteção: 0, 1, 2, e 3. Apenas anéis 0 (Kernel) e 3 (User) são tipicamente usados.
Se estamos usando apenas dois anéis de isolamento, é um pouco obscuro onde os drivers de dispositivos devem ir – o código que nos permite usar nossas placas de vídeo, teclados, mouses, impressoras, e assim por diante. Esses drivers rodam em modo Kernel, para máxima performance, ou eles rodam em modo Usuário, para máxima estabilidade? No Windows, pelo menos, a resposta é: depende. Drivers de dispositivos podem rodar tanto em modo usuário quanto em modo kernel. A maioria dos drivers são desviados para o lado do usuário da cerca atualmente, com a notável exceção dos drivers da placa de vídeo, que precisam de desempenho em modo Kernel. Mas mesmo isso está mudando; no Windows Vista, os drivers de vídeo são segmentados em seções Usuário e Kernel. Talvez seja por isso que os jogadores reclamam que o Vista executa cerca de 10% mais lentamente nos jogos.
A borda exata entre esses modos ainda é um pouco obscura. Que código deve ser executado no modo Usuário? Que código deve rodar no modo Kernel? Ou talvez nós vamos apenas redefinir o andar como a base – o aumento da virtualização impulsionou a criação de um novo anel abaixo de todos os outros, Ring -1, que agora conhecemos como virtualização de hardware x86.
O modo Usuário é claramente um bem público líquido, mas vem com um custo. A transição entre o modo Usuário e o modo Kernel é cara. Realmente caro. É por isso que o software que lança exceções é lento, por exemplo. Exceções implicam transições em modo kernel. É verdade, nós temos tanta performance agora que raramente temos que nos importar com a performance de transição, mas quando você precisa de performance final, você definitivamente começa a se importar com essas coisas.
Provavelmente o exemplo mais público de redesenhar a linha usuário / kernel está em servidores web. O IIS 6 da Microsoft moveu uma parte considerável de sua funcionalidade central para o modo Kernel, mais notavelmente depois que um servidor web de código aberto em particular aproveitou o modo Kernel para criar uma enorme vitória de benchmark da indústria. Foi uma espécie de guerra sem sentido, se você me perguntar, uma vez que as otimizações do kernel (em ambos os campos) só se aplicam ao conteúdo HTML estático. Mas tal é o caminho de todas as guerras, benchmark ou não.
A estrita segregação de código do CPU entre o modo Usuário e o 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 catastroficamente o tempo todo. Isto é o que nós programadores extra-crashy-code-writing gostamos de chamar de “progresso”. Por isso, em nome de todos os programadores em todo o lado, gostaria de dizer obrigado Modo utilizador. És o máximo!