Kim doğrusallaştırılabilirliğe ihtiyaç duyar?


13

Çoğaltılmış veritabanları gibi çoğaltılmış sistemler için tutarlılık ölçütü olan serileştirilebilirlik ve doğrusallaştırılabilirlik arasındaki farkları okudum . Ancak, serileştirilebilirlikten daha güçlü olmasına rağmen hangi durumlarda doğrusallaştırmaya ihtiyaç duyulacağını bilmiyorum.

Böyle güçlü bir mülkün gerçekten gerekli olacağı senaryolar bulabilir misiniz?


Wikipedia üzerinde kontrol edebilirsiniz: en.wikipedia.org/wiki/… ya da kağıt üzerinde Herlihy ve Wing: "Doğrusallık: Eşzamanlı nesneler için bir doğruluk koşulu".
Eduardo Bezerra

Yanıtlar:


5

Eşzamanlı, beklemesiz (veya daha zayıf olan kilitsiz) veri yapılarının tasarımını düşünün. Bu senaryoda, bazı durumlarda, zayıf bir doğruluk koşulu sağlanarak performans ve ölçeklenebilirlik artırılabilse de, doğrusallaştırılabilirlik genellikle gereklidir. Bu kadar zayıf bir koşulu karşılayan bir uygulamanın faydalı olup olmadığı genellikle uygulamaya bağlıdır. Aksine, doğrusallaştırılabilir bir uygulama her zaman kullanılabilir, çünkü tasarımcılar bunu atomik olarak görebilirler.

Dahası, doğrusallaştırılabilirlik engellenmeyen bir özelliktir: hiçbir zaman (tüm nesne durumları için tanımlanmış) engellenmesi gereken bir işlem gerekmez. Bunun yerine, Serileştirilebilirlik engellenmeyen bir özellik değildir. Bu nedenle, eşzamanlılık derecesini arttırmak için, eşzamanlı veri yapılarının tasarımcıları her zaman doğrusallaştırılabilirliğe güvenir.


1
o şüphe kavramını açıklamak için henüz başka açıklanamayan kavramını kullandıkça bu iyi cevap değil .. (bu okuma zaman kaybı olduğunu) altına cevaplar çok daha iyi .. ...
Richard

Orijinal OP sorusunu okumadığınız anlaşılıyor. OP doğrusallaştırmanın ne olduğunu sormuyordu, "Kimler doğrusallaştırılabilirliğe ihtiyaç duyar" diye sordu. Benim cevabım uygun, çünkü OP'ye örnek bir senaryo sağlıyor (en azından OP tarafından uygun görüldü ve seçildi). Eşzamanlı, kesintisiz veri yapılarının ne olduğunu bilmemeniz tamamen farklı bir konudur. Bu arada, OP neden bahsettiğimi biliyordu. Bir cevapta kullandığımız her kavramı açıklamak zorunda
kalsaydık

10

Son 15 yılda Herlihy ve Wing'i birçok kez tekrar okudum. Okuması çok zor. Ve bu talihsiz bir durum, çünkü kenarlarda bazı incelikler varken, temel fikir aslında oldukça makul.

Kısacası: doğrusallaştırılabilir serileştirilebilirlik gibidir, ancak serileştirmenin işlemler arasındaki ek sipariş kısıtlamalarına uyması şartıyla. Amaç, tüm sistemi bir kerede düşünmek yerine, tek bir atomik veri yapısı hakkında titizlikle akıl yürütmenize izin vermektir.

Doğrusallaştırılabilirlik elde etmek de kolaydır: bir muteksi doğrusallaştırmak istediğiniz nesne ile ilişkilendirin. Bu nesne üzerindeki her işlem muteksi kilitleyerek başlar ve muteksin kilidini açarak sona erer.

İşte kullanacağım tanımlar:

Bir sistem olup serializabile veri kümesi üzerinde bir set işlem verilirse gibi, işlemlerinde herhangi bir sonuç aynı işlemlerin bazı sırayla gerçekleştirildi ve her bir işlem içinde işlemleri için kendi işlem içinde yer alır işlem koduyla belirtilir.

Serileştirilebilirlik, farklı işlemler arasındaki işlemlerin harmanlanması görünümüne izin vermez ve seçilen işlem sırasının nedenselliğe uymasını gerektirir (A işlemi x değerini yazarsa ve B işlemi A'nın yazdığı x değerini okursa, A işlemi B işleminden önce gelmelidir Ancak, işlemlerin sıralanmasındaki diğer kısıtlamalar hakkında hiçbir şey söylemez (özellikle süreçler ve süreçlerin olayları algılama sırası hakkında hiçbir şey söylemez .)

İşlemlerin yürütüldüğü işlemlerin sırası hakkında kısıtlamalar ekleyen (ancak yalnızca bireysel okuma / yazma işlemlerinden bahsetmeyen) ilgili başka bir fikir vardır:

Herhangi bir yürütmenin sonucu, tüm işlemlerin işlemlerinin ardışık bir sırada yürütülmesi ile aynıysa ve her bir işlemin işlemleri bu sırayla programı tarafından belirtilen sırayla görünürse, bir sistem sıralı olarak tutarlıdır . ( Lamport, "Çok İşlemcili Programları Doğru Olarak Yürüten Çok İşlemcili Bir Bilgisayar Nasıl Yapılır", IEEE T Comp 28: 9 (690-691), 1979 ).

Sıralı tutarlılığın tanımında örtük olan, yalnızca her bellek konumu (nesne) için uyarılan sıralı işlem sırasının, her okuma işlemi tarafından konuma döndürülen xdeğerin, xsıraya göre hemen önceki yazma işlemi .

Doğrusallaştırılabilirlik iyi niyete sahiptir (a) işlem kavramını (serileştirmeden), süreçlerin düzenledikleri işlemlerin sırayla (sıralı tutarlılıktan) tamamlanmasını bekledikleri ve (b) her biri hakkında konuşmak için doğruluk kriterlerini daraltmak düşüncesi ile birleştirmek sizi bir bütün olarak sistem hakkında akıl yürütmeye zorlamak yerine, tecrit halinde. (Doğrusallaştırılamayan başka nesnelerin olduğu bir sistemde bile nesnemin uygulamasının doğru olduğunu söylemek isterim.) Herlihy ve Wing'in bir monitörü titizlikle tanımlamaya çalıştığına inanıyorum .

Bölüm (a) "kolaydır": Sıralı bir tutarlılık benzeri gereklilik, her işlem tarafından yayınlanan nesne üzerindeki işlemlerin, program tarafından belirtilen sırayla ortaya çıkan sırada görünmesidir. Serileştirme benzeri bir gereklilik, nesne üzerindeki işlemlerin birbirini dışlamasıdır (serileştirilebilir).

Karmaşıklık amaç (b) 'den kaynaklanır (her bir nesne hakkında diğerlerinden bağımsız olarak konuşabilmek).

Birden çok nesneye sahip bir sistemde, B nesnesindeki işlemlerin, işlemlerin A nesnesine çağrıldığına inandığımız sırayla kısıtlamalar koyması mümkündür. Tüm sistem geçmişine bakarsak, belirli sıralı siparişlerle kısıtlanırız ve başkalarını reddetmesi gerekecek. Ancak, tek başına kullanabileceğimiz bir doğruluk kriteri istedik (A nesnesine küresel sistem geçmişine hitap etmeden ne olduğu hakkında akıl yürütme).

Örneğin: bir kuyruk olan A nesnesinin doğruluğu hakkında tartışmaya çalıştığımı varsayalım, B nesnesinin bir bellek konumu olduğunu varsayalım ve aşağıdaki yürütme geçmişlerine sahip olduğumu varsayalım: İş parçacığı 1: A.enqueue (x), A. dequeue () (y değerini döndürür). Konu 2: A. enqueue (y), A.dequeue () (x değerini döndürür). Sıranın bu uygulamasının doğru olmasına izin verecek olaylar arasında bir araya ekleme var mı? Evet:

Thread 1                           Thread 2
A.enqueue(x)                       ...
...                                A.enqueue(y)
...                                A.dequeue() (returns x)
A.dequeue(y) (returns y)           ...

Ama şimdi tarih ( B nesnesi dahil ) ise: B 0 değeri ile başlar. 1: A.enqueue (x), A.dequeue () (y döndürür), B.write (1). İş parçacığı 2: B.read () (1 döndürür) A.enqueue (y), A.dequeue () (x döndürür).

Thread 1                           Thread 2
A.enqueue(x)                       ...
A.dequeue() (returns y)            ...                       (uh oh!)
B.write(1)                         ...
...                                B.read() (returns 1)
...                                A.enqueue(y)
...                                A.dequeue() (returns x)

Şimdi "doğruluk" tanımımızın bu tarihin ya A uygulamamızın ya da B uygulamamızın buggy olduğunu belirtmesini istiyoruz, çünkü "mantıklı" bir serileştirme yok (2. B'den henüz yazılmamış bir değer veya İş Parçacığı 1'in A'dan henüz henüz hesaplanmamış bir değeri alması gerekir.) Dolayısıyla, A'daki işlemlerin orijinal serileştirmesi makul bir değer gibi görünüyordu, eğer uygulamamız ikincisi gibi bir tarihe izin verirse, o zaman açıkça yanlıştır.

Dolayısıyla, doğrusallaştırmanın eklediği kısıtlamalar oldukça mantıklıdır (ve FIFO kuyrukları gibi basit veri yapıları için bile gereklidir.) Bunlar şöyledir: "uygulamanız, dequeue'ya (), geleceği." Doğrusallaştırılabilirliği elde etmek oldukça kolaydır (ve doğaldır): sadece bir muteksi nesnenizle ilişkilendirin ve her işlem kilitleme ile başlar ve kilidini açarak sona erer. Atomisitenizi basit muteksler yerine bloke olmayan veya kilitsiz veya bekleme gerektirmeyen tekniklerle uygulamaya çalıştığınızda lineerleştirilebilirlik hakkında akıl almaz hale gelir.

Literatüre bazı işaretçilerle ilgileniyorsanız, aşağıdakileri buldum ("gerçek zamanlı" hakkındaki tartışma, lineerizabilty'i olması gerekenden daha zor hale getiren kırmızı ringalardan biri olduğunu düşünüyorum.) Https: // stackoverflow.com/questions/4179587/difference-between-linearizability-and-serializability


`` Herlihy ve Wing'in titizlikle bir monitör tanımlamaya çalıştıklarına inanıyorum '' demekle ne demek istiyorsun? Lütfen biraz ayrıntı ekler misiniz? (Herlihy ve Wing'in gazetesini okuyorum.)
hengxin

1
Derin bir şey demek istediğimi sanmıyorum. Herlihy ve Wing'i okumadan önce monitörler hakkında okuduğum şeylerin hepsi operasyoneldi. Böyle bir şey "bir monitör örtük bir mutex ve türü her yöntemi sahip olduğu bir soyut veri türüdür başında ve bültenleri sonunda muteks, Mutekse edinir" o tamam olduğunda ilgili karmaşık tartışma takip wait()ve notify(). Doğrusallaştırılabilirlik, çok daha karmaşık / optimize edilmiş monitör uygulamalarının doğruluğundan bahsetmenin bir yolunu sunar.
Gezici Mantık

Bana mantıklı geliyor. Teşekkür. Bugün Related WorkHerlihy ve Wing gazetesinin bir bölümünü okudum . İddialarının monitorbir örneği olarak bahsettiler Our notion of linearizability generalizes and unifies similar notions found in specific examples in the literature. Bununla birlikte genel bir soru: Doğrusallaştırılabilirlik kavramı çok işlemcili sistemlerde (örneğin donanım, derleyici, programlama dili ve eşzamanlı veri yapıları) yaygın olarak benimsenmiştir mi? (Kısa görüşlü olmak, sadece monitör gibi şeyler biliyorum.) Değilse, engeller nelerdir? En son teknoloji nedir?
hengxin

Bence bazen uygulamak için çok pahalı olan arzu edilen bir özellik olarak kabul edilir. Örnek için bakınız: courses.csail.mit.edu/6.852/01/papers/p91-attiya.pdf . Ayrıca pratikte, çoğu eşzamanlı hashmaps'in kova başına bir kilidi olduğunu, ancak küresel bir kilidi olmadığını ve bu nedenle ekleme / silme hash tablosunun yeniden boyutlandırılmasına neden olduğunda garip davranışlara sahip olabileceğini düşünüyorum.
Gezici Mantık

Uzun cevap için teşekkürler, ama korkarım bana doğrusallaştırmanın ne zaman ilginç olduğunu söylemediniz, sadece onu tanımladınız ve bu nedenle yanlış tanımladığınızı söylüyorsunuz: her sürecin operasyonları görmesi yeterli değil verildikleri emir. Tüm süreçlerdeki düzen de tutarlı olmalıdır. Ama yanılıyorsam beni düzeltin ...
Eduardo Bezerra

2

Birincisi, doğrusallaştırılabilirlik ve serileştirilebilirlik doğrudan karşılaştırılabilir değildir. Aşağıdaki tabloda gösterildiği gibi, ana fark, sol tarafta, tüm bireysel işlemlerin atomik olmasıdır ( synchronizedher bir işlemin etrafında bir java olması gibi . Sağ tarafta, atomite birimi bir işlemdir; bireysel bir işlem atomik değildir Bu nedenle, seri hale getirilebilirlik her zaman veritabanı literatürünün bir parçası iken sol taraf işlemci-bellek literatürüne konu olmuştur (okuma / yazma op atomiktir) Orijinal Anahtar / Değer Depoları (dbm ve memcached) sol tarafta başladı (get / put atomik), ancak daha yenileri giderek daha fazla (Google'ın somun anahtarı gibi) işlemleri destekliyor.

obj. işlemleri atomiktir | İşlemler atomik
-------------------------------- + ----------------- ----------------
Doğrusallaştırılabilirlik |
Sıralı Tutarlılık | serilerştirilebirlik
Nedensel Tutarlılık |
Önbellek Tutarlılığı |

Doğrusallaştırılabilirlik, eşzamanlı bir ortamda bulunan bir nesne sisteminin, (paralel) bir evrende bir seferde bir işlemi (istek / yanıt çifti) işleyen sıralı bir sistemle özdeş davranmasını gerektirir (a) istemciler her iki evrende de tam olarak aynı tepkileri görürsünüz (b) zamansal düzen korunur (aşağıda daha fazlası).

Serileştirilebilirliğin tanımı, Sıralı Tutarlılık gibi yalnızca ilk kriteri gerektirir.

Geçici sipariş koruması şu anlama gelir: A: x.op1 () (A bir istemciyse, x bir nesnedir ve op1 bir işlemdir) başka bir işlem B: y.op2 () başlamadan önce bitmişse, ardışık evrende istekler aynı sırayla ele alınır. Sıralı Tutarlılıkta (SC) bu gerekli değildir; nesnenin bir istemcinin isteğini kuyruğa almasına, istemciye yanıt vermesine ve daha sonra değerlendirmesine izin verilir. Ayrıca, nesne, başka bir istemciden daha sonra gelen bir isteği, sırayla birincisine ulaşmadan değerlendirerek ele alabilir.

Zamansal düzenin korunmaması bir sorundur. A: x.op1 () 'den sonra, A'nın telefonu aldığını ve B'ye bunu söylediğini, sonra B'nin x.op2 () çağrısı olduğunu varsayalım. Sistemin bu nedensel olay zincirini bilmesinin bir yolu yoktur, çünkü ikinci adımda sistem tarafından izlenmeyen bir mesaj vardır. Birçok gerçek durumda, A'nın x'e bir kez cevap verdiğinde, B'nin çağrışmasının güncellenmiş duruma güvenebileceğini varsayması mantıksız değildir. Geçici düzen korunmazsa, A ve B sürpriz içindedir. Bu doğrusallaştırılabilir bir sistemde olmazdı.

Zamansal düzenin korunmasının ikinci güzel özelliği, doğrusallaştırılabilir nesnelerden oluşan bir sistemin kendisinin doğrusallaştırılabildiği yerellik ve kompozisyonluktur. Yani, bir monolitik anahtar / değer deposu yerine, her biri kendi KV-mağaza sunucusu tarafından yönetilen birçok ayrı bölüme ayırabilirsiniz; her biri doğrusallaştırılabiliyorsa, tüm veritabanı, fazladan çaba harcamadan doğrusallaştırılabilen bir monolitik KV deposu olarak işlev görür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.