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_timeout
indica che un'attività è in attesa di I / O, hardware come tastiere e mouse, dispositivi audio o persino prese di rete.
- Una funzione nel kernel
- 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.
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_me
accoda 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.
- Un'attività può essere un processo 3 o un thread 2
- Una discussione è una sottosezione di un processo. Molti thread possono funzionare in parallelo
- Un processo è un programma completo, è costituito da uno o più thread, anche se un programma può comprendere anche più processi.
- 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.