Wikipedia'ya göre,
Paylaşılan kilitler bazen "okuma kilitleri" olarak adlandırılır ve özel kilitler bazen "yazma kilitleri" olarak adlandırılır.
"Paylaşılan" ve "özel" terimlerinin arkasındaki mantığı açıklayabilir misiniz?
Wikipedia'ya göre,
Paylaşılan kilitler bazen "okuma kilitleri" olarak adlandırılır ve özel kilitler bazen "yazma kilitleri" olarak adlandırılır.
"Paylaşılan" ve "özel" terimlerinin arkasındaki mantığı açıklayabilir misiniz?
Yanıtlar:
Bu cevabı yazdım çünkü bunun eğlenceli (ve uygun) bir benzetme olacağını düşündüm:
Bir öğretmen (yazar) ve birçok öğrencinin (okuyucunun) bulunduğu bir sınıfta kilitlenebilir bir nesneyi kara tahta (kilitlenebilir) olarak düşünün .
Bir öğretmen tahtaya bir şey (özel kilit) yazarken:
Kimse okuyamaz çünkü hala yazılıyor ve o sizin görüşünüzü engelliyor => Bir nesne özel olarak kilitliyse, paylaşılan kilitler elde edilemez .
Diğer öğretmenler de gelip yazmaya başlamazlar ya da pano okunamaz hale gelir ve öğrencilerin kafasını karıştırır => Bir nesne özel olarak kilitliyse, diğer özel kilitler elde edilemez .
Öğrenciler okurken (paylaşılan kilitler) tahtada ne var:
Hepsi birlikte üzerinde ne olduğunu okuyabilir => Birden fazla paylaşılan kilit birlikte var olabilir .
Öğretmen tahtayı daha fazla yazmak için temizlemeden önce okumayı bitirmelerini bekler => Bir veya daha fazla paylaşılan kilit zaten mevcutsa, özel kilitler elde edilemez .
lock()
aramaları ilki hemen ve başarılı bir şekilde geri dönecektir. yani zaten sahip olduğunuz bir şeyi başarıyla kilitleyebilirsiniz.
writer
bekleyen okuyucular arasında öncelik verilir edildiğinde kilidi alır kilit seçer sonraki (onun şimdiki sahibi tarafından kilitli değilken). Bu politika ile ilgili .
Oldukça basit. Okuma kilitleri, aynı anda birden fazla işlem okuyabildiğinden, paylaşılan kilitler olarak da bilinir. Bir okuma kilidinin amacı, başka bir işlem tarafından bir yazma kilidinin edinilmesini önlemektir. Buna karşılık, bir yazma kilidi, bir yazma işlemi tamamlanırken diğer tüm işlemleri engeller, bu nedenle özel olarak tanımlanır.
Bu nedenle, bir okuma kilidi "şimdi okuyabilirsiniz, ancak yazmak istiyorsanız beklemeniz gerekir" derken, yazma kilidi "beklemeniz gerekecek" der.
Çalışmalarını desteklemek için araştırma yaptığının farkındayım ama ders verme dürtüsüne karşı koyamıyorum.
Kilitlemenin yetersiz kullanımı, performans baş ağrılarının başlıca nedenidir. Okuma ve yazma kilitlerini ayırt eden bir kilitleme sisteminin kullanılması iyi bir başlangıçtır, ancak dikkatli tasarım bazen kilitleme ihtiyacının çoğunu ortadan kaldırabilir. Örneğin, oturum durumu hiçbir zaman durum öğesi başına tek bir küresel koleksiyonda tutulmamalıdır.
Aslında bunun yapıldığını gördüm. Bu iğrenç bir tasarım, boks yapmaya ve oturum durumundaki her son değişiklik için koleksiyonda bir değişikliğe neden olarak uzun süreli bir yazma kilidi gerektiriyor. Genel giderler, sunucuyu etkili bir şekilde tek iş parçacıklı davranışa indirgeyerek sakat bırakıyordu.
Basitçe tüm oturum durumunu bir yapıda toplamak büyük bir gelişme oldu. Oturum durumundaki değişiklikler yalnızca bir oturumun durum yapısının üyelerinin değerlerini değiştirdi. Başka hiçbir oturum bir oturumun durumuna doğrudan başvurma fırsatı ve hatta fırsatı olmadığından, güncellenen tek koleksiyon oturumların listesiydi. Sonuç olarak, bir oturum sırasında kilitleme tamamen gereksizdi , yalnızca başlangıçta ve sonunda ve işlem hacmi 3000 kat arttı.
Diğer yaygın kilitleme senaryosu, bir kullanıcı uygulamasının iş parçacıkları arasında paylaşılan kaynaklardır. Çoğu modern çerçeve bunu kilitler yerine mesajları kullanarak ele alır; "UI iş parçacığına geçiş yaptığınızda" aslında bir işlev işaretçisi ve bazı parametreler (veya uygulamaya bağlı olarak bir temsilci ve bir yığın çerçevesi) içeren bir mesajı kuyruğa almış olursunuz.
Özel veya yazma kilidi, dosyanın belirtilen bölümüne yazmak için işleme özel erişim sağlar. Bir yazma kilidi uygulandığında, başka hiçbir işlem dosyanın bu bölümünü kilitleyemez.
Paylaşılan veya okuma kilidi, başka herhangi bir işlemin dosyanın belirtilen bölümünde bir yazma kilidi istemesini yasaklar. Ancak, diğer işlemler okuma kilitleri isteyebilir.
Daha fazlası için: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html
Prensip veritabanı tarafında da aynı. Oracle belgelerine göre
Özel kilit modu, ilişkili kaynağın paylaşılmasını engeller. Bu kilit modu, verileri değiştirmek için elde edilir. Bir kaynağı özel olarak kilitlemek için ilk işlem, özel kilit serbest bırakılıncaya kadar kaynağı değiştirebilen tek işlemdir.
Paylaşım kilidi modu, ilgili işlemlere bağlı olarak ilgili kaynağın paylaşılmasına izin verir. Verileri okuyan birden çok kullanıcı, bir yazarın (özel bir kilide ihtiyacı olan) eşzamanlı erişimini önlemek için paylaşım kilitlerini tutarak verileri paylaşabilir. Birkaç işlem
, aynı kaynakta paylaşım kilitleri alabilir .