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 aselect()
. 2Aplicativos 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.- Uma função no Kernel
- 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.- Uma tarefa pode ser um Process 3 ou um Thread 2
- Um segmento é uma subseção de um processo. Muitos encadeamentos podem ser executados em paralelo
- Um processo é um programa completo, consiste em um ou mais encadeamentos, embora um programa possa consistir em vários processos também.
- 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 oschedule()
a seguir, para agendar outro processo. Quandodo_exit()
é chamado, o processo é umZOMBIE
. -
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.