Herhangi bir kaynaktan veri talep ederken her zaman biraz gecikme olur. Web sunucularına gönderilen ping milisaniye cinsinden ölçülür, depolama erişim süresi mikrosaniye cinsinden gecikmelere sahip olabilirken RAM gecikmesi CPU saat döngülerinde ölçülür. Tabii ki, bu tür hızlar yalnızca birkaç on yıl önce düşünülemezdi, ancak günümüzde asla yeterince hızlı değiller. Erişim hızı, performansta düzenli olarak bir tür darboğazdır. Bunun ele alınabilmesinin yollarından biri önbelleğe almadır.
Önbelleğe alma, bir kaynağın geçici bir kopyasını, normalden daha hızlı erişilebilecek şekilde depolama işlemidir. Hem yazılımda hem de donanımda çok çeşitli uygulamalar vardır. Önbellekler, okuma önbellekleri, yazma önbellekleri veya her ikisi olarak işlev görebilir.
Önbellekleri oku
Bir okuma önbelleğinde, daha önce talep edilen veriler daha hızlı erişim için bir önbellekte saklanır. Bazı senaryolarda, önbellek, yalnızca sonraki isteklerden ziyade ilk isteğin önbellekten sunulmasına izin veren verilerle önceden yüklenebilir.
Muhtemelen aşina olduğunuz okuma önbelleği, tarayıcı önbelleğidir. Burada tarayıcı, istenen kaynakların yerel bir kopyasını saklar. Bu, web sayfası yeniden yüklendiğinde veya aynı içeriğin çoğunu kullanan benzer bir sayfa yüklendiğinde, bu içeriğin web sunucusu yerine önbellekten sunulabileceği anlamına gelir. Bu yalnızca web sayfasının daha hızlı yüklenebileceği anlamına gelmez, aynı zamanda web üzerindeki yükü de azaltır sunucu ve kullanıcının indirmesi gereken veri miktarını azaltır, bu da ölçümde önemli olabilir bağlantılar.
RAM'in kendisi de sabit sürücüdeki veriler için bir okuma önbelleği görevi görür. Bu durumda, çalışan bir programın verileri, CPU'nun daha hızlı erişebilmesi için önceden RAM'e yüklenir. RAM'den gelen veriler daha sonra CPU önbelleğine daha fazla önbelleğe alınır, ancak bunun için işlem çok daha karmaşıktır çünkü CPU önbelleği gigabayt değil megabayt olarak ölçülür.
Önbellek yaz
Yazma önbelleği, daha yavaş bir aygıta yazılan verileri emebilen bir önbellektir. Bunun yaygın bir örneği, modern SSD'lerdeki SLC önbelleği olacaktır. Bu önbellek, verilerin daha hızlı okunmasına izin vermez, ancak SSD'nin geri kalanını oluşturan TLC veya QLC flash'a yazmaktan çok daha hızlıdır. SLC önbelleği, yüksek hızlı yazma işlemlerini emebilir ve ardından bu verileri mümkün olan en kısa sürede çok daha iyi depolama yoğunluğu sunan, ancak aynı zamanda yazması çok daha yavaş olan TLC flaşına aktarabilir. Flash belleği bu şekilde kullanmak, onu hem yüksek yazma hızları hem de yüksek depolama yoğunluğu için optimize eder.
Hibrit önbellekler
Önbellekleri hem okuma hem de yazma önbelleği olarak hareket etmelerine izin verebilecek birçok yolu vardır. Bu yöntemlerin her biri, yazma işlemlerini farklı şekilde ele alır ve yararları ve sakıncaları vardır. Üç seçenek etrafa yazma, üzerine yazma ve geri yazmadır. Etrafına yazma önbelleği yazarken önbelleği tamamen atlar, üzerine yazma önbelleği önbelleğe yazar, ancak işlemi yalnızca depolamaya yazıldığında tamamlanmış olarak kabul eder. Geri yazma önbelleği önbelleğe yazar ve ardından gerekirse önbelleğe onu depolamaya aktarmak için güvenerek işlemin tamamlandığını düşünür.
Önbellek karmaşasını en aza indirdiği için çok sayıda yazma bekliyorsanız, etrafa yazma yararlı olabilir. Ancak bu, daha sonra bu yazılı verilerden herhangi birini okuyan bir işlemin, ilk seferde en az bir önbellek ıskasıyla karşılaşacağı anlamına gelir. Yazma önbellekleri, yazma işlemlerini hemen önbelleğe alır; bu, sonucun ilk istendiğinde önbellekten sunulabileceği anlamına gelir. Yine de tamamlanmış sayılması için, bir yazma işleminin verileri diske yazması gerekir, bu da gecikme ekler. Geri yazma önbelleği, yazılı verilerin önbellekten hemen sunulmasına izin vererek, üzerine yazma ile aynı faydaya sahiptir. Yine de tamamlanmış sayılması için diske yazmak için yazma işlemleri gerektirmez. Bu, yazma gecikmesini azaltır, ancak önbellek geçiciyse ve güç kesilmeden önce verileri depolamaya geri yazmayı bitirmezse veri kaybı riskiyle birlikte gelir.
Önbellekten veri nasıl kaldırılır?
Herhangi bir önbelleğin sınırlayıcı faktörlerinden biri kapasitedir. Büyük bir önbelleğin aranması uzun zaman alır ve ilk etapta önbellek kullanma avantajının büyük bir bölümünü ortadan kaldırır. Önbelleğe alma için kullanılan bellek teknolojileri, önbelleğe aldıkları bellekten daha pahalı olma eğilimindedir. Durum böyle olmasaydı, bu bellek katmanının performansı artırmak için bellek teknolojilerini değiştirmiş olması muhtemeldir. Bu faktörlerin her ikisi de, özellikle önbelleğe alındıkları depolama ortamıyla karşılaştırıldığında, önbelleklerin nispeten küçük olma eğiliminde olduğu anlamına gelir. RAM, depolamadan daha az kapasiteye sahiptir ve CPU önbelleği RAM'den daha az kapasiteye sahiptir. SLC önbelleği, TLC belleğinden daha az kapasiteye sahiptir.
Tüm bunlar, önbelleğe alınması gereken yeni veriler için yer açmak için genellikle verileri önbellekten çıkarmanın gerekli olduğu anlamına gelir. Bu konuda bir dizi farklı yaklaşım var. “En az kullanılan”, en düşük erişim sayısına sahip önbellek girişlerini çıkarmayı tercih eder. Bu, hangi girdilerin gelecekteki önbellek kayıpları üzerinde en az etkiye sahip olacağını tahmin etmek için yararlı olabilir, ancak ayrıca çok yakın zamanda eklenen girişleri düşük erişim sayısına sahip olarak sayar ve bu da önbelleğe neden olabilir çalkalamak.
"En son kullanılanlar", bir süredir kullanılmayan önbellek girişlerini çıkarmayı tercih ediyor. Bu, şu anda kullanılmadıklarını varsayar, ancak bir süre önce yoğun bir şekilde kullanılıp kullanılmadıklarını hesaba katmaz. "En son kullanılanlar", en son kullanılan önbellek girişlerini, kullanıldıklarını ve tekrar kullanılmaları gerekmeyeceğini varsayarak çıkarmayı tercih eder. En iyi yaklaşım, genellikle kullanım istatistiklerine göre bilgi verilen üçünün birleşimidir.
Eski bilgi ve güvenlik riskleri
Önbelleklerin ana riski, içerdikleri bilgilerin eskimesidir. Orijinal veriler güncellendiğinde ve önbellek girişi güncelliğini yitirdiğinde, bir önbellek girişi eski kabul edilir. Sunulan canlı kopyanın önbelleğe alınmış kopyayla hala eşleştiğini düzenli olarak doğrulamak önemlidir.
Özellikle web sitelerinde, hangi verilerin önbelleğe alınıp alınamayacağını belirlemek de son derece önemlidir. Örneğin, büyük, değişmeyen bir JavaScript dosyasının önbelleğe alınması gayet iyi. Bu, kullanıcıyı her seferinde indirmekten kurtarır ve hatta aynı önbellek tarafından sunulan diğer kullanıcılara fayda sağlayabilir. Yine de, oturuma özgü verileri önbelleğe alamazsınız. Kendiniz olarak oturum açmışken bir mesajlaşma uygulamasına göz atıp yalnızca başka bir kullanıcının mesajlarının önbelleğe alınmış bir sürümünün size sunulduğunu bir düşünün. Neyse ki, web sunucuları hangi kaynakların önbelleğe alınıp alınamayacağını belirleyebilir ve bu sorunlar genellikle iyi bilinir, bu nedenle bunun gibi birkaç sorun vardır.
Çözüm
Önbellek, son zamanlarda kullanılan bazı verileri, normal veri erişim sürecini tekrar tamamlamaktan daha hızlı erişilebilen bir depolama yönteminde depolayabilen bir bellek bölümüdür. Bir önbellek tipik olarak kapasite bakımından sınırlıdır, yani dolduğunda girdileri çıkarması gerekir. Önbellekler genellikle kullanıcı için şeffaftır, yani gecikme, sonucun bir önbellek aracılığıyla sunulduğunun tek göstergesidir.