İçeriğe atla

İşlemci önbelleği

Vikipedi, özgür ansiklopedi
Dört çekirdekli bir işlemcide önbellek hiyerarşisi. Her çekirdeğin ayrı birinci düzey buyruk ve veri önbelleği ile özel ikinci düzey önbelleği vardır; üçüncü düzey (son düzey) önbellek bütün çekirdeklerce paylaşılır, orada da bulunamayan satırlar kırmık dışındaki ana bellekten getirilir. Büyüklük ve gecikmeler Intel'in Skylake mikromimarisinin istemci sürümü içindir; öteki işlemcilerin değerleri gerçeklemeler çizelgesinde verilmiştir.

İşlemci önbelleği (İngilizce: CPU cache), işlemcinin ana bellekteki buyruk ve verilere ortalama erişim süresini kısaltmak için işlemciye yakın yerleştirilen, ana bellekten çok daha küçük ve çok daha hızlı bir donanım belleğidir. Önbellek, ana belleğin o sırada kullanılan bölümlerinin kopyalarını tutar; işlemcinin istediği veri önbellekte varsa erişim birkaç saat çevriminde tamamlanır, yoksa veri ana bellekten getirilir ve yakında yeniden gerekeceği varsayılarak bir kopyası önbelleğe yazılır.[1]:473-474 İlk kez 1960'ların sonunda büyük bilgisayarlarda kullanılan bu düzen, 1980'lerde mikroişlemci yongalarının içine girmiş, bugün ise birkaç düzeyden oluşan bir bellek hiyerarşisine dönüşmüştür.[2]:15[3]:2-11

İşlemci önbelleği, genel önbellek düşüncesinin donanımdaki uygulamasıdır. Programın kendisi önbelleği görmez ve onu adreslemez; buyruklar ana bellek adresleriyle çalışır, hangi verinin önbellekte tutulacağına, hangisinin çıkarılacağına ve değiştirilen verinin ana belleğe ne zaman yazılacağına donanım kendisi karar verir.[2]:15 Önbellek ile ana bellek arasında taşınan birim tek bir sözcük değil, satır ya da veri öbeği (İngilizce: cache line, block) adı verilen, çağdaş işlemcilerin çoğunda 64 baytlık bitişik bir bellek parçasıdır.[4]:14-4[5]:23

Çağdaş işlemcilerde her çekirdeğin ayrı bir birinci düzey buyruk önbelleği ve birinci düzey veri önbelleği, bunların arkasında daha büyük bir ikinci düzey önbelleği vardır; çekirdeklerin ortak kullandığı üçüncü düzey önbellek ise AMD'nin Zen 3 çekirdeklerinde olduğu gibi 32 MB'a ulaşabilir.[6]:26 Intel'in Skylake mikromimarisinde birinci düzey veri önbelleğine erişim 4, ikinci düzey önbelleğe 12, paylaşılan üçüncü düzey önbelleğe ortalama 44 çevrim sürer.[7]:2-36 Bu katmanlara ek olarak işlemcinin içinde adres çevirilerini, çözülmüş buyrukları ya da dallanma hedeflerini saklayan, önbellek gibi düzenlenmiş başka yapılar da vardır. Önbelleğin başarımı, işlemcinin ana bellek gecikmesini ne ölçüde gizleyebildiğini belirler.[8]:20

Uydu bellekten Model 85'e

[değiştir | kaynağı değiştir]

Önbellek düşüncesinin ilk yayımlanmış betimlemesi, Maurice Wilkes'in 1965'te önerdiği uydu bellektir (İngilizce: slave memory). Wilkes'in tasarımında küçük ve çok hızlı bir bellek, yavaş ana bellekten okunan sözcükleri kendiliğinden biriktirir; her yazmacın yanında adresin üst bitlerinden oluşan bir etiket tutulur ve okunacak sözcüğün etiketi eşleşirse ana belleğe gidilmez.[9]:270 Bugünkü doğrudan eşlemeli önbelleğin, etiket karşılaştırmasının ve adresin alt bitleriyle konum seçmenin hepsi bu kısa makalede vardır.

Düşünce ticari bir makinede ilk olarak IBM System/360 ailesinin Model 85'inde hayata geçmiştir. Model 85'in işlemcisi 80 nanosaniyelik bir çevrimle çalışıyordu, ana belleğin çevrim süresi ise 1,04 mikrosaniyeydi; bu hızda büyük bir ana bellek yapılamadığı için işlemcinin içine yarı iletken yongalardan yapılmış küçük bir hızlı bellek eklendi.[2]:15, 21 16 KB'lık (isteğe bağlı olarak 24 ya da 32 KB'lık) bu önbellek 1 KB'lık bölümlere ayrılmıştı, her bölüm ise ayrı ayrı yüklenebilen 64 baytlık on altı veri öbeğinden oluşuyordu.[2]:16-17 Önbellekteki bir veriyi okumak iki işlemci çevrimi sürüyordu ve yazmalar her zaman ana belleğe de iletiliyordu.[2]:17 Önbelleği anlatan 1968 tarihli makale, benzetimlerde makinenin, bütün belleği önbellek hızında çalışan kuramsal bir makinenin başarımının ortalama yüzde 81'ine ulaştığını bildirir.[2]:19

1970'lerde önbellek büyük bilgisayarların olağan bir parçası oldu ve küçük bilgisayarlara da yayıldı. Smith 1982'de yayımladığı kapsamlı incelemede, neredeyse bütün büyük bilgisayarların önbellek taşıdığını, IBM 3033, Amdahl 470 ailesi ve DEC VAX-11/780 gibi makinelerde kümedeki satır sayısının 2 ile 16 arasında seçildiğini aktarır.[1]:473, 487 Aynı inceleme, devre yoğunluğu arttıkça önbelleğin tek yongalı mikroişlemcilere de gireceğini ve yonga üstündeki bir önbelleğin, yonga dışına çıkmanın uzun süresi nedeniyle orada da büyük kazanç sağlayacağını öngörmüştür.[1]:522

Mikroişlemcilerde ilk önbellekler

[değiştir | kaynağı değiştir]
Motorola 68020 işlemcisinin kırmığı. 1984 tarihli kullanıcı kılavuzuna göre işlemci, yonga üstünde 64 girdilik doğrudan eşlemeli bir buyruk önbelleği taşır.

Mikroişlemcilerde önbellek önce buyruklar için ortaya çıktı. Motorola'nın 1984 tarihli MC68020 kullanıcı kılavuzu, işlemcinin yonga üstündeki buyruk önbelleğini 64 uzun sözcüklük doğrudan eşlemeli bir önbellek olarak tanımlar; her girdi adresin üst 24 bitinden oluşan bir etiket, bir geçerlilik biti ve iki 16 bitlik buyruk sözcüğü tutar, girdiyi ise adresin 2. ile 7. bitleri seçer.[10]:7-1 64 girdinin her biri dört bayt taşıdığından toplam veri kapasitesi 256 bayttır. Ardılı MC68030 bu buyruk önbelleğinin yanına 256 baytlık bir veri önbelleği ekledi; iki önbellek de 16 baytlık dört uzun sözcükten oluşan 16 girdiye ayrılmıştı ve işlemcinin mantıksal (sanal) adresleriyle erişiliyordu.[11]:1-16, 6-1 Denning'in yerellik ilkesinin tarihçesi için hazırladığı çizelge de yonga üreticilerinin bir noktada buyruk önbelleklerinin yanına, veriye erişimi hızlandırmak ve bellek arayüzündeki çekişmeyi azaltmak için veri önbellekleri eklemeye başladığını kaydeder.[12]:21

Intel'in 32 bitlik ilk işlemcisi 80386 ise yonga üstünde önbellek taşımıyordu; önbellek, işlemcinin yanına konan ayrı bir denetleyiciyle kuruluyordu. Intel'in 82385 önbellek denetleyicisi, dış belleklerden kurulan 32 KB'lık bir önbelleğin etiket dizinini ve bütün yönetim mantığını taşıyordu ve önbelleğin doğrudan eşlemeli ya da iki yollu kümeli ilişkili düzenlenmesine izin veriyordu.[13]:4-344 Bu önbellek doğrudan yazmalıydı; her yazma ana belleği de güncelliyordu.[13]:4-347 Intel'in 1989 tarihli veri sayfasına göre i486 ile önbellek Intel işlemcilerinde de yongaya taşındı; işlemci buyruk ve veri için ortak kullanılan, 16 baytlık satırlardan oluşan 8 KB'lık, dört yollu kümeli ilişkili ve doğrudan yazmalı bir önbellek taşıyordu.[14]:12, 73

Intel işlemcilerinde önbellek, buyruk ve veri için Pentium ile ikiye ayrıldı. Intel'in 1993 tarihli Pentium el kitabı, işlemcide 8 KB'lık ayrı bir buyruk önbelleği ile 8 KB'lık ayrı bir veri önbelleği bulunduğunu, ikisinin de 32 baytlık satırlı ve iki yollu kümeli ilişkili olduğunu, veri önbelleğinin her satır için ayrı ayrı geri yazmalı ya da doğrudan yazmalı çalışacak biçimde ayarlanabildiğini ve MESI protokolünü izlediğini belirtir.[15]:2-2 Ayrık önbellekler, boru hattında buyruk getirme ile veri erişiminin aynı anda yapılabilmesini sağlayarak önbelleğin bant genişliğini artırır.[1]:478

İkinci düzey önbelleğin yongaya taşınması

[değiştir | kaynağı değiştir]

Birinci düzey önbellek yongaya girdikten sonra ikinci düzey önbellek bir süre işlemci kırmığının dışında kaldı. Pentium Pro, 256 KB'lık ikinci düzey önbelleği, işlemci kırmığından ayrı bir kırmık olarak aynı paketin içine yerleştirdi ve iki kırmığı işlemci hızında çalışan ayrı bir önbellek yoluyla bağladı.[16]:1-1, 1-11 Pentium II ise 512 KB'lık ikinci düzey önbelleği, piyasadan alınan bellek kırmıklarıyla işlemcinin yanına, bir kartuşun üstüne yerleştirdi; işlemci ile bu önbellek arasındaki aktarım hızı işlemci saat sıklığının yarısıydı.[17]:1, 7

İkinci düzey önbelleği işlemci kırmığının üstüne alan bir tasarım DEC'in Alpha 21164'üdür. 1995 tarihli bir makalede anlatılan bu işlemcide 8 KB'lık doğrudan eşlemeli birinci düzey buyruk ve veri önbelleklerinin arkasında, yonga üstünde 96 KB'lık üç yollu kümeli ilişkili bir ikinci düzey önbellek bulunmaktaydı; bunun da arkasına yonga dışında 1 ile 64 MB arasında üçüncü düzey bir önbellek eklenebiliyordu.[18]:34 Ardılı Alpha 21264, birinci düzey buyruk önbelleğini 64 KB'a ve iki yollu kümeli ilişkili bir düzene büyüttü.[19]:25 IBM'in POWER4 işlemcisinde ise aynı kırmıktaki iki çekirdek, üç dilime bölünmüş 1,5 MB'lık bir ikinci düzey önbelleği paylaşıyordu; 32 MB'lık üçüncü düzey önbelleğin etiket dizini ve denetleyicisi işlemci yongasındaydı, veri dizisi ise ayrı bir modüle takılmış iki gömülü DRAM yongasında tutuluyordu.[20]:15, 18

Paylaşılan son düzey önbellek

[değiştir | kaynağı değiştir]
İki çekirdekli Intel Xeon 7130M işlemcisinin kırmığı. Üst yarıda iki işlemci çekirdeği, alt yarıda ise bu çekirdeklerin paylaştığı üçüncü düzey önbelleğin düzenli bellek dizileri görülmektedir.

Tek kırmıkta birden çok çekirdek bulunan çok çekirdekli işlemcilerle birlikte önbellek düzeylerinden en az birinin çekirdekler arasında paylaşılması olağan hâle geldi. Intel'in Core 2 işlemcilerinde iki çekirdek 6 MB'a kadar çıkan bir ikinci düzey önbelleği ve bir yol arayüz birimini paylaşıyordu; Intel bu birleşime Advanced Smart Cache adını vermişti.[3]:3-11 Drepper, bu düzende iki çekirdeğin çalışma kümeleri büyük ölçüde örtüşüyorsa kullanılabilen önbellek kapasitesinin arttığını, örtüşmüyorsa Intel'in önbellek yönetiminin bir çekirdeğin bütün önbelleği tekeline almasını önlemek için tasarlandığını yazar.[21]:35

Sandy Bridge kuşağıyla birlikte Intel'in paylaşılan son düzey önbelleği, her çekirdek için bir tane olmak üzere dilimlere bölündü ve dilimler bir halka ağla birbirine bağlandı.[3]:2-16 IBM ise 2009'da Hot Chips konferansında tanıttığı POWER7'de üçüncü düzey önbelleği yonga dışındaki gömülü DRAM'den işlemci kırmığının üstüne taşıdı. Sekiz çekirdekli işlemcide her çekirdeğin 256 KB'lık özel ikinci düzey önbelleğinin yanında, çekirdeklerin paylaştığı 32 MB'lık gömülü DRAM üçüncü düzey önbelleği vardı.[22]:slayt 4[23]:slayt 9 Intel'in bazı işlemcilerinde ise bunlara bir dördüncü düzey eklendi. Haswell kuşağının bazı yapılandırmalarında kırmık dışında, isteğe bağlı bir dördüncü düzey önbellek desteklenir;[3]:1-2, 1-5 Broadwell kuşağından Core i7-5775C'nin teknik özellikleri 128 MB'lık gömülü DRAM içerir.[24]

Yongacıklar ve yığılmış önbellek

[değiştir | kaynağı değiştir]

Büyük işlemcilerin tek bir kırmık yerine birkaç yongacıktan kurulması önbellek düzenini de bu bölünmeye uydurdu. AMD'nin 2019'da tanıttığı Zen 2 mikromimarisinde dört çekirdek ve 16 MB'lık üçüncü düzey önbellek bir çekirdek kompleksi (İngilizce: core complex, CCX) oluşturur, iki çekirdek kompleksi 7 nm'de üretilen 74 mm²'lik bir hesaplama yongacığında yer alır; giriş/çıkış işlevleri ise ayrı bir giriş/çıkış kırmığına bırakılmıştır.[25]:slayt 12, 14 Bu düzende üçüncü düzey önbellek bütün işlemcide değil, yalnızca bir çekirdek kompleksinin içinde paylaşılır; 64 çekirdekli sunucu işlemcisi sekiz hesaplama yongacığıyla toplam 256 MB üçüncü düzey önbellek taşır.[25]:slayt 19

Önbelleği büyütmenin bir sonraki adımı onu işlemci kırmığının üstüne yığmak oldu. AMD, 2021'de hibrit bağlama yöntemiyle iki boyutlu yongacık bağlantılarının 200 katından fazla bağlantı yoğunluğu sağlayan bir üç boyutlu yığma tekniği ve bunun ilk uygulaması olarak bir Ryzen 5000 işlemcisine bağlanmış dikey bir önbellek tanıttı.[26] Zen 3 hesaplama yongacığının kendi 32 MB'lık üçüncü düzey önbelleği, üstüne yığılan 64 MB'lık AMD 3D V-Cache kırmığıyla yongacık başına 96 MB'a çıkarıldı; iki kırmık silisyumdan geçen bağlantı delikleri ve doğrudan bakır-bakır bağlamayla birleştirilir.[27]:slayt 21 AMD'nin Ocak 2022'de tanıttığı Ryzen 7 5800X3D, AMD'nin açıklamasıyla üç boyutlu yığılmış yongacıklar taşıyan ilk tüketici bilgisayarı işlemcisidir ve 96 MB üçüncü düzey önbelleğe sahiptir.[28][29] AMD aynı teknolojiyi Mart 2022'de sunucu işlemcilerine de taşıdı; Milan-X kod adlı üçüncü kuşak EPYC işlemcileri, üç boyutlu kırmık yığması kullanan ilk veri merkezi işlemcisi olarak duyuruldu ve 768 MB üçüncü düzey önbelleğe ulaştı.[30]

IBM'in 2021'de tanıttığı z ana bilgisayar işlemcisi Telum'da ise önbellek düzeyleri farklı bir biçimde kurulmuştur. Yongadaki sekiz çekirdeğin her birinin 32 MB'lık özel ikinci düzey önbelleği vardır; IBM'e göre bu ikinci düzey önbellekler birlikte çalışarak yonga üstünde 256 MB'lık sanal bir üçüncü düzey önbellek oluşturur; birden çok işlemcinin önbellekleri de aynı biçimde 2 GB'a varan sanal bir dördüncü düzey önbellek gibi kullanılır. Özel ikinci düzey önbelleğin yükle-kullan gecikmesi, adres çevirisi dahil 19 çevrim ya da yaklaşık 3,8 nanosaniyedir; yonga üstüne dağılmış 256 MB'lık sanal üçüncü düzeyin ortalama gecikmesi ise yaklaşık 12 nanosaniyedir.[31]:slayt 5-6

İşlemci hızı ile ana bellek hızı uzun yıllar boyunca farklı oranlarda arttı. Mahapatra ve Venkatrao'nun 1999'da aktardığı değerlere göre mikroişlemci başarımı yılda yaklaşık yüzde 60 artarken DRAM erişim süresi yılda yüzde 10'dan az iyileşiyordu; ikisi de üstel olarak geliştiği için aradaki fark da üstel olarak büyüyordu.[32] Wulf ve McKee 1995'te bu ayrışmaya "bellek duvarı" adını verdi. Hesaplarında DRAM hızının yılda yüzde 7, işlemci hızının yılda yüzde 80 arttığını varsaydılar ve buyrukların yaklaşık beşte birinin belleğe başvurduğu bir programda ortalama erişim süresi beş buyruk süresini aştığında başarımın artık bellekle sınırlanacağını gösterdiler.[8]:21 Bu varsayımlarla bir bellek erişiminin ortalama süresi 2000'de 1,52, 2005'te 8,25, 2010'da 98,8 çevrime çıkıyordu; yüzde 99,8'lik bir önbellek bulma oranı bile duvara çarpmayı ancak on bir on iki yıl erteleyebiliyordu.[8]:21

İşlemci önbelleğinin varlık nedeni bu farkı kapatmaktır. Ortalama bellek erişim süresi bulma zamanı, bulamama oranı ve bulamama cezasıyla belirlenir; önbellek tasarımındaki tekniklerin hemen hepsi bu üç etkenden birini iyileştirmeyi amaçlar.[32] Rakamlar farkın büyüklüğünü gösterir. Intel'in Sandy Bridge mikromimarisinde birinci düzey veri önbelleğinden bir yükleme 4 çevrimde, ikinci düzey önbellekten 12 çevrimde, paylaşılan son düzey önbellekten ise çekirdeğin halkadaki yerine göre 26 ile 31 çevrimde tamamlanır.[3]:2-11, 2-17 Drepper'in Pentium M için aktardığı ölçümlerde ana belleğe erişim yaklaşık 240 çevrim sürmektedir.[21]:16

Önbelleğin kapattığı açık yalnızca gecikme değildir. Mahapatra ve Venkatrao, gecikmeyi gizlemeye yönelik tekniklerin işlemcinin bellek bant genişliği gereksinimini artırdığını, daha büyük yonga üstü önbelleklerin ise yonga dışına daha az istek gönderilmesini sağlayarak etkin bant genişliğini iyileştirdiğini vurgular.[32] Çağdaş bir çekirdekte birinci düzey veri önbelleği her çevrimde onlarca bayt aktarabilir; Skylake'te bu tepe değer çevrim başına 96 bayt, ikinci düzey önbellekte 64 bayt, son düzey önbellekte 32 bayttır.[7]:2-36 Ana belleğin bu hızda veri sağlaması olanaksız olduğundan, yürütme birimlerini besleyen bant genişliği büyük ölçüde önbelleklerden gelir.

Önbelleğin işe yaramasının nedeni programların yerellik özelliğidir; bir program yakın zamanda kullandığı veriyi yeniden kullanma, kullandığı adresin yakınındaki adreslere de erişme eğilimindedir.[1]:474 İşlemci önbellekleri ilk eğilimden, yakın zamanda kullanılan satırları tutarak; ikincisinden ise bir bulamamada istenen sözcüğün çevresindeki bütün satırı getirerek yararlanır. Smith, zamanda yerelliği döngülerin, alanda yerelliği ise buyrukların çoğunlukla sırayla yürütülmesinin ve ilişkili verilerin bir arada saklanmasının doğurduğunu belirtir.[1]:474

Satır yapısı ve adresin bölünmesi

[değiştir | kaynağı değiştir]
Bir önbellek girdisinin yapısı ve adresin alanları. 32 KB'lık, sekiz yollu, 64 baytlık satırlı birinci düzey veri önbelleğinde 512 satır 64 kümeye ayrılır; öbek içi göreli konum 6, dizin 6 bittir, adresin geri kalan bütün bitleri etiket olarak saklanır.

Girdinin içeriği

[değiştir | kaynağı değiştir]

Bir işlemci önbelleği, her biri bir veri satırı ile o satırı tanımlayan bilgileri tutan girdilerden oluşur. Girdinin en önemli parçası, satırın ana bellekteki hangi adresten geldiğini gösteren ve adresin üst bitlerinden oluşan etikettir (İngilizce: tag). Etiketin yanında satırın geçerli bir veri taşıyıp taşımadığını gösteren bir geçerlilik biti (İngilizce: valid bit) vardır; işlemci açıldığında ya da önbellek boşaltıldığında bütün geçerlilik bitleri sıfırlanır.[14]:73, 75 Geri yazmalı önbelleklerde, satırın önbellekteyken değiştirildiğini gösteren bir kirli bit (İngilizce: dirty bit) de gerekir; satır önbellekten çıkarılırken bu bit 1 ise satır ana belleğe geri yazılır.[1]:501 Bunlara veri çıkarma yönteminin kullandığı bitler ve çok işlemcili sistemlerde satırın tutarlılık durumunu gösteren bitler eklenir. Pentium'un veri önbelleğinde her satır MESI protokolünün dört durumundan birini taşır, buyruk önbelleği ise bu durumların yalnızca paylaşılan ve geçersiz olanlarını kullanır.[15]:3-13

Durum bitlerinin ve etiketlerin tuttuğu yer önbelleğin toplam alanının küçük ama göz ardı edilemeyecek bir bölümüdür. i486'nın 8 KB'lık önbelleğinde 128 küme ve her kümede dört satır vardır; satırlar 16 bayttır, her satıra 21 bitlik bir etiket ve bir geçerlilik biti eşlik eder, her küme için ayrıca üç bitlik bir veri çıkarma bilgisi tutulur.[14]:73, 75 Bu değerlerle her satırın 128 bitlik verisine 22 bitlik etiket ve durum bilgisi eklenir. Smith'in belirttiği gibi uzun satırlar, aynı kapasitede daha az satır ve dolayısıyla daha az etiket biti gerektirdiği için bu ek yükü azaltır.[1]:493

Adresin alanları

[değiştir | kaynağı değiştir]

Bir adres önbellekte aranırken üç alana ayrılır. En düşük bitler satırın içindeki baytı seçen öbek içi göreli konumdur (İngilizce: block offset); 64 baytlık satırda bu alan 6 bittir. Onların üstündeki bitler kümeyi seçen dizindir (İngilizce: index); küme sayısı 2'nin bir kuvveti olarak seçildiğinden dizin, adresin bir bit dilimidir ve seçim için yalnızca bu bitlerin çözülmesi yeter. Smith bu yönteme bit seçimi adını verir ve onu en basit ve en yaygın küme seçme yolu olarak niteler.[1]:487 Geriye kalan üst bitler etiket olarak saklanır ve aramada karşılaştırılır.

Alanların genişliği önbelleğin boyutundan, satır uzunluğundan ve ilişkililiğinden çıkar. Intel'in Skylake mikromimarisindeki birinci düzey veri önbelleği 32 KB büyüklüğünde, sekiz yollu ve 64 baytlık satırlıdır.[7]:2-36 32 KB'lık önbellek 512 satır taşır; sekiz yollu düzende bu satırlar 64 kümeye ayrılır. Öbek içi göreli konum 6 bit, dizin de 6 bit olduğundan adresin en düşük 12 biti küme ve bayt seçimine gider, geri kalan bütün bitler etiketi oluşturur. Aynı hesap Motorola 68020'nin buyruk önbelleğine uygulanırsa her girdi dört bayt taşıdığı için en düşük iki bit sözcük içindeki baytı, 2. ile 7. bitler 64 girdiden birini seçer; adresin kalan üst 24 biti, buyruğun hangi adres alanından geldiğini gösteren bir bitle birlikte etiket olarak saklanır.[10]:7-1

Etiketin, dizinin ve öbek içi göreli konumun birbirinden bağımsız olarak çözülebilmesi, önbelleği hızlı yapan özelliklerden biridir. Önbellek erişiminde dizin önce etiket dizisinde ve veri dizisinde birer satırı seçer, seçilen etiketler adresin etiket bitleriyle karşılaştırılır ve karşılaştırmanın sonucu hem bulma ya da bulamama kararını hem de çıkışa hangi verinin gönderileceğini belirler.[33]:2

Satır uzunluğu

[değiştir | kaynağı değiştir]

Satır uzunluğu, alanda yerellikten ne ölçüde yararlanılacağını belirler. Uzun bir satır bir bulamamada daha çok komşu veriyi getirir, ama aynı kapasitede daha az satır tutulmasına ve kullanılmayacak verinin de taşınmasına yol açar. Smith'in ölçümleri, her önbellek büyüklüğü ve her iş yükü için bulamama oranını en aza indiren bir satır uzunluğu bulunduğunu gösterir; uzun satırların ek bir yararı, iki satıra yayılan erişimleri azaltmasıdır.[1]:493, 497 1982'de kullanılan satır uzunlukları makineden makineye büyük farklar gösteriyordu; satırlar PDP-11/70'te 4, VAX-11/780'de 8, Amdahl 470 ailesinde 32, IBM 3033'te 64, IBM 3081'de 128 bayttı. Smith, IBM 3033 ve Amdahl 470 gibi makinelerdeki satırların şaşırtıcı ölçüde kısa seçilmesini, uzun satırların aktarım süresinin ve gereken geniş bellek yolunun maliyetine bağlar.[1]:497-498

Çağdaş işlemcilerin çoğu 64 baytlık satır kullanır. Intel işlemcileri bir satırı sistem belleğinden her zaman 64 baytlık bir sınırdan başlayarak okur;[4]:14-4 AMD'nin Zen ailesinde ve ARM'ın Cortex-A76 çekirdeğinde de satır 64 bayttır.[5]:23[34]:A2-36 Bu değer her işlemcide aynı değildir. Pentium 4'ün ikinci düzey önbelleği 128 baytlık satırlar kullanıyordu,[35] IBM'in POWER4'ünde birinci ve ikinci düzey satırlar 128 bayt, üçüncü düzey satırlar ise 512 bayttı.[20]:15 Satır uzunluğu düzeyden düzeye değişebildiği gibi, uzun bir satır daha küçük parçalara da bölünebilir. POWER4'ün birinci düzey buyruk önbelleği 128 baytlık satırları dört 32 baytlık kesim, 512 baytlık üçüncü düzey satırları da dört 128 baytlık kesim olarak yönetiyordu.[20]:15 Aynı düşüncenin ilk örneği Model 85'tir; önbelleğinin 1 KB'lık her bölümü yalnızca bir etiket taşıyor, ama bölüm 64 baytlık öbekler hâlinde, gerektikçe dolduruluyordu.[1]:487[2]:16-17

Satır uzun olduğunda bir bulamamada bütün satırın gelmesini beklemek cezayı büyütür. Bunu kısaltmak için bellek denetleyicisi satırın sözcüklerini sırayla değil, işlemcinin beklediği sözcükten başlayarak getirebilir; o sözcük gelir gelmez program kaldığı yerden sürer, satırın geri kalanı ise arkadan dolar. Drepper bu tekniğin önce kritik sözcük ve erken yeniden başlatma (İngilizce: critical word first & early restart) diye anıldığını, işlemcilerin bunu uyguladığını, ama önceden getirilen bir satırda kritik sözcük bilinmediği için her zaman uygulanamadığını belirtir; ölçümlerinde istenen sözcüğün satırın sonunda olması, başında olmasına göre yaklaşık yüzde 0,7 yavaşlamaya yol açmıştır.[21]:34-35

Tam ilişkili bir önbellekte arama. 32 baytlık satırlı bu örnekte adresin en düşük 5 biti satırdaki baytı seçer; kalan 27 bit etikettir ve her girdinin yanındaki karşılaştırıcıda bütün etiketlerle aynı anda karşılaştırılır. Etiketi eşleşen ve geçerlilik biti 1 olan girdide bulma olur.

Bir satırın önbellekte hangi konumlara yerleşebileceğini belirleyen kurala yerleştirme düzeni ya da ilişkililik (İngilizce: associativity) denir. Hill ve Smith'in tanımıyla önbellekteki satırlar, her birinde aynı sayıda satır bulunan kümelere ayrılır; her kümede tek satır varsa önbellek doğrudan eşlemeli, bütün önbellek tek bir kümeyse tam ilişkili, öteki durumlarda n yollu kümeli ilişkilidir.[36]:1612 Bir kümedeki satır konumlarının her birine yol (İngilizce: way) denir; dört yollu bir önbellekte her adres, kümesinin dört yolundan herhangi birine yerleşebilir.

Donanımda gerçekleme

[değiştir | kaynağı değiştir]
Dört yollu kümeli ilişkili önbellekte okuma. Dizin kümeyi seçer, dört etiket dört karşılaştırıcıda adresin etiketiyle karşılaştırılır ve eşleşen yolun verisini çoklayıcı seçer. Altta yol öngörüsü: etiketlerin dördü okunur ama veri dizisinden yalnız öngörülen yol okunur; öngörü yanlışsa doğru yol için veri dizisine ikinci kez erişilir.

İlişkililiğin bedeli donanımda görülür. A yollu bir kümeli ilişkili önbellekte kümenin bütün etiketleri birlikte okunur ve adresin etiketiyle karşılaştırılır; bunun için A tane karşılaştırıcı gerekir. Karşılaştırmaların sonucu hem bulma ya da bulamama çıkışını hem de doğru yolun verisini seçen çoklayıcıları sürer.[33]:2 Doğrudan eşlemeli önbellekte ise tek bir karşılaştırıcı yeter ve okunan veri, karşılaştırmanın sonucunu beklemeden kullanılmaya başlanabilir; Jouppi bu düzende kritik yolun yalnızca bellek dizisine erişim süresinden oluştuğunu, bu yüzden birinci düzey önbelleklerde en kısa etkin erişim süresini doğrudan eşlemeli düzenin verdiğini belirtir.[37]

Wilton ve Jouppi'nin önbellek erişim süresi modeli, doğrudan eşlemeli düzenden iki yollu düzene geçişte erişim süresinin belirgin biçimde arttığını, iki yoldan dört yola geçişte artışın çok daha küçük kaldığını, ilişkililik daha da büyütüldüğünde ise erişim süresinin ve çevrim süresinin yeniden hızla arttığını göstermiştir.[33]:49 Doğrudan eşlemeli önbellek her zaman en hızlı olanıdır ama bulma oranı en düşük olan da odur.[33]:51 Hill ve Smith'in ölçümlerine göre ilişkililiği sekiz yoldan dörde, dörtten ikiye ve ikiden doğrudan eşlemeye indirmek bulamama oranını sırasıyla yaklaşık yüzde 5, 10 ve 30 artırır.[36]:1612 Bu iki ölçüm birlikte, tasarımcıların neden çoğu zaman küçük ve hızlı birinci düzey önbelleklerde az, büyük ve yavaş alt düzeylerde çok sayıda yol seçtiğini açıklar.

Gerçek işlemciler bu ödünleşimi farklı noktalarda çözmüştür. Alpha 21164'ün 8 KB'lık birinci düzey önbellekleri doğrudan eşlemeli, 96 KB'lık ikinci düzeyi üç yolluydu.[18]:34 Pentium'un birinci düzey önbellekleri iki yollu, i486'nın ortak önbelleği dört yolluydu.[15]:2-2[14]:73 Skylake'te birinci düzey önbellekler sekiz yollu, ikinci düzey önbellek ise dört yolludur; Intel bu kuşakta ikinci düzeyin ilişkililiğini sekiz yoldan dörde indirmiştir.[7]:2-36 AMD'nin Zen 5 çekirdeğinde 48 KB'lık birinci düzey veri önbelleği 12 yollu, 1 MB'lık ikinci düzey önbelleği 16 yolludur.[38]:20, 23 Tam ilişkili düzen ise girdi sayısı küçük olan yapılarda kullanılır; Drepper birinci düzey etkin sayfalar önbelleğinin küçüklüğünün çoğu zaman onu tam ilişkili yaparak telafi edildiğini belirtir.[21]:39

Çarpık ilişkililik

[değiştir | kaynağı değiştir]

Kümeli ilişkili bir önbellekte bütün yollar aynı dizinle seçilir; bu yüzden aynı kümeye düşen satırlar, öteki kümeler boş olsa bile birbirini çıkarır. Seznec ve Bodin'in 1992'de önerdiği çarpık ilişkili önbellek (İngilizce: skewed-associative cache), önbelleğin her yolunu ayrı bir bölüm olarak düşünür ve her bölüm için farklı bir eşleme işlevi kullanır; böylece bir yolda çakışan iki satır, öteki yolda büyük olasılıkla farklı konumlara düşer.[39]:8-9 Yazarlara göre gereken donanım değişikliği çok küçüktür ve iki bölümlü bir çarpık ilişkili önbellek tipik olarak aynı satır sayısındaki dört yollu bir kümeli ilişkili önbellekle aynı bulma oranını verir; dört bölümlü bir çarpık önbelleğin davranışı da sekiz yollu bir önbelleğinkine yaklaşır.[39]:9, 15, 17 Düzenin bir sakıncası, bir satırın olası konumları her adres için farklı olduğundan en uzun süredir kullanılmayanı çıkarma yönteminin basit bir donanımla gerçeklenmesinin güçleşmesidir.[39]:12

Yol öngörüsü

[değiştir | kaynağı değiştir]

Kümeli ilişkili bir önbellekte bütün yolların verisi etiket aramasıyla birlikte okunur, ama bunlardan yalnızca biri kullanılır. Powell ve arkadaşları bu düzenin enerjiyi boşa harcadığını, etiket araması bitip doğru yol belirlendikten sonra yalnızca o yolu okuyan ardışık erişimin yaklaşık yüzde 75 daha az enerji harcadığını, ama erişim süresini yaklaşık yüzde 60 uzattığını belirtir.[40]:54, 56 Yol öngörüsü (İngilizce: way prediction) bu iki uç arasında bir yol açar. Erişimde etiket dizisi ile öngörülen tek bir veri yolu birlikte okunur, öngörü yanlış çıkarsa veri dizisine doğru yol için ikinci kez erişilir. Doğru öngörülen erişim koşut erişim kadar hızlı, ardışık erişim kadar az enerjiyle tamamlanır.[40]:56 Yazarların benzetimlerinde yol öngörüsü ve seçici doğrudan eşleme, dört yollu koşut erişimli birinci düzey veri önbelleğinin enerji ile gecikmenin çarpımını yüzde 69 azaltmış, başarım kaybı yüzde 3'ün altında kalmıştır.[40]:55

Ticari işlemcilerde de benzer düzenekler vardır. Alpha 21264'ün iki yollu buyruk önbelleği, bir sonraki getirilecek satırı ve yolunu öngören bir düzenekle kurulmuştu; Kessler'e göre bu öngörücüler çoğu uygulamada zamanın yüzde 85 ile 100'ünde doğru sonuç veriyordu.[19]:25-26 AMD'nin Zen çekirdeklerinde birinci düzey veri önbelleğinin etiketleri, her satırı doğrusal adresiyle işaretleyen bir mikro etiket (İngilizce: microtag, utag) içerir; bu sayede bir yükleme sekiz yolun hepsini değil yalnızca birini okur, AMD'ye göre bu hem güç tasarrufu sağlar hem de önbelleğin bölmelerine erişimdeki çakışmaları azaltır.[5]:24[41]:18

Veri çıkarma yöntemleri

[değiştir | kaynağı değiştir]

Bir bulamamada yeni satıra yer açmak gerektiğinde, doğrudan eşlemeli bir önbellekte seçenek yoktur, çünkü satırın gidebileceği tek bir konum vardır. Kümeli ilişkili bir önbellekte ise kümedeki satırlardan hangisinin çıkarılacağına bir veri çıkarma yöntemi (İngilizce: replacement policy) karar verir. Smith, işlemci önbelleğinde bu yöntemin tümüyle donanımda gerçeklenmesi ve işlemciyi yavaşlatmayacak kadar hızlı çalışması gerektiğini vurgular.[1]:498 Bu kısıt, sayfalı bellekler ya da disk önbellekleri için geliştirilen pek çok yöntemin işlemci önbelleğinde kullanılmasını engeller ve donanımı ucuz olan yaklaşık yöntemleri öne çıkarır.

LRU ve maliyeti

[değiştir | kaynağı değiştir]

En uzun süredir kullanılmayanı çıkarma (İngilizce: least recently used, LRU), kümedeki satırların kullanım sırasını tutar ve en eski kullanılanı çıkarır. İki yollu bir önbellekte bu sıra tek bir bitle tutulabilir; Pentium'un iki yollu önbellekleri her küme için bir LRU biti kullanıyordu.[15]:3-13 Smith'in ölçümlerinde kullanıma bakmayan ilk giren ilk çıkar yöntemi, LRU'dan ortalama yaklaşık yüzde 12 daha yüksek bir bulamama oranı vermiştir.[1]:498 Yol sayısı arttıkça kesin LRU sırasını tutmak pahalılaşır. Jaleel ve arkadaşlarının hesabına göre n yollu bir kümede LRU, küme başına n·log2n bit gerektirir; 16 yollu bir önbellekte bu 64 bit eder.[42]:70-71 Al-Zoubi ve arkadaşları LRU'nun donanım maliyetinin sekiz yoldan büyük ilişkililikte çok hızlı arttığını belirtir.[43]:269

i486'nın dört yollu önbelleğinde sözde LRU. Çizelge yol 1, 0, 3, 2 sırasıyla yapılan erişimlerde B0, B1 ve B2 bitlerinin nasıl yazıldığını gösterir; ağaçta son durumdan çıkarılacak satır bulunur: B0 = 0 olduğundan yol 0-1 çiftine, B1 = 1 olduğundan yol 1'e gidilir.

Bu maliyeti düşürmek için çoğu işlemci LRU'ya yaklaşan sözde LRU (İngilizce: pseudo-LRU) yöntemleri kullanır. En yaygın biçimi ağaç tabanlı sözde LRU'dur; n yollu bir küme için n−1 bitlik bir ikili karar ağacı tutulur.[43]:268 i486'nın veri sayfası dört yollu önbellekte bu düzeni ayrıntısıyla anlatır. Her kümede B0, B1 ve B2 adlı üç bit vardır; son erişim 0 ya da 1 numaralı satıraysa B0 1, 2 ya da 3 numaralı satıraysa 0 yapılır, B1 0 ile 1 arasındaki, B2 ise 2 ile 3 arasındaki son erişimi gösterir. Bir satırın çıkarılması gerektiğinde önce B0'a bakılarak hangi çiftin daha önce kullanıldığı, sonra o çiftin bitine bakılarak çiftteki daha eski satır belirlenir. Kümede geçersiz bir satır varsa bu ağaca hiç bakılmaz ve önce geçersiz satır doldurulur.[14]:75

Bu düzen kümede gerçek kullanım sırasını değil, yalnızca bir yaklaşığını tutar, ama donanımı çok ucuzdur; 16 yollu bir önbellekte küme başına 64 bit yerine 15 bit yeter.[42]:71 Al-Zoubi ve arkadaşlarının SPEC CPU2000 programlarıyla yaptıkları benzetimlerde sözde LRU yöntemlerinin LRU'ya çok iyi yaklaştığı görülmüştür; aynı çalışmada LRU ile kuramsal en iyi yöntem arasındaki farkın yüzde 50'ye kadar çıkabildiği de bulunmuştur.[43]:271 ARM'ın Cortex-A76 çekirdeğinin birinci düzey önbellekleri de sözde LRU kullanır.[34]:A6-72

Yakın zamanda kullanılmayanı çıkarma ve yeniden başvuru aralığı

[değiştir | kaynağı değiştir]

Daha da ucuz bir yaklaşım, her satır için tek bir bit tutan yakın zamanda kullanılmayanı çıkarma (İngilizce: not recently used, NRU) yöntemidir. Bir satıra erişildiğinde onun biti, yakında yeniden kullanılacağını gösterecek biçimde ayarlanır; çıkarılacak satır gerektiğinde biti "uzak gelecekte kullanılacak" anlamını taşıyan bir satır aranır, böyle bir satır yoksa kümedeki bütün bitler bu değere çekilip arama yinelenir.[42]:63 Jaleel ve arkadaşları NRU'nun yüksek başarımlı işlemcilerde yaygın olarak kullanıldığını belirtir ve kaynak olarak Itanium 2 ile UltraSPARC T2 belgelerini gösterir.[42]:61

Aynı yazarların önerdiği yeniden başvuru aralığı öngörüsü (İngilizce: re-reference interval prediction, RRIP), NRU'nun tek bitini M bitlik bir sayaca genişletir. Sayaç, satıra ne kadar uzak bir gelecekte yeniden başvurulacağının bir öngörüsüdür; M 1 olduğunda yöntem NRU'nun aynısıdır.[42]:63 Yöntemin durağan biçimi SRRIP, yeni gelen satırları "uzun aralıkta yeniden kullanılacak" diye işaretler; böylece yalnızca bir kez okunacak uzun bir veri dizisi önbelleğe girse bile orada önceden duran ve yeniden kullanılacak satırları hemen çıkaramaz. Devingen biçimi DRRIP ise bu davranışla, satırların büyük çoğunluğunu "çok uzak gelecekte kullanılacak" diye ekleyen ikinci bir davranış arasında çalışma sırasında seçim yapar.[42]:63, 65 Satır başına yalnızca iki bit kullanan bu yöntemler, yazarların benzetimlerinde LRU'dan sırasıyla ortalama yüzde 4 ve yüzde 10 daha iyi sonuç vermiştir.[42]:60

Ekleme yöntemleri ve küme yarıştırma

[değiştir | kaynağı değiştir]

Çıkarma kararı kadar, yeni gelen satırın kullanım sırasında nereye konacağı da başarımı etkiler. Qureshi ve arkadaşları, büyük ikinci düzey önbelleklerde satırların yüzde 60'ından fazlasının önbelleğe girdikten sonra hiç kullanılmadan çıkarıldığını gözlemlemiştir.[44]:381 Programın çalışma kümesi önbellekten büyük olduğunda LRU, her yeni satırı en yeni konuma koyduğu için satırların birbirini sürekli çıkarmasına yol açar. Önerdikleri LRU konumuna ekleme yönteminde (İngilizce: LRU insertion policy, LIP) gelen satır en eski konuma konur ve ancak orada dururken yeniden kullanılırsa en yeni konuma alınır; iki kipli biçiminde (BIP) gelen satırların küçük bir bölümü, örneğin 32'de biri, yine en yeni konuma yerleştirilir.[44]:381, 383

Hangi ekleme yönteminin daha iyi olduğu programa göre değiştiği için yazarlar çalışma sırasında seçim yapan bir düzenek de önermiştir. Küme yarıştırma (İngilizce: set dueling) adı verilen bu düzenekte önbelleğin birkaç kümesi her zaman bir yöntemi, birkaç kümesi öteki yöntemi kullanır; bu kümelerde oluşan bulamamalar bir sayaçla karşılaştırılır ve önbelleğin geri kalanı o anda daha az bulamama üreten yöntemi izler. Yazarlara göre her yönteme 32 ile 64 küme ayırmak yeterlidir ve bütün düzenek iki bayttan az ek bellek ister.[44]:381-382 Benzetimlerde bu devingen ekleme yöntemi, 1 MB'lık 16 yollu bir ikinci düzey önbelleğin bin buyruk başına bulamama sayısını ortalama yüzde 21 azaltmış ve LRU ile kuramsal en iyi yöntem arasındaki farkın üçte ikisini kapatmıştır.[44]:381

Yazma yöntemleri

[değiştir | kaynağı değiştir]

Geri yazma ve doğrudan yazma

[değiştir | kaynağı değiştir]

İşlemcinin bir yazması önbellekteki kopyayı değiştirdiğinde, değişikliğin ana belleğe ne zaman yansıtılacağı iki temel biçimde düzenlenir. Doğrudan yazmalı (İngilizce: write-through ya da store-through) bir önbellekte her yazma hemen alt düzeye de iletilir; geri yazmalı (İngilizce: write-back, store-in ya da copy-back) bir önbellekte ise değişiklik yalnızca önbellekte yapılır ve satır önbellekten çıkarılırken alt düzeye yazılır.[45]:1 Jouppi'ye göre geri yazmalı önbellekler, yazmaların da zamanda ve alanda yerellik göstermesinden yararlanır; aynı satıra yapılan çok sayıda yazma önbellekte toplanır ve alt düzeye tek bir satır olarak gider.[45]:1

Mikroişlemci tarihinde iki yöntem de geniş biçimde kullanılmıştır. i486'nın ortak önbelleği, 386 için yapılmış 82385 denetleyicisi ve MC68030'un veri önbelleği doğrudan yazmalıydı.[14]:12[13]:4-347[11]:1-16 Pentium'un veri önbelleği her satır için ayrı ayrı geri yazmalı ya da doğrudan yazmalı çalışacak biçimde ayarlanabiliyordu.[15]:2-2 Çok düzeyli önbelleklerde iki yöntem bir arada da kullanılabilir. Alpha 21164'ün birinci düzey veri önbelleği ve POWER4'ün birinci düzey önbelleği doğrudan yazmalıydı, yazmalar yonga üstündeki ikinci düzey önbelleğe iletiliyordu.[18]:34[20]:16 Intel'in Skylake mikromimarisinde ve AMD'nin Zen çekirdeklerinde ise bütün önbellek düzeyleri geri yazmalıdır.[7]:2-36[5]:23, 25

Geri yazmalı bir önbellekte en güncel veri yalnızca önbellekte bulunabilir; bu yüzden mimariler yazılıma belirli satırları önbellekten boşaltma olanağı tanır. Intel'in x86 mimarisindeki CLFLUSH ve CLFLUSHOPT buyrukları, belirli bir satırı, değiştirilmiş verisi önce belleğe yazıldıktan sonra bütün önbellek düzeylerinden geçersiz kılar.[4]:11-32, 14-17 Kendi kendini değiştiren kod da benzer bir sorun doğurur. Intel işlemcilerinde, önbellekte bulunan bir kod satırına yapılan yazma o satırın önbellekten geçersiz kılınmasına yol açar.[4]:14-18

Yazma bulamamaları

[değiştir | kaynağı değiştir]

Yazılacak satır önbellekte yoksa ne yapılacağı ayrı bir karardır. Jouppi bu kararın aslında üç ayrı seçimden oluştuğunu gösterir: yazılan veriye önbellekte yer ayrılıp ayrılmayacağı (yaz ve yerini ayır ya da yaz ve yerini ayırma), satırın geri kalanının bellekten getirilip getirilmeyeceği (yazmada getirme ya da getirmeme) ve önbellekte o konumda duran eski satırın geçersiz kılınıp kılınmayacağı. Yazara göre bu seçimlerin farklı birleşimleri, bulamama oranında iki kata varan farklar doğurabilir.[45]:1 Ölçtüğü programlarda yazma bulamamaları bütün bulamamaların yaklaşık üçte biriydi.[45]:14

En yaygın seçim, geri yazmalı önbellekle birlikte yaz ve yerini ayır ile yazmada satırı getirmektir. Bu düzende yazma bulamamasında satır önce bellekten getirilir, yazma ardından önbellekte yapılır.[45]:14 Jouppi iki seçeneği daha inceler. Yazılanı geçerli sayma (İngilizce: write-validate) yönteminde yazılan veriye önbellekte yer ayrılır ama satırın geri kalanı getirilmez; satıra yazılan baytlar dışındaki bölümlerin geçerlilik bitleri kapalı tutulur. Önbelleği atlayarak yazma (İngilizce: write-around) yönteminde ise yazmalar önbelleğe girmez, doğrudan alt düzeye gider.[45]:16 Benzetimlerde bu iki yöntem her durumda yazmada getirmeden daha iyi sonuç vermiş, yazılanı geçerli sayma yöntemi yazma bulamamalarını yüzde 30 ile 35 azaltmıştır.[45]:31

Yazma ara belleği ve yazma birleştirme

[değiştir | kaynağı değiştir]

Doğrudan yazmalı bir önbellekte işlemcinin her yazmada alt düzeyi beklememesi için yazmalar bir yazma ara belleğinde (İngilizce: write buffer) toplanır. Ara bellekte zaten bulunan bir adrese gelen yeni yazmaların eskileriyle birleştirildiği düzene birleştiren yazma ara belleği (İngilizce: coalescing write buffer) denir.[45]:9 Jouppi, beş girdilik ve her girdisi 8 bayt olan küçük, tam ilişkili bir yazma önbelleğinin yazma trafiğini ortalama yüzde 40 azalttığını, 4 KB'lık geri yazmalı bir önbelleğin ise yüzde 58 azalttığını bulmuştur.[45]:31

Intel işlemcileri bu düşünceyi bellek türleriyle birleştirir. Her bellek bölgesi için önbelleğin nasıl kullanılacağını gösteren bir tür tanımlanır: önbelleğe alınmayan (UC), yazma birleştirmeli (WC), doğrudan yazmalı (WT), yazmaya karşı korumalı (WP) ve geri yazmalı (WB). Geri yazmalı bölgede yazmalar hemen sistem belleğine iletilmez, önbellekte birikir; doğrudan yazmalı bölgede her yazma hem önbellek satırına hem sistem belleğine yapılır; yazma birleştirmeli bölgede ise veri önbelleğe alınmaz, yazmalar bellek erişimlerini azaltmak için geciktirilip yazma birleştirme ara belleğinde (İngilizce: write-combining buffer) birleştirilir.[4]:14-6, 14-7 Bu ara bellek gözetlenmez, dolayısıyla tutarlılık sağlamaz.[4]:14-8 Ara belleğin girdi sayısı kuşaktan kuşağa artmıştır: P6 ailesinde 4, Pentium 4'te 6 ya da 8, Core mikromimarisinde çekirdek başına 8, Nehalem'den başlayarak 10, Ice Lake'ten başlayarak 12.[4]:14-4[7]:3-55

Bulamama türleri

[değiştir | kaynağı değiştir]

Bulamamalar, nedenlerine göre dört türe ayrılır. İlk kez başvurulan bir satır her durumda bulunamaz; buna zorunlu bulamama denir. Önbelleğin büyüklüğü programın o anda kullandığı veriyi tutmaya yetmediğinde oluşanlara kapasite nedeniyle bulamama, önbellekte yer olduğu hâlde o anda kullanılan çok sayıda satırın aynı kümelere düşmesinden oluşanlara çakışma nedeniyle bulamama denir.[36]:1612, 1624 Hill ve Smith çakışma nedeniyle bulamamayı, aynı büyüklükte, tam ilişkili ve LRU kullanan bir önbellekte oluşmayacak bulamamalar olarak tanımladığından, tam ilişkili bir önbellekte bu tür bulamama tanım gereği yoktur.[36]:1624 Çok çekirdekli sistemlerde bir satır, başka bir çekirdeğin yazması üzerine geçersiz kılındığı için de bulunamayabilir; Jouppi bu dördüncü türe tutarlılık nedeniyle bulamama adını verir.[37]

Türler hangi önlemin işe yarayacağını gösterir. Önbelleği büyütmek kapasite nedeniyle oluşan bulamamaları, ilişkililiği artırmak çakışma nedeniyle oluşanları azaltır; uzun satırlar ve önceden getirme ise zorunlu bulamamalara karşı kullanılır. Jouppi'nin aktardığına göre doğrudan eşlemeli önbelleklerde çakışma nedeniyle oluşan bulamamalar bütün bulamamaların genellikle yüzde 20 ile 40'ını oluşturur; küçük bir çıkarılanlar önbelleği bu bulamamaların önemli bir bölümünü doğrudan eşlemeli önbelleğin hızından vazgeçmeden giderebilir.[37]

Bulamama cezası

[değiştir | kaynağı değiştir]

Bulamamanın işlemciye maliyeti, verinin hangi düzeyden geldiğine bağlıdır. Sandy Bridge'de birinci düzeyde bulunamayıp ikinci düzeyde bulunan bir yükleme 12, son düzeyde bulunan bir yükleme 26-31 çevrim sürer; veri başka bir çekirdeğin önbelleğinden gelecekse bu süre, satır değiştirilmemişse 43, değiştirilmişse 60 çevrime çıkar.[3]:2-11 AMD'nin Zen 4 çekirdeğinde ikinci düzeyden bir yükleme en az 14, üçüncü düzeyden ortalama 50 çevrimdir.[41]:18 Ana belleğe kadar inen bir bulamama yüzlerce çevrim sürebildiği için[21]:16 çağdaş işlemciler bulamama cezasını kısaltmanın yanı sıra onu gizlemeye de çalışır; işlemci bulamamayı beklerken başka işler yapar, birden çok bulamamayı aynı anda sürdürür ya da veriyi istenmeden önce getirir.

Engellemeyen önbellekler

[değiştir | kaynağı değiştir]
Engellemeyen önbellekte bekleyen bulamama yazmaçları. A ve B'nin bulamamaları ana bellekten birlikte beklenirken C ve D önbellekte bulunur. A ile aynı satıra düşen A' yeni bir bellek isteği doğurmaz, ikincil bulamama olarak A'nın yazmacına eklenir ve satır gelince ikisi birlikte yanıtlanır.

İlk önbelleklerde bir bulamama, veri gelene kadar önbelleği kilitliyordu; önbellek o sürede başka hiçbir isteğe yanıt veremiyordu. Kroft 1981'de bu cezayı büyük ölçüde ortadan kaldıran bir önbellek düzeni önerdi. Bu düzende aynı anda sürdürülebilecek her bulamama için bulamamanın bilgisini ve durumunu tutan bir bekleyen bulamama yazmacı (İngilizce: miss information/status holding register, MSHR) vardır; Kroft'un hesaplarına göre dört yazmaç en uygun sayıydı.[46]:81-82 Böyle bir önbelleğe engellemeyen önbellek (İngilizce: non-blocking ya da lockup-free cache) denir.

Farkas ve Jouppi'nin 1994'teki incelemesi engellemeyen önbelleklerin farklı derecelerini karşılaştırır. En basit biçim, bir bulamama sürerken önbelleğe gelen öteki erişimlerin bulunabilmesine izin verir; HP'nin PA7100 işlemcisi önbellekte aynı anda en çok bir bulamamaya izin veriyordu. Daha gelişmiş biçimlerde birden çok bulamama aynı anda sürer ve her biri bir bekleyen bulamama yazmacında izlenir. Aynı satıra gelen bir birincil bulamama ile ondan sonraki ikincil bulamamalar tek bir bellek isteğinde birleştirilebilir.[47]:1-2 Yazarların benzetimlerinde tamsayı programları için bulamama sırasında bulmaya izin veren basit bir gerçekleme, elde edilebilecek kazancın neredeyse tamamını sağlamıştır.[47] Intel'in Pentium Pro veri sayfası da işlemcinin hem birinci düzey hem ikinci düzey önbelleğini engellemeyen önbellek olarak tanımlar.[16]:1-1

Adres çevirisi ile ilişkisi

[değiştir | kaynağı değiştir]

Sanal bellek kullanan bir sistemde program sanal adreslerle çalışır, ana bellek ise fiziksel adreslerle erişilir. Bu çeviriyi hızlandırmak için işlemci son çevirileri etkin sayfalar önbelleği (İngilizce: translation lookaside buffer, TLB) adı verilen küçük bir önbellekte tutar. i486'nın etkin sayfalar önbelleği 32 girdili ve dört yollu kümeli ilişkiliydi;[14]:123 Pentium'da ise buyruk önbelleği ile veri önbelleğinin her birinin kendine ayrılmış bir etkin sayfalar önbelleği vardı.[15]:2-3 Önbelleğin kendisinin sanal adresle mi fiziksel adresle mi erişileceği ayrı bir tasarım kararıdır; dizin ve etiket için ayrı ayrı sanal ya da fiziksel adres kullanılabildiğinden üç yaygın düzen ortaya çıkar.

Fiziksel dizinli ve fiziksel etiketli önbellek

[değiştir | kaynağı değiştir]

En basit düzende önbellek fiziksel adresle erişilir; sanal adres önce çevrilir, sonra önbellekte aranır. i486'nın önbelleği fiziksel adreslerle çalışıyordu.[14]:73 Bu düzende önbelleğin içeriği adres alanından bağımsızdır ve aynı fiziksel satırın iki kopyası oluşamaz; Linux çekirdeğinin belgeleri, x86 işlemcilerinin fiziksel dizinli ve fiziksel etiketli önbelleklerinin sanal adresle ilgili önbellek boşaltma işlemlerine hiç gereksinim duymadığını belirtir.[48] Sakıncası, adres çevirisinin önbellek erişiminin önüne eklenmesidir. Smith, gerçek adresle erişilen bir önbellekte satırın aranıp okunmasının ancak çeviri tamamlandıktan sonra bitebildiğini, çeviri adımı ortadan kaldırılabilirse önbellek erişim süresinin belirgin biçimde kısalacağını yazar.[1]:509-510

Sanal dizinli ve sanal etiketli önbellek

[değiştir | kaynağı değiştir]

Çeviriyi yoldan çıkarmanın doğrudan yolu, önbelleği sanal adresle dizinlemek ve etiketlemektir. MC68030'un buyruk ve veri önbellekleri mantıksal (sanal) adreslerle erişiliyordu.[11]:6-1 Smith bu düzenin iki ek gereksinimini ve bir ciddi sorununu sıralar. Satırlar ait oldukları adres alanının kimliğiyle etiketlenmeli ya da her görev değişiminde önbellek boşaltılmalıdır; ayrıca bulamamalarda ve doğrudan yazmalı önbellekteki yazmalarda ana belleğe yine fiziksel adresle gidileceği için adres çevirisi düzeneği ortadan kalkmaz.[1]:510 Ciddi sorun, aynı fiziksel adrese eşlenen iki ya da daha çok sanal adres anlamına gelen eşanlamlılardır (İngilizce: synonyms). Eşanlamlılar iki adres alanı kod ya da veri paylaştığında ortaya çıkar ve aynı verinin önbellekte iki farklı yerde, birbirinden habersiz iki kopyasının oluşmasına yol açabilir.[1]:510[49]:140 Bunun tersi olan eşsesli (İngilizce: homonym) durumunda ise aynı sanal adres farklı süreçlerde farklı fiziksel adreslere karşılık gelir; satırlar adres alanı kimliği taşımıyorsa bağlam değişiminde önbelleğin geçersiz kılınması gerekir.[49]:140

Wang, Baer ve Levy 1989'da bu sorunlara bir çözüm olarak iki düzeyli bir düzen önerdiler. Birinci düzey önbellek doğrudan sanal adresle erişilir, arkasında ise büyük ve fiziksel adresli bir ikinci düzey önbellek durur. İkinci düzey, sanal önbellekteki satırların fiziksel karşılıklarını izleyen bir ters çeviri bilgisi tutar; düzen eşanlamlılara izin verir ve onları algılar, ama bir verinin sanal önbellekte aynı anda en çok bir kopyası bulunmasını güvenceye alır.[49]:140-141

Sanal dizinli ve fiziksel etiketli önbellek

[değiştir | kaynağı değiştir]
Sanal dizinli fiziksel etiketli birinci düzey önbellek. Dizin ile öbek içi göreli konum, sanal adresin çeviride değişmeyen 12 bitlik sayfa içi göreli konumundan alınır; küme seçimi ve etiketlerin okunması, sanal sayfa numarasının etkin sayfalar önbelleğinde çevrilmesiyle aynı anda yapılır. Çeviri bitince fiziksel sayfa numarası okunan sekiz etiketle karşılaştırılır.

İki düzenin arasında bir çözüm de vardır; önbellek sanal adresle dizinlenir, ama etiketler fiziksel adresi taşır. Dizin sanal adresten alındığı için küme seçimi ve etiketlerin okunması, etkin sayfalar önbelleğindeki çeviriyle aynı anda yapılabilir; çeviri bittiğinde fiziksel sayfa numarası okunan etiketlerle karşılaştırılır. Bunun dayandığı gözlem, sayfa içindeki baytı gösteren bitlerin çeviride değişmemesidir.[1]:479, 489

Dizin ve öbek içi göreli konum bitlerinin tamamı sayfa içi göreli konumun içinde kalıyorsa, sanal dizin fiziksel dizinle aynıdır ve önbellek fiziksel dizinliymiş gibi davranır. Bu koşul, önbelleğin bir yolunun büyüklüğünün sayfa büyüklüğünü aşmamasıyla sağlanır. Skylake'in 32 KB'lık ve sekiz yollu birinci düzey veri önbelleğinde bir yol 4 KB'tır;[7]:2-36 4 KB'lık sayfalarda bu, dizinin tümüyle sayfa içi göreli konumdan alınması demektir. Yol büyüklüğü sayfayı aştığında ise aynı fiziksel satır, farklı sanal adreslerden farklı kümelere düşebilir. Linux çekirdeğinin belgeleri, sanal dizinli, sayfa büyüklüğünden büyük ve aynı fiziksel adresin birden çok satırda bulunmasını engellemeyen bir veri önbelleğinin bu sorunu taşıdığını, bu tür işlemciler için işletim sisteminin belirli noktalarda önbelleği boşaltması gerektiğini anlatır.[48] ARM'ın Cortex-A76 çekirdeğinde ise 64 KB'lık ve dört yollu birinci düzey veri önbelleği sanal dizinli ve fiziksel etiketlidir, ama ARM'a göre fiziksel dizinli ve fiziksel etiketli bir önbellek gibi davranır; eşanlamlı sorununu donanım kendisi çözer.[34]:A2-36, A6-72

Sayfa renklendirme

[değiştir | kaynağı değiştir]

Fiziksel dizinli büyük bir önbellekte, hangi satırın hangi kümeye düşeceğini işletim sisteminin sayfalara verdiği fiziksel adresler belirler. Kessler ve Hill, işletim sistemi sayfaları gelişigüzel yerleştirdiğinde gereksiz çakışma nedeniyle oluşan bulamamaların yüzde 30'a varabildiğini, dikkatli bir yerleştirmenin bulamamaları gelişigüzel yerleştirmeye göre yüzde 10-20 azalttığını ve bu kazancın önbelleği iki katına büyütmenin sağlayacağı kazancın yaklaşık yarısı olduğunu göstermiştir.[50]:338 İnceledikleri yöntemlerden sayfa renklendirme (İngilizce: page coloring), bir sanal sayfayı, önbellekte sanal adresinin düşeceği kümeler grubuyla aynı kümelere düşen bir fiziksel sayfaya yerleştirir; MIPS bu yöntemin bir biçimini kullanmıştır.[50]:341, 345 Öteki yöntem ise sayfaları sanal adreslerine bakmadan, sırayla önbelleğin ardışık bölgelerine dağıtır.[50]:346 Linux çekirdeği de sanal dizinli önbelleklerde eşanlamlı sorununu azaltmak için, çekirdeğin bir sayfayı eşlerken kullanıcı eşlemesiyle aynı "renkte" bir sanal adres seçtiğini, örneğin Sparc64'ün bu tekniği kullandığını belirtir.[48]

Önbellek hiyerarşisi

[değiştir | kaynağı değiştir]

Buyruk ve veri önbellekleri

[değiştir | kaynağı değiştir]

Boru hattıyla çalışan bir işlemci belleğe birden çok noktadan erişir: buyruğu getirirken, adresi çevirirken ve yükleme ya da saklama buyruğunu yürütürken. Bu erişimlerin aynı önbellekte yarışmaması için birinci düzeyde ayrı bir buyruk önbelleği, ayrı bir veri önbelleği ve her birine ayrılmış etkin sayfalar önbellekleri kullanılır; Pentium'un yapısı bunun erken bir örneğidir.[15]:2-2, 2-3 Smith ayrık önbelleklerin bir bedelini de ölçmüştür; toplam kapasite aynı kalsa bile önbellek ikiye bölündüğünde bulamama oranı iş yüküne bağlı olarak belirgin biçimde artabilir, çünkü iki yarının boyutu programın buyruk ve veri gereksinimlerine her zaman uymaz.[1]:509-510 Birinci düzeyin arkasındaki düzeyler ise çoğu tasarımda ortaktır; Pentium 4'ün ikinci düzey önbelleği hem iz önbelleğinde bulunamayan buyrukları hem birinci düzey veri önbelleğinde bulunamayan verileri tutuyordu.[35]

Çok düzeyli önbellekler

[değiştir | kaynağı değiştir]

Tek bir önbellek hem çok hızlı hem çok büyük olamaz. Wilton ve Jouppi'nin modelinde önbellek erişim süresini bellek dizisinin sözcük hatlarının ve bit hatlarının boyu belirler; Muralimanohar ve arkadaşlarına göre sözcük hattının ve bit hattının gecikmesi, dizinin genişliğinin ve yüksekliğinin karesiyle artar.[33]:2, 4[51]:3 Bu yüzden önbellek büyüdükçe erişimi yavaşlar ve çözüm, küçük ve hızlı bir birinci düzeyin arkasına daha büyük ve daha yavaş düzeyler koymaktır. Mahapatra ve Venkatrao 1999'da önbelleklerin çoğunun iki düzeyli olduğunu, işlemciye yakın olana L1, sonrakine L2 dendiğini yazar.[32] Bugün Intel'in ve AMD'nin işlemcilerinde üç düzey olağandır; çekirdeğe özel birinci ve ikinci düzeyin arkasında çekirdeklerin paylaştığı bir üçüncü düzey vardır.[7]:2-36[41]:16, 18

Düzeylerin büyüklükleri ve gecikmeleri kuşaktan kuşağa değişmiştir. Skylake'te ikinci düzey önbellek 256 KB iken Ice Lake'te 512 KB'a, Golden Cove'un istemci sürümünde 1,25 MB'a, sunucu sürümünde 2 MB'a çıkmıştır.[7]:2-11, 2-21, 2-36 AMD'nin ilk Zen çekirdeğinde 512 KB olan ikinci düzey, Zen 4 ve Zen 5'te 1 MB'tır; üçüncü düzey ise ilk Zen'deki dört çekirdeğin paylaştığı 4 ya da 8 MB'tan, Zen 3 ile birlikte sekiz çekirdeğin paylaştığı 32 MB'a büyümüştür.[5]:25[6]:26[38]:23 Gecikme de büyüklükle birlikte artar; AMD'ye göre üçüncü düzeyin ortalama yükle-kullan gecikmesi ilk Zen'de 35, Zen 3'te 46, Zen 4'te 50 çevrimdir.[5]:25[6]:26[41]:18

Kapsayan, dışlayan ve ikisi de olmayan düzenler

[değiştir | kaynağı değiştir]
Kapsayan, dışlayan ve ne kapsayan ne dışlayan iki düzeyli önbellekte A, B ve C satırlarının tutulduğu yerler. Altta kapsayan düzende ikinci düzeye D gelirken çıkarılan A'nın birinci düzeyden de geriye doğru geçersiz kılınması.

Çok düzeyli bir önbellekte bir satırın aynı anda birden çok düzeyde bulunup bulunamayacağı bir tasarım kararıdır. Jaleel ve arkadaşlarının tanımlarıyla kapsayan (İngilizce: inclusive) bir hiyerarşide küçük düzeylerin içeriği son düzey önbelleğin bir alt kümesi olmak zorundadır; son düzeyden bir satır çıkarıldığında, bu kuralı korumak için aynı satır üst düzeylerden de geriye doğru geçersiz kılınır. Dışlayan (İngilizce: exclusive) bir hiyerarşide hiçbir düzeyin içeriği başka bir düzeyde yinelenmez; ne kapsayan ne dışlayan (İngilizce: non-inclusive) bir hiyerarşinin etkin kapasitesi ise son düzeyin büyüklüğü ile bütün düzeylerin toplamı arasında bir yerdedir.[52]:152

Her düzenin kendine özgü üstünlükleri ve bedelleri vardır. Kapsayan bir son düzey önbellek, doğal bir gözetleme süzgeci (İngilizce: snoop filter) görevi görür; bir satır son düzeyde yoksa hiçbir çekirdeğin özel önbelleğinde de yoktur, bu yüzden öteki çekirdeklere sormaya gerek kalmaz.[52]:152 Buna karşın kapsayan düzende üst düzeylerdeki satırlar alt düzeyde de yer kaplar ve son düzeyden çıkarılan bir satır, çekirdek onu hâlâ kullanıyor olsa bile üst düzeyden de atılır; Jaleel ve arkadaşlarına göre kapsayan önbelleklerin sınırlı başarımının asıl nedeni, kapsama kuralı yüzünden çekirdek önbelleklerinden atılan bu satırlardır.[52]:151 Dışlayan düzen kapasiteyi en iyi kullanır, ama çekirdeğin önbelleklerinden çıkarılan temiz satırların da son düzeye yazılması gerektiği için daha çok bant genişliği ister.[52]:152 Drepper, kapsayan düzende birinci düzeyden satır çıkarmanın çok daha hızlı olduğunu, dışlayan düzende ise yeni bir satırın yalnızca birinci düzey veri önbelleğine yüklenmesinin bir üstünlük olabileceğini belirtir.[21]:16

Gerçek işlemciler bu üç düzenin hepsini kullanmıştır. Intel'in Nehalem ve Sandy Bridge kuşaklarında son düzey önbellek, üst düzeylerin bütün içeriğini kapsar.[4]:14-4[3]:2-11 Skylake'in sunucu sürümünde ise Intel bu kuraldan vazgeçmiştir. Son düzey önbellek ne kapsayan ne dışlayan bir paylaşılan önbellektir, bir çekirdeğin ikinci düzey önbelleğindeki satırın son düzeyde kopyası olmayabilir ve bu yüzden iki düzeyin kapasitesi toplanabilir. Bu değişiklikle birlikte ikinci düzey önbellek 256 KB'tan 1 MB'a büyütülmüş, çekirdek başına düşen son düzey önbellek ise 2,5 MB'tan 1,375 MB'a küçültülmüştür.[7]:2-27, 2-28, 2-29 AMD'nin Athlon (Thunderbird) ve Duron işlemcilerinin ikinci düzey önbellekleri dışlayandı; ikinci düzey yalnızca birinci düzeyde olmayan satırları tutuyor, bir satır birinci düzeye kopyalandığında ikinci düzeydeki kopyası geçersiz kılınıyordu.[53]:2[54]:1 AMD'nin Zen çekirdeklerinde ikinci düzey önbellek birinci düzeyi kapsar, üçüncü düzey ise ikinci düzeyden çıkarılan satırlarla doldurulur; AMD bu son düzeni "çoğunlukla dışlayan" diye niteler.[5]:25[27]:slayt 20 ARM'ın Cortex-A76 çekirdeğinde ikinci düzey önbellek birinci düzey veri önbelleğini kesin olarak, buyruk önbelleğini ise gevşek biçimde kapsar.[34]:A7-98 ARM'ın çekirdek kümelerinde paylaşılan üçüncü düzey önbellek ise satırın kaç çekirdekte kullanıldığına göre karar verir; yalnızca bir çekirdeğin kullandığı veri dışlayan biçimde, çekirdekler arasında paylaşılan veri kapsayan biçimde yerleştirilir.[55]:A5-65

Paylaşılan son düzey önbellek ve dilimler

[değiştir | kaynağı değiştir]

Çok çekirdekli işlemcilerde önbellekler, yalnızca bir çekirdeğin kullandığı özel önbellekler ile birden çok çekirdeğin ortak kullandığı paylaşılan önbellekler olarak ayrılır. Paylaşılan bir önbellekte çekirdekler birbirinin satırlarını çıkarabilir; Drepper aynı paylaşılan önbelleği kullanan iki programın, önbelleğin ilişkililiğini uygulamada yarıya indirdiğini belirtir.[21]:19

Dilimli paylaşılan son düzey önbellek. Her çekirdeğe karşılık bir dilim vardır ve dilimler halka ağla bağlıdır; bir satırın hangi dilimde tutulacağını bir karma işlevi belirler. Uzaktaki bir dilime erişim halkada daha uzun yol alır; Sandy Bridge'de son düzeyde bulma süresi bu uzaklığa göre 26 ile 31 çevrim arasındadır.

Paylaşılan son düzey önbellek çoğu zaman dilimlere bölünür. IBM'in POWER4'ünde iki çekirdeğin paylaştığı ikinci düzey önbellek, her birinin kendi denetleyicisi olan üç özdeş dilimden oluşuyordu.[20]:15 Intel'in Sandy Bridge'inde son düzey önbelleğin dilim sayısı çekirdek sayısına eşittir, adresler dilimlere bir karma işleviyle dağıtılır ve her dilim çevrim başına 32 bayt veri sağlayabilir. Dilimler bir halka ağla bağlandığından son düzeyde bulma süresi, verinin bulunduğu dilimin çekirdeğe uzaklığına göre 26 ile 31 çevrim arasında değişir.[3]:2-16, 2-17 Liu ve arkadaşları Intel'in bu karma işlevini yayımlamadığını belirtir.[56]:607 ARM'ın paylaşılan üçüncü düzey önbelleği de bir ya da iki dilimle kurulabilir ve iki dilim koşut olarak erişilebilir; 1,5 MB'lık yapılandırmada önbellek 16 yerine 12 yolla gerçeklenir ve yazılıma 2 MB'lık bir önbellek olarak bildirilir.[55]:A1-24, A5-73

Önbellek büyüdükçe erişim süresini bellek dizilerinin kendisinden çok, onları birbirine bağlayan yonga içi bağlantılar belirlemeye başlar; Muralimanohar ve arkadaşları büyük önbelleklerin özelliklerinin öncelikle bağlantı ağının özelliklerine bağlı olacağını belirterek, erişim süresi bankadan bankaya değişen tekdüze olmayan önbellek erişimi (İngilizce: non-uniform cache access, NUCA) düzenlerini modellemiştir.[51] IBM POWER7'nin üçüncü düzey önbelleğinde her çekirdeğin özel verisi, yakındaki hızlı bölgeye kendiliğinden taşınır ve oradan bütün önbelleğe göre yaklaşık beş kat daha kısa gecikmeyle okunur.[23]:slayt 13 POWER10'un 120 MB'a kadar çıkan üçüncü düzey önbelleği de bu tür bir yönetimle çalışır.[57]:slayt 5

Özelleşmiş önbellekler

[değiştir | kaynağı değiştir]

Çıkarılanlar önbelleği

[değiştir | kaynağı değiştir]

Jouppi'nin 1990'da önerdiği çıkarılanlar önbelleği (İngilizce: victim cache), doğrudan eşlemeli bir önbellekten çıkarılan satırları tutan küçük ve tam ilişkili bir önbellektir. Doğrudan eşlemeli önbellekte bulunamayan bir satır çıkarılanlar önbelleğinde bulunursa iki önbelleğin ilgili satırları yer değiştirir ve ana belleğe gidilmez. 1 ile 5 girdilik çıkarılanlar önbellekleri çakışma nedeniyle oluşan bulamamaları gidermede çok etkili çıkmıştır; Jouppi'nin benzetimlerinde tek girdilik bir çıkarılanlar önbelleği bile bazı programlarda iki yollu ilişkililiğin sağladığı kazancın yaklaşık yarısını sağlamıştır.[37] Aynı düşünce büyük ölçekte de kullanılır. AMD'nin Zen çekirdeklerindeki üçüncü düzey önbellek ikinci düzeyden çıkarılan satırlarla doldurulur ve AMD onu "çıkarılanlar üçüncü düzey önbelleği" diye anar.[5]:19, 25

İz önbelleği

[değiştir | kaynağı değiştir]

Sıradan bir buyruk önbelleği buyrukları bellekteki sıralarıyla tutar; alınan bir dallanma, buyruk akışını önbellekte başka bir satıra atlatır ve bir çevrimde getirilebilecek buyruk sayısını sınırlar. Rotenberg, Bennett ve Smith'in 1996'da önerdiği iz önbelleği (İngilizce: trace cache), buyrukları yürütüldükleri sırayla, dinamik buyruk akışının izleri olarak saklar; böylece bellekte bitişik olmayan buyruklar önbellekte bitişik görünür.[58] Bir iz en çok n buyruk ve en çok m temel öbekten oluşur; iz satırı ayrıca izin içindeki her dallanmanın hangi yöne gittiğini gösteren bitler taşır, bu yüzden aynı adresten başlayan ama farklı dallanma yolları izleyen izler ayrı satırlarda tutulabilir. Yazarların benzetimlerinde 16 buyruk ve 3 temel öbekten oluşan izlerle çalışan 4 KB'lık bir iz önbelleği, sıradan ardışık getirmeye göre başarımı ortalama yüzde 28 artırmıştır.[58]

İz önbelleğinin ticari bir uygulaması Intel'in Pentium 4'üdür. Bu işlemcinin iz önbelleği IA-32 buyruklarını değil, onlardan çözülmüş mikro işlemleri saklar ve 12.000'e kadar mikro işlem tutabilir; Intel'e göre bulma oranı 8 ile 16 KB'lık sıradan bir buyruk önbelleğininkine yakındır.[35] İz önbelleği çözülmüş buyrukları tuttuğu için, bulma durumunda boru hattının ilk aşamaları atlanabilir; Drepper, değiştirilen kodun iz önbelleğinde tutulamayacağını da belirtir.[21]:31

Mikro işlem önbelleği

[değiştir | kaynağı değiştir]

Çözülmüş buyrukları saklama düşüncesi Intel'in sonraki mikromimarilerinde mikro işlem önbelleği biçiminde sürdü. Intel'in Sandy Bridge mikromimarisiyle getirdiği kod çözülmüş buyruk önbelleği (İngilizce: decoded ICache), sıradan buyruk önbelleğinin yanında durur. 32 kümeden oluşur, her kümede sekiz yol, her yolda en çok altı mikro işlem vardır; ideal durumda 1.536 mikro işlem tutar.[7]:3-18[3]:2-6 32 baytlık her hizalı bellek parçası için en çok 18 mikro işlem saklanabilir.[7]:3-19 Golden Cove'da bu önbellek büyütülmüş ve bant genişliği çevrim başına sekiz mikro işleme çıkarılmıştır.[7]:2-11

AMD'nin Zen çekirdeklerindeki karşılığı işlem önbelleğidir (İngilizce: op cache). İlk Zen'de 32 kümeli ve sekiz yollu bu önbellek en çok 2.048 buyruk tutuyordu; kapasite Zen 3'te 4.096 işleme, Zen 4'te 64 kümeli ve 12 yollu bir düzenle 6.750 işleme çıkarılmıştır. Zen 5'te 64 küme ve 16 yoldan oluşan önbellek 6.000 buyruk ya da kaynaştırılmış buyruk tutar.[5]:32[6]:33[41]:26[38]:34

Dallanma hedef ara belleği

[değiştir | kaynağı değiştir]

Önbellek düzeni yalnızca bellek verisini saklamak için kullanılmaz; işlemci, hesaplanması pahalı bilgileri de önbelleğe benzer tablolarda tutar. Dallanma hedef ara belleği (İngilizce: branch target buffer), daha önce yürütülmüş dallanmaların adreslerini ve hedeflerini saklar ve getirme aşamasında bir dallanmanın nereye gideceğini, buyruk henüz çözülmeden öngörmeyi sağlar. Pentium'da dallanma adresleri bu ara bellekte tutuluyor, buyruk getirme ara bellekleri de onun öngörülerine göre çalışıyordu.[15]:2-3 Pentium 4'te 4.096 girdilik bir dallanma hedef ara belleği ön ucu, 512 girdilik ayrı bir ara bellek de iz önbelleğini besliyordu.[35]

Karalama belleği ve sıkı bağlı bellek

[değiştir | kaynağı değiştir]

Bazı gömülü işlemcilerde önbelleğin yerine ya da yanında, içeriğini donanımın değil yazılımın yönettiği, adreslenebilir küçük bir yonga üstü bellek kullanılır. Bu belleğe karalama belleği (İngilizce: scratchpad memory) denir. Banakar ve arkadaşlarının ölçümlerinde aynı kapasitedeki bir karalama belleği, önbelleğe göre ortalama yüzde 34 daha az alan kaplamış ve yüzde 40 daha az enerji harcamıştır; yazarlar, yonga üstü SRAM önbelleklerinin toplam yonga gücünün yüzde 25 ile 45'ini tüketebildiğini de aktarır.[59] Bedeli, hangi verinin bu belleğe konacağına kullanıcının ya da derleyicinin karar vermesidir; yazarlara göre karalama belleği ancak etkili bir derleyici desteğiyle önbelleğin yerini alabilir.[59]

ARM'ın Cortex-M7 gibi mikrodenetleyici çekirdeklerinde bu bellek, sıkı bağlı bellek (İngilizce: tightly coupled memory, TCM) adıyla buyruk ve veri için iki ayrı birim olarak yer alır ve 4 KB ile 16 MB arasında yapılandırılabilir. ARM'a göre en iyi başarım, kodun buyruk, verinin veri sıkı bağlı belleğine yerleştirilmesiyle elde edilir; sıkı bağlı belleğe gitmeyen erişimler ise ayrı önbellek denetleyicilerince karşılanır.[60]:1-11, 5-33, 5-37

Önceden getirme

[değiştir | kaynağı değiştir]

Bulamamaları azaltmanın bir yolu, gerekecek satırları istenmeden önce getirmektir. Smith'in ölçümlerinde önceden getirmenin sağladığı başarım artışı, satır uzunluğunu iki katına çıkarmanın sağladığından belirgin biçimde büyüktür; önceden getirilen ama kullanılmayan bir satır önbellekten çıkarılabildiği hâlde, uzun bir satırın kullanılmayan yarısı ayrıca çıkarılamaz.[1]:497 Çağdaş işlemcilerde önceden getirme hem donanımla hem yazılımla yapılır.

Donanımla önceden getirme

[değiştir | kaynağı değiştir]

Donanım önceden getiricileri bellek erişimlerindeki düzenli örüntüleri tanır. Drepper'e göre donanımın önceden getirmeyi başlatması için çoğunlukla belirli bir örüntüde iki ya da daha çok bulamama gerekir; tek bir bulamamaya tepki vermek, rastgele erişimlerde bant genişliğini boşa harcar.[21]:60 Intel'in Sandy Bridge mikromimarisinde birinci düzeyde iki önceden getirici vardır: yakın zamanda yüklenen veriye artan adreslerle erişildiğinde sonraki satırı getiren akış önceden getiricisi ve tek tek yükleme buyruklarının adreslerini izleyerek 2 KB'a kadar sabit adımları tanıyan buyruk göstergesine dayalı önceden getirici. İkinci düzeydeki uzamsal önceden getirici, getirilen her satırı 128 baytlık hizalı bir parçayı tamamlayan eşiyle birlikte getirir; akış önceden getiricisi ise 32'ye kadar akışı izleyebilir ve 20 satıra kadar önden gidebilir.[3]:2-18 AMD'nin Zen 4 ve Zen 5 çekirdeklerinde beş ayrı önceden getirici bulunmaktadır; bunlardan birinci düzeydeki adım önceden getiricisi, tek tek buyrukların erişim geçmişini kullanarak erişimler arasında sabit bir uzaklık olduğunda ek satırlar getirir.[41]:41

Donanım önceden getiricilerinin önemli bir sınırı, sayfa sınırlarını aşamamalarıdır. Bir sonraki sayfa bellekte olmayabilir ve önceden getirme işletim sisteminin bir sayfa hatasını ele almasını gerektirebilir; Drepper, bu yüzden işlemcilerin karmaşık örüntüleri tanımaya çalışmadığını belirtir.[21]:60-61 Intel'in akış önceden getiricisi de önceden getirdiği satırları aynı 4 KB'lık sayfanın içinde tutar.[3]:2-18

Akış ara bellekleri

[değiştir | kaynağı değiştir]

Önceden getirilen verinin önbelleğe konması, henüz gerekmeyen satırların gerekli satırları çıkarmasına yol açabilir. Jouppi 1990'da bu sorunu, önceden getirilen satırları önbelleğin dışında, küçük bir akış ara belleğinde (İngilizce: stream buffer) tutarak çözmeyi önerdi. Akış ara belleği bir bulamamayla başlar ve bulamama adresini izleyen satırları sırayla getirir; satırlar önbelleğe ancak gerçekten istendiklerinde aktarılır.[37] Jouppi'nin benzetimlerinde tek bir akış ara belleği buyruk önbelleği bulamamalarının yüzde 72'sini giderebilmiş, ama veri önbelleğinde bu oran yüzde 25'te kalmıştır, çünkü veri erişimleri farklı kaynaklardan gelen iç içe akışlardan oluşur. Dört akış ara belleğinin koşut çalıştığı çok yollu düzen, veri tarafında bulamamaların yüzde 43'ünü gidermiş ve tek akış ara belleğinin başarımını neredeyse iki katına çıkarmıştır. Çıkarılanlar önbellekleri ile akış ara bellekleri birlikte, altı büyük sınama programında birinci düzey önbelleğin bulamama oranını iki ile üç kat azaltmıştır.[37]

Yazılımla önceden getirme

[değiştir | kaynağı değiştir]

Yazılımla önceden getirmede program, kaynak koduna eklenen özel buyruklarla hangi verinin önceden getirileceğini bildirir. x86 işlemcilerinde bu buyruklar, verinin hangi önbellek düzeyine getirileceğini belirten ipuçları alır. En yakın düzeye getirme ipucu, kapsayan önbelleklerde veriyi bütün düzeylere, dışlayan önbelleklerde ise en alt düzeye getirir; bir başka ipucu veriyi ikinci düzeye getirir; zamana yayılmayan veri ipucu ise satırın kısa süre kullanılacağını ve önbelleği kirletmemesi gerektiğini bildirir.[21]:61 Drepper'e göre donanımla önceden getirmenin, erişim örüntülerinin basit olması gerektiği ve sayfa sınırlarını aşamadığı için yetmediği durumlar, yazılımla önceden getirmeyi gerekli kılar; bunun bedeli kaynak kodun değiştirilmesidir.[21]:61

Çok çekirdekli işlemcilerde önbellek

[değiştir | kaynağı değiştir]

Her çekirdeğin kendi özel önbellekleri olduğunda, aynı satırın birden çok çekirdekte kopyası bulunabilir ve bir çekirdeğin yazması ötekilerin kopyalarını eskitir. Bu kopyaları tutarlı tutmak için önbellekler bir tutarlılık protokolü izler. Intel işlemcilerinin kullandığı protokol, her satırın değiştirilmiş (M), özel (E), paylaşılan (S) ya da geçersiz (I) durumlarından birinde bulunduğu MESI protokolüdür; Pentium'un veri önbelleği bu protokolü izliyordu, Sandy Bridge'de ise bütün önbellek düzeylerindeki tutarlılık bu protokolle korunur.[15]:2-2[4]:14-5[3]:2-11 Bir çekirdeğin bulamaması, istenen satır başka bir çekirdeğin önbelleğinde değiştirilmiş olarak duruyorsa o çekirdekten karşılanmalıdır; Sandy Bridge'de böyle bir erişim 60 çevrim sürer.[3]:2-11 Bu yüzden işlemci, her bulamamada bütün çekirdeklere sormamak için hangi satırın nerede bulunduğunu izleyen yapılar kullanır. Kapsayan bir son düzey önbellek bu işi kendiliğinden görür;[52]:152 AMD'nin Zen çekirdeklerinde ise üçüncü düzey önbellek, kümesindeki her çekirdeğin ikinci düzey önbelleğinin etiketlerinin bir kopyasını tutar ve bu kopyaları sorguları süzmek ve satırları çekirdekler arasında hızla aktarmak için kullanır.[5]:25[27]:slayt 20

Yanlış paylaşım

[değiştir | kaynağı değiştir]

Tutarlılık satır düzeyinde korunduğu için, farklı çekirdeklerin aynı satırda duran farklı değişkenlere yazması da satırın çekirdekler arasında sürekli gidip gelmesine yol açar. Intel bu durumu, iş parçacıklarının aynı önbellek satırını paylaşan farklı değişkenlere eriştiğinde ortaya çıkan bir başarım sorunu olarak tanımlar ve yanlış paylaşım (İngilizce: false sharing) diye adlandırır.[7]:3-77 Birden çok iş parçacığı aynı satırdaki farklı değişkenlere yazdığında satır için yarışır; bu da gereksiz geçersiz kılmalara ve güncellemelere, dolayısıyla belirgin bir başarım kaybına yol açar ve sorun, aynı satır için yarışan iş parçacığı sayısı arttıkça ağırlaşır. Intel, veri yapılarının ve bellek yerleşiminin paylaşılan satırlar üzerindeki yarışmayı en aza indirecek biçimde tasarlanmasını önerir; Linux'taki perf c2c aracı, çekirdekler arasındaki önbellekten önbelleğe aktarımları çözümleyerek yanlış paylaşımın yaşandığı satırları bulur.[7]:3-77

Eşzamanlı çoklu iş parçacığı

[değiştir | kaynağı değiştir]

Eşzamanlı çoklu iş parçacığı destekleyen bir çekirdekte iki iş parçacığı, yazmaçlar dışında çekirdeğin bütün kaynaklarını ve bu arada birinci düzey önbellekleri de paylaşır.[21]:35 Percival'in 2005'teki incelemesine göre Pentium 4'ün 64 baytlık 128 satırdan oluşan, 32 kümeli ve dört yollu birinci düzey veri önbelleği iki iş parçacığı arasında tümüyle paylaşılıyordu.[61]:3 Paylaşım, iş parçacıklarından birinin çalışma kümesi büyükse ötekinin önbellekteki satırlarını çıkarabileceği anlamına gelir; aynı paylaşım, güvenlik açısından da sonuçlar doğurur.

Önbellek bölüştürme

[değiştir | kaynağı değiştir]

Paylaşılan son düzey önbellekte bir uygulamanın ötekilerin satırlarını çıkarabilmesi, gerçek zamanlı uygulamalarda yanıt süresini öngörülemez kılabilir; Intel'in beyaz bülteni bu nedenle sistem yöneticisinin önbelleğin bir bölümünü belirli çekirdeklere ayırabilmesini amaçlar.[62]:5 Intel'in Cache Allocation Technology (CAT) adlı düzeneği, işletim sisteminin ya da sanal makine izleyicisinin bir uygulamanın son düzey önbellekte ne kadar yere satır yerleştirebileceğini belirlemesini sağlar. Her hizmet sınıfına bir kapasite bit maskesi atanır; maskeler sınıfların kullanabileceği önbellek bölgelerini ve bu bölgelerin birbiriyle ne ölçüde örtüşeceğini gösterir.[4]:20-52, 20-53 Intel'in beyaz bülteni önbelleğin yollara bölündüğünü ve bu yolların CAT ile çekirdekler arasında paylaştırıldığını açıklar; bölüştürme yalnızca satırların nereye yerleştirileceğini sınırlar, bir çekirdeğin erişimi son düzey önbelleğin herhangi bir yerinde duran bir satırda yine de bulma ile sonuçlanabilir.[62]:5, 9 ARM'ın çekirdek kümelerinde paylaşılan üçüncü düzey önbellek de bölüştürmeyi destekler.[55]:A1-22

Önbellekte bulunan bir veriye erişim, bulunmayan bir veriye erişimden çok daha kısa sürer. Bu süre farkı, bir programın başka bir programın hangi belleğe eriştiğini dolaylı yoldan öğrenmesine olanak verir ve önbelleği bir yan kanal hâline getirir. Bernstein 2005'te bir ağ sunucusundaki AES şifrelemesinin zamanlamasını uzaktan ölçerek anahtarın tamamını elde etmiş ve bir dizinin bir elemanını, süresi elemanın konumuna bağlı olmadan okumanın son derece güç olduğunu göstermiştir. Bernstein'ın uyarısına göre gizli bir veriyi bir dizinin konumu olarak kullanmak felakete davetiyedir.[63]:1-2 Gizli veriye bağlı tablo okumaları yapan şifreleme yazılımları bu nedenle önbellek saldırılarının başlıca hedefidir.[64]:1

Prime+Probe ve Evict+Time

[değiştir | kaynağı değiştir]

Osvik, Shamir ve Tromer 2005'te iki saldırı yöntemini tanımladı. Evict+Time yönteminde saldırgan, kurbanın şifreleme işleminden önce önbellekteki belirli satırları çıkarır ve işlemin süresindeki değişimi ölçer. Prime+Probe yönteminde ise saldırgan önce önbelleği kendi verisiyle doldurur, kurbanın işlemi bittikten sonra kendi verisine erişim sürelerini küme küme ölçer; kurbanın eriştiği kümelerde saldırganın satırları çıkarılmış olacağından bu erişimler bulamamayla sonuçlanır.[64]:9-11 Prime+Probe'un bir üstünlüğü, saldırganın karmaşık bir şifreleme hizmetini değil, kendi yaptığı basit bir işlemi zamanlamasıdır. Yazarlar bu yöntemlerle 128 bitlik bir AES anahtarını Athlon 64'te 300, Pentium 4E'de 16.000 şifrelemeden sonra elde etmiştir.[64]:11, 13

Percival aynı yıl, eşzamanlı çoklu iş parçacığında iki iş parçacığının önbellekleri paylaşmasının hem iş parçacıkları arasında yüksek bant genişlikli bir gizli kanal açtığını hem de kötü niyetli bir iş parçacığının ötekinin çalışmasını izlemesine izin verdiğini gösterdi; birinci düzey veri önbelleği üzerinden kurulan kanal 2,8 GHz'lik bir işlemcide saniyede 400 kilobayt taşıyabiliyordu.[61]:1, 5 Saldırı, OpenSSL'in 1024 bitlik bir RSA işleminde 512 bitlik her üsten tipik olarak yaklaşık 200 bit elde edebilmişti.[61]:6, 8

İlk saldırılar saldırgan ile kurbanın aynı çekirdeği paylaşmasını gerektiriyordu. Liu ve arkadaşları 2015'te Prime+Probe'u, çekirdekler arasında paylaşılan son düzey önbelleğe karşı da uygulanabilir hâle getirdi. Saldırgan, kendi adres alanında son düzey önbelleğin belirli bir kümesine düşen bellek satırlarından bir çıkarma kümesi (İngilizce: eviction set) kurar; Intel'in dilimler arasındaki karma işlevi yayımlanmadığı için yazarlar bu kümeleri çakışan adresleri arayarak bulmuştur. Saldırı, sanal makineler arasında ve saldırgan ile kurbanın belleği paylaşmasına gerek kalmadan GnuPG'nin şifreleme anahtarlarını elde etmiştir.[56]:605, 607-609

Flush+Reload saldırısında bir tur. Saldırgan paylaşılan satırı CLFLUSH ile bütün önbellek düzeylerinden çıkarır, bekler ve satırı yeniden okuyup süreyi ölçer. Kurban beklerken satıra erişmişse okuma kısa sürer ve eşiğin altında kalır (önbellekte bulma), erişmemişse satır bellekten okunur ve süre eşiği aşar.

Yarom ve Falkner'ın 2014'te tanımladığı Flush+Reload saldırısı, saldırgan ile kurbanın aynı fiziksel bellek sayfalarını paylaşmasından yararlanır. Sanal makineleri barındıran sistemler, aynı içerikteki sayfaları birleştirerek bellekten tasarruf eder; bu birleştirme, birbirinden habersiz iki sanal makinenin aynı kütüphane kodunu aynı fiziksel sayfadan çalıştırmasına yol açar.[65]:720, 724 Saldırının her turu üç aşamadan oluşur: saldırgan izlediği bellek satırını önbellek hiyerarşisinden çıkarır, bir süre bekler ve satırı yeniden okuyarak okumanın ne kadar sürdüğünü ölçer. Okuma kısa sürerse satır önbellekte bulunmuştur; bu, kurbanın bekleme süresince o satıra eriştiğini gösterir.[65]:722-723 Satırı çıkarmak için x86'nın CLFLUSH buyruğu kullanılır; bu buyruk satırı paylaşılan son düzey önbellek dahil bütün düzeylerden çıkarır. Saldırı, kapsayan son düzey önbelleğin bir özelliğine dayanır; son düzeyden çıkarılan bir satır öteki bütün düzeylerden de çıkarılır, bu yüzden saldırgan ile kurbanın aynı çekirdekte çalışması gerekmez.[65]:719, 721 Yazarlar bu yöntemle GnuPG'nin RSA anahtarının bitlerinin yüzde 96,7'sini, sanal makineler arasında tek bir imza ya da şifre çözme işlemini izleyerek elde etmiştir.[65]:719-720

Spectre ve Meltdown

[değiştir | kaynağı değiştir]

Spectre ve Meltdown saldırılarında önbellek, gizli veriyi işlemcinin içinden dışarı taşıyan kanal olarak kullanılır. Spectre saldırıları kurbanı, doğru yürütmede hiç yapılmayacak işlemleri öngörüye dayalı olarak yapmaya ve kurbanın gizli bilgisini bir yan kanal üzerinden sızdırmaya yöneltir.[66] Öngörü yanlış çıktığında işlemci yazmaçlardaki sonuçları geri alır, ama önbelleğin içeriği gibi mikromimari durumdaki değişiklikler geri alınmaz. Gizli veriye bağlı bir adresten yapılan öngörüye dayalı bir okuma o adresin satırını önbelleğe getirir; saldırgan da Flush+Reload ya da benzeri bir yöntemle hangi satırın önbellekte olduğunu ölçerek gizli değeri bulur.[66] Meltdown saldırısı da ayrıcalıklı belleği sırasız yürütülen buyruklarla okur ve okunan değeri Flush+Reload üzerinden kurulan bir gizli kanalla dışarı aktarır; yazarlar çekirdek belleğini saniyede 3,2 ile 503 kilobayt arasında bir hızla okuyabildiklerini bildirmiştir.[67]

Karşı önlemler

[değiştir | kaynağı değiştir]

Önbellek saldırılarına karşı önlemler, saldırının dayandığı koşulları ortadan kaldırmayı hedefler. Yarom ve Falkner, sayfa paylaşımının engellenmesinin Flush+Reload'u da engellediğini belirtir.[65]:730 Liu ve arkadaşlarının önerdiği CATalyst, Intel'in yollara dayalı önbellek bölüştürme düzeneği CAT'i kullanarak son düzey önbelleği donanım ve yazılımla birlikte yönetilen bir önbelleğe dönüştürür ve güvenliği önemli sayfaları ayrılmış bir bölgede tutar; yazarlara göre CAT'in kendisi, inceledikleri işlemcilerde yalnızca dört hizmet sınıfına izin verdiği için güvenlik amacıyla tek başına yetersizdir.[68] Qureshi'nin önerdiği CEASER ise önbelleği adresin kendisiyle değil, düşük gecikmeli bir blok şifreyle şifrelenmiş hâliyle dizinler ve şifreleme anahtarını belirli aralıklarla değiştirir; böylece saldırganın hangi adreslerin aynı kümeye düştüğünü bulması güçleşir. Yöntem Prime+Probe gibi çakışmaya dayalı saldırıları hedefler.[69]:775, 777

Çizelge, bazı işlemcilerin önbellek düzenini üreticilerin belgelerinde ve teknik yayınlarda verilen değerlerle özetler. Değerler çekirdek başınadır; aksi belirtilmedikçe satır uzunluğu 64 bayttır. Boş hücreler o düzeyin bulunmadığını ya da kaynakta verilmediğini gösterir.

Bazı işlemcilerin önbellek düzeyleri. y: yol sayısı (ilişkililik), ç: yükle-kullan gecikmesi (çevrim).
İşlemciBirinci düzey buyrukBirinci düzey veriİkinci düzeyÜçüncü düzey
Motorola MC68020256 B, doğrudan eşlemeli[10]:7-1
Motorola MC68030256 B, 16 baytlık 16 girdi256 B, doğrudan yazmalı[11]:1-16, 6-1
Intel i4868 KB ortak, 4y, 16 baytlık satır, doğrudan yazmalı[14]:12, 73
Intel Pentium8 KB, 2y, 32 baytlık satır8 KB, 2y, 32 baytlık satır, geri ya da doğrudan yazmalı[15]:2-2
Intel Pentium Pro8 KB8 KB256 KB, aynı pakette ayrı kırmık[16]:1-1
Intel Pentium II16 KB16 KB512 KB, kartuşta, işlemcinin yarı hızında[17]:1, 7
Intel Pentium 4iz önbelleği, 12.000 mikro işlem8 KB, 4y256 KB, 8y, 128 baytlık satır[35]
DEC Alpha 211648 KB, doğrudan eşlemeli8 KB, doğrudan eşlemeli, doğrudan yazmalı96 KB, 3y, yonga üstü1-64 MB, yonga dışı, isteğe bağlı[18]:34
IBM POWER464 KB, doğrudan eşlemeli, 128 baytlık satır32 KB, 2y, 128 baytlık satıriki çekirdeğe 1,5 MB, 8y32 MB, 8y, 512 baytlık satır, yonga dışı gömülü DRAM[20]:15, 18
IBM POWER732 KB32 KB256 KBsekiz çekirdeğe 32 MB, yonga üstü gömülü DRAM[22]:slayt 4, 7
Intel Sandy Bridge32 KB, 8y32 KB, 8y, 4ç256 KB, 8y, 12çpaylaşılan, kapsayan, 26-31ç[3]:2-11
Intel Skylake (istemci)32 KB, 8y32 KB, 8y, 4ç256 KB, 4y, 12çpaylaşılan, çekirdek başına 2 MB'a kadar, 16y'ye kadar, 44ç[7]:2-36
Intel Skylake (sunucu)32 KB, 8y, 4-6ç1 MB, 16y, 14çpaylaşılan, ne kapsayan ne dışlayan, çekirdek başına 1,375 MB, 50-70ç[7]:2-27, 2-28
AMD Zen64 KB, 4y32 KB, 8y, 4-5ç512 KB, 8y, 12ç'den az değildört çekirdeğe 4 ya da 8 MB, 16y, ortalama 35ç[5]:23, 25
AMD Zen 332 KB, 8y32 KB, 8y512 KB, 8y, 12ç'den az değilsekiz çekirdeğe 32 MB'a kadar, 16y, ortalama 46ç[6]:24, 26
AMD Zen 432 KB, 8y32 KB, 8y, 4-5ç1 MB, 14ç'den az değilsekiz çekirdeğe 32 MB'a kadar, ortalama 50ç[41]:16, 18
AMD Zen 532 KB, 8y48 KB, 12y1 MB, 16y, 14ç'den az değil96 MB'a kadar, 16y, ortalama 46ç[38]:19, 20, 23
ARM Cortex-A7664 KB, 4y64 KB, 4y128, 256 ya da 512 KB, 8y[34]:A2-36, A2-37kümede paylaşılan, 512 KB-4 MB, 16y[55]:A1-22, A1-24
IBM Telum32 MB, 19çsanal, 256 MB[31]:slayt 5-6

Önbellek tasarımında ödünleşimler

[değiştir | kaynağı değiştir]

Önbellek tasarımı, birbiriyle çatışan birkaç ölçünün dengelenmesidir. Mahapatra ve Venkatrao'nun özetlediği gibi küçük bellek daha hızlıdır, çünkü büyük bellekte sinyal gecikmesi uzar ve adresin çözülmesi daha çok aşama gerektirir; önbellekler bu yüzden statik rastgele erişimli bellekten (SRAM), ana bellek ise daha yoğun ama daha yavaş DRAM'den yapılır.[32] Banakar ve arkadaşlarının alan ve enerji modelinde de bellek hücresi altı transistörlü bir statik RAM hücresidir.[59]

Bir önbellek dizisinden okuma, kod çözücünün bir sözcük hattını sürmesi, seçilen satırdaki hücrelerin önceden yüksek düzeye çekilmiş bit hatlarından birini aşağı çekmesi ve bu değişimin algılanmasıyla yapılır. Wilton ve Jouppi'nin modelinde tasarımcı diziyi düşey ve yatay kesimlerle alt dizilere bölerek sözcük hatlarını ve bit hatlarını kısaltabilir; alt dizilerin sayısı bu iki bölmenin çarpımıdır.[33]:2, 4 Muralimanohar ve arkadaşlarının modeli bu iki birimi birbirinden ayırır: koşut olarak erişilebilen bölmeler aynı anda farklı istekleri karşılayabilir, bir bölmenin içindeki alt diziler ise yalnızca tek bir erişimi destekler. Aynı çalışmaya göre büyük önbelleklerin özelliklerini öncelikle bölmeleri birbirine bağlayan ağ belirler.[51]:3 Bu kararları değerlendirmek için önbellek erişim süresini çözümsel olarak hesaplayan modeller kullanılır; Wilton ve Jouppi'nin modeli, devre benzetimiyle elde edilen sonuçların yüzde 10'u içinde kalan ve devre benzetiminden 100.000 kat daha hızlı sonuç veren bir yöntem olarak sunulmuştur.[33]:51

Enerji tüketimi de önbellek düzenini belirler. Banakar ve arkadaşlarının aktardığına göre yonga üstü SRAM önbellekleri toplam yonga gücünün yüzde 25 ile 45'ini tüketebilir.[59] Kümeli ilişkili bir önbellekte bütün yolların koşut olarak okunması erişimi hızlandırır ama okunan verinin çoğu boşa gider; yol öngörüsü, mikro etiketler ve ardışık erişim bu bedeli azaltan yöntemlerdir.[40]:54[5]:24

Bellek teknolojisinin seçimi kapasite ile hız arasındaki dengeyi değiştirir. IBM, POWER7'nin yonga üstündeki 32 MB'lık üçüncü düzey önbelleğini gömülü DRAM ile yapmış ve 1,2 milyar transistörlük yonganın, gömülü DRAM'in verimliliği sayesinde 2,7 milyar transistörlük bir tasarımın işlevini gördüğünü belirtmiştir.[22]:slayt 4 Üç boyutlu yığma ise önbelleği büyütmek için işlemci kırmığının alanını büyütmek yerine, ayrı bir kırmığı onun üstüne bağlamaya olanak verir; AMD'nin 3D V-Cache'i 74 mm²'lik hesaplama yongacığının üçüncü düzey önbelleğini 32 MB'tan 96 MB'a çıkarmıştır.[27]:slayt 21[29]

Ayrıca bakınız

[değiştir | kaynağı değiştir]
  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Smith, Alan Jay (1982). "Cache Memories". ACM Computing Surveys (İngilizce). 14 (3). ss. 473-530. doi:10.1145/356887.356892.
  2. 1 2 3 4 5 6 7 Liptay, J. S. (1968). "Structural aspects of the System/360 Model 85, II: The cache" (PDF). IBM Systems Journal (İngilizce). 7 (1). ss. 15-21. doi:10.1147/sj.71.001524 Ekim 2026.
  3. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 "Optimizing Earlier Generations of Intel 64 and IA-32 Processor Architectures, Throughput, and Latency". Intel 64 and IA-32 Architectures Optimization Reference Manual, Volume 2, belge no. 356477-050US (İngilizce). Intel Corporation. Nisan 2024. Erişim tarihi: 24 Ekim 2026.
  4. 1 2 3 4 5 6 7 8 9 10 "Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3: System Programming Guide". Belge no. 325384-093US (İngilizce). Intel Corporation. Eylül 2026. Erişim tarihi: 24 Ekim 2026.
  5. 1 2 3 4 5 6 7 8 9 10 11 12 "Software Optimization Guide for AMD EPYC 7001 Processors" (PDF). Yayın no. 55723, sürüm 3.00 (İngilizce). Advanced Micro Devices. Haziran 2017. 8 Mart 2023 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 24 Ekim 2026.
  6. 1 2 3 4 5 "Software Optimization Guide for AMD EPYC 7003 Processors". Yayın no. 56665, sürüm 3.00 (İngilizce). Advanced Micro Devices. Kasım 2020. 9 Temmuz 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Ekim 2026.
  7. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 "Intel 64 and IA-32 Architectures Optimization Reference Manual: Volume 1". Belge no. 248966-051US (İngilizce). Intel Corporation. Ekim 2026. Erişim tarihi: 24 Ekim 2026.
  8. 1 2 3 Wulf, Wm. A.; McKee, Sally A. (1995). "Hitting the memory wall: implications of the obvious". ACM SIGARCH Computer Architecture News (İngilizce). 23 (1). ss. 20-24. doi:10.1145/216585.216588.
  9. ↑ Wilkes, Maurice V. (1965). "Slave Memories and Dynamic Storage Allocation". IEEE Transactions on Electronic Computers (İngilizce). EC-14 (2). ss. 270-271. doi:10.1109/PGEC.1965.264263.
  10. 1 2 3 MC68020 32-Bit Microprocessor User's Manual (PDF) (İngilizce). Motorola. 1984. Erişim tarihi: 24 Ekim 2026.
  11. 1 2 3 4 MC68030 Enhanced 32-Bit Microprocessor User's Manual (PDF) (İngilizce) (3 bas.). Motorola. 1990. Erişim tarihi: 24 Ekim 2026.
  12. ↑ Denning, Peter J. (2005). "The Locality Principle". Communications of the ACM (İngilizce). 48 (7). ss. 19-24. doi:10.1145/1070838.1070856.
  13. 1 2 3 "82385 High Performance 32-Bit Cache Controller" (PDF). Belge no. 290143-004 (İngilizce). Intel Corporation. Kasım 1989. Erişim tarihi: 24 Ekim 2026.
  14. 1 2 3 4 5 6 7 8 9 "i486 Microprocessor" (PDF) (İngilizce). Intel Corporation. Kasım 1989. Erişim tarihi: 24 Ekim 2026.
  15. 1 2 3 4 5 6 7 8 9 10 "Pentium Processor User's Manual, Volume 1: Pentium Processor Data Book" (PDF). Belge no. 241428 (İngilizce). Intel Corporation. 1993. Erişim tarihi: 24 Ekim 2026.
  16. 1 2 3 "Pentium Pro Processor at 150 MHz" (PDF). Pentium and Pentium Pro Processors and Related Products, belge no. 241732-003 (İngilizce). Intel Corporation. 1996. Erişim tarihi: 24 Ekim 2026.
  17. 1 2 "Pentium II Processor at 233, 266, 300, and 333 MHz" (PDF). Belge no. 243335-003 (İngilizce). Intel Corporation. Ocak 1998. 21 Eylül 2016 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 24 Ekim 2026.
  18. 1 2 3 4 Edmondson, John H.; Rubinfeld, Paul; Preston, Ronald (1995). "Superscalar Instruction Execution in the 21164 Alpha Microprocessor". IEEE Micro (İngilizce). 15 (2). ss. 33-43. doi:10.1109/40.372349.
  19. 1 2 Kessler, R. E. (1999). "The Alpha 21264 Microprocessor". IEEE Micro (İngilizce). 19 (2). ss. 24-36. doi:10.1109/40.755465.
  20. 1 2 3 4 5 6 Tendler, J. M.; Dodson, J. S.; Fields, J. S.; Le, H.; Sinharoy, B. (2002). "POWER4 system microarchitecture". IBM Journal of Research and Development (İngilizce). 46 (1). ss. 5-25. doi:10.1147/rd.461.0005.
  21. 1 2 3 4 5 6 7 8 9 10 11 12 13 Drepper, Ulrich (2007). "What Every Programmer Should Know About Memory" (PDF) (İngilizce). Red Hat. 11 Aralık 2019 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 24 Ekim 2026.
  22. 1 2 3 Kalla, Ron; Sinharoy, Balaram (2009). "POWER7: IBM's Next Generation Server Processor" (PDF). Hot Chips 21 (İngilizce). IBM. Erişim tarihi: 24 Ekim 2026.
  23. 1 2 Starke, William (2009). "POWER7: IBM's Next Generation, Balanced POWER Server Chip" (PDF). Hot Chips 21 (İngilizce). IBM. Erişim tarihi: 24 Ekim 2026.
  24. ↑ "Intel Core i7-5775C Processor: Specifications". Intel ARK (İngilizce). Intel Corporation. Erişim tarihi: 24 Ekim 2026.
  25. 1 2 Suggs, David; Bouvier, Dan (19 Ağustos 2019). "Zen 2" (PDF). Hot Chips 31 (İngilizce). Advanced Micro Devices. Erişim tarihi: 24 Ekim 2026.
  26. ↑ "AMD Showcases Industry-Leading Innovation Across the High-Performance Computing Ecosystem at COMPUTEX 2021" (İngilizce). Advanced Micro Devices. Haziran 2021. Erişim tarihi: 24 Ekim 2026.
  27. 1 2 3 4 Evers, Mark; Barnes, Leslie; Clark, Mike (Ağustos 2021). "Next Generation "Zen 3" Core" (PDF). Hot Chips 33 (İngilizce). Advanced Micro Devices. Erişim tarihi: 24 Ekim 2026.
  28. ↑ "AMD Presents Latest High-Performance Computing Technologies in 2022 Product Premiere Livestream" (İngilizce). Advanced Micro Devices. 4 Ocak 2022. Erişim tarihi: 24 Ekim 2026.
  29. 1 2 "AMD Ryzen 7 5800X3D" (İngilizce). Advanced Micro Devices. 21 Eylül 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Ekim 2026.
  30. ↑ "3rd Gen AMD EPYC Processors with AMD 3D V-Cache Technology Deliver Outstanding Leadership Performance in Technical Computing Workloads" (İngilizce). Advanced Micro Devices. 21 Mart 2022. Erişim tarihi: 24 Ekim 2026.
  31. 1 2 Jacobi, Christian (2021). "Real-time AI for Enterprise Workloads: the IBM Telum Processor" (PDF). Hot Chips 33 (İngilizce). IBM. Erişim tarihi: 24 Ekim 2026.
  32. 1 2 3 4 5 Mahapatra, Nihar R.; Venkatrao, Balakrishna (1999). "The Processor-Memory bottleneck: Problems and Solutions". ACM Crossroads (İngilizce). Association for Computing Machinery. 19 Mayıs 2010 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Ekim 2026.
  33. 1 2 3 4 5 6 7 Wilton, Steven J. E.; Jouppi, Norman P. (Temmuz 1994). "An Enhanced Access and Cycle Time Model for On-Chip Caches" (PDF). WRL Research Report 93/5 (İngilizce). Digital Equipment Corporation Western Research Laboratory. Erişim tarihi: 24 Ekim 2026.
  34. 1 2 3 4 5 "Arm Cortex-A76 Core Technical Reference Manual, r3p1". Belge no. 100798_0301_00_en (İngilizce). Arm Limited. 2018. Erişim tarihi: 24 Ekim 2026.
  35. 1 2 3 4 5 Hinton, Glenn; Sager, Dave; Upton, Mike; Boggs, Darrell; Carmean, Doug; Kyker, Alan; Roussel, Patrice (2001). "The Microarchitecture of the Pentium 4 Processor" (PDF). Intel Technology Journal (İngilizce), Q1. 24 Şubat 2008 tarihinde kaynağından (PDF) arşivlendi24 Ekim 2026.
  36. 1 2 3 4 Hill, Mark D.; Smith, Alan Jay (1989). "Evaluating Associativity in CPU Caches". IEEE Transactions on Computers (İngilizce). 38 (12). ss. 1612-1630. doi:10.1109/12.40842.
  37. 1 2 3 4 5 6 Jouppi, Norman P. (Mart 1990). "Improving Direct-Mapped Cache Performance by the Addition of a Small Fully-Associative Cache and Prefetch Buffers" (PDF). WRL Technical Note TN-14 (İngilizce). Digital Equipment Corporation Western Research Laboratory. Erişim tarihi: 24 Ekim 2026.
  38. 1 2 3 4 "Software Optimization Guide for the AMD Zen5 Microarchitecture". Yayın no. 58455, sürüm 1.00 (İngilizce). Advanced Micro Devices. Ağustos 2024. 8 Nisan 2025 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Ekim 2026.
  39. 1 2 3 Seznec, André; Bodin, François (Nisan 1992). "Skewed-associative caches". INRIA Research Report RR-1655 (İngilizce). INRIA. Erişim tarihi: 24 Ekim 2026.
  40. 1 2 3 4 Powell, Michael D.; Agarwal, Amit; Vijaykumar, T. N.; Falsafi, Babak; Roy, Kaushik (2001). Reducing set-associative cache energy via way-prediction and selective direct-mapping. 34th Annual IEEE/ACM International Symposium on Microarchitecture (MICRO-34) (İngilizce). ss. 54-65. doi:10.1109/MICRO.2001.991105.
  41. 1 2 3 4 5 6 7 "Software Optimization Guide for the AMD Zen4 Microarchitecture". Yayın no. 57647, sürüm 1.00 (İngilizce). Advanced Micro Devices. Ocak 2023. 16 Aralık 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Ekim 2026.
  42. 1 2 3 4 5 6 7 Jaleel, Aamer; Theobald, Kevin B.; Steely, Simon C.; Emer, Joel (2010). High performance cache replacement using re-reference interval prediction (RRIP). 37th Annual International Symposium on Computer Architecture (ISCA '10) (İngilizce). ss. 60-71. doi:10.1145/1815961.1815971.
  43. 1 2 3 Al-Zoubi, Hussein; Milenkovic, Aleksandar; Milenkovic, Milena (2004). Performance evaluation of cache replacement policies for the SPEC CPU2000 benchmark suite. 42nd Annual ACM Southeast Regional Conference (İngilizce). ss. 267-272. doi:10.1145/986537.986601.
  44. 1 2 3 4 Qureshi, Moinuddin K.; Jaleel, Aamer; Patt, Yale N.; Steely, Simon C.; Emer, Joel (2007). Adaptive insertion policies for high performance caching. 34th Annual International Symposium on Computer Architecture (ISCA '07) (İngilizce). ss. 381-391. doi:10.1145/1250662.1250709.
  45. 1 2 3 4 5 6 7 8 9 Jouppi, Norman P. (Aralık 1991). "Cache Write Policies and Performance" (PDF). WRL Research Report 91/12 (İngilizce). Digital Equipment Corporation Western Research Laboratory. Erişim tarihi: 24 Ekim 2026.
  46. ↑ Kroft, David (1981). Lockup-free instruction fetch/prefetch cache organization (PDF). 8th Annual Symposium on Computer Architecture (ISCA '81) (İngilizce). ss. 81-87. Erişim tarihi: 24 Ekim 2026.
  47. 1 2 Farkas, Keith I.; Jouppi, Norman P. (Mart 1994). "Complexity/Performance Tradeoffs with Non-Blocking Loads" (PDF). WRL Research Report 94/3 (İngilizce). Digital Equipment Corporation Western Research Laboratory. Erişim tarihi: 24 Ekim 2026.
  48. 1 2 3 "Cache and TLB Flushing Under Linux". The Linux Kernel documentation (İngilizce). Erişim tarihi: 24 Ekim 2026.
  49. 1 2 3 Wang, Wen-Hann; Baer, Jean-Loup; Levy, Henry M. (1989). Organization and performance of a two-level virtual-real cache hierarchy. 16th Annual International Symposium on Computer Architecture (ISCA '89) (İngilizce). ss. 140-148. doi:10.1145/74925.74942.
  50. 1 2 3 Kessler, R. E.; Hill, Mark D. (1992). "Page placement algorithms for large real-indexed caches". ACM Transactions on Computer Systems (İngilizce). 10 (4). ss. 338-359. doi:10.1145/138873.138876.
  51. 1 2 3 Muralimanohar, Naveen; Balasubramonian, Rajeev; Jouppi, Norman P. (2009). "CACTI 6.0: A Tool to Model Large Caches" (PDF). HPL-2009-85 (İngilizce). HP Laboratories. 29 Ağustos 2017 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 24 Ekim 2026.
  52. 1 2 3 4 5 Jaleel, Aamer; Borch, Eric; Bhandaru, Malini; Steely, Simon C.; Emer, Joel (2010). Achieving Non-Inclusive Cache Performance with Inclusive Caches: Temporal Locality Aware (TLA) Cache Management Policies. 43rd Annual IEEE/ACM International Symposium on Microarchitecture (MICRO-43) (İngilizce). ss. 151-162. doi:10.1109/MICRO.2010.52.
  53. ↑ Krewell, Kevin (26 Haziran 2000). "Duron Takes On Celeron" (PDF). Microprocessor Report (İngilizce)24 Ekim 2026.
  54. ↑ Krewell, Kevin (15 Mayıs 2000). "AMD Brands Spitfire: Duron" (PDF). Microprocessor Report (İngilizce)24 Ekim 2026.
  55. 1 2 3 4 "Arm DynamIQ Shared Unit Technical Reference Manual, r3p0". Belge no. 100453_0300_00_en (İngilizce). Arm Limited. 2018. Erişim tarihi: 24 Ekim 2026.
  56. 1 2 Liu, Fangfei; Yarom, Yuval; Ge, Qian; Heiser, Gernot; Lee, Ruby B. (2015). Last-Level Cache Side-Channel Attacks are Practical. 2015 IEEE Symposium on Security and Privacy (İngilizce). ss. 605-622. doi:10.1109/SP.2015.43.
  57. ↑ Starke, William; Thompto, Brian (Ağustos 2020). "IBM's POWER10 Processor" (PDF). Hot Chips 32 (İngilizce). IBM. Erişim tarihi: 24 Ekim 2026.
  58. 1 2 Rotenberg, Eric; Bennett, Steve; Smith, James E. (1996). Trace cache: a low latency approach to high bandwidth instruction fetching. 29th Annual IEEE/ACM International Symposium on Microarchitecture (MICRO-29) (İngilizce). ss. 24-34. doi:10.1109/MICRO.1996.566447.
  59. 1 2 3 4 Banakar, Rajeshwari; Steinke, Stefan; Lee, Bo-Sik; Balakrishnan, M.; Marwedel, Peter (2002). Scratchpad memory: a design alternative for cache on-chip memory in embedded systems. 10th International Symposium on Hardware/Software Codesign (CODES 2002) (İngilizce). ss. 73-78. doi:10.1145/774789.774805.
  60. ↑ "ARM Cortex-M7 Processor Technical Reference Manual, r1p1". Belge no. ARM DDI 0489D (İngilizce). ARM Limited. 2015. Erişim tarihi: 24 Ekim 2026.
  61. 1 2 3 Percival, Colin (2005). "Cache Missing for Fun and Profit" (PDF) (İngilizce). Erişim tarihi: 24 Ekim 2026.
  62. 1 2 "Improving Real-Time Performance by Utilizing Cache Allocation Technology" (PDF). Beyaz bülten, belge no. 331843-001US (İngilizce). Intel Corporation. Nisan 2015. Erişim tarihi: 24 Ekim 2026.
  63. ↑ Bernstein, Daniel J. (14 Nisan 2005). "Cache-timing attacks on AES" (PDF) (İngilizce). Erişim tarihi: 24 Ekim 2026.
  64. 1 2 3 Osvik, Dag Arne; Shamir, Adi; Tromer, Eran (20 Kasım 2005). "Cache Attacks and Countermeasures: the Case of AES" (PDF) (İngilizce). Erişim tarihi: 24 Ekim 2026.
  65. 1 2 3 4 5 Yarom, Yuval; Falkner, Katrina (2014). FLUSH+RELOAD: A High Resolution, Low Noise, L3 Cache Side-Channel Attack (PDF). 23rd USENIX Security Symposium (İngilizce). ss. 719-732. Erişim tarihi: 24 Ekim 2026.
  66. 1 2 Kocher, Paul; Horn, Jann; Fogh, Anders; Genkin, Daniel (2019). Spectre Attacks: Exploiting Speculative Execution (PDF). 2019 IEEE Symposium on Security and Privacy (İngilizce). ss. 1-19. doi:10.1109/SP.2019.00002. Erişim tarihi: 24 Ekim 2026.
  67. ↑ Lipp, Moritz; Schwarz, Michael; Gruss, Daniel (2018). Meltdown: Reading Kernel Memory from User Space (PDF). 27th USENIX Security Symposium (İngilizce). Erişim tarihi: 24 Ekim 2026.
  68. ↑ Liu, Fangfei; Ge, Qian; Yarom, Yuval (2016). CATalyst: Defeating Last-Level Cache Side Channel Attacks in Cloud Computing. 2016 IEEE International Symposium on High Performance Computer Architecture (HPCA) (İngilizce). ss. 406-418. doi:10.1109/HPCA.2016.7446082.
  69. ↑ Qureshi, Moinuddin K. (2018). CEASER: Mitigating Conflict-Based Cache Attacks via Encrypted-Address and Remapping. 51st Annual IEEE/ACM International Symposium on Microarchitecture (MICRO-51) (İngilizce). ss. 775-787. doi:10.1109/MICRO.2018.00068.

Dış bağlantılar

[değiştir | kaynağı değiştir]