कैश पॉल्यूशन

कैश प्रदूषण उन स्थितियों का वर्णन करता है जहां एक निष्पादित कंप्यूटर प्रोग्राम अनावश्यक रूप से सीपीयू कैश में डेटा लोड करता है, इस प्रकार अन्य उपयोगी डेटा को कैश से मेमोरी पदानुक्रम के निचले स्तरों में निकाल दिया जाता है, जिससे प्रदर्शन में गिरावट आती है। उदाहरण के लिए, एक मल्टी-कोर प्रोसेसर में, एक कोर अन्य कोर द्वारा लाए गए ब्लॉक को साझा कैश में बदल सकता है, या कैश प्रीफ़ेचिंग ब्लॉक कैश से मांग-प्राप्त ब्लॉक को बदल सकता है।

उदाहरण
निम्नलिखित दृष्टांत पर विचार करें: टी[0] = टी[0] + 1; मेरे लिए 0..sizeof(CACHE) में सी[आई] = सी[आई] + 1; टी[0] = टी[0] + सी[आकार(कैश)-1];

(यहां धारणाएं यह हैं कि कैश केवल एक स्तर से बना है, यह अनलॉक है, प्रतिस्थापन नीति छद्म-एलआरयू है, सभी डेटा कैश करने योग्य है, सीपीयू कैश # कैश की एसोसिएटिविटी एन है (जहां एन> 1), और अधिकतम एक प्रोसेसर रजिस्टर प्रोग्राम मानों को शामिल करने के लिए उपलब्ध है)।

लूप शुरू होने से ठीक पहले, T[0] को मेमोरी से कैश में लाया जाएगा, इसका मान अपडेट किया जाएगा। हालाँकि, जैसे ही लूप निष्पादित होता है, क्योंकि लूप संदर्भों में डेटा तत्वों की संख्या के लिए पूरे कैश को उसकी क्षमता तक भरने की आवश्यकता होती है, टी [0] वाले कैश ब्लॉक को बाहर निकालना होगा। इस प्रकार, अगली बार जब प्रोग्राम T[0] को अद्यतन करने का अनुरोध करता है, तो कैश छूट जाता है, और कैश नियंत्रक को कंप्यूटर बस से संबंधित कैश ब्लॉक को मुख्य मेमोरी से फिर से लाने का अनुरोध करना पड़ता है।

इस मामले में कैश को प्रदूषित कहा जाता है। T[0] के पहले अपडेट को लूप और दूसरे अपडेट के बीच रखकर डेटा एक्सेस के पैटर्न को बदलने से अक्षमता समाप्त हो सकती है:

मेरे लिए 0..sizeof(CACHE) में सी[आई] = सी[आई] + 1; टी[0] = टी[0] + 1; टी[0] = टी[0] + सी[आकार(कैश)-1];

समाधान
ऊपर उल्लिखित कोड-पुनर्गठन के अलावा, कैश प्रदूषण का समाधान यह सुनिश्चित करना है कि कैश में केवल उच्च-पुन: उपयोग वाला डेटा संग्रहीत किया जाए। इसे विशेष कैश नियंत्रण निर्देशों, ऑपरेटिंग सिस्टम समर्थन या हार्डवेयर समर्थन का उपयोग करके प्राप्त किया जा सकता है।

विशेष हार्डवेयर निर्देशों के उदाहरणों में PowerPC AltiVec द्वारा प्रदान किया गया lvxl शामिल है। यह निर्देश एक 128 बिट विस्तृत मान को एक रजिस्टर में लोड करता है और संबंधित कैश ब्लॉक को कम से कम हाल ही में उपयोग किए गए के रूप में चिह्नित करता है यानी अपने कैश सेट से एक ब्लॉक को कैश करने की आवश्यकता पर निष्कासन के लिए प्रमुख उम्मीदवार के रूप में। उपरोक्त उदाहरण के संदर्भ में उस निर्देश का उचित उपयोग करने के लिए, लूप द्वारा संदर्भित डेटा तत्वों को इस निर्देश का उपयोग करके लोड करना होगा। जब इस तरीके से लागू किया जाता है, तो कैश प्रदूषण नहीं होगा, क्योंकि ऐसे लूप के निष्पादन से कैश से टी [0] का समय से पहले निष्कासन नहीं होगा। इससे बचा जाएगा क्योंकि, जैसे-जैसे लूप आगे बढ़ेगा, सी में तत्वों के पते उसी कैश तरीके से मैप हो जाएंगे, जिससे वास्तव में पुराना (लेकिन कम से कम हाल ही में उपयोग किए गए के रूप में चिह्नित नहीं) डेटा दूसरे तरीके पर बरकरार रहेगा। केवल सबसे पुराना डेटा (दिए गए उदाहरण के लिए प्रासंगिक नहीं) को कैश से निकाला जाएगा, जिसका T[0] सदस्य नहीं है, क्योंकि इसका अपडेट लूप के शुरू होने से ठीक पहले होता है।

इसी तरह, ऑपरेटिंग सिस्टम (ओएस) समर्थन का उपयोग करके, मुख्य मेमोरी में सी डेटा सरणी के अनुरूप पृष्ठों को कैशिंग बाधित या दूसरे शब्दों में, गैर-कैशेबल के रूप में चिह्नित किया जा सकता है। इसी प्रकार, हार्डवेयर स्तर पर, कैश बायपासिंग योजनाओं का उपयोग किया जा सकता है जो प्रोग्राम एक्सेस पैटर्न के आधार पर कम-पुन: उपयोग वाले डेटा की पहचान करते हैं और उन्हें कैश से बायपास करते हैं। इसके अलावा, चल रहे अनुप्रयोगों के बीच विनाशकारी हस्तक्षेप से बचने के लिए साझा कैश को विभाजित किया जा सकता है। इन समाधानों में ट्रेडऑफ यह है कि ओएस-आधारित योजनाओं में बड़ी विलंबता हो सकती है जो कैश प्रदूषण से बचाव द्वारा प्राप्त लाभ को कम कर सकती है (जब तक कि मेमोरी क्षेत्र शुरू करने के लिए गैर-कैश योग्य न हो), जबकि हार्डवेयर-आधारित तकनीकों में प्रोग्राम नियंत्रण प्रवाह और मेमोरी एक्सेस पैटर्न का वैश्विक दृष्टिकोण नहीं हो सकता है।

बढ़ता महत्व
कैश प्रदूषण नियंत्रण का महत्व बढ़ रहा है क्योंकि तथाकथित स्मृति दीवार  के कारण होने वाला जुर्माना बढ़ता जा रहा है। चिप निर्माता लगातार बढ़ती सापेक्ष मेमोरी-टू-सीपीयू विलंबता को दूर करने के लिए नई तरकीबें ईजाद करना जारी रखते हैं। वे कैश आकार बढ़ाकर और सॉफ्टवेयर इंजीनियरों को सीपीयू में डेटा आने और रहने के तरीके को नियंत्रित करने के लिए उपयोगी तरीके प्रदान करके ऐसा करते हैं। कैश प्रदूषण नियंत्रण (मुख्य रूप से एम्बेडेड) प्रोग्रामर के लिए उपलब्ध कई उपकरणों में से एक है। हालाँकि, अन्य विधियाँ, जिनमें से अधिकांश मालिकाना और अत्यधिक हार्डवेयर और एप्लिकेशन विशिष्ट हैं, का भी उपयोग किया जाता है।