Jawaban:
Sebenarnya ada beberapa alasan.
Pertama dan mungkin yang paling utama, data yang disimpan dalam cache instruksi umumnya agak berbeda dari apa yang disimpan dalam cache data - bersama dengan instruksi itu sendiri, ada penjelasan untuk hal-hal seperti di mana instruksi berikutnya dimulai, untuk membantu decoder. Beberapa prosesor (Misalnya, Netburst, beberapa SPARC) menggunakan "jejak cache", yang menyimpan hasil penguraian suatu instruksi daripada menyimpan instruksi asli dalam bentuk yang disandikan.
Kedua, ini sedikit menyederhanakan sirkuit - cache data harus berurusan dengan membaca dan menulis, tetapi cache instruksi hanya berurusan dengan membaca. (Ini adalah bagian dari mengapa kode modifikasi sendiri sangat mahal - alih-alih langsung menimpa data dalam cache instruksi, penulisan berjalan melalui cache data ke cache L2, dan kemudian baris dalam cache instruksi dibatalkan dan re -diisi dari L2).
Ketiga, meningkatkan bandwidth: kebanyakan prosesor modern dapat membaca data dari cache instruksi dan cache data secara bersamaan. Sebagian besar juga memiliki antrian di "pintu masuk" ke cache, sehingga mereka benar-benar dapat melakukan dua membaca dan satu menulis dalam siklus tertentu.
Keempat, ini bisa menghemat daya. Meskipun Anda perlu mempertahankan daya ke sel-sel memori sendiri untuk mempertahankan isinya, beberapa prosesor dapat / mematikan daya beberapa sirkuit terkait (decoder dan semacamnya) saat tidak digunakan. Dengan cache terpisah, mereka dapat menyalakan sirkuit ini secara terpisah untuk instruksi dan data, meningkatkan kemungkinan sirkuit tetap tidak bertenaga selama siklus tertentu (Saya tidak yakin prosesor x86 melakukan ini - AFAIK, ini lebih merupakan ARM benda).
Sama seperti real estat, penggunaan cache didorong oleh tiga hal: lokasi, lokasi, lokasi. Inti dari memiliki cache adalah bahwa sebagian besar program menunjukkan pola lokasi: jika mereka mengakses byte 1111111, maka byte berikutnya yang akan mereka akses mungkin 1111110 atau 1111112, dan tidak begitu banyak byte 9999999. Namun, sebagian besar program akan menunjukkan sangat berbeda pola lokasi untuk instruksi dan data mereka. Ini berarti bahwa tidak mungkin untuk instruksi dan data untuk dapat berbagi cache secara efisien. Karena instruksi dan data tidak harus saling berdekatan dalam memori. Akses data akan menabrak instruksi dari cache, dan memuat instruksi akan menabrak data dari cache.