Modern bir işlemcideki bellek alt sistemi, belleğe, kelime boyutunun ayrıntı düzeyinde ve hizasında erişmesi ile sınırlıdır; bu birkaç nedenden ötürü böyledir.
hız
Modern işlemciler, verilerin alınması gereken çok sayıda önbellek düzeyine sahiptir; tek baytlık okumaların desteklenmesi, bellek alt sistemi çıktısını yürütme birimi çıktısına sıkıca bağlı hale getirir (cpu-bağlı olarak da bilinir); tüm bunlar, PIO modunun sabit sürücülerdeki aynı nedenlerden ötürü DMA tarafından nasıl aşıldığını anımsatıyor .
CPU her zaman kelime boyutunda (32 bit işlemcide 4 bayt) okur, bu nedenle hizalanmamış bir adres erişimi yaptığınızda - bunu destekleyen bir işlemcide - işlemci birden çok kelime okuyacaktır. CPU, istediğiniz adresin katlandığı her bellek sözcüğünü okuyacaktır. Bu, istenen verilere erişmek için gereken bellek işlemi sayısının 2 katına kadar yükselmesine neden olur.
Bu nedenle, dört bayttan iki baytı okumak çok daha yavaş olabilir. Örneğin, bellekte şöyle görünen bir yapınız olduğunu varsayalım:
struct mystruct {
char c; // one byte
int i; // four bytes
short s; // two bytes
}
32 bit işlemcide büyük olasılıkla burada gösterildiği gibi hizalanacaktır:
İşlemci bu üyelerin her birini tek bir işlemde okuyabilir.
Diyelim ki yapının paketlenmiş bir versiyonuna sahipsiniz, belki de iletim verimliliği için paketlendiği ağdan; şöyle görünebilir:
İlk baytı okumak aynı olacak.
İşlemciden 0x0005'ten 16 bit vermesini istediğinizde 0x0004'ten bir kelime okumalı ve 16 bitlik bir kayıt defterine yerleştirmek için 1 bayt sola kaydırmalısınız; bazı ekstra işler, ancak çoğu bunu bir döngüde halledebilir.
0x0001'den 32 bit istediğinde 2X amplifikasyon elde edersiniz. İşlemci, 0x0000'den sonuç yazmacına okuyacak ve 1 bayt sola kaydıracak, daha sonra 0x0004'ten geçici bir sicile tekrar okuyacak, 3 bayt sağa kaydıracak, daha sonra OR
sonuç yazmacı ile olacaktır.
Aralık
Herhangi bir adres alanı için, mimari 2 LSB'nin her zaman 0 olduğunu varsayabilirse (örn. 32 bit makineler) 4 kat daha fazla belleğe erişebilir (kaydedilen 2 bit 4 farklı durumu temsil edebilir) veya aynı miktar bayrak gibi bir şey için 2 bit bellek. 2 LSB'yi bir adresten çıkarmak size 4 baytlık bir hizalama sağlar; 4 baytlık bir adım olarak da adlandırılır . Bir adres her artırıldığında, 0 biti değil de bit 2'yi etkili bir şekilde arttırır, yani son 2 bit her zaman olmaya devam edecektir 00
.
Bu, sistemin fiziksel tasarımını bile etkileyebilir. Adres veri yolunun 2 daha az bite ihtiyacı varsa, CPU'da 2 daha az pin ve devre kartında 2 daha az iz olabilir.
Atomsallık
CPU, hizalanmış bir bellek sözcüğü üzerinde atomik olarak çalışabilir, yani başka hiçbir talimat bu işlemi kesintiye uğratamaz. Bu, birçok kilitsiz veri yapısının ve diğer eşzamanlılık paradigmalarının doğru çalışması için kritiktir .
Sonuç
Bir işlemcinin bellek sistemi burada tarif edilenden biraz daha karmaşıktır ve dahil edilmiştir; bir x86 işlemcinin gerçekte belleği nasıl ele aldığını tartışmak yardımcı olabilir (birçok işlemci benzer şekilde çalışır).
Bu IBM makalesinde okuyabileceğiniz bellek hizalamasına bağlı kalmanın daha birçok avantajı vardır .
Bilgisayarın birincil kullanımı verileri dönüştürmektir. Modern bellek mimarileri ve teknolojileri, daha güvenilir, daha fazla veri girişi, çıkışı ve arasında daha fazla ve daha hızlı yürütme birimleri elde etmek için on yıllar boyunca optimize edilmiştir.
Bonus: Önbellekler
Daha önce bahsettiğim performans için başka bir hizalama (örneğin, bazı CPU'larda) önbellek hatlarında hizalamadır (örneğin, bazı CPU'larda).
Önbelleklerden yararlanarak ne kadar performans elde edilebileceği hakkında daha fazla bilgi için İşlemci Önbellek Efektleri Galerisi'ne bakın ; Bundan önbellek satırı boyutlarına soru
Önbellek satırlarını anlamak, belirli program optimizasyonu türleri için önemli olabilir. Örneğin, verilerin hizalanması, bir işlemin bir veya iki önbellek satırına dokunup dokunmadığını belirleyebilir. Yukarıdaki örnekte gördüğümüz gibi, bu, yanlış hizalanmış durumda, işlemin iki kat daha yavaş olacağı anlamına gelebilir.