CPU Önbelleği
- İngilizcesi
- CPU Cache
- Türkçe karşılığı
- işlemci önbelleği
- Okunuşu
- si-pi-yu keş
Günlük kullanımda iki ad da yaygın.
Kısaca
CPU önbelleği, işlemcideki küçük ve çok hızlı bir bellektir; RAM'den yakın zamanda kullanılan verinin kopyalarını tutar, böylece CPU belleği daha az bekler.
CPU önbelleği (CPU cache) nedir?
Ana bellek modern bir CPU'dan çok daha yavaştır: RAM'den bir değer getirmek yaklaşık 100 nanosaniye sürebilir, bu yüzlerce komut için yeterli bir süredir. CPU önbelleği, işlemcinin içine yerleşik, CPU'nun yakın zamanda kullandığı ya da bir sonraki adımda ihtiyaç duyacağı verinin ve komutların kopyalarını tutan küçük miktarda çok hızlı bellektir.
Önbellekler seviyeler halinde düzenlenir: L1 en küçük ve en hızlı olandır, çekirdek başına on kilobaytlar düzeyindedir ve komut ile veri önbelleklerine ayrılır; L2 daha büyük ve biraz daha yavaştır; genellikle onlarca megabayt olan L3 ise tüm çekirdekler tarafından paylaşılır. Veri, bellek ile önbellek arasında tipik olarak 64 bayt olan cache line denen sabit boyutlu bloklar halinde hareket eder. CPU ihtiyaç duyduğunu önbellekte bulursa buna cache hit denir; bulamazsa cache miss, satırı bir sonraki seviyeden ya da RAM'den getirmeye zorlar. Önbellekler, programların yakın zamanda kullanılan veriyi yeniden kullanma ve yakın adreslere erişme eğiliminde olması sayesinde işe yarar; çok çekirdekli yongalar da her çekirdeğin güncel değerleri görmesi için bir tutarlılık (coherence) protokolü kullanır.
Bir kütüphanedeki masayı düşünün. Kullandığınız kitaplar masanızda (L1), birkaçı yakındaki bir arabada (L2), okuma salonunun rafı daha fazlasını tutar (L3) ve bodrumdaki depo RAM'dir. CPU önbelleğinin günlük kod için önemli olmasının nedeni budur: bir diziyi sırayla dolaşmak, belleğe dağılmış bir bağlı listedeki işaretçileri izlemekten çok daha hızlıdır ve aynı cache line üzerindeki farklı değişkenlere yazan iki thread birbirini yavaşlatabilir; bu soruna false sharing denir.
CPU önbelleği çoğu zaman bir veritabanının önündeki bellek içi önbellek ya da HTTP önbelleği gibi uygulama önbelleğiyle karıştırılır. İkisi de veriyi ihtiyaç duyulan yere daha yakın tutar, ancak CPU önbelleği donanım tarafından otomatik olarak yönetilir ve nanosaniye ölçeklerinde çalışır; yazılım önbellekleri ise ne zaman geçersiz kılacağına karar vermesi gereken kodunuz tarafından yönetilir. CPU yazmaçları ise yine farklıdır: çekirdeğin içinde, daha da küçük ve hızlı depolamadır.
Önemli noktalar
- CPU önbelleği, işlemcide RAM'deki verinin kopyalarını tutan hızlı bellektir.
- Önbellekler seviyelidir: L1 en küçük ve en hızlı, L3 en büyük ve paylaşımlıdır.
- Veri, tipik olarak 64 bayt uzunluğundaki cache line'lar halinde hareket eder.
- Sıralı, öngörülebilir bellek erişimi önbelleği en iyi şekilde kullanır.
- Uygulama düzeyindeki önbelleklerin aksine CPU kendi önbelleğini otomatik olarak yönetir.
Örnek
#define N 4096
static int grid[N][N];
long sum_rows(void) { /* fast: reads memory in order, */
long s = 0; /* so every 64-byte cache line is fully used */
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) s += grid[i][j];
return s;
}
long sum_cols(void) { /* slow: jumps 16 KB on every step, */
long s = 0; /* so almost every read is a cache miss */
for (int j = 0; j < N; j++)
for (int i = 0; i < N; i++) s += grid[i][j];
return s;
}Sık sorulan sorular
L1, L2 ve L3 önbelleği arasındaki fark nedir?
Bunlar boyutu hızla takas eden önbellek seviyeleridir. L1 en küçük ve en hızlı olandır ve tek bir çekirdeğe aittir, L2 daha büyük ve biraz daha yavaştır, L3 ise en büyük ve en yavaş önbellek seviyesidir ve genellikle tüm çekirdekler tarafından paylaşılır.
Cache miss nedir?
Cache miss, CPU'nun ihtiyaç duyduğu veri önbellekte olmadığında gerçekleşir; bu yüzden daha yavaş bir önbellek seviyesinden ya da RAM'den getirilmesi gerekir. Sık cache miss'ler bir programı birkaç kat yavaşlatabilir.
CPU önbellek boyutu önemli mi?
Etkin verisi neredeyse önbelleğe sığan oyunlar, veritabanları ve bilimsel kod gibi iş yükleri için önemlidir. Daha büyük önbellek RAM'e daha az gidiş anlamına gelir, ancak koddaki erişim örüntüleri çoğu zaman ham boyuttan daha önemlidir.
İlgili sayfalar
- ÖnbellekBackend ve API'ler, s. 34Önbellek, sık kullanılan verilerin kopyalarını tutan hızlı ve geçici bir depolama katmanıdır; sonraki istekler yavaş işi tekrarlamadan hızla karşılanır.
- DiziProgramlamanın Temelleri, s. 15Dizi, tek bir ad altında saklanan ve her öğesine genellikle 0'dan başlayan indeks adlı sayısal konumuyla erişilen, sıralı bir değerler koleksiyonudur.
- Bağlı ListeVeri Yapıları, s. 4Bağlı liste, öğeleri ayrı düğümlerde saklayan bir veri yapısıdır; her düğüm bir değer ile zincirdeki sonraki düğüme bir referans tutar.
- Context Switchİşletim Sistemleri, s. 2Context switch, işletim sisteminin çalışan thread veya process'in durumunu kaydedip CPU'yu kullanabilmesi için başka birinin durumunu geri yüklemesidir.
- Pagingİşletim Sistemleri, s. 22Paging, belleği sabit boyutlu sayfalara bölen ve sayfa tablolarıyla her process'in sanal sayfalarını fiziksel RAM'e eşleyen bir bellek yönetim düzenidir.
- Big O gösterimiProgramlamanın Temelleri, s. 4Big O gösterimi, girdi büyüdükçe bir algoritmanın çalışma süresinin ya da bellek kullanımının nasıl arttığını, kesin hız yerine büyüme oranıyla anlatır.
- CPUİşletim Sistemleri, s. 3CPU (merkezî işlem birimi), program talimatlarını yürüten ve her yazılımın üzerinde çalıştığı aritmetik, mantık ve kontrol işlerini yapan işlemcidir.
- RAMİşletim Sistemleri, s. 25RAM (rastgele erişimli bellek), bilgisayarın hızlı ve geçici çalışma belleğidir; kullanımdaki programları ve verileri tutar, güç kesilince içeriği kaybolur.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin