Definisi umum bebas kunci adalah bahwa setidaknya satu proses membuat kemajuan. 1
Jika saya memiliki struktur data sederhana seperti antrian, dilindungi oleh kunci, maka satu proses selalu dapat membuat kemajuan, karena satu proses dapat memperoleh kunci, melakukan apa yang diinginkan, dan melepaskannya.
Jadi, apakah itu memenuhi definisi bebas kunci?
1 Lihat misalnya M. Herlihy, V. Luchangco, dan M. Moir. Sinkronisasi bebas halangan: Antrian berujung ganda sebagai contoh. Dalam Distributed Computing, 2003. "Tidak dikunci jika hanya memastikan bahwa beberapa utas selalu membuat kemajuan".
multithreading
Joe Pension
sumber
sumber
Jawaban:
Itu bukan definisi untuk bebas kunci.
Jika Anda dapat menjamin kemajuan maka Anda memiliki jalan buntu , dan jika Anda akhirnya menyelesaikan setiap permintaan, maka Anda bebas kelaparan , tetapi tidak bebas kunci.
Saya mempertanyakan apakah contoh sederhana Anda benar-benar memberikan ini. Anda perlu hierarki kunci dan seterusnya untuk benar-benar membuat jaminan kemajuan ketika beberapa kunci terlibat.
sumber
Saya telah mempelajari The Art of Multiprocessor Programming 1 dan teks mereka kurang jelas, seperti buku yang Anda rujuk. Berikut beberapa kutipan dari TAMPP:
Kutipan 1 (Definisi bebas kunci)
Kutipan 2 (Definisi nonblocking)
Kutipan 3 (klaim bahwa bebas-kunci tidak menghalangi)
Masalahnya adalah bahwa klaim dalam Kutipan 3 tidak jelas mengikuti dari definisi dalam Kutipan 1. Seperti yang telah disebutkan, antrian yang disinkronkan tampaknya memuaskan Kutipan 1: sering kali beberapa metode berhasil mendapatkan kunci dan menyelesaikannya.
Perhatikan secara khusus frasa yang agak kabur dalam Kutipan 3: "terlepas dari bagaimana sistem menjadwalkan utas". Hal ini tidak didahului oleh apapun deskripsi formal dari "sistem benang-penjadwalan", jadi kami yang tersisa untuk merekonstruksi sifat-sifatnya berdasarkan prasangka kita pada apa definisi harus berarti:
Pada sistem seperti itu, metode pemblokiran tidak dapat bebas dari kunci: jika utas yang memegang kunci tidak pernah lagi dijadwalkan untuk dieksekusi, tidak akan ada utas lain yang dapat menyelesaikan permohonan metodenya dalam sejumlah langkah terbatas, namun akan ada beberapa utas yang menjalankan langkah-langkah metode. Untuk sistem yang lebih realistis, yang pada akhirnya menjamin waktu CPU untuk masing-masing utas, definisi tersebut harus secara eksplisit menyertakan properti nonblocking:
Definisi terkoreksi bebas kunci
1 Maurice Herlihy, Nir Shavit, Seni Pemrograman Multi-Prosesor, Elsevier 2008, hlm. 58-60
sumber
Terminologi tidak selalu konsisten, tetapi saya pikir yang penting adalah mengajukan pertanyaan berikut tentang algoritma atau sistem yang diusulkan:
Sebagian besar pentingnya algoritme bebas-kunci bukan berarti lebih cepat daripada algoritme bebas-kunci, melainkan fakta bahwa algoritme tersebut tidak rentan terhadap sekarat jika ada thread yang terhalang [perhatikan bahwa jaminan semacam itu hanya membutuhkan bahwa algoritme menjadi non-pemblokiran, tetapi semua algoritma bebas-kunci adalah]. Algoritme bebas kunci dimungkinkan untuk menggunakan kunci, tetapi hanya jika upaya akuisisi kunci menyertakan batas waktu bersama dengan algoritme untuk memastikan bahwa selalu ada kemungkinan bagi seseorang untuk membuat kemajuan (misalnya, suatu algoritma dapat menggunakan
CompareExchange
loop sebagai yang utama metode arbitrase, tetapi gunakan kunci untuk menengahi akses ketika pertikaian tampaknya tinggi, jika kunci tampaknya ditahan terlalu lama, utas lainnya dapat memutuskan untuk meninggalkan upaya untuk menggunakan kunci itu dan alih-alih membuat yang baru.CompareExchange
, jika pelanggan meninggalkan kunci tidak akan membahayakan konsistensi sistem, meskipun itu mungkin berarti bahwa kode yang telah menahan kunci lama tidak akan menyelesaikan pekerjaan sampai kunci itu meninggalkan kunci lama dan mengantre untuk kunci yang baru.sumber
Anda harus melihat "definisi" yang Anda kutip dalam konteks :
Anda menggunakan kunci untuk pengecualian bersama, jadi itu bukan teknik bebas kunci yang mereka bicarakan.
sumber
Bisa jadi, tapi itu tergantung algoritma.
Catatan per se .
Jika langkah "lakukan apa yang diinginkan" tidak melibatkan memperoleh kunci lain, dan dijamin akan selesai dalam waktu yang terbatas, maka bagian khusus dari algoritma Anda ini akan bebas dari kebuntuan.
Namun, jika prasyarat tersebut tidak terpenuhi, setidaknya ada potensi kebuntuan ...
sumber
Contoh yang Anda berikan tidak bebas kunci karena alasan berikut.
Mendukung satu utas mendapatkan kunci, dan penjadwal OS menangguhkan utas untuk periode tunggal tanpa batas, maka semua utas tidak dapat membuat kemajuan karena tidak ada yang dapat memperoleh kunci yang diperoleh oleh utas yang ditangguhkan.
Secara umum, algoritma yang menggunakan kunci tidak bebas kunci.
Perhatikan bahwa jalan buntu dan bebas kunci adalah dua konsep yang berbeda. jalan buntu berarti tidak ada kemungkinan kebuntuan, tetapi mungkin ada livelock yang dapat mencegah keseluruhan sistem dari membuat kemajuan. Kunci-kebebasan lebih kuat dari itu karena itu berarti beberapa utas dalam sistem selalu membuat kemajuan dengan sejumlah langkah terbatas.
sumber