जवाबों:
वास्तव में कई कारण हैं।
सबसे पहले और शायद सबसे महत्वपूर्ण बात यह है कि निर्देश कैश में संग्रहीत डेटा आम तौर पर डेटा कैश में संग्रहीत की तुलना में कुछ हद तक भिन्न होता है - स्वयं निर्देशों के साथ, चीजों के लिए एनोटेशन होते हैं जैसे कि अगला निर्देश कहां शुरू होता है, डिकोडर्स की मदद करने के लिए। कुछ प्रोसेसर (जैसे, नेटबर्स्ट, कुछ स्पार्क) एक "ट्रेस कैश" का उपयोग करते हैं, जो मूल निर्देश को उसके एन्कोडेड रूप में संग्रहीत करने के बजाय एक निर्देश को डिकोड करने का परिणाम संग्रहीत करता है।
दूसरा, यह सर्किटरी को थोड़ा सरल करता है - डेटा कैश को रीड और राइट से निपटना होता है, लेकिन इंस्ट्रक्शन कैश केवल रीड से संबंधित होता है। (यह स्व-संशोधित कोड इतना महंगा क्यों है - निर्देश कैश में डेटा को सीधे ओवरराइट करने के बजाय, राइट डेटा कैश से होकर L2 कैश तक जाता है, और फिर निर्देश कैश में लाइन अमान्य और पुनः है -L2 से लोड किया गया)।
तीसरा, यह बैंडविड्थ बढ़ाता है: अधिकांश आधुनिक प्रोसेसर निर्देश कैश और डेटा कैश से डेटा को एक साथ पढ़ सकते हैं। अधिकांश भी कैश करने के लिए "प्रवेश द्वार" पर कतारें हैं, इसलिए वे वास्तव में दो पढ़ सकते हैं और किसी भी चक्र में लिख सकते हैं।
चौथा, यह शक्ति बचा सकता है। जब आपको मेमोरी सेल को अपनी सामग्री बनाए रखने के लिए खुद को शक्ति बनाए रखने की आवश्यकता होती है, तो कुछ प्रोसेसर संबंधित सर्किटरी (डिकोडर्स और ऐसे) के कुछ बिजली का उपयोग कर सकते हैं / कर सकते हैं जब उनका उपयोग नहीं किया जा रहा हो। अलग-अलग कैश के साथ, वे निर्देशों और डेटा के लिए इन सर्किटों को अलग-अलग कर सकते हैं, किसी भी चक्र के दौरान बिना सर्किट के शेष रहने की संभावना को बढ़ा सकते हैं (मुझे यकीन नहीं है कि कोई x86 प्रोसेसर ऐसा करता है - AFAIK, यह एक एआरएम से अधिक है चीज़)।
अचल संपत्ति की तरह, कैश का उपयोग तीन चीजों से संचालित होता है: स्थान, स्थान, स्थान। कैश होने की पूरी बात यह है कि अधिकांश कार्यक्रम स्थान के पैटर्न को प्रदर्शित करते हैं: यदि वे बाइट 1111111 तक पहुंचते हैं, तो अगले बाइट तक वे पहुंचेंगे शायद 1111110 या 1111112, और इतना बाइट 9999999 नहीं है। हालांकि, अधिकांश कार्यक्रम बहुत अलग दिखेंगे उनके निर्देशों और उनके डेटा के लिए स्थान के पैटर्न। इसका मतलब यह है कि यह निर्देश और डेटा के लिए कैश को कुशलता से साझा करने में सक्षम होने की संभावना नहीं है। क्योंकि निर्देश और डेटा आवश्यक रूप से स्मृति में एक दूसरे के पास नहीं हैं। डेटा एक्सेस कैश से निर्देश को टक्कर देगा, और लोडिंग निर्देश कैश से डेटा टकराएगा।