Visão geral do Tempo de Execução de Simultaneidade
Este documento fornece uma visão geral de tempo de execução de simultaneidade. Descrever os benefícios de tempo de execução de simultaneidade, quando usá-lo, e como seus componentes interagem entre si e com o sistema operacional e os aplicativos.
Seções
Este documento contém as seções a seguir:
Por que um Tempo de Execução para Simultaneidade é Importante
Arquitetura
Expressões Lambda C++
Requisitos
Por que um Tempo de Execução para Simultaneidade é Importante
Um tempo de execução para simultaneidade fornece uniformidade e previsibilidade à aplicativos e os componentes de aplicativo que são executados simultaneamente. Dois exemplos dos benefícios de tempo de execução de simultaneidade são programação de tarefa cooperativa e bloqueio cooperativo.
O tempo de execução de simultaneidade usa um agendador de tarefas cooperativo que implementa um algoritmo de rob para distribuir com eficiência o trabalho entre recursos de computação. Por exemplo, considere um aplicativo que tem dois threads que ambos são gerenciados no mesmo tempo de execução. Se um thread termina sua tarefa agendada, pode descarregar o trabalho de outro thread. Esse mecanismo equilibra a carga de trabalho total do aplicativo.
O tempo de execução de simultaneidade fornece também primitivos de sincronização que usam o bloqueio cooperativo para sincronizar o acesso a recursos. Por exemplo, considere uma tarefa que deve ter acesso exclusivo a um recurso compartilhado. Bloqueando cooperativa, o tempo de execução pode usar o quantum restante para executar outra tarefa enquanto a primeira tarefa aguarda o recurso. Esse mecanismo promove o uso máximo de recursos de computação.
[Superior]
Arquitetura
O tempo de execução de simultaneidade é dividido em quatro componentes: a paralela da biblioteca (PPL), a biblioteca assíncrona de agentes, o agendador de tarefas, e o Gerenciador de Recursos. Esses componentes estão entre o sistema operacional e os aplicativos. A ilustração a seguir mostra como os componentes de tempo de execução de simultaneidade interagem entre o sistema operacional e os aplicativos:
Arquitetura de tempo de execução de simultaneidade
Importante
Os componentes do agendador e do Gerenciador de Recursos de tarefa não estão disponíveis em um aplicativo de Windows Store .
O tempo de execução de simultaneidade é altamente combinável, ou seja, você pode combinar a funcionalidade existente para tornar mais. O tempo de execução de simultaneidade composto muitos recursos, como algoritmos paralelos, os componentes de baixo nível.
O tempo de execução de simultaneidade fornece também primitivos de sincronização que usam o bloqueio cooperativo para sincronizar o acesso a recursos. Para obter mais informações sobre esses primitivos de sincronização, consulte Estruturas de dados de sincronização.
As seções a seguir fornecem uma visão geral do que cada componente fornece e quando usar o.
Biblioteca de Padrões Paralelos
A biblioteca (PPL) de padrões de paralelo fornece contêineres e algoritmos de uso geral para executar o paralelismo refinado. O PPL habilita o paralelismo obrigatório de dados fornecendo os algoritmos paralelos que distribuem computações em coleções ou conjuntos de dados por meio dos recursos de computação. Também permite que o paralelismo de tarefa fornecendo os objetos da tarefa que distribuem operações independentes de vários por meio dos recursos de computação.
Use a biblioteca de padrões de paralela quando você tiver uma computação local que podem se beneficiar da execução paralela. Por exemplo, você pode usar o algoritmo de concurrency::parallel_for para transformar um loop existente de for para atuar em paralelo.
Para obter mais informações sobre a biblioteca de padrões de paralelas, consulte Biblioteca de padrões paralelos (PPL).
Biblioteca de Agentes Assíncronos
A biblioteca assíncrona de agentes (ou simplesmente a biblioteca dos agentes) fornecem um modelo baseado ator- e a mensagem de programação que passam interfaces para o fluxo de dados de alta granularidade e de canal que tarefas. Os agentes assíncronas permite fazer uso produtivo de latência executando o trabalho já que outros componentes esperam dados.
Use a biblioteca dos agentes quando você tiver várias entidades que se comunicam entre si de forma assíncrona. Por exemplo, você pode criar um agente que lê dados de um arquivo ou de uma conexão de rede e use a mensagem interfaces de streaming para enviar esses dados para outro agente.
Para obter mais informações sobre a biblioteca de agentes, consulte Biblioteca de Agentes Assíncronos.
Agendador de Tarefas
O agendador de tarefas agenda e coordena tarefas em tempo de execução. O agendador de tarefas é cooperativo e usa um algoritmo de rob para obter o uso máximo de recursos de processamento.
O tempo de execução de simultaneidade fornece um agendador padrão de modo que você não precise gerenciar detalhes da infraestrutura. No entanto, para atender às necessidades de qualidade de seu aplicativo, você também pode fornecer sua própria política de programação ou associar agendadores específicos com as tarefas específicas.
Para obter mais informações sobre o agendador de tarefas, consulte Agendador de tarefas (Tempo de Execução de Simultaneidade).
Gerenciador de Recursos
A função do Gerenciador de Recursos é gerenciar recursos de computação, como processadores e a memória. O Gerenciador de Recursos responde às cargas de trabalho como são alterados em tempo de execução alocando recursos para onde podem ser mais eficientes.
O Gerenciador de Recursos serve como uma abstração sobre os recursos de computação e interage principalmente com o agendador de tarefas. Embora você possa usar o Gerenciador de Recursos para ajustar o desempenho dos aplicativos e bibliotecas, você geralmente usa a funcionalidade fornecida pela biblioteca de padrões de paralela, pela biblioteca de agentes, e o agendador de tarefas. Essas bibliotecas usam o Gerenciador de Recursos para a sobreamostragem dinamicamente recursos porque as cargas de trabalho são alterados.
[Superior]
Expressões Lambda C++
Muitos dos tipos e os algoritmos que são definidos no tempo de execução de simultaneidade são implementados como modelos C++. Alguns desses tipos e os algoritmos obtém como um parâmetro uma rotina que executa o trabalho. Esse parâmetro pode ser uma função de lambda, um objeto de função, ou um ponteiro de função. Essas entidades também são referidas como funções de trabalho ou as rotinas de trabalho.
As expressões lambdas são um novo recurso de idioma do Visual C++ importante porque fornecem uma maneira sucinto das funções de trabalho para o processamento paralelo. Os objetos de função e ponteiros da função permite usar o tempo de execução de simultaneidade com seu código existente. Entretanto, recomendamos que você use expressões de lambda quando você grava o novo código devido aos benefícios de segurança e a produtividade que fornecem.
O exemplo a seguir compara a sintaxe de funções de lambda, de objetos da função, e ponteiros da função em chamadas de vários ao algoritmo de concurrency::parallel_for_each . Cada chamada para parallel_for_each usa uma técnica diferente computar o quadrado de cada elemento em um objeto de std::array .
// comparing-work-functions.cpp
// compile with: /EHsc
#include <ppl.h>
#include <array>
#include <iostream>
using namespace concurrency;
using namespace std;
// Function object (functor) class that computes the square of its input.
template<class Ty>
class SquareFunctor
{
public:
void operator()(Ty& n) const
{
n *= n;
}
};
// Function that computes the square of its input.
template<class Ty>
void square_function(Ty& n)
{
n *= n;
}
int wmain()
{
// Create an array object that contains 5 values.
array<int, 5> values = { 1, 2, 3, 4, 5 };
// Use a lambda function, a function object, and a function pointer to
// compute the square of each element of the array in parallel.
// Use a lambda function to square each element.
parallel_for_each(begin(values), end(values), [](int& n){n *= n;});
// Use a function object (functor) to square each element.
parallel_for_each(begin(values), end(values), SquareFunctor<int>());
// Use a function pointer to square each element.
parallel_for_each(begin(values), end(values), &square_function<int>);
// Print each element of the array to the console.
for_each(begin(values), end(values), [](int& n) {
wcout << n << endl;
});
}
Saída
Para obter mais informações sobre as funções de lambda em C++, consulte Expressões lambda em C++.
[Superior]
Requisitos
A tabela a seguir mostra os arquivos de cabeçalho que estão associados a cada componente de tempo de execução de simultaneidade:
Componente |
Arquivos de cabeçalho |
---|---|
PPL (Biblioteca de Padrões Paralelos) |
ppl.h concurrent_queue.h concurrent_vector.h |
Biblioteca de Agentes Assíncronos |
agents.h |
Agendador de Tarefas |
concrt.h |
Gerenciador de Recursos |
concrtrm.h |
O tempo de execução de simultaneidade é declarado no namespace de Simultaneidade . (Você também pode usar simultaneidade, que é um alias para esse namespace.) O namespace de concurrency::details oferece suporte à estrutura de tempo de execução de simultaneidade, e não se destina a ser usada diretamente no seu código.
O tempo de execução de simultaneidade é fornecido como parte da biblioteca de tempo de execução C (CRT). Para obter mais informações sobre como criar um aplicativo que usa o CRT, consulte Recursos da biblioteca CRT.
[Superior]