Evet arkadaşlar, şimdi iç mantığını çalıştırmak için olay
döngüsü kullanan uygulamaların neden kilitlenmediğini anlamaya çalışalım.
Dolayısıyla, çift döngü kullanan uygulamalar kilitlenmez.
Bu yüzden bunu iddia ediyorum, sizce doğru mu yanlış mı?
Uygulama mantığı sadece görev üzerinden yürütüldüğü sürece, programımızda herhangi
bir tehdit, senkronizasyon veya kilitleme karmaşasına gerçekten ihtiyacımız yoktur.
Dolayısıyla bu noktayı anlamak için öncelikle en temel düzeyde şunu anlamamız gerekir: Normal
bir çok iş parçacıklı ortamda ya da normal bir çok iş parçacıklı programda
neden günlüklere ihtiyacımız var? Bu noktayı çok iyi anlarsanız, olay döngülerini kullanan uygulamada
gerçekten kilitli serbest veya tuzaklı senkronizasyon serbest olduğu konusunda da mantık yürütebilirsiniz.
Peki, çocuklar, çok iş parçacıklı bir ortamda neden kilitlemeye ihtiyacımız olduğu
sorusu ortaya çıkıyor? Dolayısıyla, çok iş parçacıklı bir programınız olduğunda,
veri bütünlüğünü sağlamak için iş parçacığı senkronizasyonunda oturum açmanız gerekir.
Yani tek bir cümleyle ifade etmek gerekirse, kilitlemeye ihtiyacımız
var çünkü iş parçacıkları programın rastgele noktalarında bağlam değiştiriyor.
Temel işletim sisteminiz de bu şekilde tasarlanmıştır.
Kullanıcı alanı iş parçacıklarının herhangi bir keyfi noktada bağlam değiştirmeye tabi tutulmasıdır.
Eğer bunu kontrol edebilirseniz, yani programcı olarak kullanıcı alanı iş parçacıklarınızın
yalnızca programda tanımlanmış ya da programcı tarafından karar verilmiş noktalarda bağlam
değiştirmesini kontrol edebilirseniz, o zaman çok iş parçacıklı bir ortamda
bile herhangi bir senkronizasyon ya da kilit türüne ihtiyaç duymazsınız.
Ama bu öyle bir şey değil.
İşletim sistemlerimiz, bir iş parçacığının programın hangi noktasında yürütüldüğü konusunda
endişelenmeden sadece kullanıcı alanı tuzaklarından bağlam değiştirmeyi tetiklemek için tasarlanmıştır.
İşte bu noktayı anlamak için çok iş
parçacıklı programlarımızda iş parçacığı senkronizasyonunda kilitlere
neden ihtiyaç duyuyoruz? Bir örnek verelim.
Burada bağlantılı bir listemiz var ve D1 konuları bu bağlantı listesi üzerinde
çalışıyor ve çekici olan bu nord'u bu bağlantı listesinden çıkarmak istiyor.
Yani sonuç olarak T1 iş parçacığı işlemler için gerçekleştirmelidir.
İlk işlem, viral yükü atlayarak işaretçiyi bir
önceki düğümden bir sonraki düğüme ayarlamaktır.
Yani bu operasyon No.
Bir.
Tamam.
İkinci işlem ise bu işlemin tersidir.
Bu, maksimum notanın hemen bir önceki noktasında, Nord'un
silinmekte olan önceki modeline çok sıkıcı geliyor.
Tartışmamızı kolaylaştırmak için bu düğümleri Node E Node B. ve Nord CE olarak belirleyelim.
Tamam.
Daha sonra üç numaralı işlemde ve trajediden önce, B düğümünün
sol işaretçisi olan bu konuma ahlaki değer ve ayrıca düğümün
sağ noktasına -- değeri koyulmalıdır. 31'in B düğümünü bu bağlantı
listesinden tamamen ayırmak için bu dört işlemi gerçekleştirmesi gerektiğini gördük.
Tamam.
Şimdi bir durum düşünün ki, antlaşmanın imzalanması sırasında bir numaralı operasyon tamamlanmış olsun.
Birincisi, bağlam değiştirme gerçekleşir.
Konu bu, sadece operasyonun yapılmasını mı istiyorsunuz, hayır.
Bir ve işlemi gerçekleştiremeden önce No.
İki ya da üç ve dört, bağlam değiştirme
gerçekleşir ve 31 yerine, sisteme girmeye hazır değil.
Yani, CPU'ya yüklenir.
Bu enkaz bağlantı listesine çekilen Dude aşağıdaki gibi görünecektir a düğüme bağlı değildir.
Bu, 381'in birinci işlemi gerçekleştirmesinden ve bağlam değiştirme tetiklemesinden hemen sonradır.
Nord sol işaretçinin geride kalmamaya ve geride bırakılmamaya bağlı olduğunu veya A Düğümüne bağlı olduğunu görür.
Ve doğru değil, nokta Kuzey Denizi'ne bağlı.
Dolayısıyla, bu çift bağlantılı listenin tehdit veri görselleştirmesinin tamamen berbat
olduğunu görebilirsiniz ve tüm kök neden, trajedinin bağlantı listesi
üzerinde bir işlem yaparken bağlam değiştirme yapması ve tetiklenen
bağlam olduğunda bu işlemin tamamlanmamış olması nedeniyle ortaya çıkmaktadır.
Dolayısıyla, bir veri yapısı güncelleme sürecinde olduğunda ve güncelleme
henüz tamamlanmadığında, veri yapısının tutarsız bir durumda olduğunu görürüz.
Dolayısıyla, 381 bu bağlantı listesindeki dört işlemi de tamamlayana
kadar, bu enkaz bağlantı listesi tutarsız bir durumda olacaktır.
Dolayısıyla, iş parçacıklarının veri yapılarını tutarsız bir durumda görmesini asla
istemeyiz ve günlüğe kaydetme işleminin gerekli olmasının nedeni de budur.
Hiç kimse işlemi gerçekleştirilmeden önce bu bağlantı listesi kaydedilirse,
hiç kimse işlemi gerçekleştirildikten sonra bağlam değiştirme gerçekleşse bile.
Birincisi, iş parçacığı verileri tutarsız bir bağlantı listesi üzerinde
işlem yapamayacaktır çünkü bağlantı listesi Treaty tarafından günlüğe kaydedilmiştir.
Tabii ki, tehdit katmanı, işlemini gerçekleştirdikten sonra mutantların
veya bu veri yapılarının kilidini açmak zorundadır.
Şimdi programımızdaki tüm iş parçacığı senkronizasyonunu kilitlemeye neden ihtiyaç duyduğumuz sonucuna varmak
gerekirse, tehditlerin bir programın rastgele noktalarında bağlam değiştirmeye maruz kalması nedeniyle, bir
şekilde işletim sisteminizi, kontrolü geliştiricinin ellerine verecek şekilde, tehditlerin yalnızca bir geliştirici
istediğinde bağlam değiştirmeye maruz kalacağı şekilde değiştirebilirseniz, geliştiricinin tehditlerin yalnızca hiçbir uygulama
veri yapısının tutarlı bir durumda kalmadığından yüzde 100 emin olunduğunda bağlam
değiştirmeye maruz kalacağı şekilde bir kod parçası yazması her zaman mümkündür.
Eğer amaç buysa, çok iş parçacıklı ortamda bile herhangi
bir kilitleme veya tehdit senkronizasyon mekanizmasına ihtiyacınız olmayacaktır.
Ama durum böyle değil.
İşletim sistemlerimiz, çok çekirdekli sistemlerin tüm veriminden yararlanmak için bu şekilde tasarlanmamıştır.
İşletim sistemleri, bir programın hangi noktasında iş parçacıklarının doğru
çalıştığını beklemeden veya dikkate almadan kullanıcı tabanlı tehditler
arasında bağlam geçişini tetiklemek için bağlanmak üzere tasarlanmıştır.
Bağlam değişimlerinde veri bütünlüğünün ve tutarlılığının korunmasını sağlamak için uygun
senkronizasyon veya kilitli kilitleme mekanizmaları kullanmak da geliştiricinin sorumluluğundadır.