Відповіді:
Насправді є кілька причин.
По-перше, і, мабуть, головне, що дані, що зберігаються в кеші інструкцій, як правило, дещо відрізняються, ніж ті, що зберігаються в кеш-даних - поряд із самими інструкціями є анотації до таких речей, як де починається наступна інструкція, щоб допомогти декодерам. Деякі процесори (напр., Netburst, деякі SPARC) використовують "кеш слідів", який зберігає результат декодування інструкції, а не зберігає оригінальну інструкцію в її закодованому вигляді.
По-друге, це трохи спрощує схему - кеш даних повинен мати справу з читанням і записом, але кеш інструкцій стосується лише зчитування. (Це частина того, чому самовиправляючий код такий дорогий - замість того, щоб безпосередньо перезаписати дані в кеш інструкцій, запис переходить через кеш даних у кеш L2, а потім рядок у кеш-інструкціях недійсний і повторно -завантажений з L2).
По-третє, це збільшує пропускну здатність: більшість сучасних процесорів можуть одночасно читати дані з кеша інструкцій та кешу даних. Більшість також мають черги біля "входу" в кеш, тому вони можуть зробити два читання та одне записування в будь-якому заданому циклі.
По-четверте, це може заощадити енергію. Хоча вам потрібно підтримувати живлення самих комірок пам'яті, щоб підтримувати їх вміст, деякі процесори можуть / вимикати частину пов'язаної схеми (декодери тощо), коли вони не використовуються. За допомогою окремих кеш-пам'ять вони можуть живити ці схеми окремо для отримання інструкцій та даних, збільшуючи шанси на те, що ланцюг залишиться без живлення протягом будь-якого даного циклу (я не впевнений, що будь-які процесори x86 роблять це - AFAIK, це більше ARM річ).
Так само, як і нерухомість, використання кешу керується трьома речами: місцеположенням, розташуванням, розташуванням. Вся суть кешу в тому, що більшість програм демонструють шаблони розташування: якщо вони отримують доступ до байту 1111111, то наступний байт, до якого вони отримають доступ, - це, ймовірно, 1111110 або 1111112, і не так багато байт 9999999. Однак більшість програм демонструватимуть дуже різні схеми розташування їх інструкцій та їх даних. Це означає, що інструкції та дані навряд чи зможуть ефективно ділитися кешем. Тому що в пам'яті вказівки та дані не обов'язково знаходяться поблизу. Доступ до даних збільшить інструкції з кеша, а інструкції щодо завантаження збільшать дані з кеша.