- No Linux, sempre dizemos que o primeiro processo é
init
(pid==1). Mas por que não é o kernel (inicialização) que configura o sistema e cria oinit
processo. O kernel é um processo? - Sabemos que todos os threads do espaço do usuário estão enraizados no processo init. Então, e quanto ao agendador e outras coisas do kernel, como gerenciamento de memória?
Basicamente, o que me confunde é a estrutura do kernel. Se for um processo, é um processo único ou consiste em vários processos?
Responder1
Respostas curtas:
- Não, não é um processo
- Threads de usuário não têm raiz no init.
Init é apenas o primeiro processo; ele não gerencia nenhum processo ou thread. Ele cria alguns, usando as chamadas de sistema do kernel fork() e exec.
Acho que você tem uma ideia confusa do que é um processo. isso não significa apenas um pouco de execução de código. Sim, o kernel é executado antes do init (e o gerenciador de boot antes mesmo disso). Mas um 'processo' tem uma definição específica de:
- Executa no espaço do usuário
- Executa com um ID de processo
- Muitas interações precisam passar pelo kernel
- Todos os recursos precisam vir do kernel
- Precisa ser agendado por kernel
Assim, uma vez inicializado o kernel, ele executa o init, que então gera quaisquer outros processos que sua configuração indique.
No que diz respeito ao número 2, todo o material do kernel está, bem, no kernel. Pense no kernel como uma grande área de código. Novamente, não é um processo, mas um grande blob de código. Partes do kernel lidam com o gerenciamento de memória, partes dele com partes de agendamento de si mesmo (como drivers, etc.) e partes dele com processos de agendamento.
Responder2
O kernel realmente não se comporta como um processo. Ele não é agendado, ele é executado em nome de um processo (denominado contexto de processo ou contexto de usuário) ou é executado como resultado de uma interrupção ou exceção (denominado contexto de interrupção).
Dito isto, o kernel do Linux gera threads do kernel para executar algumas tarefas, ou para evitar executar algo no contexto de interrupção por muito tempo (é isso que o thread ksoftirqd faz, evitando latências excessivas que poderiam levar, por exemplo: à queda de áudio,...) .
Você pode ver os threads do kernel na saída do ps
comando. São facilmente identificados: seu nome está entre colchetes. Alguns deles executam uma instância por CPU, a CPU é identificada com um número após uma barra, então [ksoftirqd/0] é a instância de ksoftirqd na CPU 0.
Responder3
Existem conceitos em micro-kernels onde várias partes do kernel são de fato processos com a sentinela primária gerenciando principalmente o IPC.
Linux - para o bem ou para o mal - não é um sistema micro kernel.
Responder4
ninjalj escreveu: "O kernel realmente não se comporta como um processo. Ele não é agendado",
Bem, existe o processo ocioso (basicamente pid 0, embora não seja mostrado em lugar nenhum) que é agendado e quase sempre em estado executável.