Visão geral do Runtime de simultaneidade

Este documento fornece uma visão geral do Runtime de simultaneidade. Ele descreve os benefícios do Runtime de simultaneidade, quando usá-lo e como seus componentes interagem entre si e com o sistema operacional e aplicativos.

Seções

Este documento contém as seções a seguir:

  • Por que o tempo de execução para Concurency é importante

  • Arquitetura

  • Expressões Lambda do C++

  • Requisitos

Por que um Runtime de simultaneidade é importante

Um runtime de simultaneidade fornece uniformidade e previsibilidade para os aplicativos e componentes de aplicativos executam simultaneamente. Dois exemplos das vantagens do Runtime de simultaneidade são agendamento da tarefa cooperativa e bloqueio cooperativo.

O Runtime de simultaneidade usa um Agendador de tarefas cooperativo que implementa um algoritmo de roubo de trabalho para distribuir o trabalho entre recursos de computação de forma eficiente. Por exemplo, considere um aplicativo que tenha dois threads são gerenciados pelo runtime do mesmo. Se um thread terminar sua tarefa agendada, ele pode descarregar o trabalho do outro thread. Esse mecanismo equilibra a carga de trabalho geral do aplicativo.

O Runtime de simultaneidade também fornece os primitivos de sincronização que usam o bloqueio cooperativo para sincronizar o acesso aos recursos. Por exemplo, considere uma tarefa que deve ter acesso exclusivo a um recurso compartilhado. Bloqueando em cooperativa, o runtime pode usar o quantum restante para executar outra tarefa, como a primeira tarefa aguarda que o recurso. Esse mecanismo promove o uso máximo de recursos de computação.

go to top

Arquitetura

O Runtime de simultaneidade é dividido em quatro componentes: a biblioteca de padrões paralelos (PPL), a biblioteca de agentes assíncrona, o Agendador de tarefas e o Gerenciador de recursos. Esses componentes residem entre o sistema operacional e aplicativos. A ilustração a seguir mostra como os componentes do Runtime de simultaneidade interagem entre o sistema operacional e aplicativos:

Arquitetura de Runtime de simultaneidade

A arquitetura de tempo de execução de simultaneidade

O Runtime de simultaneidade é altamente compostos, ou seja, você pode combinar a funcionalidade existente para fazer mais. O Runtime de simultaneidade compõe muitos recursos, como, por exemplo, os algoritmos paralelos, dos componentes de nível inferior.

O Runtime de simultaneidade também fornece os primitivos de sincronização que usam o bloqueio cooperativo para sincronizar o acesso aos 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 de cada componente oferece e quando usá-lo.

Biblioteca paralela de padrões

O paralela padrões PPL (biblioteca) fornece os algoritmos e recipientes de uso gerais para executar o paralelismo refinado. A PPL permite o paralelismo de dados fundamental , fornecendo os algoritmos paralelos, distribuir computações em coleções ou em conjuntos de dados entre os recursos de computação. Ele também permite que o paralelismo de tarefas , fornecendo os objetos de tarefa distribuir várias operações independentes entre os recursos de computação.

Quando você tem uma computação local que pode se beneficiar com execução paralela, use a biblioteca de padrões paralelos. Por exemplo, você pode usar o Concurrency::parallel_for o algoritmo para transformar uma existente for loop para funcionar em paralelo.

Para obter mais informações sobre a biblioteca de padrões paralelos, consulte Biblioteca paralela de padrões (PPL).

Biblioteca de agentes assíncronos

A biblioteca de agentes assíncronos (ou apenas Biblioteca de agentes) fornece um modelo de programação baseada em ator e a mensagem passando interfaces para o fluxo de dados refinado e processamento de tarefas. Agentes assíncronos permitem fazer uso produtivo de latência realizando trabalho como outros componentes aguardar a dados.

Use a biblioteca de agentes, quando você tiver várias entidades que se comunicam entre si de maneira assíncrona. Por exemplo, você pode criar um agente que lê dados de uma arquivo ou conexão de rede e usa as interfaces de transmissão de mensagens 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 as tarefas em tempo de execução. O Agendador de tarefas é cooperativo e usa um algoritmo de roubo de trabalho para alcançar a utilização máxima dos recursos de processamento.

O Runtime de simultaneidade fornece um agendador padrão para que você não precisa gerenciar os detalhes da infra-estrutura. No entanto, para atender às necessidades de qualidade do seu aplicativo, você também pode fornecer seus próprio agendamento agendadores de específicos diretiva ou associar com tarefas específicas.

Para obter mais informações sobre o Agendador de tarefas, consulte Agendador de tarefas (Runtime de simultaneidade).

Gerenciador de recursos

A função do Gerenciador de recursos é gerenciar recursos de computação, como, por exemplo, processadores e memória. O Gerenciador de recursos responde a cargas de trabalho que eles mudam em tempo de execução, atribuindo recursos onde eles podem ser mais eficazes.

O Gerenciador de recursos serve como uma abstração sobre recursos de computação e principalmente interage com o Agendador de tarefas. Embora você possa usar o Gerenciador de recursos para ajustar o desempenho dos aplicativos e bibliotecas, você normalmente usa a funcionalidade fornecida pela biblioteca paralela de padrões, a biblioteca de agentes e o Agendador de tarefas. Essas bibliotecas usam o Gerenciador de recursos para reequilibrar dinamicamente recursos à medida que mudam de cargas de trabalho.

go to top

Expressões Lambda do C++

Muitos dos tipos e algoritmos que são definidos pelo Runtime de simultaneidade são implementados como modelos C++. Alguns desses tipos e algoritmos utilizam como um parâmetro uma rotina que executa o trabalho. Este parâmetro pode ser uma função lambda, um objeto de função ou um ponteiro de função. Essas entidades são também denominadas funções de trabalho ou rotinas de trabalho.

Expressões lambda são um recurso de linguagem do Visual C++ novo importante, pois eles fornecem uma maneira sucinta para definir funções de trabalho para processamento paralelo. Objetos de função e ponteiros de função permitem que você use o Runtime de simultaneidade com o seu código existente. No entanto, recomendamos que você use expressões lambda, ao escrever código novo devido, por exemplo, os benefícios de segurança e produtividade que eles fornecem.

O exemplo a seguir compara a sintaxe das funções de lambda, objetos de função e ponteiros de função em várias chamadas para o Concurrency::parallel_for_each algoritmo. Cada chamada para parallel_for_each usa uma técnica diferente para calcular o quadrado de cada elemento em um std::array objeto.

// 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(values.begin(), values.end(), [](int& n){n *= n;});

   // Use a function object (functor) to square each element.
   parallel_for_each(values.begin(), values.end(), SquareFunctor<int>());

   // Use a function pointer to square each element.
   parallel_for_each(values.begin(), values.end(), &square_function<int>);

   // Print each element of the array to the console.
   for_each(values.begin(), values.end(), [](int& n) { 
      wcout << n << endl;
   });
}

O exemplo produz a seguinte saída.

1
256
6561
65536
390625

Para obter mais informações sobre as funções de lambda em C++, consulte Lambda Expressions in C++.

go to top

Requisitos

A tabela a seguir mostra os arquivos de cabeçalho que estão associados a cada componente do Runtime de simultaneidade:

Componente

Arquivos de cabeçalho

Biblioteca paralela de padrões (PPL)

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 Runtime de simultaneidade é declarado na simultaneidade espaço para nome. O Concurrency::details namespace suporta o framework Runtime de simultaneidade e não se destina a ser usado diretamente em seu código.

O Runtime de simultaneidade é fornecido como parte do C Runtime Library (CRT). Para obter mais informações sobre como criar um aplicativo que usa a CRT, consulte C Run-Time Libraries.

go to top

Histórico de alterações

Date

History

Motivo

Julho de 2010

Conteúdo reorganizado.

Aprimoramento de informações.