Rust'da Async IO'nun uygulanmasıyla ilgili bu konuşmayı izliyordum ve Carl iki potansiyel modelden bahsediyor. Hazırlık ve Tamamlama.
Hazırlık Modeli:
- bir soketten okumak istediğiniz çekirdeğe söylersiniz
- bir süre başka şeyler yap…
- çekirdek soketin ne zaman hazır olduğunu size söyler
- okudun (bir tampon doldur)
- ne istersen yap
- arabelleği boşalt (Rust ile otomatik olarak gerçekleşir)
Tamamlanma Modeli:
- çekirdeğin doldurması için bir tampon ayırırsınız
- bir süre başka şeyler yap…
- çekirdek tamponun ne zaman dolduğunu size söyler
- verilerle ne gerekiyorsa yap
- tamponu boşalt
Carl'ın hazır olma modelini kullanma örneğinde, hazır bir soketi doldurarak ve daha az bellek kullanmış gibi görünmesini sağlayan global bir tamponu serbest bırakabilirsiniz .
Şimdi benim varsayımlarım:
Bir soketin "hazır" olduğu söylendiğinde kaputun altında (çekirdek boşluğunda) veriler zaten mevcuttur. Ağ üzerinden (veya her yerden) sokete girdi ve işletim sistemi verileri tutuyor.
Bu hafıza tahsisi sihirli bir şekilde hazır olma modelinde olmaz gibi değil. Sadece işletim sistemi onu sizden soyutlıyor. Tamamlama modelinde, işletim sistemi sizden veri akmadan önce bellek ayırmanızı istiyor ve ne olduğu belli.
İşte Hazırlık Modelinin değiştirilmiş versiyonum:
- bir soketten okumak istediğiniz çekirdeğe söylersiniz
- bir süre başka şeyler yap…
- DEĞİŞİKLİK: veriler işletim sistemine gelir (çekirdek belleğinde bir yer)
- çekirdek soketin hazır olduğunu söyler
- okudunuz (yukarıdaki çekirdek arabelleğinden ayrı bir tampon daha doldurun (ya da bir işaretçi mi aldınız?))
- ne istersen yap
- arabelleği boşalt (Rust ile otomatik olarak gerçekleşir)
/ Varsayımlarım
Kullanıcı-uzay programını küçük tutmaktan hoşlanıyorum ama gerçekte burada neler olduğu hakkında biraz açıklama yapmak istedim. Bir modelin doğal olarak daha az bellek kullanacağını veya daha yüksek bir eşzamanlı IO seviyesini destekleyeceğini görmüyorum. Düşüncelerini ve bunun daha derin bir açıklamasını duymak isterim.