Kısım I · Makine · Bölüm 8

Bellek Hiyerarşisi

Hız ile kapasitenin pazarlığı (Memory hierarchy)

Neden burada · Neye dayanıyor

Neden burada: İşlemciyi bir komut ve bir bellek kutusuyla anlattık. Ama bütün veriye aynı sürede erişilseydi yazılımın pek çok performans sorusu başka olurdu. İşlemci içindeki küçük bir depoya bakmakla SSD'den veri istemek, uzaktaki bir sunucudan cevap beklemek aynı iş değildir. Bu bölüm, “veriyi nereye koyuyorum?” sorusunun neden programın hızını değiştirdiğini gösteriyor.

Neye dayanıyor: Bölüm 5.3'ten yazmaçları, Bölüm 5.4'ten RAM ve uçuculuğu; Bölüm 6.2'den CPU'nun veri ve komut getirme ihtiyacını kullanacağız. Bölüm 7.3'te yükle/sakla işini gördüysen şimdi o işin niçin bazen beklettiğini yerine koyabilirsin. Byte birimleri için dayanak Bölüm 2.3.

  1. Kat 8–10Ağ, web ve uygulamalarYakına kopya koyma fikri burada yeniden karşımıza çıkacak.
  2. Kat 3İşlemci ve bellekTek bellek kutusunu, hızları ve kapasiteleri farklı depolar olarak açıyoruz.
  3. Kat 2Hesap ve hafıza devreleriBilgiyi tutmak mümkün; şimdi hangi tür depoda tutulacağını ayırıyoruz.
  4. Kat 0–1Bitler ve fiziksel devrelerTeknoloji farkının altında yine bilgi taşıyan fiziksel düzenler var.

Bölüm sonunda önbelleğin neyi sakladığını, isabet ile ıskanın farkını, iki türlü yerelliği ve RAM ile kalıcı depolamanın niçin aynı şey olmadığını anlatabileceksin. Ayrıca ileride tarayıcı, CDN ve Redis başlıklarını gördüğünde onları birbirinden bağımsız üç yeni sihir olarak değil, bu bölümdeki fikrin farklı ölçeklerdeki örnekleri olarak karşılayacaksın.

8.1 Yazmaçtan ağa: gecikme ve kapasite

Bellek hiyerarşisi (memory hierarchy), farklı hız, kapasite ve byte başına maliyete sahip saklama düzeylerinin birlikte kullanılmasıdır. Küçük ve hızlı alanı, daha büyük ve daha yavaş alanın bir bölümünü yakında tutmak için kullanırız. Böylece bütün veriyi en pahalı hızlı teknolojiyle saklamak zorunda kalmadan, sık erişilen bölüme hızlı ulaşabiliriz. CS:APP'nin bu konudaki temel resmi budur.12

CPU'nun doğrudan çalışma alanı      yazmaçlar
                                          ⇅
CPU'ya yakın küçük kopyalar         L1 → L2 → L3 önbellek
                                          ⇅
Çalışan programların ana alanı      RAM
                                          ⇅
Yerel kalıcı kayıt                 SSD / HDD
                                          ⇅
Başka makinedeki kayıt             ağ üzerinden uzak depolar

Şemadaki aşağı yön genellikle daha büyük kapasite ve daha yüksek erişim gecikmesi, yukarı yön daha küçük ve daha hızlı alan demektir. Bu bir her-donanım garantisi değildir. Her CPU'da üç önbellek düzeyi bulunmak zorunda değil; önbelleklerin çekirdekler arasında paylaşımı da tasarıma bağlıdır. Ağın ucunda ise bir disk olmak zorunda değildir: başka bilgisayarın RAM'indeki bir hizmete de erişebilirsin. Hiyerarşi bir iş bölümü modeli; bütün isteklerin mecburen aynı merdiveni tek sıra inmesi değil.23

Gecikme ile bant genişliği aynı soru değildir

Gecikme (latency), bir erişimin veya isteğin sonucunu almak için geçen bekleme süresidir. Bant genişliği (bandwidth) ise bir yoldan birim zamanda taşınabilecek veri miktarıyla ilgilidir. Bir depodan ilk küçük parçayı almak için beklemekle, akmaya başladıktan sonra çok veri taşımak farklı ölçülerdir. HPBN, ağ performansını bu ayrımdan başlatır; CS:APP'nin disk anlatımı da ilk parçaya ulaşma ile devamındaki aktarımın farkını gösterir.41

Kütüphanedeki görevlinin ilk kitabı getirmesini beklemek gecikmeye, bir seferde kaç kitap taşıyabildiği aktarım kapasitesine benzer. Daha geniş taşıma arabası, depoya gidip gelme süresini sıfırlamaz. “Bağlantım hızlı, küçük istek niye bekliyor?” sorusu da yalnızca saniyedeki byte sayısıyla çözülmez.

Önce sayının statüsünü bil

Gecikmeler bilgisayara, istek boyuna, erişim düzenine ve yüke göre değişir. Aşağıdaki tablo bir cihaz karşılaştırması veya güncel ölçüm değildir; mertebeleri karşılaştıran öğretim senaryosudur. CMU'nun “Examples of Caching in the Mem. Hierarchy” slaydında L1 için 4, L2 için 10 çevrim örneği vardır. Bunları yalnızca bu modelde çevrim başına 1 nanosaniye varsayımıyla çeviriyoruz. Diğer satırların süreleri de model için seçilmiş varsayımlardır; bir ürünün ölçülmüş özelliği olarak sunulmuyor.2

Ölçeği büyütelim: modelde 1 nanosaniye beklemek, insan ölçeğinde 1 saniye beklemek olsun. Nanosaniye saniyenin milyarda biri, mikrosaniye milyonda biri, milisaniye binde biridir. Hepsini aynı katsayıyla büyütürsek küçük görünen sayıların arasındaki fark görünür hale gelir. Dönüşümler Python ile hesaplandı.

DüzeyBu senaryoda kabul edilen süre1 ns → 1 saniye ölçeğinde
Yazmaç1 ns; varsayımsal temel1 saniye
L1 önbellek4 ns; örnek 4 çevrim × 1 ns4 saniye
L2 önbellek10 ns; örnek 10 çevrim × 1 ns10 saniye
L3 önbellek40 ns; varsayımsal ara basamak40 saniye
RAM100 ns; varsayımsal erişim100 saniye
SSD erişimi100 µs; varsayımsal erişimYaklaşık 27,8 saat
HDD erişimi10 ms; varsayımsal erişimYaklaşık 115,7 gün
Uzak ağ isteği50 ms; varsayımsal toplam beklemeYaklaşık 578,7 gün

Tabloyu “bütün SSD'ler tam 100 mikrosaniyedir” diye ezberleme. Bir milyar kat büyütmede 100 mikrosaniye yüz bin saniye, 10 milisaniye on milyon saniye eder. Bu oranı görmek için model kurduk; gerçek sistem için ölçüm gerekir. Satırlar, tek isteğin sırayla toplanacak parçaları da değildir.

Ağın özel bir bekleme nedeni de mesafedir. HPBN, ağ gecikmesini yayılma, iletim, işleme ve kuyrukta bekleme bileşenlerine ayırır. CPU'yu hızlandırmak uzaktaki sinyalin yolculuğunu yok etmez. Bu yüzden uzağa gitmeyi gerektirmeyen bir kopya bazen hesabı hızlandırmaktan daha değerli olur. Ağın protokollerini Bölüm 19'a bırakıyoruz; burada yalnızca “verinin yeri de süreye dahildir” fikri gerekiyor.4

Neden her şeyi yazmaç yapmıyoruz?

Çünkü hızın kapasite, çip alanı ve maliyetle bir pazarlığı var. CS:APP, SRAM'in DRAM'den daha hızlı fakat byte başına daha pahalı ve daha düşük yoğunluklu olduğunu açıklar. Bu yüzden hızlı küçük kopyalar için SRAM, büyük ana bellek için DRAM kullanılması anlamlıdır. Yazmaçlar ise CPU'nun doğrudan çalışma alanıdır; bütün dosyalarımızı onlara doldurmak üzere tasarlanmış büyük bir depo değildir.12

Fazla RAM, CPU yazmaçlarını da büyütmez; büyük SSD, RAM erişimini kendiliğinden hızlandırmaz. Bir düzeyin kapasitesi başka düzeyin hızı değildir. Hangi kaynağın sınırladığını bulmadan yalnız “bellek” demek farklı sorunları tek kutuya doldurur.

8.2 Önbellek: isabet, ıska ve yerellik

Önbellek (cache), daha büyük veya daha uzaktaki bir kaynaktan alınan verinin bir bölümünü, daha hızlı veya daha yakın erişilebilen yerde tutan alandır. Amaç her verinin yeni asıl kopyasını yaratmak değil; yeniden kullanılacak veriye ulaşmanın maliyetini azaltmaktır. CPU önbelleğinde bu kopyalar RAM adresleriyle ilişkilidir. Bir uygulama önbelleğinde ise anahtar bir kullanıcı veya sorgu adı olabilir; üst kat örneklerine 8.4'te geleceğiz.2

İsabet ile ıska

İsabet (hit), istenen verinin aranan önbellek düzeyinde bulunmasıdır. Iska (miss), o düzeyde bulunmayıp sonraki kaynağa başvurmak gerekmesidir. L1'de ıska olması, verinin bilgisayarda kaybolduğu veya programın hata verdiği anlamına gelmez; L2'de, başka düzeyde veya ana bellekte bulunabilir. Bu kelimeler bir isteğin belirli önbellek düzeyiyle ilişkisidir.2

veri isteği
    │
    ▼
önbellekte var mı? ── evet: isabet ──► yakındaki kopyayı kullan
    │
    hayır: ıska
    ▼
sonraki kaynaktan al ──► gerekirse önbelleğe yerleştir ──► kullan

Bir kopyanın hangi büyük kaynağın hangi parçası olduğunu bilmek gerekir. Aksi halde hızlı kutuda bir veri bulman, onun istediğin veri olduğunu göstermez. CPU önbelleği bu eşlemeyi adres bilgileriyle donanımda yapar. Bu kitapta donanımın bütün eşleme devrelerini tasarlamıyoruz; “hangi kopya?” sorusunun da gerçekleme işi olduğunu bilmek yeterli.3

Neden işe yarar: yerellik

Yerellik (locality), programların yakın zamanda kullandıkları veya adresçe yakın duran verilere yeniden yönelme eğilimidir. Önbellek, geleceği kusursuz bilen bir kâhin değildir; bu eğilimden yararlanır. CS:APP iki yönü ayırır: aynı şeyi yeniden kullanma ve yakındaki şeyleri birlikte kullanma.12

“Aynı” ile “yakın”ı ayır. Her sorudan sonra aynı puan sayacına dönmek zamansal sezgidir. Yan yana yerleştirilmiş soru numaralarını sırayla okumak mekânsal sezgidir. Ama JavaScript nesnelerinin gerçek bellekte otomatik olarak istediğin gibi yan yana dizildiğini varsaymıyoruz. Bu örnekler erişim düşüncesini anlatır; somut yerleşimi Bölüm 10'da C dizileriyle açıkça göreceğiz.

Önbellek satırı: yalnız istediğin küçük sayı gelmeyebilir

Önbellek satırı (cache line), CPU önbelleği ile alt bellek düzeyi arasında birlikte taşınan bitişik veri bloğudur. Bir küçük sayı istendiğinde onun çevresindeki byte'lar da aynı satırla getirilebilir. Bu, mekânsal yerelliği işe çevirir: az sonra komşu adrese baktığında veri zaten yakında olabilir. Satır boyu donanıma bağlıdır; kaynaklarda 64 byte yaygın bir örnek olarak kullanılır, ama bütün işlemciler için zorunlu bir sabit değildir.23

Bir öğretim deneyi kuralım. Satır boyu 64 byte olsun. 1024 adresinden başlayan, her biri 4 byte olan 16 tamsayı yan yana dursun. Adresler 1024, 1028, 1032…1084 olur; toplam 16 × 4 = 64 byte. Başlangıç adresi de 64 byte'lık satır sınırına denk gelsin. Önbellek başlangıçta boş, başka işler satırı çıkarmıyor ve önceden veri getirme gibi ek mekanizmalar yok varsayılsın. Böylece bütün dizi tek satıra sığar.

ErişimBu sade modelde sonuçNeden?
1024'teki ilk tamsayıIskaSatır henüz getirilmedi
1028'deki ikinci tamsayıİsabetİlk erişimde gelen aynı satırda
1032'den 1084'e kalan tamsayılarİsabetOnlar da o satırın içinde
Aynı 16 değeri hemen yeniden okumakHepsi isabet; satır korunuyorsaGetirilmiş veriyi zaman içinde tekrar kullanma

İlk turdaki bir ıska ve on beş isabet, mekânsal yerelliği gösterir. İkinci turdaki yeniden kullanım ise zamansal yerelliktir. Bu bir ölçüm sonucu değil, açık varsayımlı modelin hesabıdır. Başlangıç hizası değişse, arada başka satırlar yerini alsa veya erişim biçimi değişse sonuç değişebilir. Örnek bir performans garantisi değil; veriyi küçük bloklarla getirmenin mantığıdır.2

Kapasite ve hangi verinin kalacağı

Önbellek küçük olduğu için bütün veriyi saklayamaz. Yeni bir blok geldiğinde bir eskisinin çıkarılması gerekebilir. Hangi bloğun nerede durabileceği ve hangisinin çıkarılacağı gerçekleme kararlarıdır. Başlangıçta boş olması, etkin kullanılan verinin sığmaması veya bazı blokların aynı yerlere düşmesi ıskaya yol açabilir. CMU slaytları bunları ilk erişim, kapasite ve eşleme çatışması kaynaklı ıskalar olarak ayırır. Burada ayrıntılı önbellek tasarımına değil, “sık kullanılıyor ama yine de her şey sığmıyor” sınırına bakıyoruz.2

CPU'nun donanım önbelleğini normal programda her değer için elle doldurmazsın. Donanım, bellek erişimleri üzerinden onu yönetir. Ama veriye hangi sırayla dokunduğun, bu düzene yararlanabileceği yerellik sunar veya sunmaz. “Algoritma aynı sayıda toplama yapıyor, öyleyse aynı sürede biter” demek bu yüzden eksiktir: hangi verinin nereden getirildiği de zaman alır.13

Az sayıda ıska ortalamayı nasıl etkiler?

Yine basit, tek önbellekli bir model seçelim. Her istek önce 4 ns süren önbellek kontrolü yapsın. Iska olursa buna ek olarak 100 ns beklesin. Yani isabetin toplam süresi 4 ns, ıskanın toplam süresi 104 ns. Başka düzeyler, paralel istekler veya örtüşmeler bu alıştırmada yok. Böylece bir isabeti yanlışlıkla “4 ns”, bir ıskayı ise önbellek kontrolünü unutarak “100 ns” saymamış oluruz.

ortalama süre = kontrol süresi + ıska oranı × ek ıska beklemesi
%90 isabet:    4 + 0,10 × 100 = 14 ns
%99 isabet:    4 + 0,01 × 100 =  5 ns

İlk durumda on bin isteğin dokuz bini isabet, bini ıskadır; toplam 140.000 ns. İkinci durumda 9.900 isabet ve 100 ıska vardır; toplam 50.000 ns. Aynı on bin istek için ortalama 14 ns yerine 5 ns elde edilir. Bu sayılar gerçek uygulamamızın hızı değil, Python ile hesaplanmış senaryodur. Önbelleğin değerini belirleyen yalnızca isabetin hızlı olması değil, pahalı ıskaya ne sıklıkla düştüğündür.

Önbellek kopyası değişince ne olacak?

Okuma kadar yazma da var. CPU bir kopyayı değiştirince RAM'deki daha aşağı kopyanın ne zaman güncelleneceği için kurallar gerekir. Bottom-Up CS, değişikliklerin aşağıya iletilmesi veya bir süre önbellekte tutulup daha sonra yazılması seçeneklerini açıklar. Burada bu politikaların bütün ayrıntısını öğrenmeyeceğiz. Çıkarımımız şu: önbellek yalnızca “yakına koy” değil, “hangi kopya güncel ve değişiklik ne zaman aktarılacak?” sorusunu da doğurur. Uygulama düzeyindeki önbellekte aynı sorun daha görünür olacak.3

8.3 Kalıcı depolama: SSD, HDD ve flash

Kalıcı depolama (persistent storage), bilgiyi güç kapandıktan sonra da korumayı amaçlayan saklama alanıdır. RAM'deki çalışan değerle SSD'de kaydedilmiş kayıt arasında bu fark vardır. “Kalıcı” sözü, donanımın asla bozulmayacağı veya programın silme komutuna rağmen verinin kalacağı anlamına gelmez; uçucu bellekten farklı olarak sürekli güç gerektirmeyen saklama özelliğini anlatır.12

Öğrenme oturumunun puanı RAM'de hesaplanabilir. Uygulama veya makine yeniden başladığında geri gelsin istiyorsan, o bilginin uygun biçimde kalıcı depolamaya aktarılması gerekir. “Ekranda 30 yazıyor” ile “30 kalıcı kayda ulaştı” aynı gözlem değildir. Aktarımın tamamlandığına ve hata halinde ne olduğuna ilişkin yazılım kurallarını dosyalar ve veritabanlarında inceleyeceğiz; bu bölüm yalnızca fiziksel ayrımı kuruyor.

HDD: hareketli parçalarla saklama

HDD (Hard Disk Drive), veriyi dönen plakaların manyetik yüzeylerinde saklayan depodur. Bir yere erişmek için okuma/yazma kafasının uygun bölgeye konumlanması ve istenen parçanın dönüşle kafanın altına gelmesi gerekebilir. Böylece erişim süresine mekanik beklemeler eklenir. CS:APP bu süreyi konumlanma, dönme beklemesi ve veri aktarımı olarak ayırır.1

Her yeni konumun ilk parçasına ulaşmak pahalı olabilir; devamı akarken aktarım daha verimlidir. Bu yüzden art arda büyük okuma ile kopuk küçük erişimler aynı performansı vermeyebilir. Her HDD'ye tek süre biçmiyoruz; 8.1'deki 10 ms, yalnızca öğretim senaryosuydu.

Flash ve SSD: aynı kelime değiller

Flash bellek (flash memory), elektrik kesilince de veriyi koruyan, elektronik olarak silinip yeniden yazılabilen bellek teknolojisidir. SSD (Solid-State Drive) ise bu bölümde ele aldığımız biçimiyle flash çipleri ve onları yöneten denetleyiciyle kurulmuş depolama aygıtıdır. Flash bir saklama teknolojisi; SSD onu kullanan aygıt düzenidir. Aynı düzeyde iki eş anlamlı ad değiller.12

SSD'de HDD'deki dönen plaka ve hareket eden okuma kafası yoktur. Bu, mekanik konumlanma beklemesini kaldırır; ama SSD'yi RAM'in aynısı yapmaz. Flash'ın okuma, yazma ve silme düzeni farklıdır. CMU'nun şeması SSD içinde flash çeviri katmanı, denetim ve bellek alanlarını ayrı gösterir: küçük bir yazma isteğinin aygıt içinde düzenlenmesi gerekir. Dolayısıyla “hareket yoksa bekleme de yoktur” sonucu yanlış olur.2

Flash hücrelerinin yeniden yazılma/silinme dayanımı sınırlıdır; denetleyici yazmaları dağıtarak aşınmayı yönetebilir. Burada belirli bir diske kesin ömür, kaç yıl veya kaç yazma garantisi vermiyoruz. Bunlar ürünün teknolojisine ve kullanımına bağlıdır. Temel fikir, RAM ile flash'ın “ikisi de çip” diye aynı fiziksel davranışa sahip sayılmamasıdır.2

AlanBaşlıca göreviGüç kesilince?Bu bölümdeki sınırı
Yazmaç / CPU önbelleğiÇok yakın çalışma ve kopyalarUçucuKüçük kapasite
DRAM ana bellekÇalışan programların verileriUçucuKalıcı kayıt yerine geçmez
Flash tabanlı SSDYerel kalıcı depolamaVeriyi korurRAM erişimiyle aynı özellikte değildir
HDDYerel kalıcı depolamaVeriyi korurMekanik erişim beklemeleri vardır

Bu ayrım bir satın alma tavsiyesi değildir. Dosyaların adlandırılması ve düzenlenmesi de aygıt teknolojisinden başka bir katmandır; onu Bölüm 16: Dosyalar ve Dosya Sistemleri'nde kuracağız.1

8.4 Aynı fikir üst katlarda: tarayıcı, CDN ve Redis

Şimdi bilinçli olarak küçük bir üst kat önizlemesi yapacağız. Ağın ve sunucunun ayrıntısını henüz öğrenmedik. Bu alt bölüm için sunucuyu başka bir programdan gelen isteğe cevap veren program, tarayıcıyı web belgelerini alıp gösteren uygulama olarak düşünmen yeterli. Bunların çalışma biçimini Bölüm 19 ve Bölüm 20 açıklayacak. Burada taşıdığımız tek fikir şu: aynı veriyi tekrar üretmek veya uzaktan tekrar getirmek yerine, uygun kopyayı yakın bir yerde tutmak.

Tarayıcı önbelleği: daha önce alınan yanıtı kullanmak

Tarayıcı önbelleği (browser cache), tarayıcının daha önce aldığı uygun yanıtları yeniden kullanmasını sağlar. Örneğin aynı görsel veya CSS dosyası için yeniden bütün veriyi istemek gerekmeyebilir. MDN'nin HTTP önbelleği anlatımı, isteğe bağlı yanıtın saklanıp sonraki isteklerde tekrar kullanılmasını temel alır. Önbelleğin burada sakladığı şey CPU'nun 64 byte'lık satırı değil, web yanıtıdır.5

CPU önbelleğini donanım, tarayıcı önbelleğini tarayıcı ve web kuralları yönetir. Nesne, anahtar ve güncellik kuralları farklıdır; ortak amaç pahalı yeniden erişimi azaltmaktır.25

CDN: yakınlık yalnızca çip üzerindeki mesafe değildir

İçerik dağıtım ağı (Content Delivery Network, CDN), içeriğin kopyalarını farklı konumlardaki sunucularda tutarak kullanıcılara uygun yakın noktadan sunmayı amaçlayan düzendir. MDN, CDN'yi coğrafi olarak yayılmış, veri kopyaları saklayan sunucu grubu olarak tanımlar. İşlemciye yakın önbellek sinyal ve erişim maliyetini azaltıyordu; CDN'de yakınlık, ağ üzerinden gidilen mesafeyi ve asıl sunucunun yükünü azaltmaya yardımcı olabilir.64

Her isteğin kesin hızlanacağı garantisi yoktur; yeni bağlantı kurma veya yanlış yapılandırma gibi ek maliyetler bulunabilir. Ayrıca her kullanıcının özel puanını herkese ortak bir kopya gibi saklamak doğru değildir. Kopyalanabilen ortak içerikle kişiye özel yanıtın sınırı vardır. MDN, özel ve paylaşılan önbelleklerin ayrımında kişiselleştirilmiş yanıtların yanlış paylaşılmasının bilgi sızdırabileceğini özellikle vurgular. Ayrıntılı web kurallarını burada öğretmiyoruz; “kopya kimin için geçerli?” sorusunu kaydediyoruz.56

Redis: RAM'i kullanan yazılım; CPU önbelleği değil

Redis (Redis), veriyi RAM'de işleyen ve önbellek olarak da kullanılabilen bir veri deposudur. Planlanan uygulamamızda leaderboard gibi tekrar istenen veriler için bu tür bir katman düşünebiliriz. “Leaderboard” burada kullanıcıların puan sırasını gösteren liste. Her istekte bütün hesabı tekrarlamak yerine uygun sonucu bir süre yeniden kullanma fikri, 8.2'deki isabet/ıska akışının üst kat örneğidir. Redis'in komutlarını ve ne zaman gerekli olduğunu Bölüm 40'a bırakıyoruz.7

Redis, CPU'nun L1/L2/L3 önbelleği değildir. Kendi başına çalışan bir yazılım bileşeni olarak başka bir programa hizmet verir; erişiminde yazılım ve gerekirse ağ maliyetleri vardır. Ayrıca “RAM'de çalışıyor, o halde asla kalıcı olamaz” da eksiktir: Redis'in diske kayıt seçenekleri vardır. Bu seçeneklerin bulunması RAM'i kalıcı bellek yapmaz; yazılım RAM'deki veri için ayrı bir kalıcı saklama yolu kurar.78

Kopyanın eskimesi: yeni bir sorumluluk

Önbellekte puan 20, asıl kayıtta yeni puan 30 ise hızlıca 20 göstermek doğru cevap değildir. Bayat veri (stale data), asıl veri değiştiği halde eski kopyanın kullanılmaya devam etmesi sorununu anlatır. Geçersiz kılma (invalidation), bu kopyayı artık kullanılmaması için silmek veya güncellemek gibi yöntemlerle ilgilidir. Bu terimler Bölüm 40'ta ayrıntılanacak. HTTP tarafında da saklanan yanıtın ne kadar süre yeniden kullanılabileceği ve gerektiğinde doğrulanması için kurallar vardır.5

Kopyanın varlığı, kullanılabilirliğini garanti etmez. Donanımda bellek sözleşmesi korunur; uygulama önbelleğinde “liste bir süre eski kalabilir mi?” gibi ürün kararları da gerekir. Her katmanın sorumluluğu aynı değildir.

Uygulamamızda: tek kullanıcı eylemi, farklı saklama işleri

Prototipinin kodunu görmediğimiz için aşağıdaki akış mevcut gerçekleme değil; planlanan Expo + TypeScript, Go, Postgres ve Redis yığınına ilişkin öğretim taslağıdır. Kullanıcı doğru bir cevap verdiğinde şu işleri ayırabilirsin:

Bir yavaşlık gördüğünde agent'a yalnız “cache ekle” demek yerine şunu sorabilirsin: “Neyi yeniden kullanacağız, asıl kaynağı ne, kopya nerede, ne zaman bayat sayılacak?” Bu dört soruya cevap yoksa önbellek henüz bir tasarım değil, yalnızca bir sözcüktür. Bazen sorun tekrar erişim değil, başka bir hesap veya beklemedir; o durumda yanlış kata önbellek eklemek hedefi ıskalar.

Bölüm 5–6 ile bağlantı

Bölüm 5 “bilgi nasıl korunur?” sorusunu, Bölüm 6 “işlemci bu bilgiyi nasıl kullanır?” sorusunu cevapladı. Bu bölüm üçüncüsünü ekledi: “hangi bilgiye hangi maliyetle ulaşılır?” ALU'nun doğru toplaması, gereken verinin hemen hazır olduğu anlamına gelmez. Programın hesap adımlarını bilmek ile veri erişim maliyetini bilmek, aynı makinenin birbirini tamamlayan iki görünümüdür.

Bu bölümde neler kuruldu

Bellek tek hızdaki tek kutu değildir: yazmaç, önbellek, RAM, SSD/HDD ve uzak erişim farklı roller taşır. Gecikme bir isteğin beklemesi, bant genişliği aktarım kapasitesidir. Önbellek hızlı kopya sunar; isabet yakında bulmak, ıska sonraki kaynağa gitmek demektir. Zamansal yerellik aynı bilgiye, mekânsal yerellik komşu adreslere tekrar yönelmedir. RAM uçucu, SSD/HDD kalıcı depolamadır; flash teknoloji, SSD aygıttır. Tarayıcı, CDN ve Redis de uygun kopyayı yakın tutma fikrini kullanabilir, fakat sakladıkları birimler ve güncellik kuralları farklıdır.

Terimler sözlükte, Bölüm 8 başlığı altında. Artık alt makinenin temel parçaları hazır; Bölüm 9'da C ile bu makinenin üstüne daha okunur bir dil katı koyabiliriz.

Birincil okuma

CMU, The Memory Hierarchy yazılı ders slaytları; özellikle “Example Memory Hierarchy”, “Locality”, “Caches”, “General Cache Concepts: Hit / Miss” ve “Examples of Caching in the Mem. Hierarchy”. Derinleşmek için CS:APP Chapter 6 önizlemesi, giriş ve 6.1 Storage Technologies; sonra Bottom-Up CS, 2. Memory.

Takıldığın yeri yapay zekâ öğretmenine sor. Ondan aynı on altı değeri bir kez sırayla, bir kez aynı değere tekrar dönerek okutan iki erişim çizimi iste. Hangisinin mekânsal, hangisinin zamansal yerellik sunduğunu sen işaretle. Hesap alıştırması olarak da isabet oranı %95 olduğunda 4 ns kontrol + 100 ns ek ıska modelinin ortalamasını bul.

Bölüm sonu soruları

Sayının kaynağını ve modelin varsayımlarını unutmadan cevapla.

1. Bellek hiyerarşisi hangi temel pazarlığı yönetir?
Farklı saklama teknolojilerini birleştirerek küçük hızlı alanı büyük daha yavaş alanla birlikte kullanırız. Bkz. 8.1.
2. Gecikme ile bant genişliği arasındaki ayrım hangisidir?
İlk sonuca ulaşma süresiyle birim zamanda taşınabilen veri miktarı farklı ölçülerdir. Bkz. 8.1.
3. L1 önbelleğinde ıska olması ne anlama gelir?
Iska belirli düzeyde bulunmamak demektir; veri sonraki düzeyde bulunabilir. Bu tek başına program hatası değildir. Bkz. 8.2.
4. Bir döngünün aynı komutlarına tekrar dönmek hangi yerelliğe örnektir?
Aynı komutları zaman içinde yeniden kullanmak zamansal yerelliktir; komşulara erişmek mekânsal yerelliktir. Bkz. 8.2.
5. Önbellek satırı neden komşu verilere erişimi kolaylaştırabilir?
Satırla getirilen komşu veriler sonraki erişimde zaten önbellekte olabilir; bu mekânsal yerellikten yararlanır. Bkz. 8.2.
6. Flash ile SSD arasındaki doğru ilişki hangisidir?
Flash bir kalıcı bellek teknolojisi, ele aldığımız SSD ise flash ve denetleyici içeren depolama aygıtıdır. Bkz. 8.3.
7. Redis ile CPU önbelleğini nasıl ayırmalıyız?
Ortak fikir hızlı kopyadır; ama Redis çalışan bir yazılım deposu, CPU önbelleği işlemcinin donanım düzeyidir. Bkz. 8.4.
8. Önbellek tasarımında yalnız “veri bulundu mu?” sorusu neden yetmez?
Bulunan eski kopya, asıl veri değiştiyse uygun yanıt olmayabilir. Yeniden kullanım ve geçersiz kılma kuralları gerekir. Bkz. 8.4.
9. Her istekte 4 ns kontrol, ıskada ek 100 ns bekleme olan sade modelde %95 isabet için ortalama süreyi hesapla. Sonucun gerçek laptopunun ölçümü olmadığını da açıkla.
Örnek cevap

Iska oranı %5'tir. Ortalama 4 + 0,05 × 100 = 9 ns. Iskada toplam 104 ns harcanır; ilk kontrolü unutmam. Tek düzeyli, seri beklemeli model seçtik; gerçek donanımın gecikmesi, önbellek düzeyleri ve örtüşmeleri ayrıca ölçülmelidir. Bkz. 8.2.

10. Leaderboard'u hızlandırmak için önbellek önerildi. Kopyanın yeri, asıl veri, bayatlama ve kalıcı kayıt konularını ayrı ayrı nasıl sorarsın?
Örnek cevap

Asıl kayıt nerede ve liste nasıl üretiliyor? Kopya tarayıcıda mı Redis'te mi duracak? Puan değişince ne zaman güncellenecek veya geçersiz kılınacak? Önbellek kaybolunca asıl puan ve ilerleme hangi kalıcı kayıttan geri gelecek? CPU önbelleği bu ürün kararlarını kendi başına yönetmez. Bkz. 8.3 ve 8.4.

Kaynaklar

  1. Bryant ve O'Hallaron, Computer Systems: A Programmer's Perspective, Chapter 6: The Memory Hierarchy önizlemesi, giriş ve 6.1.1–6.1.2: hiyerarşi, yerellik, SRAM/DRAM, uçuculuk, flash ve mekanik disk erişimi. Eski baskıdaki donanım sayıları güncel ürün ölçümü olarak kullanılmamıştır.
  2. Carnegie Mellon University, The Memory Hierarchy yazılı ders slaytları, “Example Memory Hierarchy”, “Locality”, “Caches”, “General Cache Concepts”, “Examples of Caching in the Mem. Hierarchy”, “Solid State Disks”. L1/L2 için örnek 4/10 çevrim, satır blokları, isabet/ıska, kapasite ve SSD düzeni. Bu bölümün insan ölçeği tablosu ve ortalama süreleri açık varsayımlı öğretim hesaplarıdır; Python ile doğrulanmıştır.
  3. Ian Wienand, Computer Science from the Bottom Up, Chapter 3, 2. Memory, “Memory Hierarchy”, “Cache”, satır boyu, önbellek düzeyleri ve yazma politikaları. Mutlak hız iddiaları yerine kavramsal iş bölümü kullanılmıştır.
  4. Ilya Grigorik, High Performance Browser Networking, Primer on Latency and Bandwidth, “The Many Components of Latency” ve “Speed of Light and Propagation Latency”: gecikme/bant genişliği ayrımı ve mesafenin etkisi.
  5. MDN, HTTP caching, “Types of caches”, “Fresh and stale based on age”, “Validation”: tarayıcı ve paylaşılan önbellekler, kişisel veri sınırı ve yeniden kullanım kuralları.
  6. MDN, CDN: coğrafi olarak yayılmış kopyalar, yakın sunucudan erişim, olası yararlar ve ek maliyetler.
  7. Redis resmî belgeleri, Quick starts: bellek içi veri deposu ve önbellek kullanım alanı. Leaderboard akışı bu kitap için öğretim senaryosudur; mevcut prototipe ilişkin gerçekleme iddiası değildir.
  8. Redis resmî belgeleri, Redis persistence, giriş ve saklama seçenekleri: bellek içi çalışma ile diske kalıcı kayıt seçeneklerinin ayrı olması.