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_timeout
indica que uma tarefa está aguardando E / S, tanto hardware como teclados e mouses, dispositivos de som ou até soquetes de rede.
- Uma função no Kernel
- Eles são definidos em
<linux/poll.h>
. poll
foi 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.
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_me
enfileira 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.
- Uma tarefa pode ser um Processo 3 ou um Tópico 2
- Um Thread é uma subseção de um Processo. Muitos threads podem executar paralelamente
- Um processo é um programa completo, consiste em um ou mais encadeamentos, embora um programa também possa consistir em vários processos.
- 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.