मेमोरी ऑर्डरिंग काफी मुश्किल हो सकती है, और इसे गलत होने के प्रभाव अक्सर बहुत सूक्ष्म होते हैं।
सभी मेमोरी ऑर्डरिंग के साथ मुख्य बिंदु यह है कि यह गारंटी देता है कि "क्या हुआ है", ऐसा नहीं होने वाला है। उदाहरण के लिए, यदि आप कुछ चर (जैसे x = 7; y = 11;
) पर कुछ संग्रहीत करते हैं, तो x में 7
मान को देखने से पहले एक अन्य प्रोसेसर y
को 11 के रूप में देख सकता है। x
सेटिंग और y
सेट करने के बीच मेमोरी ऑर्डरिंग ऑपरेशन का उपयोग करके, आप जिस प्रोसेसर का उपयोग कर रहे हैं, वह गारंटी देगा कि x = 7;
y
में कुछ स्टोर करने से पहले स्मृति में लिखा गया है।
अधिकांश समय, यह वास्तव में महत्वपूर्ण नहीं है कि आपके लिखने का आदेश क्या होता है, जब तक मूल्य अंततः अपडेट हो जाता है। लेकिन अगर हम, कहते हैं, पूर्णांकों के साथ एक परिपत्र बफर है, और हम जैसे कुछ कार्य करें:
buffer[index] = 32;
index = (index + 1) % buffersize;
और कुछ अन्य धागा index
उपयोग कर रहा है निर्धारित करने के लिए है कि नए मूल्य में लिखा गया है, तो हम 32
लिखा है करने के लिए की जरूरत है FIRST, फिर index
अपडेट किया गया। अन्यथा, अन्य धागे old
डेटा प्राप्त कर सकते हैं।
वही सैफफोर्स, म्यूटेक्स और ऐसी चीजों को काम करने के लिए लागू होता है - यही कारण है कि शब्द रिलीज और अधिग्रहण स्मृति बाधा प्रकारों के लिए उपयोग किया जाता है।
अब, cst
सबसे सख्त ऑर्डरिंग नियम है - यह लागू करता है कि आपके द्वारा लिखे गए डेटा को पढ़ने और लिखने के लिए प्रोसेसर अधिक संचालन जारी रखने से पहले स्मृति में जाता है। यह विशिष्ट अधिग्रहण या रिलीज बाधाओं को करने से धीमा होगा। यह प्रोसेसर को यह सुनिश्चित करने के लिए मजबूर करता है कि स्टोर्स और लोड पूरा हो गए हैं, केवल स्टोर्स या सिर्फ लोड के विपरीत।
इससे कितना अंतर आता है? यह सिस्टम आर्चीचर क्या है इस पर अत्यधिक निर्भर है। कुछ प्रणालियों पर, कैश को [आंशिक रूप से] फ्लश करने की आवश्यकता होती है और एक कोर से दूसरे में भेजे गए इंटरप्ट्स कहते हैं, "कृपया जारी रखने से पहले कृपया इस कैश-फ्लशिंग काम को करें" - इसमें कई सौ चक्र लग सकते हैं। अन्य प्रोसेसर पर, नियमित स्मृति लिखने की तुलना में यह केवल कुछ छोटा प्रतिशत धीमा है। X86 इस तेजी से करने में बहुत अच्छा है। कुछ प्रकार के एम्बेडेड प्रोसेसर, (कुछ मॉडलों - निश्चित नहीं हैं?) उदाहरण के लिए एआरएम, सबकुछ काम करने के लिए प्रोसेसर में थोड़ा और काम करने की आवश्यकता है।
यह क्या अंतर्निहित हार्डवेयर के लिए प्रस्ताव दिया पर निर्भर करता है। यदि आप विशेष रूप से नहीं जानते कि यह कैसे काम करता है, और उसके अनुसार अनुकूलित करने के लिए मजबूर किया जाता है, तो डिफ़ॉल्ट शायद ठीक है। सामान्य x86 सिस्टम पर यदि कोई हो, तो बहुत कम अंतर होगा। X12 पर –
@ बो पर्सन, जीसीसी एक seq_cst स्टोर के बाद एक पूर्ण MFENCE डालता है। यह आपको – LWimsey