Pergunta

Got algumas dúvidas com fundo half.Here, I considerar apenas tasklets. Além disso, considero kernel não-preemptivo somente.

Suponha que consideram um driver ethernet em que rx processamento de interrupção está fazendo cerca de 10 funções chamadas. (Má programação :))

Agora, olhando para perspectiva de desempenho se 9 chamadas de função pode ser movido para uma tasklet e apenas 1 precisa ser chamado em manipulação de interrupção, Can I realmente obter um bom desempenho em um tcp ler aplicação.

Ou, em outras palavras, quando há é mudar para aplicação espaço do usuário todos os 9 chamadas de função para os tasklets programadas será chamado, em efetivo o uso do espaço do usuário será capaz de obter os dados de pacote cum só depois "todos os taskets programada" são concluídos? correto?

Eu entendo que por ter metade inferior, estamos permitindo que todas as interrupções .. mas eu tenho uma dúvida se a aplicação que conta com a interrupção realmente ganhar alguma coisa por ter toda a 10 funções em si manipulador de interrupção ou na metade inferior.

Em suma, por ter tasklet que eu ganho melhoria de desempenho no aplicativo de espaço do usuário, aqui?

Foi útil?

Solução

Desde tasklets não estão na fila, mas programada, ou seja, várias interrupções de hardware postar o mesmo tasklet pode resultar em uma única chamada de função tasklet, você seria capaz de salvar até 90% do processamento em extrema casos.

Por outro lado já existe um IRQ macio de alta prioridade para a net-rx.

Outras dicas

Em minha experiência em máquinas rápidas, movendo-se o trabalho do manipulador para o tasklet não faz a máquina funcionar mais rápido. Eu adicionei macros no manipulador que pode transformar o meu apelo schedule_tasklet () em uma chamada para a função em si tasklet, e é fácil de referência em ambos os sentidos e ver a diferença.

Mas é importante que manipuladores de interrupção terminar rapidamente. Como Nikolai mencionado, você pode se beneficiar se o dispositivo gosta de interromper um monte, mas a maioria dos dispositivos de alta largura de banda tem hardware mitigação interrupção que torna este um problema menos grave.

Usando tasklets é a maneira que o núcleo do kernel pessoas vão fazer as coisas, então tudo o resto igual, provavelmente é melhor seguir a sua liderança, especialmente se você quiser ver o seu motorista aceito no kernel.

Eu também gostaria de observar que chamar muitas funções não é necessariamente má prática; modernos preditores ramo podem tornar o código ramo pesado correr tão rápido como código-não-galho pesado. Muito mais importante na minha opinião são os potenciais efeitos de cache de ter que fazer metade do trabalho agora, e, em seguida, metade do trabalho mais tarde.

A tasklet não é executado no contexto do processo de usuário. Se seus horários ISR um tasklet, ele será executado imediatamente após o seu ISR é feito, mas com interrupções habilitado. O benefício disso é que o seu processamento de pacotes não está impedindo interrupções adicionais.

No seu exemplo TCP, as mãos de hardware fora do pacote para a pilha de rede e o driver é feito - as alças pilha líquida acordar o processo etc. então não há realmente nenhuma maneira para que o motorista do hw para executar no contexto do processo do destinatário dos dados, porque o hw nem sabe quem é.

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