Gambaran umum Runtime Konkurensi

Dokumen ini memberikan gambaran umum tentang Runtime Konkurensi. Ini menjelaskan manfaat Dari Runtime Konkurensi, kapan harus menggunakannya, dan bagaimana komponennya berinteraksi satu sama lain dan dengan sistem operasi dan aplikasi.

Bagian

Dokumen ini berisi bagian berikut:

Riwayat implementasi Runtime Konkurensi

Di Visual Studio 2010 hingga 2013, Runtime Konkurensi dimasukkan dalam msvcr100.dll melalui msvcr120.dll. Ketika pemfaktoran ulang UCRT terjadi di Visual Studio 2015, DLL tersebut direfaktor menjadi tiga bagian:

  • ucrtbase.dll – C API, dikirim di Windows 10 dan layanan downlevel melalui Windows Update-

  • vcruntime140.dll – Fungsi dukungan pengkompilasi dan runtime EH, dikirim melalui Visual Studio

  • concrt140.dll – Concurrency Runtime, dikirim melalui Visual Studio. Diperlukan untuk kontainer dan algoritma paralel seperti concurrency::parallel_for. Selain itu, STL memerlukan DLL ini pada Windows XP untuk mendukung primitif sinkronisasi, karena Windows XP tidak memiliki variabel kondisi.

Di Visual Studio 2015 dan yang lebih baru, Penjadwal Tugas Runtime Konkurensi bukan lagi penjadwal untuk kelas tugas dan jenis terkait di ppltasks.h. Jenis tersebut sekarang menggunakan Windows ThreadPool untuk performa dan interoperabilitas yang lebih baik dengan primitif sinkronisasi Windows.

Mengapa Runtime untuk Konkurensi Penting

Runtime untuk konkurensi memberikan keseragaman dan prediksi untuk aplikasi dan komponen aplikasi yang berjalan secara bersamaan. Dua contoh manfaat Runtime Konkurensi adalah penjadwalan tugas kooperatif dan pemblokiran kooperatif.

Concurrency Runtime menggunakan penjadwal tugas kooperatif yang mengimplementasikan algoritma pencurian kerja untuk mendistribusikan pekerjaan secara efisien di antara sumber daya komputasi. Misalnya, pertimbangkan aplikasi yang memiliki dua utas yang keduanya dikelola oleh runtime yang sama. Jika satu utas menyelesaikan tugas terjadwal, utas tersebut dapat membongkar pekerjaan dari utas lainnya. Mekanisme ini menyeimbangkan beban kerja keseluruhan aplikasi.

Runtime Konkurensi juga menyediakan primitif sinkronisasi yang menggunakan pemblokiran kooperatif untuk menyinkronkan akses ke sumber daya. Misalnya, pertimbangkan tugas yang harus memiliki akses eksklusif ke sumber daya bersama. Dengan memblokir secara kooperatif, runtime dapat menggunakan kuantum yang tersisa untuk melakukan tugas lain saat tugas pertama menunggu sumber daya. Mekanisme ini mempromosikan penggunaan maksimum sumber daya komputasi.

[Atas]

Arsitektur

Runtime Konkurensi dibagi menjadi empat komponen: Pustaka Pola Paralel (PPL), Pustaka Agen Asinkron, Penjadwal Tugas, dan Resource Manager. Komponen-komponen ini berada antara sistem operasi dan aplikasi. Ilustrasi berikut menunjukkan bagaimana komponen Runtime Konkurensi berinteraksi di antara sistem operasi dan aplikasi:

Arsitektur Runtime Konkurensi

The Concurrency Runtime Architecture.

Penting

Komponen Task Scheduler dan Resource Manager tidak tersedia dari aplikasi Platform Windows Universal (UWP) atau saat Anda menggunakan kelas tugas atau jenis lain di ppltasks.h.

Runtime Konkurensi sangat dapat dikompositasikan, yaitu, Anda dapat menggabungkan fungsionalitas yang ada untuk melakukan lebih banyak hal. Runtime Konkurensi menyusun banyak fitur, seperti algoritma paralel, dari komponen tingkat bawah.

Runtime Konkurensi juga menyediakan primitif sinkronisasi yang menggunakan pemblokiran kooperatif untuk menyinkronkan akses ke sumber daya. Untuk informasi selengkapnya tentang primitif sinkronisasi ini, lihat Struktur Data Sinkronisasi.

Bagian berikut memberikan gambaran singkat tentang apa yang disediakan setiap komponen dan kapan menggunakannya.

Pustaka Pola Paralel

Parallel Patterns Library (PPL) menyediakan kontainer dan algoritma tujuan umum untuk melakukan paralelisme mendetail. PPL memungkinkan paralelisme data imperatif dengan menyediakan algoritma paralel yang mendistribusikan komputasi pada koleksi atau pada kumpulan data di seluruh sumber daya komputasi. Ini juga memungkinkan paralelisme tugas dengan menyediakan objek tugas yang mendistribusikan beberapa operasi independen di seluruh sumber daya komputasi.

Gunakan Pustaka Pola Paralel saat Anda memiliki komputasi lokal yang dapat memperoleh manfaat dari eksekusi paralel. Misalnya, Anda dapat menggunakan algoritma concurrency::p arallel_for untuk mengubah perulangan yang ada for untuk bertindak secara paralel.

Untuk informasi selengkapnya tentang Pustaka Pola Paralel, lihat Pustaka Pola Paralel (PPL).

Pustaka Agen Asinkron

Pustaka Agen Asinkron (atau hanya Pustaka Agen) menyediakan model pemrograman berbasis aktor dan antarmuka passing pesan untuk aliran data dan tugas alur yang kasar. Agen asinkron memungkinkan Anda untuk memanfaatkan latensi secara produktif dengan melakukan pekerjaan saat komponen lain menunggu data.

Gunakan Pustaka Agen saat Anda memiliki beberapa entitas yang berkomunikasi satu sama lain secara asinkron. Misalnya, Anda dapat membuat agen yang membaca data dari file atau koneksi jaringan lalu menggunakan antarmuka passing pesan untuk mengirim data tersebut ke agen lain.

Untuk informasi selengkapnya tentang Pustaka Agen, lihat Pustaka Agen Asinkron.

Tugas Microsoft Azure Scheduler

Penjadwal Tugas menjadwalkan dan mengoordinasikan tugas pada waktu proses. Penjadwal Tugas kooperatif dan menggunakan algoritma pencurian kerja untuk mencapai penggunaan maksimum sumber daya pemrosesan.

Runtime Konkurensi menyediakan penjadwal default sehingga Anda tidak perlu mengelola detail infrastruktur. Namun, untuk memenuhi kebutuhan kualitas aplikasi, Anda juga dapat memberikan kebijakan penjadwalan Anda sendiri atau mengaitkan penjadwal tertentu dengan tugas tertentu.

Untuk informasi selengkapnya tentang Penjadwal Tugas, lihat Penjadwal Tugas.

Resource Manager

Peran Resource Manager adalah mengelola sumber daya komputasi, seperti prosesor dan memori. Resource Manager merespons beban kerja saat berubah pada waktu proses dengan menetapkan sumber daya ke tempat yang paling efektif.

Resource Manager berfungsi sebagai abstraksi atas sumber daya komputasi dan terutama berinteraksi dengan Penjadwal Tugas. Meskipun Anda dapat menggunakan Resource Manager untuk menyempurnakan performa pustaka dan aplikasi, Anda biasanya menggunakan fungsionalitas yang disediakan oleh Pustaka Pola Paralel, Pustaka Agen, dan Penjadwal Tugas. Pustaka ini menggunakan Resource Manager untuk menyeimbangkan kembali sumber daya secara dinamis saat beban kerja berubah.

[Atas]

Ekspresi Lambda C++

Banyak jenis dan algoritma yang ditentukan oleh Runtime Konkurensi diimplementasikan sebagai templat C++. Beberapa jenis dan algoritma ini mengambil sebagai parameter rutinitas yang melakukan pekerjaan. Parameter ini dapat berupa fungsi lambda, objek fungsi, atau penunjuk fungsi. Entitas ini juga disebut sebagai fungsi kerja atau rutinitas kerja.

Ekspresi Lambda adalah fitur bahasa Visual C++ baru yang penting karena menyediakan cara yang tepat untuk menentukan fungsi kerja untuk pemrosesan paralel. Objek fungsi dan penunjuk fungsi memungkinkan Anda menggunakan Runtime Konkurensi dengan kode yang ada. Namun, kami sarankan Anda menggunakan ekspresi lambda saat menulis kode baru karena manfaat keamanan dan produktivitas yang diberikannya.

Contoh berikut membandingkan sintaks fungsi lambda, objek fungsi, dan penunjuk fungsi dalam beberapa panggilan dengan algoritma konkurensi::p arallel_for_each . Setiap panggilan untuk parallel_for_each menggunakan teknik yang berbeda untuk menghitung kuadrat dari setiap elemen dalam objek 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;
   });
}

Hasil

1
256
6561
65536
390625

Untuk informasi selengkapnya tentang fungsi lambda di C++, lihat Ekspresi Lambda.

[Atas]

Persyaratan

Tabel berikut ini memperlihatkan file header yang terkait dengan setiap komponen Runtime Konkurensi:

Komponen File Header
Parallel Patterns Library (PPL) ppl.h

concurrent_queue.h

concurrent_vector.h
Pustaka Agen Asinkron agents.h
Tugas Microsoft Azure Scheduler concrt.h
Resource Manager concrtrm.h

Runtime Konkurensi dideklarasikan dalam namespace layanan Konkurensi . (Anda juga dapat menggunakan konkurensi, yang merupakan alias untuk namespace layanan ini.) Namespace concurrency::details mendukung kerangka kerja Runtime Konkurensi, dan tidak dimaksudkan untuk digunakan langsung dari kode Anda.

Runtime Konkurensi disediakan sebagai bagian dari C Runtime Library (CRT). Untuk informasi selengkapnya tentang cara membuat aplikasi yang menggunakan CRT, lihat Fitur Pustaka CRT.

[Atas]