Jawaban:
Hanya untuk memastikan kita berada di halaman yang sama, pertama mari kita perhatikan tiga definisi ini:
Definisi. Test-and-set adalah instruksi baca-modifikasi-tulis pada beberapa register biner (katakan saja 0 dan 1 adalah nilai yang mungkin) di mana utas mendapatkan nilai lama dan tulis 1.
Definisi. Konsensus dicapai antara utas jika semua n utas memutuskan nilai yang sama (persyaratan konsistensi) dan semua utas menentukan nilai yang sebenarnya diusulkan oleh salah satu utas (persyaratan validitas).
Definisi. Protokol konsensus bebas menunggu jika setiap panggilan metode selesai dalam sejumlah langkah terbatas.
Sekarang ikuti dua sketsa bukti.
Klaim 1. Jumlah konsensus test-and-set setidaknya 2. Bukti. Misalkan kita memiliki dua utas 0 dan 1 yang perlu mencapai konsensus. Kita dapat melakukan ini dengan membiarkan setiap utas mengikuti protokol konsensus di bawah ini:
Anda dapat memverifikasi diri Anda bahwa konsensus dan kesabaran menunggu.
(Untuk bukti selanjutnya, saya akan membuat beberapa bukti dan definisi karena saya pikir ini akan membuatnya lebih mudah untuk diikuti.)
Klaim 2. Jumlah konsensus uji-dan-set paling banyak 2. Bukti. Dengan kontradiksi. Misalkan kita memiliki tiga utas , B dan C yang masing-masing ingin memutuskan nilai a , b dan c , dan bahwa kita memiliki beberapa protokol konsensus bebas-tunggu yang valid yang diimplementasikan menggunakan uji-dan-set (dan atom membaca dan menulis ).
Kami dapat memvisualisasikan proses konsensus sebagai pohon terarah, di mana:
Definisi. Biarkan negara menjadi multivalen jika hasil dari proses konsensus belum ditentukan. Dengan kata lain, tidak semua interleaving yang mungkin dari gerakan yang tersisa mengarah ke hasil yang sama. Mari negara menjadi univalen ketika hasil dari proses konsensus yang ditentukan.
Akarnya multivalen. Bukti. Jika hanya satu utas yang aktif dan utas lainnya tidak aktif selamanya, maka X akan menyelesaikan dalam sejumlah langkah terbatas (dijamin oleh asumsi tunggu-bebas) dan ia akan memutuskan x (karena hanya memiliki akses ke nilai ini dan keputusan akan memenuhi persyaratan validitas konsensus). Jadi untuk situasi kita, a , b dan c adalah semua hasil yang mungkin. ◻
Definisi. Biarkan keadaan kritis menjadi keadaan yang multivalen, dengan properti tambahan yang bergerak oleh akan menentukan a , dan gerakan oleh B akan menentukan b .
Ada kondisi kritis. Bukti. Dari atas kita tahu bahwa kita mulai dalam keadaan multivalen. Biarkan tidak bergerak sama sekali. Selama A atau B tidak memaksa pohon ke kondisi univalen, biarkan ia bergerak. Wait-freeness menjamin bahwa pohon itu terbatas, sehingga pada titik tertentu keadaan kritis harus dijumpai. ◻
Sekarang pertimbangkan sebuah skenario di mana kita berada dalam keadaan kritis. Ada setidaknya dua kemungkinan:
1) bergerak (dengan demikian menentukan a ) dan berhenti. B kemudian bergerak dan berhenti. Selanjutnya C berjalan sampai selesai, akhirnya memutuskan a .
2) bergerak (dengan demikian menentukan b ) dan berhenti. Selanjutnya C berjalan sampai selesai, akhirnya memutuskan b . A tidak bergerak.
Karena atom membaca dan menulis memiliki konsensus nomor 1, gerakan dan B harus menjadi instruksi tes-dan-atur pada register yang sama (jika register berbeda, maka C tidak akan dapat memberi tahu urutan di mana A dan B B bergerak 's terjadi). Jadi, dari perspektif C , skenario 1 dan 2 tidak bisa dibedakan, jadi kita harus memastikan bahwa C memutuskan a dan b . Ini tidak mungkin. ◻
Bahwa instruksi ujian dan set memiliki nomor konsensus 2 mengikuti dari Klaim 1 dan 2.
Artikel wikipedia memang memiliki referensi yang menjawab pertanyaan Anda, tetapi mungkin Anda tidak ingin membaca makalah 26 halaman itu. Saya akan memberikan versi sederhana dari bukti (cukup teknis), menunjukkan bahwa test-and-set tidak dapat menyelesaikan konsensus biner untuk 3 proses. Argumen semacam ini banyak digunakan dalam membuktikan angka konsensus.
Misalkan kita memiliki algoritma konsensus menggunakan register TAS untuk 3 proses.
Setiap saat, setiap proses akan memiliki langkah (instruksi) yang siap untuk dieksekusi. Manakah dari tiga instruksi yang akan dieksekusi adalah non-deterministik.
Misalkan kita berada dalam keadaan bivalen (keadaan di mana keputusan 0 atau 1 masih dimungkinkan) dan proses apa pun yang bergerak berikutnya, keadaan selanjutnya akan univalen. Keadaan seperti itu akhirnya harus dicapai karena kondisi bebas menunggu.
Misalkan (wlg) bahwa jika proses 1 bergerak, status akan 0-valent, dan jika proses 2 bergerak, status akan 1-valen. Kedua gerakan harus merupakan operasi TAS (atau setidaknya: semacam penulisan) pada register yang sama, karena jika mereka adalah operasi TAS pada register yang berbeda, kami tidak dapat mengetahui apakah proses 1 bergerak terlebih dahulu atau proses 2 bergerak terlebih dahulu.
Mari kita pertimbangkan dua kemungkinan eksekusi ini:
Dari sudut pandang proses 3, keadaan ini tidak dapat dibedakan karena hanya melihat nilai yang ditulis oleh proses 2. Namun, dalam kasus pertama harus memberikan 0 sebagai output, dan dalam 1 kedua sebagai output. Jelas, ini adalah kontradiksi.
Proses 1 dan 2 dapat memutuskan di antara mereka sendiri yang bergerak terlebih dahulu (karena mereka dapat melihat nilai apa dalam register sebelum penulisan mereka) tetapi proses penonton ketiga tidak bisa.
Cara lain untuk membuktikan bahwa test-and-set tidak dapat digunakan untuk menyelesaikan konsensus 3-prosesor adalah dengan menunjukkan bahwa test-and-set dapat diimplementasikan menggunakan konsensus 2-prosesor. Kemudian, dengan asumsi bahwa test-and-set dapat menyelesaikan konsensus 3-prosesor mengarah ke sebuah kontradiksi: Misalkan tes-dan-set dapat menyelesaikan konsensus 3-prosesor; kemudian dengan mengganti uji-dan-atur dengan implementasinya menggunakan konsensus 2-prosesor, seseorang memperoleh implementasi konsensus 3-prosesor menggunakan konsensus 2-prosesor, yang tidak mungkin. Dengan demikian test-and-set tidak dapat menyelesaikan konsensus 3-prosesor.
Untuk menerapkan uji-dan-set untuk n-prosesor menggunakan 2-prosesor konsensus, biarkan prosesor menentukan pemenang uji-dan-set menggunakan turnamen di mana setiap pertandingan diimplementasikan menggunakan konsensus 2-prosesor (dalam pertandingan, prosesor usulkan pengenal mereka dan hasil konsensus memberitahu mereka siapa yang menang).
Dalam arti praktis, definisi konsensus yang kurang ketat mungkin cukup (di sini saya menyebutnya konsensus ringan):
Definisi . Light-Consensus dicapai antara n threads jika (a) setiap thread memutuskan nilai yang sama atau nilainya tidak diketahui, (b) setidaknya satu thread mengetahui nilai dan (c) nilai ini sebenarnya diusulkan oleh salah satu utas.
Karenanya, konsensus ini dalam pengertiannya yang lebih ringan memungkinkan beberapa utas tidak mengetahui konsensus, nilai yang diputuskan.
Konsekuensi : Dalam pengertian yang lebih ringan ini test-and-set memiliki jumlah konsensus cahaya yang tak terbatas.
Klaim : Rasa yang lebih ringan ini praktis. Misalnya untuk memilih utas untuk memasuki bagian kritis, tidak perlu membuat konsensus dalam arti yang ketat. Artinya: setiap utas harus tahu apakah sudah dipilih atau belum, namun jika tidak dipilih maka tidak perlu tahu yang dipilih. Dengan kata lain, untuk saling pengecualian, konsensus ketat tidak diperlukan, cahaya sudah cukup.