Mengapa nomor konsensus untuk test-and-set, 2?

17

Menurut Wikipedia ,

Operasi uji-dan-atur dapat menyelesaikan masalah konsensus bebas-tunggu selama tidak lebih dari dua proses bersamaan.

Mengapa tidak bisa menyelesaikan masalah selama lebih dari dua proses?

ben
sumber

Jawaban:

17

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).nn

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:

  1. Tulis nilai yang Anda usulkan ke , dengan t adalah id utas dan A adalah array ukuran 2.SEBUAH[t]tSEBUAH
  2. Lakukan instruksi test-and-set pada beberapa register , dengan R diinisialisasi ke 0.RR
  3. Jika nilai kembali adalah 0, Anda yang pertama: mengembalikan . Jika tidak, Anda yang kedua: return A [ | t - 1 | ] .SEBUAH[t]SEBUAH[|t-1|]

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 ).SEBUAHBCSebuahbc

Kami dapat memvisualisasikan proses konsensus sebagai pohon terarah, di mana:

  • Root adalah keadaan di mana tidak ada utas yang 'bergerak';
  • Anak kiri dari sebuah simpul mewakili keadaan yang dihasilkan setelah langkah oleh , tengah anak mewakili keadaan yang dihasilkan setelah bergerak oleh B , dan anak kanan mewakili keadaan yang dihasilkan setelah bergerak oleh C ;SEBUAHBC
  • Node daun mewakili kondisi di mana semua utas telah selesai. Terkait dengan simpul daun adalah nilai , b , atau c , di mana nilainya tergantung pada nilai yang diputuskan untuk eksekusi tertentu.Sebuahbc

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. XXxSebuahbc

Definisi. Biarkan keadaan kritis menjadi keadaan yang multivalen, dengan properti tambahan yang bergerak oleh akan menentukan a , dan gerakan oleh B akan menentukan b .SEBUAHSebuahBb

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. CSEBUAHB

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 .SEBUAHSebuahBCSebuah

2) bergerak (dengan demikian menentukan b ) dan berhenti. Selanjutnya C berjalan sampai selesai, akhirnya memutuskan b . A tidak bergerak.BbCbSEBUAH

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. SEBUAHBCSEBUAHBCCSebuahb

Bahwa instruksi ujian dan set memiliki nomor konsensus 2 mengikuti dari Klaim 1 dan 2.

Roy O.
sumber
Terima kasih atas jawabannya Roy. Bisakah Anda menunjukkan materi apa pun tentang topik ini yang sama jelasnya dengan penjelasan Anda? :) Semua materi yang saya temukan terlalu formal.
sanatana
@sanatana: Saya lupa menjawab pertanyaan Anda, saya minta maaf. Jika masih relevan: Saya sarankan Herlihy dan Shavit 'The Art of Multiprocessor Programming' (bab 5 khususnya) dan materi kursus dari kursus Concurrency & Multithreading oleh Fokkink: cs.vu.nl/~tcs/cm (yang didasarkan Buku Herlihy dan Shavit). Di bagian bawah halaman Anda akan menemukan tautan ke video ceramah oleh Herlihy (kuliah 27 September adalah tentang konsensus). Setelah meninjau materi saya menyadari itu cukup untuk mempertimbangkan pohon biner untuk bukti semacam ini. Mungkin saya akan memperbarui jawaban saya nanti.
Roy O.
@ Roy. Saya melihat bahwa jawaban Anda menunjukkan bahwa tidak ada cara untuk mencapai konsensus dengan 3 proses. Hanya ingin memahami jika dengan cara apa pun kita telah membuktikan bahwa kita masih bisa mencapai konsensus tetapi protokol itu tidak akan menunggu bebas?
Penyebab utama
6

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:

  • Proses 1 bergerak terlebih dahulu, lalu proses 2 bergerak, lalu proses 3 berjalan sendiri
  • Proses 2 bergerak terlebih dahulu, lalu proses 3 berjalan sendiri

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.

Tom van der Zanden
sumber
1

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).

nano
sumber
0

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.

Gyula Csom
sumber