Apa perbedaan antara kunci eksklusif dan kunci bersama?

119

Menurut wikipedia,

Kunci bersama terkadang disebut "kunci baca" dan kunci eksklusif terkadang disebut "kunci tulis".

Bisakah Anda menjelaskan alasan di balik istilah "bersama" dan "eksklusif"?

Rose Perrone
sumber
Apakah kunci non-eksklusif adalah nama lain dari kunci bersama?
Ramesh Papaganti

Jawaban:

419

Saya menulis jawaban ini karena saya pikir ini akan menjadi analogi yang menyenangkan (dan pas):

Pikirkan objek yang dapat dikunci sebagai papan tulis (dapat dikunci) di ruang kelas yang berisi seorang guru (penulis) dan banyak siswa (pembaca).

Saat seorang guru menulis sesuatu (kunci eksklusif) di papan tulis:

  1. Tidak ada yang bisa membacanya, karena itu masih ditulis, dan dia memblokir pandangan Anda => Jika sebuah objek dikunci secara eksklusif, kunci bersama tidak dapat diperoleh .

  2. Guru lain tidak akan muncul dan mulai menulis, atau papan menjadi tidak dapat dibaca, dan membingungkan siswa => Jika sebuah objek dikunci secara eksklusif, kunci eksklusif lainnya tidak dapat diperoleh .

Ketika siswa membaca (kunci bersama) apa yang ada di papan tulis:

  1. Mereka semua dapat membaca apa yang ada di dalamnya, bersama-sama => Beberapa kunci bersama dapat hidup berdampingan .

  2. Guru menunggu mereka selesai membaca sebelum dia membersihkan papan untuk menulis lebih banyak => Jika satu atau lebih kunci bersama sudah ada, kunci eksklusif tidak dapat diperoleh .

ArjunShankar
sumber
2
penjelasan yang sangat bagus. Namun PO menanyakan tentang asal usul denominasi "bersama" dan "eksklusif", bukan penjelasan tentang term itu sendiri.
serhio
Apakah ini "Jika satu atau lebih kunci bersama sudah ada, kunci eksklusif tidak dapat diperoleh." adalah benar? interms dari ReentrantReadWriteLock? Saya pikir Kunci tulis dapat diperoleh kapan saja, jika tidak, kelaparan untuk menulis dapat terjadi karena terus membaca.
Kanagavelu Sugumar
1
@KanagaveluSugumar, iya betul. Anda tidak bisa mendapatkan kunci tulis ketika entitas lain sudah memegang kunci baca pada objek yang sama. Itulah inti dari kunci baca-tulis. Jika Anda kebetulan menimpa sesuatu saat orang lain membacanya, lalu apa yang akan mereka baca? Saya tidak tahu mengapa Anda memilih untuk memilih kunci baca-tulis "peserta ulang" secara khusus, tetapi masuk kembali berarti bahwa pemilik kunci peserta kembali dapat 'mengunci ()' lagi dan semua lock()panggilan berikutnya setelahnya yang pertama akan segera kembali dan berhasil. yaitu Anda berhasil mengunci sesuatu yang sudah Anda miliki.
ArjunShankar
2
Anda juga menyebutkan bahwa "Saya pikir Kunci tulis dapat diperoleh kapan saja, jika tidak, kelaparan akan menulis dapat terjadi karena terus membaca" - ini tidak mungkin. Kunci tulis tidak dapat diperoleh sementara beberapa entitas lain sudah memegang kunci baca / tulis. Apa yang bisa terjadi adalah jika beberapa entitas sudah menunggu untuk mengunci sebuah objek, maka menunggu writerdiberikan preferensi daripada menunggu pembaca ketika kunci memilih siapa yang mendapatkan kunci berikutnya (ketika dibuka oleh pemiliknya saat ini). Ini tentang kebijakan .
ArjunShankar
Terima kasih! Saya telah memilih ReentrantReadWriteLock; karena itu adalah kelas implementasi untuk ReadWriteLock di java. Lalu Apakah ada flag yang dimunculkan atau lebih banyak prioritas yang ditetapkan untuk mengatakan thread baru yang dibaca lebih lanjut untuk menunggu saat thread tulis mulai menunggu? Karena bagaimana menghindari kelaparan thread tulis karena permintaan baca terus menerus?
Kanagavelu Sugumar
34

Ini sangat mudah. Kunci baca juga dikenal sebagai kunci bersama karena lebih dari satu proses dapat membaca dalam waktu yang bersamaan. Inti dari kunci baca adalah untuk mencegah perolehan kunci tulis oleh proses lain. Sebaliknya, kunci tulis menghambat semua operasi lain sementara operasi tulis selesai, itulah sebabnya ia digambarkan sebagai eksklusif.

Jadi kunci baca mengatakan "Anda dapat membaca sekarang tetapi jika Anda ingin menulis, Anda harus menunggu" sedangkan kunci tulis mengatakan "Anda harus menunggu".


Saya menyadari Anda sedang meneliti untuk mendukung studi Anda, tetapi saya tidak bisa menahan keinginan untuk memberi kuliah.

Penggunaan penguncian yang tidak kompeten adalah penyebab utama sakit kepala kinerja. Penggunaan sistem penguncian yang membedakan kunci baca dan tulis adalah awal yang baik, tetapi desain yang cermat terkadang dapat menghilangkan banyak kebutuhan untuk mengunci. Misalnya, status sesi tidak boleh diadakan dalam satu koleksi global per elemen negara.

Saya benar-benar telah melihat ini dilakukan. Ini adalah desain yang mengerikan, menyebabkan tinju dan perubahan pada koleksi untuk setiap perubahan terakhir ke status sesi, memerlukan kunci tulis yang berlarut-larut. Overhead melumpuhkan, secara efektif mengurangi server ke perilaku single threaded.

Cukup menggabungkan semua status sesi ke dalam sebuah struct adalah peningkatan yang sangat besar. Perubahan status sesi hanya mengubah nilai anggota struct status sesi. Karena tidak ada sesi lain yang memiliki kesempatan atau bahkan kesempatan untuk merujuk secara langsung status sesi, satu-satunya koleksi yang diperbarui adalah daftar sesi. Akibatnya, penguncian sama sekali tidak diperlukan selama sesi, hanya di awal dan akhir, dan throughput meningkat dengan faktor 3000.

Skenario penguncian umum lainnya adalah sumber daya yang dibagi antara utas aplikasi pengguna. Sebagian besar kerangka kerja modern menangani hal ini menggunakan pesan, bukan kunci; saat Anda "bertransisi ke thread UI", Anda sebenarnya sedang mengantre pesan yang berisi penunjuk fungsi dan beberapa parameter (atau delegasi dan bingkai tumpukan bergantung pada implementasinya).

Peter Wone
sumber
6
  • Kunci eksklusif atau kunci tulis memberikan proses akses eksklusif untuk menulis ke bagian file yang ditentukan. Saat kunci tulis diterapkan, tidak ada proses lain yang dapat mengunci bagian file itu.

  • Kunci bersama atau baca melarang proses lain meminta kunci tulis pada bagian file yang ditentukan. Namun, proses lain dapat meminta kunci baca.

Lebih lanjut tentang itu: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html

TOC
sumber
2

Prinsipnya sama di sisi database juga. Sesuai dokumentasi Oracle

Mode kunci eksklusif mencegah sumber daya terkait untuk dibagikan. Mode kunci ini diperoleh untuk mengubah data. Transaksi pertama untuk mengunci sumber daya secara eksklusif adalah satu-satunya transaksi yang dapat mengubah sumber daya hingga kunci eksklusif dilepaskan.

Mode kunci berbagi memungkinkan sumber daya terkait untuk dibagikan, tergantung pada operasi yang terlibat. Beberapa pengguna yang membaca data dapat berbagi data, menahan kunci berbagi untuk mencegah akses bersamaan oleh penulis (yang membutuhkan kunci eksklusif). Beberapa transaksi dapat
memperoleh kunci saham pada sumber yang sama.

pengguna2155031
sumber