Conceitos básicos de processos Linux - status do processo, composição do processo, controle do processo

Índice

Processo Linux

Conceitos básicos de processo

status do processo

Composição do processo

controle do processo

Criação e encerramento de processos


Processo Linux

referência:

Conceitos básicos de processo

Programas e Processos

Em termos leigos, um programa é um arquivo que contém código executável e é um arquivo estático. Um processo é uma instância de um programa que iniciou a execução, mas ainda não terminou. É a implementação específica do arquivo executável. Um programa pode ter muitos processos e cada processo pode ter muitos processos filhos.

status do processo

  1. Estado de criação: O processo está sendo criado e ainda não foi transferido para o estado pronto.

  2. Estado pronto: o processo obteve todos os recursos necessários, exceto o processador, e pode ser executado imediatamente assim que obtiver o processador.

    • Características de status: Recursos do processador (ou agendador): falta apenas o processador. Aquisição de recursos: Os recursos necessários foram obtidos. Quando um processador for obtido: execute imediatamente.

    • Transição de estado: Estado pronto -> Estado em execução: Após o processo no estado pronto ser agendado, ele obtém recursos do processador, então o processo muda do estado pronto para o estado em execução.

  3. Estado de execução: O processo está em execução no processador; para um único processador, apenas um processo está no estado de execução ao mesmo tempo.

    • Transição de estado: Estado em execução -> Estado pronto: Caso 1: Depois que o intervalo de tempo se esgota, o processo no estado em execução deve abandonar o processador e então fazer a transição para o estado pronto. Caso 2: Em um sistema operacional privado, quando um processo de maior prioridade está pronto, o escalonador converte o processo em execução em um estado pronto para permitir a execução do processo de maior prioridade.

    • Transição de estado: estado de execução -> estado de bloqueio (comportamento ativo): Quando um processo solicita o uso de um determinado recurso (como um periférico) ou espera pela ocorrência de um determinado evento (como a conclusão de uma operação de E/S). ), ele muda do estado de execução Converter para o estado de bloqueio. O processo solicita ao sistema operacional que forneça serviços na forma de uma chamada de sistema, que é uma forma especial na qual um programa em modo de usuário chama o processo do kernel do sistema operacional.

  4. Estado de bloqueio: também conhecido como estado de espera, o processo está aguardando um determinado evento e suspende a execução/suspensão. Por exemplo, aguardando a conclusão de um determinado recurso ou IO, o processo não pode ser executado mesmo se o processador estiver ocioso.

    • Características de status: Recursos do processador (ou escalonador): podem estar faltando; podem não estar faltando. Aquisição de recursos: aguardar que um recurso esteja disponível ou aguardar que algo seja concluído. Ao obter um processador: Mesmo que o processador esteja ocioso, ele ainda não poderá ser executado quando o que está esperando não for concluído.

    • Transição de estado: Estado bloqueado -> Estado pronto (comportamento passivo, necessitando de assistência de outros processos relacionados): Quando chega o evento que o processo está aguardando, como o fim da operação de E/S ou o fim da interrupção, o o manipulador de interrupção deve alterar o status do processo correspondente de transição de estado bloqueado para estado pronto.

  5. Estado de término: O processo está desaparecendo do sistema. Pode ser que o processo termine normalmente ou saia por outros motivos.

Correspondendo aos sinalizadores de cada status de processo no kernel Linux:

  • TASK_RUNNINGIsso significa que o processo está pronto. Depende se o sistema operacional aloca um intervalo de tempo para executar na CPU. Se o processo obtiver um intervalo de tempo, é o estado de execução. Se não alocar um intervalo de tempo, é o estado pronto. Os campos que representam o status não precisam ser alterados.

    • Na verdade, TASK_RUNINGeste campo corresponde tanto ao estado pronto do processo quanto ao estado de execução do processo.

    • Somente processos neste estado podem ser executados na CPU. Pode haver vários processos no estado executável ao mesmo tempo, e as estruturas task_struct (blocos de controle de processo) desses processos são colocadas na fila executável da CPU correspondente (um processo só pode aparecer na fila executável de uma CPU em maioria). A tarefa do escalonador de processos é selecionar um processo da fila executável de cada CPU para ser executado naquela CPU.

    • Enquanto a fila de executáveis ​​não estiver vazia, sua CPU correspondente não pode ser preguiçosa e deve executar um dos processos. A CPU neste momento é geralmente chamada de "ocupada". Da mesma forma, CPU "inativa" significa que sua fila de executáveis ​​correspondente está vazia, de modo que a CPU não tem nada para fazer.

    • Muitos livros didáticos de sistemas operacionais definem processos que estão em execução na CPU como o estado RUNNING, e processos que são executáveis, mas ainda não foram agendados para execução como o estado READY.Esses dois estados são unificados no estado TASK_RUNNING no Linux.

  • TASK_INTERRUPTIBLEe TASK_UNINTERRUPTIBLEsão dois estados de suspensão, correspondentes ao estado de bloqueio acima. TASK_INTERRUPTIBLEPode ser acordado por sinais novamente, TASK_UNINTERRUPTIBLEmas não pode ser acordado por sinais.

    • TASK_INTERRUPTIBLE, estado de suspensão interrompível. O processo neste estado é suspenso porque está aguardando a ocorrência de um determinado evento (como aguardar uma conexão de soquete, aguardar um semáforo). As estruturas task_struct desses processos são colocadas na fila de espera dos eventos correspondentes. Quando esses eventos ocorrerem (desencadeados por interrupções externas ou desencadeados por outros processos), um ou mais processos na fila de espera correspondente serão despertados. Através do comando ps veremos que, em circunstâncias normais, a grande maioria dos processos da lista de processos está no estado TASK_INTERRUPTIBLE (a menos que a carga na máquina seja muito alta).

    • TASK_UNINTERRUPTIBLE, estado de suspensão ininterrupto. Semelhante ao estado TASK_INTERRUPTIBLE, o processo está em estado de suspensão, mas é ininterrupto neste momento. Ininterruptível não significa que a CPU não responda às interrupções do hardware externo, mas que o processo não responde aos sinais assíncronos. Ou seja, kill -9 não pode encerrar/eliminar esse tipo de processo. A importância do estado TASK_UNINTERRUPTIBLE é que certos fluxos de processamento do kernel não podem ser interrompidos. Se você responder a um sinal assíncrono, um processo para processamento de sinais assíncronos será inserido no fluxo de execução do programa (esse processo inserido pode existir apenas no modo kernel, ou pode se estender para o modo usuário), então o processo original será ser interrompido. .

      Quando um processo opera em determinado hardware (por exemplo, o processo chama a chamada de sistema read para ler um arquivo de dispositivo, e a chamada de sistema read eventualmente executa o código do driver de dispositivo correspondente e interage com o dispositivo físico correspondente), pode ser necessário usar o estado TASK_UNINTERRUPTIBLE para proteger o processo e evitar que a interação entre o processo e o dispositivo seja interrompida e faça com que o dispositivo caia em um estado incontrolável. O estado TASK_UNINTERRUPTIBLE neste caso é sempre de curta duração e é basicamente impossível de capturar através do comando ps. Há também um estado TASK_UNINTERRUPTIBLE que é fácil de capturar em sistemas Linux. Depois de executar a chamada do sistema vfork, o processo pai entrará no estado TASK_UNINTERRUPTIBLE até que o processo filho chame exit ou exec.

  • TASK_STOPPEDÉ o estado em que o processo recebe sinais como SIGSTOP e SIGTTIN.Quando o seu processo Linux está em execução e você pressiona Ctrl + z, o processo estará neste estado.

    • Envie um sinal SIGSTOP para um processo e ele entrará no estado TASK_STOPPED em resposta ao sinal (a menos que o próprio processo esteja no estado TASK_UNINTERRUPTIBLE e não responda ao sinal). (SIGSTOP, como o sinal SIGKILL, é muito obrigatório. O processo do usuário não tem permissão para redefinir a função de processamento de sinal correspondente por meio da chamada do sistema da série de sinais.)

    • O envio de um sinal SIGCONT ao processo pode restaurá-lo do estado TASK_STOPPED para o estado TASK_RUNNING.

  • TASK_TRACEDÉ o status do processo que está sendo monitorado.

    • Quando um processo está sendo rastreado, ele está no estado especial TASK_TRACED. "Sendo rastreado" significa que o processo está pausado e aguardando que o processo que o está rastreando opere nele. Por exemplo, se você definir um ponto de interrupção no processo rastreado no gdb, o processo estará no estado TASK_TRACED quando parar no ponto de interrupção. Outras vezes, o processo rastreado ainda está nos estados mencionados anteriormente.

    • Julgamento de status TASK_STOPPED e TASK_TRACED. Para o processo em si, os estados TASK_STOPPED e TASK_TRACED são muito semelhantes, ambos indicando que o processo está suspenso. O estado TASK_TRACED é equivalente a uma camada adicional de proteção sobre TASK_STOPPED. O processo no estado TASK_TRACED não pode ser despertado em resposta ao sinal SIGCONT. O processo depurado só pode retornar ao estado TASK_RUNNING até que o processo de depuração execute operações como PTRACE_CONT e PTRACE_DETACH por meio da chamada de sistema ptrace (operações especificadas por meio dos parâmetros da chamada de sistema ptrace) ou o processo de depuração seja encerrado.

  • TASK_DEAD- EXIT_ZOMBIE, status de saída, o processo se torna um processo zumbi. EXIT_DEADÉ o estado final. Entrar neste estado significa que o processo será excluído do sistema. EXIT_ZOMBIEÉ EXIT_DEADo estado anterior. Neste momento, o processo foi encerrado, mas o processo pai ainda não esperou que wait()a chamada do sistema obtivesse seu informações de encerramento. O processo neste estado é chamado de processo zumbi. Nesse estado, o comando kill não pode matá-lo. Você pode pensar em como limpar processos zumbis e como evitar a existência de processos zumbis.

    Em relação ao status do processo relacionado à saída (os quatro acima), para obter mais detalhes, consulte  o blog-CSDN do Linux Process Analysis_deep_explore .

Diagrama de transição de estado do processo Linux:

Códigos STAT comuns para processos do sistema:

Fila pronta e fila de bloqueio:

Fila pronta: pode haver vários processos no estado pronto no sistema e geralmente são colocados em uma fila. Contanto que a fila de prontos não esteja vazia, a CPU sempre pode agendar processos para serem executados e permanecerem ocupados. Isso não tem nada a ver com o número de processos prontos; a menos que a fila de prontos esteja vazia, a CPU entra em estado de espera e a CPU a eficiência diminui.

Fila de bloqueio: O sistema geralmente coloca processos bloqueados em uma fila e até configura várias filas de bloqueio com base em diferentes motivos de bloqueio.

Composição do processo

Essas estruturas de dados citadas no processo - Zhihu (zhihu.com) , a estrutura task_struct no Linux - Biblioteca Baidu (baidu.com) .

O processo geralmente consiste nas seguintes partes:

  • Bloco de controle de processo (PCB) : Quando cada processo é criado, o sistema criará um PCB correspondente para o processo. O PCB é a única indicação de que existe um processo.

    • A essência da criação de um processo é criar o PCB do processo. O PCB deve ser capaz de exibir identidades e relacionamentos de processos, marcar status de tarefas, marcar permissões, ajudar no agendamento de tarefas, etc.

    • No kernel Linux, processos e threads são unificados como tarefas. O bloco de controle de processo do kernel Linux é uma task_structestrutura que contém:

      • O identificador do processo (um identificador de processo ou PID); (o identificador exclusivo do próprio processo, PID)

      • Registrar valores para o processo incluindo, notadamente, o contador de programa e valores de ponteiro de pilha para o processo; Contador de programa PC, etc.)

      • O espaço de endereço para o processo;

      • Prioridade (em que o processo de maior prioridade obtém a primeira preferência. Por exemplo, bom valor em sistemas operacionais Unix);(优先级)

      • Informações contábeis do processo, como quando o processo foi executado pela última vez, quanto tempo de CPU acumulou, etc;

      • Ponteiro para o próximo PCB, ou seja, ponteiro para o PCB do próximo processo a ser executado;

      • Informações de E/S (ou seja, dispositivos de E/S alocados para este processo, lista de arquivos abertos, etc.).

    • pid_t pid; // Exibe o id do seu próprio processo 
      pid_t tgid; // O id do thread principal do processo 
      struct task_struct *group_leader; // Aponta para o endereço do thread principal

      Cada processo criará um thread principal, portanto, se houver apenas um único processo, e o thread principal criado pelo processo por padrão, então e pidserão tgideles mesmos. Se for um thread filho criado por um processo, então pidele é próprio ide tgidaponta para o id do thread principal do processo.

    • struct task_struct __rcu * real_parent; 
      struct task_struct __rcu * parent; // Aponta para o processo pai 
      struct list_head children; // Todos os processos filhos do processo pai estão na lista vinculada do processo filho, e isso aponta para o topo da lista vinculada . 
      struct list_head sibling; // Conecta processos irmãos

      O processo é uma estrutura semelhante a uma árvore (uma árvore composta por listas vinculadas), com exceção do processo nº 0, todos os processos são criados pelo processo pai, portanto, as operações no processo pai podem facilmente afetar o processo filho. Portanto, a estrutura de dados do processo mostra naturalmente quais processos pai, filho e irmão o processo possui.

  • Segmento de programa : Um segmento de programa é um segmento de código de programa em um processo que pode ser agendado para ser executado na CPU pelo escalonador de processo.

  • Segmento de dados : podem ser os dados originais processados ​​pelo processo correspondente ao programa, ou podem ser o resultado intermediário ou dados de resultado gerados quando o programa é executado.

controle do processo

A principal função do controle de processos é gerenciar efetivamente todos os processos do sistema, tem as funções de criar novos processos, cancelar processos existentes e realizar transições de estado de processo. Em suma, o controle do processo visa alcançar a transição do estado do processo.

O segmento geral do programa de controle de processo é uma "operação atômica" e não pode ser interrompido durante o processo de execução; ele usa as duas instruções privilegiadas "interrupção na instrução" e "interrupção na instrução" para obter atomicidade.

Criação e encerramento de processos

Conceitos de controle de processos relacionados à criação e encerramento de processos.

Eventos que causam a criação do processo

  • Login do usuário: No sistema de time-sharing, se o usuário efetuar login com sucesso, o sistema criará um novo processo para ele.

  • Agendamento de trabalho: Em um sistema de processamento em lote multicanal, quando um novo trabalho é colocado na memória, um novo processo será criado para ele.

  • Prestação de serviços: Quando o usuário faz determinadas solicitações ao sistema operacional, um novo processo será criado para atender a solicitação. O lançamento de um programa cria um novo processo.

  • Solicitação de aplicação: O processo do usuário solicita ativamente a criação de um processo filho.

O processo pelo qual o sistema operacional cria um novo processo

  1. Passo 1: Atribua um número de identificação de processo exclusivo ao novo processo e solicite um PCB em branco (o PCB é limitado). Se a aplicação do PCB falhar, a criação falhará.

  2. Passo 2: Aloque os recursos necessários ao processo, como arquivos, memória, dispositivos de E/S e tempo de CPU. Esses recursos são obtidos do sistema operacional ou de seu processo pai. Se não houver recursos suficientes (como memória), a criação não falha neste momento, mas fica no estado de criação, aguardando recursos de memória.

  3. Etapa 3: inicializar o PCB, incluindo principalmente informações do sinalizador de inicialização, informações de status do processador de inicialização e informações de controle do processador de inicialização, bem como definir a prioridade do processo, etc.

  4. Passo 4: Se a fila de processos prontos puder aceitar o novo processo, insira o novo processo na fila de prontos e aguarde o agendamento para execução.

Processo pai cria processo filho

Um processo pode criar outro processo, neste momento o criador é chamado de processo pai e o processo criado é chamado de processo filho. O processo filho pode herdar os recursos pertencentes ao processo pai; quando o processo filho é cancelado, os recursos obtidos do processo pai devem ser devolvidos ao processo pai; quando o processo pai é cancelado, todos os seus processos filhos geralmente são cancelados ao mesmo tempo. . O processo pai e o processo filho compartilham alguns recursos, mas não podem compartilhar o espaço de endereço virtual.Quando o processo filho é criado, recursos, como o espaço de endereço virtual, serão alocados ao processo filho.

É claro que o processo pai e o processo filho podem ser executados simultaneamente. O bloco de controle de processo (PCB) é o único sinal da existência de um processo, e cada processo possui seu próprio PCB. O processo pai e o processo filho não podem usar o mesmo recurso crítico ao mesmo tempo. Os recursos críticos só podem ser usados ​​por um processo de cada vez (os recursos críticos têm um mecanismo de bloqueio e só podem ser acessados ​​mutuamente).

Todos os processos criados no sistema Linux são criados por processos existentes (exceto o processo nº 0).O processo criado é chamado de processo filho, e o processo que cria o processo filho é chamado de processo pai. Os processos do Linux são agrupados em uma estrutura de árvore.

Eventos que causam o encerramento do processo

  • Fim normal: Indica que a tarefa do processo foi concluída e está pronta para sair.

  • Final anormal: Significa que ocorreu algum evento anormal durante a execução do processo, que impediu que o programa continuasse a execução, como área de armazenamento fora dos limites, erro de proteção, instrução ilegal, erro de instrução privilegiada, tempo limite de execução, erro de operação aritmética, Falha de E/S, etc.

  • Intervenção externa: refere-se ao processo que termina a pedido do mundo exterior, como intervenção do operador ou do sistema operacional, solicitação do processo pai e encerramento do processo pai.

O processo pelo qual o sistema operacional encerra um processo

  1. Passo 1: De acordo com o identificador (PID) do processo encerrado, recupere o PCB do processo e leia o status do processo a partir dele.

  2. Passo 2: Se o processo encerrado estiver no estado de execução, a execução do processo deverá ser encerrada imediatamente e os recursos do processador deverão ser alocados para outros processos.

  3. Passo 3: Se o processo tiver processos descendentes, todos os seus processos descendentes deverão ser encerrados.

  4. Passo 4: Retorne todos os recursos pertencentes ao processo para seu processo pai ou para o sistema operacional.

  5. Passo 5: O PCB é excluído da fila.

Visualize e interprete processos individuais

ps - efPodemos visualizar o processo atual do sistema através do comando no sistema Linux .

  • UID é o identificador do usuário (o UID do processo criado pelo usuário root é root. Se eu mesmo o criar, deverá ser meu nome de usuário.

  • PID representa o ID do processo atual.

  • PPID representa o ID do processo pai do processo atual.

Crie o processo nº 1 e o processo nº 2 até o processo nº 0, a seguir crie um processo em modo de usuário por meio do processo nº 1 e, a seguir, crie um processo em modo kernel por meio do processo nº 2, gerando assim uma árvore de processos Linux.

  • 0号进程: Durante o processo de inicialização do kernel, o processo nº 0 será criado primeiro através da instrução struct task_struct init_task = INIT_TASK(init_task). Este é o único processo que não foi gerado via fork ou kernel_thread. é o primeiro na lista de processos. Mas este processo não é um processo no sentido real, é semelhante ao topo de uma lista encadeada. Portanto, embora o processo nº 0 tenha sido criado no estado kernel, não podemos dizer que o processo nº 0 é o primeiro processo no estado kernel. Em vez disso, devemos dizer que o processo nº 2 é o primeiro processo no estado kernel.

  • 1号进程: Criado chamando a instrução kernel_thread(kernel_init, NULL, CLONE_FS) para mudar do modo kernel para o modo de usuário. O processo nº 1 é o ancestral de todos os modos de usuário. O processo 1 também é chamado de processo init . É o segundo thread do kernel criado durante a inicialização do kernel. Seu código em execução é a função do kernel init(). Enquanto o sistema não terminar, o processo init nunca terminará, sendo responsável por criar e monitorar as atividades de todos os processos fora do sistema operacional.

  • 2号进程: Criado chamando a instrução kernel_thread(kthreadd, NULL, ClONE_FS | CLONE_FILES) O processo nº 2 é responsável pelo agendamento e gerenciamento de todos os processos de estado do kernel e é o ancestral de todos os processos no estado do kernel. (Observe que o estado do kernel não faz distinção entre threads e processos, portanto, processos e threads são tarefas).

pstreeComando para exibir toda a árvore de processos,  comando básico do Linux --- exibir árvore de processos pstree_weixin_34023863's blog-CSDN blog .

Acho que você gosta

Origin blog.csdn.net/Staokgo/article/details/132630630
Recomendado
Clasificación