O que é o “Canal de Espera” de um processo?

36

Na guia Processos do Monitor do Sistema do GNOME, há uma coluna "Canal de Espera". 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 Então, o que significa essa coluna "Canal de espera"? E talvez o que alguns desses valores significam?

    
por 8128 30.12.2010 / 17:46

2 respostas

41

O canal de espera é o lugar no Kernel onde a tarefa está atualmente aguardando. Uma tarefa tem que esperar por 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 semelhantes 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

    Aplicativos que usam E / S sem bloqueio usam essas chamadas para ver se pode ler ou gravar em um arquivo, sem ter que bloqueá-lo. Eles são freqüentemente usado para fluxos de entrada / saída, que podem não ser bloqueados (caso contrário, talvez seu mouse pare de se mover).

    O canal de espera poll_schedule_timeout indica que uma tarefa está esperando por E / S, hardware como teclados e mouses, dispositivos de som ou até mesmo soquetes de rede.

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

    Para explicar isso, temos que olhar para o Locks. Um bloqueio é um estado salvo no sistema que indica que uma tarefa funciona com um recurso. Pode haver, por exemplo, apenas uma tarefa que lê um arquivo. Essa tarefa bloquearia o arquivo, qualquer outra tarefa 1 que tenta ler o arquivo saberia que está bloqueada e aguardar o bloqueio para ir embora, antes que ele possa acessá-lo. A mesma coisa acontece para tempo do processador.

    A versão moderna do Linux (na maioria das arquiteturas) usa um Futex (espaço de usuário rápido mutex) bloqueia o 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, sinalizadores no sistema estão definidos.

    Se um processo estiver aguardando por um recurso bloqueado, isso é chamado Ocupado em espera ou "Spinning", referindo-se ao fato de que ele tenta acessá-lo mais e mais, até que possa. Uma tarefa é bloqueada quando gira.

    Os bloqueios Futex podem ser considerados como um número no espaço do usuário, que pode ser incrementado ou decrementado 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). Esse é o número mostrado no diagrama 4 .

    Essas tarefas se enfileiram na fila de espera , uma fila simples de tarefas que precisam fazer algum trabalho, uma vez que o tempo de processamento esteja disponível, as tarefas fazem seu trabalho e são removidas da fila.

    futex_wait_queue_me enfileira as tarefas. Ele então espera por um sinal, uma vez fora ou um despertar. Tarefas que estão neste canal de espera não estão esperando na fila de espera, eles estão esperando para serem enfileirados.

    1. Uma tarefa pode ser um Process 3 ou um Thread 2
    2. Um segmento é uma subseção de um processo. Muitos encadeamentos podem ser executados em paralelo
    3. Um processo é um programa completo, consiste em um ou mais encadeamentos, embora um programa possa consistir em vários processos também.
    4. Lembre-se de que essa ainda é uma visão de alto nível das coisas, 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 desistir de um processo. do_exit() chama o schedule() a seguir, para agendar outro processo. Quando do_exit() é chamado, o processo é um 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 método hrtimer_nanosleep() . Esse método pode ser usado para um programa dormir por intervalos de tempo específicos, 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.

    
por Stefano Palazzo 09.01.2011 / 23:29
11

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

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

  • futex_wait_queue_me está relacionado com futex . refere-se a um tipo de mutex lock (exclusão mútua do espaço de usuário rápido) que é usado para programar muitos os processos funcionam em um processador. O estado indica que seu processo é enfileirado para receber o bloqueio. 2
  • do_wait está relacionado com aguarde .
  • etc.

Se você realmente quer informações mais detalhadas, você pode checar o kernel source .

Se você digitar cat /proc/some_pid/stack em um 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. Até onde eu sei, poll_schedule_timeout indica que o seu processo está esperando por algo.

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

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

    
por Maxime R. 30.12.2010 / 19:01