Modelo de threading de tempo de execução

Saiba como threads, pools e regras de despacho de tempo de execução afetam a execução do NetLogic, a seleção de tarefas e o desempenho.

Visão geral

O
Aplicativos FactoryTalk Optix
usa vários modelos de execução. O trabalho de tempo de execução não é executado em uma thread global. O tempo de execução usa um pool de threads compartilhado baseado em prioridade, um pool de temporizadores e threads dedicados de subsistema.
Esse modelo afeta como o código NetLogic é executado, como os retornos de chamada são serializados e como a carga do sistema altera o comportamento do aplicativo.

Pools de threads compartilhados e threads dedicados

O pool de threads compartilhado baseado em prioridade executa o trabalho geral de tempo de execução. O tempo de execução agenda o trabalho por prioridade e threads de trabalho disponíveis. O pool de temporizadores lida com retornos de chamada baseados em temporizador. Alguns subsistemas usam threads dedicados em vez dos pools compartilhados.
Os threads dedicados de subsistema isolam o trabalho que deve permanecer responsivo ou ordenado. Os drivers de comunicação podem usar seu próprio modelo de threading, com base no design do driver e nas necessidades do protocolo.

Despacho e serialização

O tempo de execução usa despacho baseado em afinidade para muitas operações. O trabalho destinado ao mesmo objeto de tempo de execução ou contexto de execução pode ser executado com a mesma afinidade e em ordem serializada. A serialização reduz o acesso simultâneo ao mesmo estado, mas isso não significa que todo o trabalho de tempo de execução seja executado em um thread.
Objetos ou subsistemas independentes podem ser executados em paralelo em threads diferentes. Os recursos compartilhados ainda exigem um design thread-safe quando o código pode ser executado a partir de contextos diferentes.

Modelo de execução do NetLogic

O código NetLogic pode ser executado em diferentes contextos de tempo de execução.
Start()
e
Stop()
seguem as regras do ciclo de vida do NetLogic descritas em Ciclo de vida do NetLogic. Métodos exportados, retornos de chamada de eventos, temporizadores e tarefas assíncronas podem ser executados em threads diferentes, com base no chamador e no agendador de tempo de execução.
Não presuma que chamadas posteriores reutilizem o mesmo thread. Projete o código NetLogic para que o estado compartilhado seja explícito, limitado e protegido quando houver possibilidade de acesso simultâneo.

Trabalho de longa duração

LongRunningTask
é a opção preferencial para operações longas ou de bloqueio que precisam acessar o modelo de informação. Ele separa o trabalho de longa duração da execução do ciclo de vida e ajuda a manter o comportamento do tempo de execução responsivo.
Use
async/await
ou APIs do pool de threads do .NET somente para trabalhos que não acessam nós do projeto. Para obter detalhes da API, consulte Construtor: LongRunningTask(action, executingNode).

Considerações sobre hardware

A taxa de transferência do tempo de execução depende tanto da contagem de núcleos da CPU quanto da velocidade de relógio da CPU. Mais núcleos aumentam o paralelismo potencial. Maior velocidade de relógio melhora o desempenho de thread único e de cargas de trabalho serializadas.
O Hyper-Threading, ou multithreading simultâneo (simultaneous multithreading, SMT), pode melhorar o uso da CPU, mas os núcleos lógicos não correspondem ao desempenho de um número maior de núcleos físicos. Os ganhos de desempenho dependem do tipo de carga de trabalho, do comportamento de bloqueio e da contenção.

Princípios de design

Use estes princípios ao projetar código NetLogic para execução em tempo de execução:
  • Mantenha
    Start()
    e
    Stop()
    curtos.
  • Mova o trabalho de bloqueio ou de longa duração para
    LongRunningTask
    ou outro tipo de tarefa adequado.
  • Evite suposições sobre a identidade do thread ou a ordem de retorno de chamada entre subsistemas.
  • Proteja o estado mutável compartilhado.
  • Reduza a contenção em recursos compartilhados.
  • Teste sob carga realista de CPU, carga de E/S e carga de comunicação.
Dê sua opinião
Tem dúvidas ou comentários sobre esta documentação? Por favor, envie seu comentário aqui.
Normal