Membandingkan Runtime Konkurensi dengan Model Konkurensi Lainnya

Dokumen ini menjelaskan perbedaan antara fitur dan model pemrograman Runtime Konkurensi dan teknologi lainnya. Dengan memahami bagaimana manfaat Runtime Konkurensi dibandingkan dengan manfaat model pemrograman lainnya, Anda dapat memilih teknologi yang paling memenuhi persyaratan aplikasi Anda.

Jika saat ini Anda menggunakan model pemrograman lain, seperti kumpulan utas Windows atau OpenMP, ada situasi di mana bisa sesuai untuk bermigrasi ke Runtime Konkurensi. Misalnya, topik Migrasi dari OpenMP ke Runtime Konkurensi menjelaskan kapan bisa sesuai untuk bermigrasi dari OpenMP ke Runtime Konkurensi. Namun, jika Anda puas dengan performa aplikasi dan dukungan penelusuran kesalahan saat ini, migrasi tidak diperlukan.

Anda dapat menggunakan fitur dan manfaat produktivitas dari Concurrency Runtime untuk melengkapi aplikasi Anda yang ada yang menggunakan model konkurensi lain. Runtime Konkurensi tidak dapat menjamin penyeimbangan beban ketika beberapa penjadwal tugas bersaing untuk sumber daya komputasi yang sama. Namun, ketika beban kerja tidak tumpang tindih, efek ini minimal.

Bagian

Membandingkan Penjadwalan Preemptive dengan Penjadwalan Koperasi

Model preemptive dan model penjadwalan kooperatif adalah dua cara umum untuk memungkinkan beberapa tugas berbagi sumber daya komputasi, misalnya, prosesor atau utas perangkat keras.

Penjadwalan Preemptive dan Cooperative

Penjadwalan preemptive adalah mekanisme berbasis prioritas round-robin yang memberi setiap tugas akses eksklusif ke sumber daya komputasi untuk periode waktu tertentu, lalu beralih ke tugas lain. Penjadwalan preemtif umum dilakukan dalam sistem operasi multitugas seperti Windows. Penjadwalan kooperatif adalah mekanisme yang memberi setiap tugas akses eksklusif ke sumber daya komputasi sampai tugas selesai atau sampai tugas menghasilkan aksesnya ke sumber daya. Runtime Konkurensi menggunakan penjadwalan koperasi bersama dengan penjadwal preemptive sistem operasi untuk mencapai penggunaan maksimum sumber daya pemrosesan.

Perbedaan Antara Penjadwal Preemptif dan Koperasi

Penjadwal preemptive berusaha memberikan beberapa utas akses yang sama ke sumber daya komputasi untuk memastikan bahwa setiap utas membuat kemajuan. Pada komputer yang memiliki banyak sumber daya komputasi, memastikan akses yang adil menjadi kurang bermasalah; namun, memastikan pemanfaatan sumber daya yang efisien menjadi lebih bermasalah.

Penjadwal mode kernel preemptive mengharuskan kode aplikasi untuk mengandalkan sistem operasi untuk membuat keputusan penjadwalan. Sebaliknya, penjadwal kooperatif mode pengguna memungkinkan kode aplikasi untuk membuat keputusan penjadwalannya sendiri. Karena penjadwalan kooperatif memungkinkan banyak keputusan penjadwalan yang akan dibuat oleh aplikasi, itu mengurangi banyak overhead yang terkait dengan sinkronisasi mode kernel. Penjadwal koperasi biasanya menunda keputusan penjadwalan ke kernel sistem operasi ketika tidak memiliki pekerjaan lain untuk dijadwalkan. Penjadwal kooperatif juga menunda penjadwal sistem operasi ketika ada operasi pemblokiran yang dikomunikasikan ke kernel, tetapi operasi itu tidak dikomunikasikan ke penjadwal mode pengguna.

Penjadwalan dan Efisiensi Koperasi

Untuk penjadwal preemptive, semua pekerjaan yang memiliki tingkat prioritas yang sama sama. Penjadwal preemptive biasanya menjadwalkan utas dalam urutan pembuatannya. Selain itu, penjadwal preemptive memberi setiap utas ikatan waktu dengan cara round-robin, berdasarkan prioritas utas. Meskipun mekanisme ini memberikan kewajaran (setiap utas membuat kemajuan ke depan), itu datang dengan biaya efisiensi. Misalnya, banyak algoritma intensif komputasi tidak memerlukan kewajaran. Sebaliknya, penting bahwa tugas terkait selesai dalam waktu yang paling tidak keseluruhan. Penjadwalan kooperatif memungkinkan aplikasi untuk menjadwalkan pekerjaan dengan lebih efisien. Misalnya, pertimbangkan aplikasi yang memiliki banyak utas. Menjadwalkan utas yang tidak berbagi sumber daya untuk dijalankan secara bersamaan dapat mengurangi overhead sinkronisasi dan dengan demikian meningkatkan efisiensi. Cara lain yang efisien untuk menjadwalkan tugas adalah menjalankan alur tugas (di mana setiap tugas bertindak pada output yang sebelumnya) pada prosesor yang sama sehingga input setiap tahap alur sudah dimuat ke dalam cache memori.

Menggunakan Penjadwalan Preemptive dan Cooperative Bersama

Penjadwalan kooperatif tidak menyelesaikan semua masalah penjadwalan. Misalnya, tugas yang tidak cukup menghasilkan tugas lain dapat menggunakan semua sumber daya komputasi yang tersedia dan mencegah tugas lain membuat kemajuan. Concurrency Runtime menggunakan manfaat efisiensi penjadwalan koperasi untuk melengkapi jaminan kewajaran penjadwalan preemptive. Secara default, Concurrency Runtime menyediakan penjadwal kooperatif yang menggunakan algoritma pencurian kerja untuk mendistribusikan pekerjaan secara efisien di antara sumber daya komputasi. Namun, penjadwal Runtime Konkurensi juga bergantung pada penjadwal preemptive sistem operasi untuk mendistribusikan sumber daya di antara aplikasi secara adil. Anda juga dapat membuat penjadwal kustom dan kebijakan penjadwal di aplikasi Anda untuk menghasilkan kontrol terperinci atas eksekusi utas.

[Atas]

Membandingkan Runtime Konkurensi dengan WINDOWS API

Antarmuka pemrograman aplikasi Microsoft Windows, yang biasanya disebut sebagai Windows API (dan sebelumnya dikenal sebagai Win32), menyediakan model pemrograman yang memungkinkan konkurensi dalam aplikasi Anda. Runtime Konkurensi dibangun di Windows API untuk menyediakan model pemrograman tambahan yang tidak tersedia dari sistem operasi yang mendasarinya.

Runtime Konkurensi dibangun pada model utas Windows API untuk melakukan pekerjaan paralel. Ini juga menggunakan manajemen memori Windows API dan mekanisme penyimpanan lokal utas. Pada Windows 7 dan Windows Server 2008 R2, ia menggunakan dukungan Windows API untuk utas dan komputer yang dapat di-schedulable pengguna yang memiliki lebih dari 64 utas perangkat keras. Runtime Konkurensi memperluas model Windows API dengan menyediakan penjadwal tugas kooperatif dan algoritma pencurian kerja untuk memaksimalkan penggunaan sumber daya komputasi, dan dengan mengaktifkan beberapa instans penjadwal simultan.

Bahasa Pemrograman

Windows API menggunakan bahasa pemrograman C untuk mengekspos model pemrograman. Concurrency Runtime menyediakan antarmuka pemrograman C++ yang memanfaatkan fitur terbaru dalam bahasa C++. Misalnya, fungsi lambda menyediakan mekanisme tipe aman yang tepat untuk menentukan fungsi kerja paralel. Untuk informasi selengkapnya tentang fitur C++ terbaru yang digunakan Runtime Konkurensi, lihat Gambaran Umum.

Kumpulan Utas dan Utas

Mekanisme konkurensi pusat di Windows API adalah utas. Anda biasanya menggunakan fungsi CreateThread untuk membuat utas. Meskipun utas relatif mudah dibuat dan digunakan, sistem operasi mengalokasikan sejumlah besar waktu dan sumber daya lain untuk mengelolanya. Selain itu, meskipun setiap utas dijamin akan menerima waktu eksekusi yang sama dengan utas lain pada tingkat prioritas yang sama, overhead terkait mengharuskan Anda membuat tugas yang cukup besar. Untuk tugas yang lebih kecil atau lebih halus, overhead yang terkait dengan konkurensi dapat melebihi manfaat menjalankan tugas secara paralel.

Kumpulan utas adalah salah satu cara untuk mengurangi biaya manajemen utas. Kumpulan utas kustom dan implementasi kumpulan utas yang disediakan oleh Windows API memungkinkan item kerja kecil berjalan secara efisien secara paralel. Kumpulan utas Windows mempertahankan item kerja dalam antrean first-in, first-out (FIFO). Setiap item kerja dimulai dalam urutan ditambahkan ke kumpulan.

Runtime Konkurensi mengimplementasikan algoritma pencurian kerja untuk memperluas mekanisme penjadwalan FIFO. Algoritma memindahkan tugas yang belum dimulai ke utas yang kehabisan item kerja. Meskipun algoritma pencurian kerja dapat menyeimbangkan beban kerja, algoritma ini juga dapat menyebabkan item kerja disusun ulang. Proses pengurutan ulang ini dapat menyebabkan item kerja dimulai dalam urutan yang berbeda dari yang dikirimkan. Ini berguna dengan algoritma rekursif, di mana ada kemungkinan yang lebih baik bahwa data dibagikan di antara tugas yang lebih baru daripada di antara yang lebih lama. Mendapatkan item baru untuk dijalankan terlebih dahulu berarti lebih sedikit kesalahan cache dan mungkin lebih sedikit kesalahan halaman.

Dari perspektif sistem operasi, pencurian kerja tidak adili. Namun, ketika aplikasi menerapkan algoritma atau tugas untuk dijalankan secara paralel, kewajaran di antara sub-tugas tidak selalu penting. Yang penting adalah seberapa cepat tugas keseluruhan selesai. Untuk algoritma lain, FIFO adalah strategi penjadwalan yang sesuai.

Perilaku pada Berbagai Sistem Operasi

Pada Windows XP dan Windows Vista, aplikasi yang menggunakan Runtime Konkurensi berperilaku sama, kecuali performa timbunan ditingkatkan pada Windows Vista.

Di Windows 7 dan Windows Server 2008 R2, sistem operasi lebih lanjut mendukung konkurensi dan skalabilitas. Misalnya, sistem operasi ini mendukung komputer yang memiliki lebih dari 64 utas perangkat keras. Aplikasi yang ada yang menggunakan Windows API harus dimodifikasi untuk memanfaatkan fitur baru ini. Namun, aplikasi yang menggunakan Runtime Konkurensi secara otomatis menggunakan fitur-fitur ini dan tidak memerlukan modifikasi.

base.user-mode_scheduling

[Atas]

Membandingkan Runtime Konkurensi dengan OpenMP

Runtime Konkurensi memungkinkan berbagai model pemrograman. Model-model ini dapat tumpang tindih atau melengkapi model pustaka lain. Bagian ini membandingkan Runtime Konkurensi dengan OpenMP.

Model pemrograman OpenMP didefinisikan oleh standar terbuka dan memiliki pengikatan yang terdefinisi dengan baik ke bahasa pemrograman Fortran dan C/C++. OpenMP versi 2.0 dan 2.5 sangat cocok untuk algoritma paralel yang berulang; artinya, mereka melakukan iterasi paralel atas array data. OpenMP paling efisien ketika tingkat paralelisme telah ditentukan sebelumnya dan cocok dengan sumber daya yang tersedia pada sistem. Model OpenMP adalah kecocokan yang sangat baik untuk komputasi berkinerja tinggi, di mana masalah komputasi yang sangat besar didistribusikan di seluruh sumber daya pemrosesan satu komputer. Dalam skenario ini, lingkungan perangkat keras diketahui dan pengembang dapat secara wajar mengharapkan untuk memiliki akses eksklusif ke sumber daya komputasi ketika algoritma dijalankan.

Namun, lingkungan komputasi lain yang kurang dibatasi mungkin tidak cocok untuk OpenMP. Misalnya, masalah rekursif (seperti algoritma quicksort atau mencari pohon data) lebih sulit diterapkan dengan menggunakan OpenMP. Runtime Konkurensi melengkapi kemampuan OpenMP dengan menyediakan Pustaka Pola Paralel (PPL) dan Pustaka Agen Asinkron. Tidak seperti OpenMP, Concurrency Runtime menyediakan penjadwal dinamis yang beradaptasi dengan sumber daya yang tersedia dan menyesuaikan tingkat paralelisme saat beban kerja berubah.

Banyak fitur dalam Concurrency Runtime dapat diperluas. Anda juga dapat menggabungkan fitur yang ada untuk menyusun fitur baru. Karena OpenMP mengandalkan arahan kompilator, openMP tidak dapat diperpanjang dengan mudah.

Untuk informasi selengkapnya tentang bagaimana Runtime Konkurensi dibandingkan dengan OpenMP dan cara memigrasikan kode OpenMP yang ada untuk menggunakan Runtime Konkurensi, lihat Migrasi dari OpenMP ke Runtime Konkurensi.

[Atas]

Baca juga

Runtime Konkurensi
Gambaran Umum
Parallel Patterns Library (PPL)
Pustaka Agen Asinkron
OpenMP