Yanıtlar:
Aslında birkaç neden var.
Öncelikle ve muhtemelen en önemlisi, talimat önbelleğinde depolanan veriler genellikle veri önbelleğinde depolanandan biraz farklıdır - talimatların kendileri ile birlikte, bir sonraki talimatın başladığı yerler için kod çözücülere yardımcı olmak için ek açıklamalar vardır. Bazı işlemciler (örneğin, Netburst, bazı SPARC'lar), orijinal talimatı kodlanmış biçiminde saklamak yerine, bir talimatın kodunun çözülmesinin sonucunu saklayan bir "iz önbelleği" kullanır.
İkincisi, devreyi biraz basitleştirir - veri önbelleğinin okuma ve yazma işlemleriyle ilgilenmesi gerekir, ancak komut önbelleği yalnızca okuma ile ilgilidir. (Bu, kod değiştirmenin neden bu kadar pahalı olduğunun bir parçasıdır - talimat önbelleğindeki verilerin üzerine doğrudan yazmak yerine, yazma işlemi veri önbelleğindeki L2 önbelleğine gider ve daha sonra önbellekteki satır geçersiz olur ve yeniden L2'den yüklendi).
Üçüncüsü, bant genişliğini arttırır: çoğu modern işlemci, komut önbelleğindeki ve veri önbelleğindeki verileri aynı anda okuyabilir. Birçoğunun önbelleğe "girişinde" sıraları da vardır, bu nedenle herhangi bir döngüde iki okuma ve bir yazma yapabilirler.
Dördüncü olarak, güç tasarrufu sağlayabilir. İçeriklerini korumak için bellek hücrelerinin kendi güçlerini korumanız gerekirken, bazı işlemciler kullanılmadıkları zaman ilişkili devrelerin bir kısmını (kod çözücüler vb.) Kapatıp açabilirler. Ayrı önbelleklerle, bu devreleri talimatlar ve veriler için ayrı ayrı açabilirler, herhangi bir döngüde güçsüz kalma şansını artırabilirler (x86 işlemcilerin bunu yaptığından emin değilim - AFAIK, daha çok ARM şey).
Emlak gibi, önbellek kullanımı da üç şey tarafından yönlendirilir: konum, konum, konum. Bir önbelleğe sahip olmanın asıl amacı çoğu programın konum modellerini göstermesidir: 1111111 baytına erişirlerse, bir sonraki bayt erişecekleri muhtemelen 1111110 veya 1111112 olur ve 9999999 çok fazla bayt olmaz. Ancak, çoğu program çok farklı sergiler talimatları ve verileri için konum örnekleri. Bu, talimatların ve verilerin önbelleği verimli bir şekilde paylaşabilmelerinin olası olmadığı anlamına gelir. Çünkü talimatlar ve veriler mutlaka bellekte birbirine yakın değildir. Bir veri erişimi önbellekten gelen talimatlara çarpacak ve yükleme yönergeleri önbellekteki verileri de çarpacak.