Ele não recebe tanto CPU, como é executado. O kernel decide em qual núcleo e quando e por quanto tempo o processo é executado. Ele agenda as tarefas para que cada processo obtenha suas fatias de tempo na CPU: ele é executado por um tempo, depois que a fatia de tempo expira ou quando ocorre uma chamada de sistema, o contexto é alternado para outro processo. O estado do programa é armazenado antes do switch e restaurado quando o kernel decide que merece outra fatia de tempo, de modo que nem perceba o intervalo de tempo. O agendamento pode variar - pode ter um temporizador fixo (milissegundos geralmente), ou pode ser sem ticking ... o kernel também gerencia o agendamento de acordo com a prioridade do processo ( nice
). O processo pode ser bloqueado em núcleos específicos ( taskset
). Para um programa multithread, os threads obtêm suas fatias independentemente e podem ser executados simultaneamente. O kernel pode suspender completamente o programa e reiniciá-lo mais tarde (acionado pelo SIGSTOP e pelo SIGCONT).
A memória é virtualizada. Os ponteiros que você vê em suas linguagens de programação não são blocos físicos de memória, mas os endereços virtuais são remapeados para a camada física. O kernel serve RAM em páginas (por exemplo, 4kB), e até mesmo embaralha um pouco (uma página pode ser trocada para o disco rígido e restaurada apenas na RAM quando você a acessa). mmap
é uma maneira de mapear uma nova página para algum endereço (onde as páginas podem se referir a um arquivo do disco rígido, mapeado para a memória). No entanto, quando você aloca dinamicamente a memória ( malloc
e outros alocadores), cabe ao alocador o que fazer. Geralmente chama sbrk
syscall para solicitar mais espaço para seu pool de memória ou mmap
para partes maiores - as implementações podem variar.
Então, para resumir: a prioridade do processo e as afinidades da CPU podem ser definidas, mas o planejador cuida de como e quando o programa é executado, sem necessidade de interagir com o kernel de forma alguma. A memória é veiculada em páginas e solicitada por meio de chamadas do sistema. Uma vez que você alocou a memória, você a acessa sem a intervenção do kernel, simplesmente através do espaço de endereço virtual.