O que é o "Canal em espera" de um processo?

36

Na guia Processos do GNOME System Monitor, há uma coluna "Waiting Channel". De longe, os valores mais comuns que vejo aqui são poll_schedule_timeout , mas também vejo outros valores: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagram e unix_stream_data_wait .

Então, o que essa coluna "Canal em espera" significa? E talvez o que alguns desses valores signifiquem?

Captura de tela

8128
fonte

Respostas:

42

O canal de espera é o local no Kernel em que a tarefa está aguardando no momento. Uma tarefa precisa aguardar um Recurso, que pode ser dados ou tempo de processamento. Esses dois incluem soquetes de rede, hardware, arquivos e assim por diante; já que a maioria deles são apenas arquivos, em sistemas similares ao Unix.

  • 0: O processo não está esperando

  • poll_schedule_timeout

    poll()é uma chamada de sistema 1 usada para manipular E / S. É semelhante a select(). 2

    Os aplicativos que usam E / S sem bloqueio usam essas chamadas para verificar se podem ler ou gravar em um arquivo, sem ter que bloqueá-lo. Eles são frequentemente usados ​​para fluxos de entrada / saída, que podem não estar bloqueados (caso contrário, talvez o mouse pare para se mover).

    O canal de espera poll_schedule_timeoutindica que uma tarefa está aguardando E / S, tanto hardware como teclados e mouses, dispositivos de som ou até soquetes de rede.

    1. Uma função no Kernel
    2. Eles são definidos em <linux/poll.h>. pollfoi uma implementação vista pela primeira vez no System V, selecté o equivalente do BSD UNIX.
  • futex_wait_queue_me:

    Para explicar isso, temos que olhar para Locks. Um bloqueio é um estado salvo no sistema que indica que uma tarefa funciona com um recurso. Por exemplo, pode haver apenas uma tarefa que lê um arquivo. Essa tarefa bloqueava o arquivo, qualquer outra tarefa 1 que tente ler o arquivo saberia que está bloqueada e esperaria que a trava desaparecesse antes que ela pudesse acessá-la. O mesmo acontece com o tempo do processador.

    A versão moderna do Linux (na maioria das arquiteturas) usa um bloqueio Futex (fast userspace mutex) no kernel. Mutex, exclusão mútua, refere-se à ideia de que um recurso comum só pode ser acessado por uma tarefa a qualquer momento. Para isso, os sinalizadores no sistema são definidos.

    Se um processo estiver aguardando um recurso bloqueado, isso será chamado de Ocupação em espera ou "Rotação", referindo-se ao fato de que ele tenta acessá-lo repetidamente, até que possa. Diz-se que uma tarefa está bloqueada quando gira.

    Se você pode ler isso, é obrigado a corrigir pelo menos um erro nesta resposta: P

    Os bloqueios do futex podem ser considerados como um número no espaço do usuário, que pode ser incrementado ou diminuído por uma tarefa (nos casos em que o recurso pode ser acessado por várias tarefas, esse número pode se tornar maior que um). Este é o número mostrado no diagrama 4 .

    Essas tarefas se enfileiram na fila de espera , uma fila simples de tarefas que precisam realizar algum trabalho, quando o tempo de processamento está disponível, as tarefas realizam seu trabalho e são removidas da fila.

    futex_wait_queue_meenfileira uma tarefa. Em seguida, aguarda um sinal, um tempo limite ou uma ativação. As tarefas que estão neste canal de espera não estão na fila de espera, estão aguardando para serem enfileiradas.


    1. Uma tarefa pode ser um Processo 3 ou um Tópico 2
    2. Um Thread é uma subseção de um Processo. Muitos threads podem executar paralelamente
    3. Um processo é um programa completo, consiste em um ou mais encadeamentos, embora um programa também possa consistir em vários processos.
    4. Lembre-se de que ainda é uma visão de alto nível, não está considerando os detalhes da implementação
  • __skb_recv_datagram

    Aguarde alguns dados em um soquete de rede bloqueado.

  • sk_wait_data

    Aguarde alguns dados em um soquete de rede.

  • do_exit

    Esta é a última parte de sair de um processo. do_exit()chama o schedule()próximo, para agendar outro processo. Quando do_exit()é chamado, o processo é a ZOMBIE.

  • do_wait

    Um processo é adicionado à fila de espera dos agendadores.

  • pipe_wait, unix_stream_data_wait

    Um processo está aguardando dados de um subprocesso. Isso acontece, por exemplo, quando você executa esse tipo de código:

    echo | sleep 10 && echo hallo              # pipe
    

    ou

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    O processo está inativo, usando o hrtimer_nanosleep()método Este método pode ser usado para um programa dormir por intervalos específicos de tempo, com precisão de nanossegundos.

Estes não são todos, mas eu não observei nenhum outro. Poste um comentário se eu perdi alguma coisa.

Stefano Palazzo
fonte
Me deparei com sleep_on_page_killable?
Axilus
A causa mais provável para sleep_on_page_killable é que o processo está tentando carregar uma página que não está na memória, por isso causa uma falha na página e o processo deve ser adormecido até que a página seja carregada. Se o subsistema de E / S estiver sobrecarregado (talvez porque você esteja realizando muita E / S), isso poderá aparecer com freqüência.
tsuna 26/09
que tal signal? Eu já me deparei com isso. O processo está morto? zumbi? ou o que? o que acontecerá com o processo?
itsnotmyrealname 5/09
11

O valor do canal em espera é o nome da função do kernel na qual o processo está atualmente bloqueado.

O nome geralmente está relacionado a uma chamada do sistema, que terá uma página de manual.

  • futex_wait_queue_me está relacionado ao futex . Refere - se a um tipo de bloqueio mutex (exclusão mútua rápida no espaço do usuário) que é usado para agendar muitos processos de trabalho em um processador. O estado indica que seu processo está na fila para receber o bloqueio. 2
  • do_wait está relacionado à espera .
  • etc.

Se você realmente deseja informações mais detalhadas, pode verificar a fonte do kernel .

Se você digitar cat /proc/some_pid/stackum terminal, obterá uma saída como essa:

[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff

E na primeira linha, você obtém o que é exibido no monitor do sistema. Tanto quanto eu sei, poll_schedule_timeout indica que seu processo está esperando por algo.

Ele lida com E / S assíncrona e sondagem .

Fonte (s): 1. canal de espera do processo (WCHAN) e alarme? - 2. Resposta do AskUbuntu

Maxime R.
fonte
Reformule isso. : P
Stefano Palazzo
Parece que você notou que eu reutilizei sua resposta para melhorar essa ;-) Que tipo de atribuição você gostaria de ter?
Maxime R.
2
Seu comentário é mais do que suficiente para me manter feliz :) Se você gostaria de aprender sobre como a atribuição funciona, há uma boa postagem no blog sobre o assunto. Não se preocupe muito com isso, quero que as pessoas reutilizem meu trabalho o máximo possível.
Stefano Palazzo
1
Bem, eu estava escrevendo uma pergunta sobre esse tópico na meta. (já tinha lido a postagem no blog)
Maxime R.
Está aqui . E eu aposto que a sua resposta vai acabar sobre a minha em algum momento ^^
Maxime R.