Não tem sido um processo de troca desde os anos 90, e a troca não tem sido usada desde a década de 1970.
Os Unices pararam de usar a troca há muito tempo. Eles foram sistemas operacionais paginados por demanda por algumas décadas - desde System V R2V5 e 4.0BSD. O processo de swapper, como era, usado para executar operações swap de processo . Ele costumava trocar processos inteiros - incluindo todas as estruturas de dados do kernel-space para o processo - para o disco e trocá-los novamente. Ele seria acordado, pelo kernel, regularmente e examinaria a tabela de processos para determinar quais processos trocados e prontos para serem executados poderiam ser trocados e quais processos de troca entre adormecidos poderia ser trocado. Qualquer livro didático sobre Unix da década de 1980 vai abordar isso com mais detalhes, incluindo o algoritmo de troca. Mas é em grande parte irrelevante para os Unices paginados por demanda, embora tenham mantido o antigo mecanismo de troca por vários anos. (Os BSDs tentaram bastante evitar a troca, a favor da paginação, por exemplo).
O processo # 0 é o primeiro processo no sistema, criado pelo kernel. É fork()
s processo 1, o primeiro processo do usuário. O que ele faz além do depende do que o sistema operacional do Unix realmente é . Como mencionado, os BSDs antes do FreeBSD 5.0 retinham o antigo mecanismo de swapper, e o processo # 0 simplesmente entrava no código do swapper no kernel, a função scheduler()
, depois de ter terminado a inicialização do sistema. O System V era praticamente o mesmo, exceto que o processo # 0 era convencionalmente denominado sched
em vez de swapper
. (Os nomes são escolhas bastante arbitrárias.) Na verdade, a maioria - possivelmente todos - do Unices tinha um mecanismo de swapper antigo (em grande parte não utilizado) que permanecia como o processo # 0.
O Linux, tradicionalmente, tem sido um pouco diferente dos Unices, nesse processo # 0 é o processo ocioso , executando cpu_idle()
. Simplesmente não faz nada, em um loop infinito. Existe para que haja sempre uma tarefa pronta para ser agendada.
Mesmo esta é uma descrição desatualizada. O final dos anos 80 e início dos anos 90 foi o advento dos sistemas operacionais multi-threading, como resultado de que o processo # 0 tornou-se simplesmente o processo do sistema . No mundo dos Unices single-threaded antigos, só é possível obter um fluxo de execução separado para executar uma tarefa de kernel contínuo, fork()
de um processo. Portanto, todas as tarefas do kernel ( vmdaemon
, pagedaemon
, pagezero
, bufdaemon
, syncer
, ktrace
e assim por diante nos sistemas FreeBSD, por exemplo) eram processos de baixa numeração, fork()
ed pelo processo # 0 após ele fork()
ed ìnit
. Em Unices de vários encadeamentos, não faz sentido criar um contexto de processo totalmente novo para algo que é executado inteiramente no espaço do kernel e não precisa de um espaço de endereço, tabela de descritor de arquivo e tudo mais para ele mesmo. Assim, todas essas tarefas se tornaram (essencialmente) encadeamentos, compartilhando o espaço de endereço de um único processo do sistema.
Ao longo do caminho, vários Unices perderam o antigo mecanismo de swapper, que eles estavam tentando ao máximo evitar o uso de qualquer maneira. O código de inicialização do OpenBSD agora simplesmente cai em um loop while(1) tsleep(…);
, por exemplo, sem nenhum mecanismo de troca em qualquer lugar.
Então hoje em dia process # 0 em um Unix é o processo do sistema , que efetivamente mantém vários threads do kernel fazendo várias coisas , variando de operações de saída de página, passando por liberações de cache do sistema de arquivos e zeramento de buffer, até o tempo ocioso quando não há mais nada para executar.