Evet arkadaşlar, başlamak için yapacağımız şey, SPC
dosyasında bir ana fonksiyona sahip olmamızdır.
Ve kullanıcı bir numaralı seçeneği seçtiğinde.
Ardından, yönlendirme tablosunun tüm içeriğini yazdırmak için art display art table işlevini çağırıyoruz.
Yani burada ilk akış, yönlendirme tablosunun yazdırılmasının
bir ana iş parçacığı bağlamında yapılmasıdır.
Eğer TX nokta c dosyasına giderseniz sağ tarafta TX tablo fonksiyonunu görüntüleyebiliriz.
Ve bu fonksiyonda basitçe yönlendirme tablosu veri yapısı
üzerinde yineleme yaptığımızı ve girdilerini yazdırdığımızı görebilirsiniz.
Dolayısıyla, ilk katta yönlendirme tablosunun içeriğini olay döngüsü iş
parçacığı değil, bir ana iş parçacığı bağlamında yazdırıyoruz.
Dolayısıyla bu, STP sürecimizin mantıksal olarak tek iş parçacıklı bir süreç olarak kalması gerektiği şeklindeki ilk hedefimizi ihlal etmektedir.
Burada STP sürecimizin çok iş parçacıklı olma eğiliminde olduğunu görüyoruz, çünkü
yönlendirme tablosunun yazdırılması ana iş parçacığı bağlamında yapılırken, yönlendirme tablosu üzerindeki
işlemlerin geri kalanı bir olay döngüsü iş parçacığı bağlamında yapılmaktadır.
Yani, aslında bir yönlendirme tablosu üzerinde çalışan iki iş parçacığı vardır.
Bu da STP sürecimizi çok iş parçacıklı bir süreç haline getirme eğilimindedir ki
bu da HDP sürecinin mantıksal olarak tek iş parçacıklı kalması gereken hedefleri bozar.
Buradaki ikinci şey ise yönlendirme tablosunun yazdırılmasının çok sıkı bir döngü içinde yapılmasıdır.
Hiçbir önleme söz konusu değildir.
Yani yönlendirme tablonuzda diyelim ki 50.000 girdi varsa, bu döngü 50.000 kez yinelenecektir.
Bu da bu işlevin CPU'yu beş saniye boyunca doğrudan meşgul edeceği anlamına gelir.
Bu yüzden yapacağımız şey, bu fonksiyonu yeni bir fonksiyonla değiştirmek olacaktır.
Diyelim ki bu yeni işlevin adı TX ekran TX tablosu ön alma bağlamı kaydetme olsun.
Diyelim ki yeni fonksiyonumuzun adı bu olsun.
Ve bu işlev de aynı şeyi yapar.
Yönlendirme tablosunun içeriğini yazdırır.
Ancak bu işlev iki hedefe ulaşmamıza yardımcı olacaktır.
Birincisi, yönlendirme tablosunun yazdırılması, olay döngüsü iş parçacığı bağlamında yapılmalıdır.
İkinci olarak, on girişi görüntüledikten sonra, bu fonksiyon bir olay döngüsü yazdırmalıdır.
Thread, yönlendirme tablosunda on giriş görüntüledikten sonra bu işlevi yeniden planlamalıdır.
Ulaşmak istediğimiz iki hedef de bunlardı.
Bu yüzden eski fonksiyonu yorumlayalım.
Ve bu yeni fonksiyonun prototipini sdp l dot h dosyasında tanımlayacağım.
Tamam.
Ve bu işlevi dosyada tpl nokta c olarak tanımlayacaktım.
Şimdi bu fonksiyonun nasıl uygulanacağını görelim.
Dolayısıyla ulaşmamız gereken iki hedef var.
Yönlendirme tablosunun ilk baskısı yapılmalıdır.
Olay döngüsü iş parçacığı bağlamında.
İkinci nokta ise şudur.
Bu işlev öncelenebilir olmalıdır.
Şimdi bu işlevin uygulanmasıyla başlayalım ve bu iki hedefe nasıl ulaşılabileceğini görelim.
Şimdi yeni bir veri yapısı kullanacağım.
Ve bu veri yapısına TX tablo yazdırma bağlamı adı verilir.
Ve bu veri yapısının amacı, yönlendirme tablosunu
yazdırırken üzerinde ne kadar iterasyon yaptığımızı hatırlamaktır.
Bu nedenle, tablo üzerinde ne kadar yineleme yaptığınızı hatırlamanız gerektiğini unutmayın,
böylece yönlendirme tablosunu en son bıraktığınız yerden yazdırmaya devam edebilirsiniz.
Bu da böyle bir bilgiyi kaydetmek için bazı veri yapılarına ihtiyacınız olduğu anlamına gelir.
Ve bu veri yapısını yönlendirme tablosu yazdırma bağlamı olarak adlandırıyoruz.
Eğer bunu tanımlamak isterseniz, bu veri yapısının tanımı ne olacaktır.
Yani bu veri yapısı çok basittir.
Bu veri yapısı içine girecektir.
Unutmayın.
Yönlendirme tablosundaki yönlendirme tablosu girişinin numarası.
Tamam.
Ve görevimiz olay döngüsü iş parçacığı tarafından tekrar programlanacağı
zaman yazdıracağımız bir sonraki yönlendirme tablosu girişinin işaretçisi.
Bu da böyle bir yönlendirme tablosu girişinin işaretçisini yakalamamız gerektiği anlamına gelir.
Pekala, eğer bu iki bilgiyi hatırlarsam, yönlendirme
tablomu yazdırmaya kaldığım yerden devam edebilirim.
Tamam.
Şimdi ilk yönlendirme tablosu girişini yazdıracağım, bu nedenle.
Gerçekten bir tane olacaktım.
Yani, yönlendirme tablosundaki ilk girdidir ve
yönlendirme tablosundaki ilk girdinin işaretçisini kaydedecektir.
Şimdi, bu noktada, artık bir olay döngüsü görevi oluşturabilecek durumdayım.
Yani görev.
Yeni iş oluşturun.
İşaretçiyi olay döngüsü örneğinize geçirin.
İşaretçiyi olay döngüsü geri çağırma işlevine geçirin.
Bu fonksiyonu kısa bir süre sonra uygulayacağız ve bu
fonksiyonun argümanı hiçbir şey değildir, ancak bağlamımızın işaretçisidir.
Tamam.
Ve bu fonksiyonun uygulanmasıyla işimiz bitti.
Şimdi geri arama fonksiyonumuzun uygulamasını tartışmamız gerekiyor.
Tüm sihri yapacak olan bu işlevdir.
Şimdi bunun olay döngüsü geri arama işlevi olduğuna dikkat
edin, bu nedenle olay döngüsü iş parçacığı bağlamında çağrılacaktır.
Tamam.
Bu yüzden, aktarılan argümandan bağlamı getirmeme izin verin ve bağlamda
ve I değerinde bulunan gizli yönlendirme tablosu girişini getireceğim.
Şimdi döngüyü başlatacağım.
Yani, yönlendirme tablosundaki bu yönlendirme tablosu girişinden
başlayarak yönlendirme tablosu üzerinde yineleme yapmam gerekiyor.
Ve şimdi bu for döngüsü içinde bu yönlendirme tablosu girişini yazdıracağım.
Bu kadar basit.
Şimdi, olay döngüsü iş parçacığı tarafından bu geri arama işlevinin tek
bir çağrısında yönlendirme tablosunun yalnızca on girişini yazdırmamız gerektiğini unutmayın.
Bu da demek oluyor ki, eğer ben
Yüzde tan sıfıra eşittir ve.
Yönlendirme tablosunda yazdırılacak daha fazla yönlendirme tablosu girişi var.
Şimdi bağlamımı güncelleyeceğim.
Yazdıracağım bir sonraki yönlendirme tablosu girişinin işaretçisini kaydedeceğim.
Bir dahaki sefere olay döngüsü iş parçacığım bu görev geri arama işlevini zamanlayacaktır.
Bu da yönlendirme tablosunu ne kadar yinelediğimi hatırladığım anlamına geliyor.
Ve basitçe geri dönmeye devam edeceğimi söyleyeceğim.
Tamam.
Ve tüm yönlendirme tablosunu zaten yinelediğimi ve yazdıracak daha
fazla girdim olmadığını fark edersem, bağlamı yok edeceğim.
Ve geri döneceğim.
Ben bitiririm.
Ve bununla birlikte prim tablomuzun uygulamasını tamamlamış oluyoruz.
Yönlendirme tablosu görüntüleme işlevi.
Şimdi derleyeyim ve nasıl çalıştığını göreyim.
Şimdi projemizi hızlıca derleyelim ve uygulamamızı çalışırken görelim.
Bu yüzden SDP nokta x'i çalıştıracağım ve 40.000 numaralı portu dinleyeceğim.
Daha sonra diğer terminal penceresinden SDP sürecimize rota göndereceğim.
Böylece SDP sürecimiz bir numaralı seçeneği kullanarak 100 kadar rotanın ne olduğunu
öğrendi, şimdi yönlendirme tablosunun olay döngüsü iş parçacığı tarafından görüntülendiğini görebilirsiniz.
Ve olay döngüsü iş parçacığı tek seferde on rota yazdırıyor.
Yani artık yönlendirme tablomuzun tüm içeriğini preemption ile boşaltabiliyoruz.
Tamam.
Yani, yönlendirme tablomuzda 50.000 rota olsa bile, olay döngüsü
kuyruğumuzda zamanlanan başka herhangi bir olayı, döngüyü, görevi veya
işi aç bırakmadan tüm bu 50.000 rotayı görüntüleyebileceksiniz.