Sudah ada cukup banyak penelitian tentang algoritma pengecualian bersama - misalnya banyak yang disajikan dalam buku teks klasik seperti The Art of Multiprocessor Programming , di mana seluruh bab dikhususkan untuk mereka.
Saya bertanya-tanya apa saja situasi praktis di mana seseorang mungkin membutuhkan algoritma ini selama rekayasa sistem bersamaan, daripada menggunakan bahasa primitif sinkronisasi yang disediakan OS dan OS (katakanlah, disediakan oleh pthread library)?
Saya dapat memikirkan banyak kasus khusus di mana saya membayangkan standar primitif tidak secara khusus disesuaikan untuk mereka, misalnya "satu pembaca yang sering dan satu penulis yang jarang", atau sebaliknya, atau "persis satu operasi penulisan, banyak pembaca", dll. - Apakah ada algoritma saling pengecualian buku teks yang secara signifikan lebih baik dalam praktiknya dalam situasi seperti itu?
Singkatnya: Algoritma mutual exclusion mutual mana yang memiliki relevansi praktis untuk seorang insinyur yang sudah memiliki perpustakaan khusus konkurensi konkurensi yang disediakan dalam bahasa mereka?
Jawaban:
Jawab: tidak ada. Bukan itu yang dimaksud dengan bagian dari Seni Pemrograman Multi-Prosesor Herlihy dan Shavit. Dalam bab-bab tentang pengecualian bersama, Herlihy dan Shavit tidak memberi Anda alternatif untuk
pthread
perpustakaan, mereka menunjukkan kepada Anda bagaimana penerapannya setara denganpthread
perpustakaan.Bab 2 Herlihy dan Shavit berjudul "Pengecualian Saling." Ini memberikan berbagai algoritma klasik untuk mengimplementasikan yang setara
pthread_mutex_lock()
dengan hanya memori bersama yang konsisten. Jawaban saya https://cs.stackexchange.com/a/12632/7459 dan https://cs.stackexchange.com/a/30249/7459 membahas pentingnya implementasi ini, dan memiliki petunjuk ke salah satu yang praktis untuk gunakan pada mesin yang tidak memiliki operasi sinkronisasi perangkat keras bawaan. (Kertas Lamport 1987 dalam ACM Trans. On Computer Systems).Bab 7 dari Herlihy dan Shavit memberikan berbagai implementasi putaran dan kunci antrian yang setara dengan
pthread_mutex_lock()
, dan Bab 8 memperluas untuk membahaspthread_cond_t
(variabel kondisi),pthread_rwlock_t
(pembaca / penulis mengunci), dan secara singkat menyentuhsemaphores
. Mungkin ada situasi di manapthread_rwlock_t
dapat digunakan sebagai alternatifpthread_lock_t
untuk alasan kinerja (tetapi biasanya tidak) dan di Posix Anda perlu menggunakansemaphores
untuk sinkronisasi antar-proses.Bab 9 hingga 16 sebagian besar membahas aplikasi (berbagai jenis wadah bersamaan). Bab 17 secara singkat membahas hal yang setara dengan
pthread_barrier_t
.Semua yang dikatakan, Herlihy dan Shavit adalah dua pendukung memori transaksional yang paling vokal dan berbagai jenis sinkronisasi non-blocking (dan tunggu-bebas). Teknik-teknik ini dimaksudkan sebagai alternatif untuk saling pengecualian dalam kasus-kasus tertentu. Herlihy dan Shavit menaburkan berbagai implementasi non-blocking di seluruh Bab 9 hingga 16, dan kemudian merinci memori transaksional dalam Bab 18.
Memori transaksional dan teknik sinkronisasi non-pemblokiran lainnya dimaksudkan untuk mengatasi masalah yang memerlukan beberapa algoritme yang tidak dirancang dengan baik untuk menahan bagian-bagian penting mereka untuk waktu yang sangat lama. Memori transaksional dan sinkronisasi yang benar-benar non-blocking saat ini bukanlah alternatif praktis dalam situasi nyata apa pun, tetapi teknik untuk mengubah struktur data blocking menjadi struktur data non-blocking berguna dalam praktiknya untuk meminimalkan jumlah waktu struktur data blocking tetap berada dalam kondisi kritis. bagian. (Seringkali Anda dapat mengurangi ukuran bagian kritis menjadi hanya beberapa instruksi mesin.)
sumber