Isso depende muito do tipo de aplicativo que você executa. Se você tem aplicativos que são muito fáceis de usar no WRT, você pode esperar ver grandes quantidades de mudança de contexto. Se a maioria de seus aplicativos ficar inativa e só acordar quando houver coisas acontecendo em um soquete, você poderá ver taxas baixas de troca de contexto.
Chamadas do sistema
Chamadas de sistema causam mudanças de contexto por sua própria natureza. Quando um processo faz uma chamada de sistema, ele basicamente diz ao kernel para assumir o ponto atual no tempo e memória para fazer coisas que o processo não é privilegiado para fazer, e retornar ao mesmo ponto quando estiver pronto.
Quando olhamos para a definição do syscall write (2) do Linux, isso fica muito claro:
NAME write - write to a file descriptor SYNOPSIS #include ssize_t write(int fd, const void *buf, size_t count); DESCRIPTION write() writes up to count bytes from the buffer pointed buf to the file referred to by the file descriptor fd. [..] RETURN VALUE On success, the number of bytes written is returned (zero indicates nothing was written). On error, -1 is returned, and errno is set appropriately. [..]
Isso basicamente diz ao kernel para assumir a operação do processo, mover para count
bytes, começando do endereço de memória apontado por *buf
para o descritor de arquivo fd
do processo atual e, em seguida, retornar para o processo e diga-lhe como foi.
Um bom exemplo para mostrar isso é o servidor de jogo dedicado para jogos baseados em Valve Source, hlds . link mostra um segundo valor de syscalls feito por uma única instância de um servidor de jogo que não tinha jogadores nele. Esse processo leva cerca de 3% do tempo de CPU em um Xeon X3220 (2.4Ghz), apenas para dar uma idéia do quanto isso é caro.
Multitarefas
Outra fonte de mudança de contexto pode ser processos que não fazem syscalls, mas precisam ser removidos de uma determinada CPU para abrir espaço para outros processos.
Uma boa maneira de visualizar isso é cpuburn . O cpuburn não faz nenhum syscalls em si, apenas faz a iteração da sua própria memória, por isso não deve causar nenhuma mudança de contexto.
Pegue uma máquina ociosa, inicie o vmstat e execute um burnMMX (ou qualquer teste diferente do pacote cpuburn) para cada núcleo de CPU que o sistema tiver. Você deve ter a utilização total do sistema até então, mas dificilmente haverá maior troca de contexto. Em seguida, tente iniciar mais alguns processos. Você verá que a taxa de troca de contexto aumenta à medida que os processos começam a competir pelos núcleos da CPU. A quantidade de comutação depende da relação processos / núcleo e da resolução multitarefa do seu kernel.
Leitura adicional
linfo.org tem uma boa descrição sobre quais opções de contexto e chamadas do sistema são. Wikipedia tem informações genéricas e uma boa coleção de links nas chamadas do Sistema.