Dışlama İlkelleri
Dışlama İlkelleri
System.Threading ad alanı, önceki örnekteki sorunları önlemek için bir dizi yararlı sınıf içerir. En sık kullanılanı Monitor sınıfıdır. Kodun sorunlu bölgesini dışlama ilkelleriyle çevreleyerek biraz bozuk örneği değiştirebilirsiniz.
Monitor.Enter() çağrısı, bu nesne için this referansını iletir. Monitörün görevi, bir iş parçacığının belirli bir değerle Monitor.Enter()’ı çağırması durumunda, aynı değere sahip diğer tüm Monitor.Enter() çağrılarının ilk iş parçacığı Monitor.Exit()’i çağırana kadar engellemesini sağlamaktır. İlk iş parçacığı Thread.Sleep()’i çağırdığında, ikinci iş parçacığı Monitor.Enter()’ı çağıracak ve ilk iş parçacığının yaptığıyla aynı nesneyi iletecek ve bu nedenle ikinci iş parçacığı engelleyecektir.
Bump() uygulamasının küçük bir sorunu var. Korunan blokta bir istisna atılırsa, Monitor.Exit() asla çağrılmayacaktır ki bu kötü bir durumdur. Monitor.Exit()’in her zaman çağrıldığından emin olmak için, çağrıların bir try-finally içinde sarılması gerekir. Bu, C#’ın tam da bunu yapmak için özel bir ifade sağlamasına yetecek kadar önemlidir.
Lock deyiminde kullanılan nesne, kilidin elde edilmesi gereken ayrıntı düzeyini yansıtır. Korunacak veri örnek veriyse, özel bir üye değişkeni oluşturmak ve bunu eşzamanlı erişimi engellemek için kullanmak normaldir.
Korunacak veri statik bir veri öğesiyse, benzersiz bir statik referans nesnesi kullanılarak kilitlenmesi gerekecektir. Bunu, sınıfa statik bir nesne türü alanı ekleyerek yaparsınız.
Yaygın olarak dağıtılacak türler için, kilit ifadelerinde kullanmak üzere özel bir üye değişkeni oluşturmak, bunu kilitlemek yerine tercih edilir. Bir uygulama etki alanı içindeki herhangi bir kod, bu nesne referansında bir kilidi de kaldırabilir, bu da çekişmeye ve kilitlenmelere neden olabilir. Kilitleme için özel bir üye değişkeni kullanmak son derece basittir.
Senkronize Yöntemler
Lock deyimini kullanmanın bir alternatifi, yöntemin tamamını senkronize edilmiş olarak işaretlemektir; bu, tüm yöntemi lock(this) içine almakla aynı etkiye sahiptir. Bunu yapmak için, yöntemi aşağıdaki öznitelikle işaretleyin.
Bu özniteliği System.Runtime.CompilerServices ad alanında bulabilirsiniz. Genel olarak, öznitelik üzerinde kilidi iki nedenden dolayı kullanmalısınız. İlk olarak, performans daha iyidir çünkü bir kilidin bulunduğu bölge genellikle tüm yöntemin bir alt kümesidir. İkincisi, kod okurken özelliği gözden kaçırmak (veya ne işe yaradığını unutmak) kolaydır; kilidi kullanmak daha açıktır.
pauli dışlama ilkesi
Pauli dışlama ilkesi nedir
Hund Kuralı
Pauli dışlama ilkesi örnek
Hund Kuralı Pauli Prensibi ve Aufbau Prensibi
Pauli ilkesi
Aufbau Kuralı
Heisenberg belirsizlik ilkesi
Birbirine Bağlı İşlemler
Birçok işlemci, kesintiye uğramayan bazı talimatları destekler. Bunları kullanmak için kilitleme gerekmediğinden, bunlar iş parçacığı ile uğraşırken kullanışlıdır. CLR’de bu işlemler, System.Threading ad alanındaki Interlocked sınıfında kapsüllenir. Bu sınıf, int veya uzun veri türlerinde kullanılabilen Increment(), Decrement(), Exchange() ve CompareExchange() yöntemlerini gösterir.
Çalışma zamanı, artış işlemlerinin kesintiye uğramayacağını garanti eder. Interlocked bir uygulama için çalışıyorsa, kilitleme yükünü ortadan kaldırdığı için güzel bir performans artışı sağlayabilir.
Şimdiye kadar tartışılan dışlama ilkellerinin tümü, uygulama alanına özgü kilitleme teknikleridir. Bir uygulama etki alanındaki bir Monitor nesnesi, aynı ada sahip olsalar bile başka bir uygulama etki alanı veya işlem olan bir Monitor nesnesinden tamamen etkilenmez.
C# nesneleri gibi uygulama etki alanlarına özgü kaynaklara eşzamanlı erişime karşı koruma sağlarken istenen davranış budur. Ancak bazen dosyalar, bağlantı noktaları ve donanım aygıtları gibi küresel olarak kullanılabilen kaynakları korumanız gerekir. Bu durumlarda, sistem genelinde hariç tutma ilkelerine ihtiyacınız olacak. Mutex ve Semaphore türlerinin devreye girdiği yer burasıdır.
Mutex, Monitor ile aynı şekilde hareket eder ancak bir makinedeki tüm işlemlerde benzersizdir. Bir süreçte bir Muteks üzerinde kilit elde edilmesi, diğer tüm süreçlerin aynı muteks üzerinde bir kilit edinmesini engeller.
Mutex’in küresel doğası, edinmeyi bir Monitör kilidinden çok daha pahalı hale getiriyor – yaklaşık iki kat daha yavaş. Mutex, bir kilit elde etmek için farklı bir sözdizimine sahiptir ve bir Monitor’ün kilit ifadesine eşdeğer bir C# dili yardımcısına sahip değildir. Aşağıdaki kod, kullanımda olan bir Mutex’i gösterir.
.NET 2.0, Semafor adı verilen yeni bir dışlama ilkelini sunar. Semafor, Mutex’e benzer, ancak Mutex’in yalnızca tek bir kaynağa erişimi koruduğu yerde Semafor, benzer bir kaynağın birden çok örneğine erişimi korur.
Bir çağrı merkezi düşünün: Bir müşterinin araması, uygun herhangi bir çağrı merkezi görevlisine yönlendirilebilir, ancak genellikle personelden daha fazla arayan olduğundan ve bir personel aynı anda yalnızca tek bir aramayı cevaplayabildiğinden, personele erişimin herhangi bir çağrı merkezi çalışanına kadar kilitlenmesi gerekir. personel sayısı kullanılabilir hale gelir.
Bir nesne havuzu, müşterinin bakış açısına göre havuzdaki herhangi bir nesnenin bir sonraki kadar iyi olmasıyla aynı gereksinimi paylaşır, ancak havuzdaki nesne sayısı sınırlı olduğu için, iki istemciyi önlemek için bir kilitleme mekanizmasının devreye alınması gerekir. Semafor kullanmak, Mutex ile neredeyse aynıdır. Bir programlama modeli perspektifinin tek farkı, Semafor oluşturulduğunda bir maksimum sayının ayarlanması gerekmesidir.
Erişim Yeniden Sıralama ve Geçici
Senkronizasyon ek yükünden kaçınmak için, bazı programcılar kendi optimizasyon ilkellerini oluşturacaklardır. Bununla birlikte, C#’ta, özellikle bu işlemleri tipik olarak gerçekleştirmeyen x86 mimarisine aşina olanlar için, komut sıralamasıyla ilgili olarak dilin ve çalışma zamanının garanti ettiği şeylerde bazı şaşırtıcı incelikler vardır.
Bu konu karmaşıktır, ancak bu bölümde daha önce tartışılan senkronizasyon yöntemlerine bağlı kalırsanız tam olarak anlamanız gerekmez.
Bu, Process1() ve Process2()’deki kodun seri yapısından anlaşılır; her iki işlev de diğeri başlamadan önce tamamlanabilir. Bu bir olasılıktır, çünkü evrelerden biri ilk komuttan sonra kesintiye uğrayabilir ve diğer evre çalışabilir.
Web sitelerinizi, arama motorlarında en yukarı getirmek adına sizlere 3 adet paket öneriyoruz. Bu paketler sayesinde web siteleriniz aramalarda 1 yıl içerisinde en yukarıya tırmanacaktır.
1) Backlink Paketi 50 $ (Yıllık Ücret)
2) Hızlandırma Paketi 300 $ (Yıllık Ücret)
3) Kelime Yönlendirme Paketi 150 $ (Aylık Ücret)