Qual è il "canale di attesa" di un processo?


36

Nella scheda Processi di GNOME System Monitor c'è una colonna "Waiting Channel". Di gran lunga i valori più comuni che vedo qui sono poll_schedule_timeout , ma vedo anche altri valori: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagram e unix_stream_data_wait .

Cosa significa questa colonna "Waiting Channel"? E forse cosa significano alcuni di questi valori?

Immagine dello schermo

Risposte:


42

Il canale di attesa è il punto nel kernel in cui l'attività è attualmente in attesa. Un'attività deve attendere una risorsa, che può essere data o tempo di elaborazione. Questi due includono socket di rete, hardware, file e così via; poiché la maggior parte di questi sono solo file, in sistemi simili a Unix.

  • 0: Il processo non sta aspettando

  • poll_schedule_timeout

    poll()è una chiamata di sistema 1 utilizzata per gestire l'I / O. È simile a select(). 2

    Le applicazioni che utilizzano I / O non bloccanti utilizzano queste chiamate per vedere se possono leggere o scrivere su un file, senza che sia necessario bloccarlo. Sono spesso utilizzati per flussi di input / output, che potrebbero non essere bloccati (altrimenti, il mouse potrebbe smettere di muoversi).

    Il canale di attesa poll_schedule_timeoutindica che un'attività è in attesa di I / O, hardware come tastiere e mouse, dispositivi audio o persino prese di rete.

    1. Una funzione nel kernel
    2. Sono definiti in <linux/poll.h>. pollè stata un'implementazione vista per la prima volta in System V, selectè l'equivalente BSD UNIX.
  • futex_wait_queue_me:

    Per spiegare questo, dobbiamo guardare Locks. Un blocco è uno stato salvato nel sistema che indica che un'attività funziona con una risorsa. Ad esempio, può esserci solo un'attività che legge un file. Questa attività bloccherebbe il file, qualsiasi altra attività 1 che tenta di leggere il file saprebbe che è bloccato e attendere che il blocco scompaia prima che possa accedervi. La stessa cosa accade per il tempo del processore.

    La versione moderna di Linux (sulla maggior parte delle architetture) usa un blocco Futex (fast userspace mutex) nel kernel. Mutex, mutua esclusione, si riferisce all'idea che a una risorsa comune è possibile accedere solo da un'attività in qualsiasi momento. Per questo, vengono impostati i flag nel sistema.

    Se un processo è in attesa di una risorsa bloccata, questo si chiama Busy Waiting o "Spinning", facendo riferimento al fatto che tenta di accedervi più volte, fino a quando è possibile. Si dice che un'attività sia bloccata quando gira.

    Se riesci a leggere questo, sei obbligato a correggere almeno un errore in questa risposta: P

    I blocchi Futex possono essere pensati come un numero nello spazio utente, che può essere incrementato o decrementato da un'attività (nei casi in cui è possibile accedere alla risorsa da più attività, questo numero può diventare maggiore di uno). Questo è il numero mostrato nel diagramma 4 .

    Queste attività si accodano nella coda di attesa , una semplice coda di attività che devono svolgere alcune attività, una volta disponibile il tempo di elaborazione, le attività eseguono il loro lavoro e vengono rimosse dalla coda.

    futex_wait_queue_meaccoda un compito. Quindi attende un segnale, un timeout o una sveglia. Le attività che si trovano in questo canale di attesa non attendono nella coda di attesa, ma in attesa di essere accodate.


    1. Un'attività può essere un processo 3 o un thread 2
    2. Una discussione è una sottosezione di un processo. Molti thread possono funzionare in parallelo
    3. Un processo è un programma completo, è costituito da uno o più thread, anche se un programma può comprendere anche più processi.
    4. Ricorda, questa è ancora una visione di livello molto elevato delle cose, non sta prendendo in considerazione i dettagli di implementazione
  • __skb_recv_datagram

    Attendere alcuni dati su un socket di rete bloccato.

  • sk_wait_data

    Attendere alcuni dati su un socket di rete.

  • do_exit

    Questa è l'ultima parte dell'uscita da un processo. do_exit()chiama il schedule()prossimo, per pianificare un altro processo. Quando do_exit()viene chiamato, il processo è a ZOMBIE.

  • do_wait

    Un processo viene aggiunto alla coda di attesa degli scheduler.

  • pipe_wait, unix_stream_data_wait

    Un processo è in attesa di dati da un sottoprocesso. Questo accade, ad esempio, quando si esegue questo tipo di codice:

    echo | sleep 10 && echo hallo              # pipe
    

    o

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    Il processo sta dormendo, usando il hrtimer_nanosleep()metodo. Questo metodo può essere utilizzato per un programma di sospensione per specifici intervalli di tempo, con precisione dei nanosecondi.

Questi non sono tutti, ma non ho osservato nessun altro. Pubblica un commento se mi sono perso qualcosa.


Mi sono imbattuto in sleep_on_page_killable?
Emmanuel M. Smith,

La causa più probabile di sleep_on_page_killable è che il processo sta provando a caricare una pagina che non è in memoria, quindi provoca un errore di pagina e il processo deve essere messo in pausa fino al caricamento della pagina. Se il sottosistema I / O è sovraccarico (forse perché stai eseguendo molti I / O), questo potrebbe comparire frequentemente.
Tsuna,

che dire signal? L'ho incontrato. Il processo è morto? zombie? o cosa? cosa accadrà al processo?
itsnotmyrealname

11

Il valore del canale in attesa è il nome della funzione del kernel in cui il processo è attualmente bloccato.

Il nome è generalmente correlato a una chiamata di sistema, che avrà una pagina di manuale.

  • futex_wait_queue_me è legato a futex . Si riferisce a un tipo di blocco mutex (esclusione reciproca dello spazio utenti veloce) che viene utilizzato per pianificare il funzionamento di molti processi su un processore. Lo stato indica che il processo è accodato per ricevere il blocco. 2
  • do_wait è legato alla attesa .
  • eccetera.

Se vuoi davvero informazioni più dettagliate, puoi controllare l' origine del kernel .

Se digiti cat /proc/some_pid/stackun terminale otterrai un output come quello:

[<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 sulla prima riga ottieni ciò che viene visualizzato sul monitor di sistema. Per quanto ne so, poll_schedule_timeout indica che il processo è in attesa di qualcosa.

Si occupa di I / O asincrono e polling .

Fonte (i): 1. processo di attesa canale (WCHAN) e allarme? - 2. Risposta di AskUbuntu



Sembra che tu abbia notato che ho riutilizzato la tua risposta per migliorarla ;-) Che tipo di attribuzione ti piacerebbe avere?
Maxime R.

2
Il tuo commento è più che sufficiente per rendermi felice :) Se vuoi sapere come funziona l'attribuzione, c'è un bel post sul blog SO sull'argomento. Non preoccuparti troppo, voglio che le persone riutilizzino il mio lavoro il più possibile.
Stefano Palazzo

1
Bene, stavo solo scrivendo una domanda su questo argomento su meta. (aveva già letto il post sul blog)
Maxime R.

È qui . E scommetto che la tua risposta finirà sopra la mia ad un certo punto ^^
Maxime R.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.