Şimdi de asenkron programlama ortamında erken silme işlemini
ele alan bir sonraki tasarım modeliyle başlayalım.
Bu yüzden öncelikle erken silmenin ne olduğunu anlamaya çalışalım:
erken silme, yakın gelecekte nesne üzerinde çalışması planlanan görevler
varken bir veri nesnesini sistemden silmek anlamına gelir.
Doğru.
Diyelim ki bir D veri yapınız var ve.
Bir olay döngüsü ortamında veya asenkron programlama ortamında, olay döngüsü iş parçacığı
üzerinde zaten zamanladığınız T bir, T iki veya görev üç üç diyelim
ve bu görevler bu veri yapısı nesnesi üzerinde bazı işlemler gerçekleştirir.
Ama bir şekilde.
Sildiniz veya serbest bıraktınız.
Bu veri yapısı.
De.
Halihazırda zamanlanmış ve de veri yapısı üzerinde bir
işlem gerçekleştirmek için bekleyen görevler olmasına rağmen.
Peki olay döngüsü T1, T2 ve T3 görevlerini yürütmek üzere zamanladığında ne olacak? T1
görevi, T2 görevi veya T3 görevi sarkan bir işaretçi kullanarak belleğe erişmeye çalışacaktır.
Tamam.
D veri yapısının adresi artık geçerli değildir.
Ve sarkan bir işaretçi haline gelir.
Sonuç olarak, programınız çökebilir.
Tamam.
Dolayısıyla, erken silme sorunu eşzamanlı olan her ortamın doğasında vardır.
Erken silme sorununu tek iş parçacıklı eş zamanlı bir ortamda gerçekleştirebilirsiniz.
Böyle bir ortam bir olay döngüsü iş parçacığından sorumludur.
Ya da çoklu iş parçacığı kavramıyla oluşturulan çok iş parçacıklı eşzamanlı bir ortam.
Sistemde birden fazla iş parçacığı varsa, ortamınız çok iş parçacıklı eşzamanlıdır.
STP sürecimiz tek iş parçacıklı eş zamanlı bir ortamdır.
STP sürecimiz tek iş parçacıklıdır çünkü mantıksal olarak tüm işlemleri gerçekleştirmekten sorumlu
olan tek bir iş parçacığı vardır ve bu da Eventloop iş parçacığıdır.
Ve eşzamanlıdır çünkü görevler arasında geçiş yaparız.
Şimdi bir örnek yardımıyla bu erken silme
sorununu biraz daha ayrıntılı olarak anlamaya çalışalım.
Diyelim ki STP sürecimizde TC adında bir
görev yürütüyoruz ve bu görev işlemini gerçekleştiriyor.
Şimdi operasyonunu gerçekleştirmenin bir parçası olarak.
Diyelim ki T1 görevi yeni bir yönlendirme tablosu girişi oluşturuyor.
Peter ise bu yönlendirme tablosu girişine bir işaretçiyi temsil eder.
Tamam o zaman görev TC, yeni oluşturulan yönlendirme tablosu girişini yönlendirme tablosuna ekleyin.
Yani burada bir sorun yok.
Her şey yolunda.
Şimdi TC görevi bu yönlendirme tablosu girişinin sona erme zamanlayıcısını da başlatır.
Tamam.
Yine mi?
Sorun değil.
Şimdi DC görevi API kullanarak başka bir T görevini zamanlıyor.
Görev zaten kullanmakta olduğumuz yeni bir iş yaratır.
Böylece DC görevi yeni bir T as görevi oluşturur ve bunu bir olay döngüsü iş parçacığı üzerinde zamanlar.
Görevin amacı da bu.
Serileştirilir ve yönlendirme tablosu girişini uzak bir makineye gönderir.
BTS görevini bu dersin bir önceki bölümünde ödevin bir parçası olarak zaten uygulamıştık.
Tamam.
İşte TC, BTS'i planlıyor.
TC, yürütülmekte olan geçerli görevdir.
BTS, bir olay döngüsü kuyruğunda zamanlanan yeni görevdir.
TC görevi yürütülmesini tamamlar tamamlamaz, olay döngüsü iş parçacığı T görevini devralacaktır.
İnfaza gelince.
Diyelim ki bu olay döngüsü kuyruğu.
Ve bu işaret üzerine t as görevi tc görevi tarafından yerleştirilmiştir.
Tamam.
Şimdi diyelim ki bu yönlendirme tablosu girdisi için süre dolum zamanlayıcısı ateşlendi.
Böylece zamanlayıcı ateşlendiğinde, olay döngüsü kuyruğuna yeni bir görev yerleştiririz.
Bırak.
Bu görev TD olarak adlandırılır.
Dolayısıyla TD görevinin amacı yönlendirme tablosu girişini silmektir
ve TD görevi olay döngüsü kuyruğuna yerleştirilir.
Yönlendirme tablosu girişinin zamanlayıcı iş parçacığı tarafından.
Bunu SDP sürecimizde de zaten uyguladık.
Şimdi bu noktada, bir olay döngüsü kuyruğunda RTS ve TD olmak üzere iki görevimiz var.
Tamam.
Şimdi, erken silme sorununu gerçekleştirmek için,
DC görevinin yürütülmesini tamamladığını varsayalım.
Ve.
Ve şimdi olay döngüsü iş parçacığı yürütme için bir sonraki görev ağacını alır.
Bu nedenle, erken silme sorununu gerçekleştirmek için, olay döngüsü iş
parçacığının yürütme için bir sonraki görev ağacını almasını sağlamalıyız.
Bu yüzden görev ağacını olay döngüsü kuyruğundan çıkaralım
ve görev ağacı çalıştığında aşağıdaki işlemi gerçekleştirsin.
Yönlendirme tablosundan bir yönlendirme tablosu girişi algılar.
Ve yönlendirme tablosu girişini serbest bırakır.
Tamam.
Yani görevin amacı buydu.
TD.
Ve 3D görevi yürütülmesini tamamladığında olay döngüsü iş parçacığı şimdi Olay
Döngüsü kuyruğundan bir sonraki görevi, yani D s görevini alacaktır.
Ve görev ekipleri artık amaçlanan işlemi gerçekleştirecektir.
BTS görevinin yönlendirme tablosu girişini serileştirmesi ve ağ üzerinden uzak
makineye göndermesi gerekiyordu ve bu nedenle BTS görevinin bu
işaretçi tarafından işaret edilen nesne üzerinde işlem gerçekleştirmesi gerekiyordu.
Ancak önceki adımda bu işaretçinin zaten serbest bırakılmış olduğunu görebilirsiniz.
Yani bu, bu işaretçinin zamanın bu noktasında sarkık hale geldiği anlamına gelir.
T'yi görevlendir.
S, sarkan bir işaretçi üzerinde işlem yapmaya çalışır ve bu nedenle STP uygulamanız çökebilir.
Tamam.
Dolayısıyla, STP sürecimizde bu olaylar dizisi meydana gelirse,
STP sürecimizin çok iyi bir şekilde çökebileceğini görebilirsiniz.
Ancak, bu olay dizilerini isteğe bağlı olarak oluşturmak çok zordur.
Bu nedenle, bu çökmeyi yeniden oluşturmaya çalışırsanız, çok zor olacaktır ve muhtemelen başarılı olamayabilirsiniz.
Ancak burada açıkladığım gibi, sarkan işaretçi sorunu her zaman vardır.
Bu nedenle, sarkan işaretçi veya erken silme sorununu daha genel bir şekilde
tartışmak için, tek iş parçacıklı eşzamanlı uygulamanızda zamanın bir noktasında olduğunu varsayabilirsiniz.
Olay döngüsü iş parçacığında zamanlanan D bir, T
iki ve D üç görevleriniz olduğunu varsayalım.
Ve bu üç görevin de aynı veri nesnesi
D üzerinde kendi işlemlerini gerçekleştirmeyi amaçladığını varsayalım.
Görev.
Üç üç, T üç görevinin bir nesne üzerinde
silme işlemi gerçekleştirmesi anlamında özel bir görevdir.
Bu nedenle, T üç görevi t bir ve t iki görevlerinden önce
olay döngüsü iş parçacığı tarafından zamanlanırsa, sarkan işaretçi sorununa yol açacaktır.
T üç görevi T veri nesnesini serbest bıraktıktan veya yok
ettikten sonra, gelecekte yani T üç görevi bittikten sonra.
Olay döngüsü iş parçacığı t1 veya t2 görevini yürütme için zamanladığında, bunlar
sarkan işaretçi tarafından işaret edilen bir nesne üzerinde ilgili işlemi gerçekleştirmeye çalışacaktır.
Tamam.
Ya da başka bir deyişle, şu anda var olmayan bir nesne üzerinde işlem yapmaya çalışırlar.
Yani bu, erken silme işlemine bir örnektir.
Yani erken silme, zaten zamanlanmış görevler varken bir veri nesnesinin sistemden silinmesi anlamına gelir.
Sistemde ve bu görevler bu veri nesnesi üzerinde bazı işlemler gerçekleştirmek istiyor.
Dolayısıyla, eşzamansız eşzamanlı programlama dünyasında, erken silme sorunu çok yaygındır.
Ve neyse ki, erken silme sorununu ele almak için çok zarif bir yöntem var.
Umarım erken silme sorununu açıklayabilmişimdir.
Şimdi de bu erken silme sorunuyla nasıl başa çıkacağınızı tartışacağız.
Sadece tek iş parçacıklı eşzamanlı programlamada değil, çok iş parçacıklı
eşzamanlı programlamada da nesnelerin erken silinmesi sorunuyla karşılaşacağınızı unutmayın.
Tartışacağımız çözüm her iki programlama ortamında da uygulanabilir, yani
tek iş parçacıklı eşzamanlılık veya çok iş parçacıklı eşzamanlılık.