Qual é o objetivo principal do processo do swapper no Unix?

4

Qual é o propósito principal do processo de swap no Unix?

O processo Swapper tem o PID 0 e eu acho que é o primeiro processo que carrega. Alguém pode lançar mais luz sobre esse assunto?

    
por Gaara 12.01.2012 / 10:12

3 respostas

11

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.

    
por 12.01.2012 / 16:25
5

O processo 0 é um processo especial (chamado de processo swapper ou ocioso) que é executado quando o sistema está ocioso, ou seja, nenhum outro processo está agendado. É o único processo que pode invocar a chamada do sistema idle() .

Este é o primeiro processo a ser gerado, que cria init (PID 1), que inicia outros processos.

root         1     0 /sbin/init

Você também pode verificar man idle .

Veja também: Entendendo o Kernel do Linux - Programação de Processos

    
por 12.01.2012 / 10:47
1

O motivo é histórico e programático. A tarefa inativa é a tarefa em execução, se nenhuma outra tarefa for executável, como você disse. Ele tem a prioridade mais baixa possível, e é por isso que a execução de nenhuma outra tarefa é executável.

Razão programática: Isto simplifica muito o processo, porque você não precisa se preocupar com o caso especial: "O que acontece se nenhuma tarefa for executável?", porque sempre há pelo menos uma tarefa executável, a tarefa ociosa . Além disso, você pode contar a quantidade de tempo de CPU usada por tarefa. Sem a tarefa inativa, qual tarefa recebe o tempo de processamento da conta não é necessária?

Motivo histórico: antes que tivéssemos CPUs capazes de descer ou entrar em modos de economia de energia, ele precisava ser executado a toda velocidade a qualquer momento. Ele executou uma série de instruções NOP, se nenhuma tarefa fosse executável. Hoje, o agendamento da tarefa inativa geralmente desce a CPU usando instruções HLT (halt), então a energia é salva. Portanto, há uma funcionalidade de alguma forma na tarefa ociosa em nossos dias.

No Windows, você pode ver a tarefa ociosa na lista de processos, é o processo ocioso.

    
por 14.09.2015 / 00:25

Tags