Mencegah kelaparan benang – praktik terbaik

pemrograman


Saya mencari informasi lebih lanjut tentang cara mencegah kelaparan/pemblokiran/balapan thread dalam aplikasi atau layanan yang mungkin dapat menjalankan hingga 200 thread secara bersamaan di beberapa prosesor/core.

Sebagian besar contoh yang saya temukan online menunjukkan cara mengoordinasikan maksimal 3 atau 4 utas dan saya merencanakan aplikasi yang akan memiliki ratusan.

Saya telah membuat aplikasi yang telah menjalankan hingga 30 thread tetapi ketika melampaui itu saya khawatir beberapa thread tidak mendapatkan waktu CPU belum lagi sinkronisasi.

Di mana saya dapat menemukan artikel dan blog yang sangat bagus?
Buku apa yang terbaik mengenai topik ini?
Ada banyak buku dan artikel tentang subjek ini, saya mencari yang paling informatif dan instruksional tetapi tidak disajikan dalam bahasa teknik di atas pemahaman saya.

Semua saran dihargai.

Solusi 1

Ada terlalu banyak skenario untuk dibahas sehingga tidak mungkin menjawab pertanyaan Anda.

Namun, menggunakan lebih banyak thread aktif daripada jumlah inti biasanya kontraproduktif. Anda bisa mendapatkan keuntungan dengan menggunakan lebih banyak thread daripada jumlah inti hanya jika sebagian besar thread biasanya ingin tidur, misalnya dengan menunggu beberapa operasi IO seperti panggilan recv() yang menerima data dari jaringan. Bahkan dalam hal ini Anda ingin secara aktif mengontrol jumlah thread yang dijalankan secara paralel sehingga memulai 200 thread dengan harapan hanya 4 thread yang *ingin* berjalan secara paralel jika Anda memiliki 4 core bukanlah praktik yang baik.

Jika Anda harus menjalankan 200 tugas paralel yang aktif sepanjang waktu maka Anda lebih baik membuat jumlah thread yang sama dengan jumlah inti dan membagi tugas menjadi pekerjaan-pekerjaan kecil. Anda menjalankan pekerjaan kecil ini di thread Anda dalam urutan apa pun yang Anda inginkan dengan memasukkannya ke dalam antrian pekerjaan tempat thread Anda menariknya keluar satu per satu. Ini sudah hampir seperti memiliki penjadwal Anda sendiri. Teknik yang sering kali menghasilkan solusi yang lebih canggih daripada yang sebelumnya adalah menggunakan thread hijau/coroutine (ucontext POSIX api tidak digunakan lagi di beberapa distro linux dan fiber api di windows).

Dengan menggunakan utas hijau, Anda dapat membagi utas menjadi banyak utas hijau dan Anda melakukan tugas peralihan/kerja sama antara utas hijau ini secara eksplisit di ruang pengguna. Katakanlah Anda memiliki 4 core. Kemudian Anda dapat memulai 4 utas dan jika Anda membagi setiap utas menjadi 100 utas hijau maka Anda memiliki 400 utas hijau tetapi hanya 4 di antaranya yang dijalankan secara paralel pada titik waktu tertentu dan Anda dapat menulis penjadwal Anda sendiri karena Anda memiliki kendali atas tugas beralih di antara utas hijau.

Menulis misalnya server web menggunakan utas hijau memiliki manfaat berikut: kode untuk implementasi multithread normal dan implementasi async/green thread dapat menggunakan kode servlet yang sama jika ditulis dengan baik (karena Anda dapat memasukkan peralihan tugas ke dalam implementasi Anda sendiri jika tidak memblokir panggilan fungsi seperti fungsi baca/tulis soket dan implementasi untuk panggilan fungsi pemblokiran yang sama dalam mode multithread sebenarnya memanggil fungsi pemblokiran yang setara dengan OS).

コメント

タイトルとURLをコピーしました