2010-02-06 13 views
11

Bu aptalca bir soru gibi gelebilir, ancak çok parçalı bir uygulamada bir kaynağı kilitlerse, kaynakta gerçekleşen işlem atomik olarak gerçekleştirilir mi?Bir kilit (diş) atomik midir?

yani .: işlemci kesilebilir veya bir bağlam anahtarı o kaynağın üzerinde bir kilit var ise ortaya çıkabilir? Öyleyse, işlemin tamamlanması için planlanana kadar başka hiçbir şey bu kaynağa erişemez. Pahalı bir operasyon gibi geliyor.

cevap

16

İşlemci kesinlikle başka bir iş parçacığına geçebilir, evet. Gerçekten de, çoğu modern bilgisayarda, aynı anda çalışan birden çok iş parçacığı olabilir. Kilitleme sadece başka bir iş parçacığının aynı kilidi almamasını sağlar, bu nedenle bu kaynaktaki bir işlemin bu kaynak açısından atomik olduğundan emin olabilirsiniz. Diğer kaynakları kullanan kod tamamen bağımsız olarak çalışabilir.

Mümkün olan yerlerde genellikle kısa operasyonlar için kilitlenmelisiniz. Ayrıca, kilitlerin ayrıntı düzeyini seçebilirsiniz ... örneğin, paylaşılan bir nesnede iki bağımsız değişkeniniz varsa, , bu değişkenlere erişimi korumak için iki ayrı kilit kullanabilirsiniz. Bu, potansiyel olarak daha iyi eşzamanlılık sağlar - ancak aynı zamanda daha fazla kilit, daha karmaşık ve daha fazla kilitlenme potansiyeli anlamına gelir. Eşzamanlılık söz konusu olduğunda her zaman bir dengeleme eylemi vardır.

+0

Yani bu kaynak için başka bir iş parçacığı bekliyorsa, beklemeye devam etmek zorunda mı? –

+1

@Tony - Evet, elbette ilk iş parçacığı – Paolo

+4

Eh tarafından serbest bırakılıncaya kadar kilidi elde etmek için beklemeyi engelleyecek. Biri bir kilitden istediği şey bu. – botismarius

7

Tam olarak haklısınız. Kısa bir süre için kilitlenmenin bu kadar önemli olmasının bir nedeni budur. Ancak, bu kulağa kötü gelmez, çünkü kilit üzerinde bekleyen başka bir iş parçacığı, kilidi tutan iş parçacığı onu serbest bırakana dek programlanmayacaktır.

+1

"Kısa bir süre için kilitlenmenin neden bu kadar önemli olmasının bir nedeni var" ?????? ANCAK bir iş parçacığının kilitli bir bölümünü başka bir iş parçacığı tarafından kesin olarak kesilebilir. Aynı kilidi kullanmayan herhangi bir iş parçacığı ile kesin olarak. – ulrichb

2

Evet, bir içerik anahtarı kesinlikle oluşabilir. Bu nedenle, paylaşılan bir kaynağa erişirken bunun başka bir iş parçacığından da kilitlenmesi önemlidir. A iş parçacığı kilidi olduğunda, B iş parçacığı, kodun kilitli erişimine erişemez. İki konu Aşağıdaki kodu çalıştırırsanız Örneğin

: Bir bağlam anahtarı 1. adımdan sonra ortaya çıkabilir, ancak diğer iplik o zaman kiliti ve bu nedenle olamaz

1. lock(l); 
2. -- change shared resource S here -- 
3. unlock(l); 

, paylaşılan kaynağı değiştiremezsiniz . Konulardan birinin üzerindeki paylaşılan kaynağa erişim kilitsiz yapılırsa - kötü şeyler olabilir!

Atıklara ilişkin olarak, evet, bu savurgan bir yöntemdir. Bu yüzden kilitleri tamamen engellemeye çalışan yöntemler vardır. Bu yöntemler lock-free olarak adlandırılır ve bunlardan bazıları CAS (Karşılıklı-Karşılaştırma) veya diğerleri gibi güçlü kilitleme hizmetlerine dayanır.

0

Hayır, bu gerçekten pahalı değil. Genellikle iki olasılık vardır:

1) Sistemin yapabileceği başka şeyler de var: Bu durumda, sistem hala tüm kullanılabilir çekirdeklerle yararlı bir çalışma yapıyor.

2) Sistemin yapacak başka bir özelliği yok: Bu durumda kilidi tutan iş parçacığı zamanlanacaktır. Planlanmış olmayan bir iş parçacığı varken, bir akıl sistemi kullanılmayan bir çekirdek bırakmaz.

Peki, bu nasıl pahalı olabilir? Sistemin bunu yapması için başka bir şey yoksa, bu kilidi (veya tüm çekirdeği işgal edecek başka bir şey değil) almayı gerektirmez ve kilidi tutan iş parçacığı, çalışmaya hazır değil değildir.Yani, kaçınmanız gereken durum budur ve içerik değiştirme veya ön boşaltma sorunu önemli değildir (iş parçacığı çalışmaya hazır olacağından).