Pergunta

Quando você tem um loop apertado pesquisando o status de algo, não tenho certeza de como fazer a pesquisa sem atrapalhar outros processos que desejam usar a CPU. Por exemplo, fazendo isso:

while (state == BUSY) state = check_state();

Parece um desperdício de recursos. Eu pensaria que a melhor maneira de fazer isso seria:

while (state == BUSY) {
    sched_yield();
    state = check_state();
}

Eu esperaria que esse top listasse o processo como dormindo, mesmo que consuma 100% da CPU enquanto estiver fazendo isso. Dessa forma, o processo (espero) da pesquisa "bem". Mas não é isso que acontece. No momento eu tenho

while (state == BUSY) {
    sleep(1);
    state = check_state();
}

O que é perfeitamente aceitável, mas sinto que poderia ser feito melhor do que isso. Existe uma prática padrão para fazer isso?

Foi útil?

Solução

Não gire no sched_yield (), ele se desenrola muito mal a detecção de prioridade do agendador e, mesmo quando interopere bem a partir de uma perspectiva de desempenho, fará coisas como métricas de vida útil da bateria e métricas de consumo de energia. Se o seu aplicativo puder tolerar as latências, a pesquisa com um tempo limite (até mesmo curtas como 10Hz) é muito preferível, se ainda não for ideal.

A resposta certa depende do que check_state () realmente precisa fazer. Você tem certeza absoluta de que não pode organizar as coisas para que suas mudanças de estado sejam eventos visíveis ao kernel que você pode bloquear?

Outras dicas

Eu não acho que isso é algo que você pode usar votação ou Epoll sobre?

Infelizmente, não existe uma pesquisa de consciência. A pesquisa é sempre uma troca entre o tempo de reação e o consumo de recursos: quanto menor o período de votação, melhor o tempo de reação, mas maior o consumo de recursos. Quanto mais tempo o período de pesquisa, mais energia você economiza, mas menos reativo será sua aplicação.

A pesquisa é sempre feia, não importa como você olhe para ela. Se você está tentando fazer as coisas da maneira certa, terá que usar um mecanismo melhor, ou seja, notificação. O que isso significa é que sua API check_state () é ruim, porque só permite pesquisar no estado; Você precisa de uma função projetada para notificá -lo quando o estado mudar. Normalmente, essa função tornaria alguns FD legíveis quando o estado mudar, para que você possa aguardar síncrono ou assíncrono pelos eventos no FD e acordar apenas quando esse evento ocorrer.

Eu acho que você poderia usar Libevent ou Libev.

Ambos fornecem instalações para lidar com coisas como essa.

No meu trabalho em tempo real, normalmente escolho um tempo limite razoável (como 10US) e giro na condição e RDTSC (o balcão de carimbo de data e hora).

Se você quiser girar por períodos muito longos (como mais de 10ms), sugiro colocar uma pequena declaração de sono lá para que outras coisas tenham alguma chance de correr.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top