आपके प्रश्नों का उत्तर इससे पहले कि मैं बाहर बिंदु चाहिए कि स्मृति बाधाओं सिर्फ सीपीयू की तुलना में अधिक प्रभावित करते हैं। जब कोई एप्लिकेशन चलता है तो वास्तव में दो मेमोरी मॉडल चलते हैं। एक हार्डवेयर स्तर पर है और दूसरा सॉफ्टवेयर स्तर पर है। एक डेवलपर के रूप में आपको दोनों के विभिन्न तत्वों के सबसे कमजोर संयोजन के लिए कोड करना होगा। सीएलआर और एक x86 आर्किटेक्चर के साथ आमतौर पर इसका मतलब है कि सीएलआर अधिक महत्वपूर्ण है क्योंकि x86 आर्किटेक्चर में वास्तव में काफी मजबूत मेमोरी मॉडल है। दूसरे शब्दों में, volatile
कीवर्ड और अन्य मेमोरी बाधाएं तंत्र प्रभावित होंगे कि जेआईटी कोड कैसे उत्पन्न करता है।
1।अस्थिर पढ़ना सुनिश्चित करें कि आप एक चर के नवीनतम मान को पढ़ते हैं। यह मतलब है कि यह करने के लिए सभी CPU के लिए बाध्य करती है कि चर के लिए अपने कैश की गई मूल्यों फ्लश करता है? केवल वह चर या सब? तो यदि यह सभी CPUs को कैश किए गए लिखने के लिए मजबूर करेगा और मुख्य स्मृति से नवीनतम संस्करण प्राप्त करेगा, तो क्या यह स्मृति बाधा है?
सबसे पहले, तकनीकी रूप से एक अस्थिर पढ़ा आप एक चर के नवीनतम मूल्य पढ़ लें ताकि सुनिश्चित नहीं करता है। इसका वास्तव में मतलब यह है कि अस्थिर व्यक्ति के सामने कोई अन्य पढ़ा या लिखना नहीं हो सकता है। हालांकि, प्रभाव यह है कि पढ़ने को मुख्य स्मृति से आना है यदि यह किसी अन्य अस्थिर पढ़ने से पहले है। दूसरा, नहीं, एक अस्थिर पढ़ने का अन्य लेखनों पर कोई प्रभाव नहीं पड़ता है, इसलिए यह सभी सीपीयू को उनके लेखन कैश को फ्लश करने के लिए मजबूर नहीं करता है। तीसरा, हां एक अस्थिर ऑपरेशन को स्मृति बाधा माना जाता है।
2. वोलाटाइल लिखना सुनिश्चित करें कि आप मुख्य मेमोरी में चर के लिए एक मान लिखते हैं। क्या इसका मतलब है कि यह सभी सभी चर CPU में उस चर के लिए कैश किए गए मानों को रद्द कर देता है?
अस्थिर पढ़ने के समान, एक अस्थिर लेखन तकनीकी रूप से ऑर्डर करने के बारे में है। यह सुनिश्चित करता है कि अस्थिर व्यक्ति के बाद कोई अन्य पढ़ या लिखना न हो। इसका मतलब यह नहीं है कि प्रश्न में लिखना तुरंत हो जाता है। यह केवल उस धागे को निष्पादित करने वाले सीपीयू को प्रभावित करता है। दिलचस्प बात यह है कि x86 आर्किटेक्चर वास्तव में सभी अस्थिर के रूप में लिखता है। लेकिन, सीएलआर (कम से कम ईसीएमए विनिर्देश) नहीं करता है। यही कारण है कि आपको अभी भी लिखने पर अस्थिर संचालन का उपयोग करना होगा। यह हार्डवेयर और सॉफ्टवेयर स्तर दोनों से कमजोर स्मृति मॉडल तत्व के लिए कोडिंग का एक उदाहरण है।
3. क्या आप कीवर्ड अस्थिरता का उपयोग करते समय मेमोरी बाधा का उपयोग कर रहे हैं?
हां। दो प्रकार की मेमोरी बाधाएं हैं। पूर्ण बाड़ और आधे बाड़। आधे बाड़ या तो गारेनटेई सेमेन्टिक्स (अस्थिर पढ़ने) प्राप्त कर सकते हैं या सेमेन्टिक्स (अस्थिर लेखन) जारी कर सकते हैं, लेकिन दोनों एक ही समय में नहीं। एक पूर्ण बाड़ (उदाहरण के लिए Thread.MemoryBarrier
के माध्यम से) guarentees दोनों।
4.Interloked पढ़ने करता है/एक परमाणु ऑपरेशन में/लिखने को संशोधित। क्या Interlocked सुनिश्चित करता है कि उदाहरण के लिए आप एक चर के नवीनतम संस्करण और में वृद्धि कर रहे हैं, अन्य CPUs इस परिवर्तन को देखेंगे? I ऐसा सोचें क्योंकि इसे मेमोरी बाधा का उपयोग करना है, लेकिन मुझे यकीन नहीं है। तो क्या हम कह सकते हैं कि इंटरलोक एक वोल्टाइल रीड/संशोधित/वोल्टाइलवाइट परमाणु रूप से कर रहा है?
हाँ। और इंटरलाक्ड वृद्धि और कमी संचालन के लायक होने के लिए CAS ऑपरेशन के साथ कार्यान्वित किया जा सकता है। .NET में आप ऑपरेशन सफल होने तक Interlocked.CompareExchange
विधि को लूप में उपयोग करेंगे। मैं Interlocked.Increment
और Interlocked.Decrement
विधियों को मूलभूत सीपीयू निर्देश का उपयोग करता हूं, लेकिन मैं इसके बारे में गलत होने के लिए तैयार हूं।
5. जब आप मेमोरी बाधा का उपयोग करते हैं, तो क्या यह सभी सीपीयूएस, या बस आस-पास के सभी चरों को प्रभावित करता है?
यह सभी मेमोरी एक्सेस को प्रभावित करेगा, लेकिन केवल उस थ्रेड को निष्पादित करने वाले सीपीयू पर। क्योंकि यह दो स्मृति बाधाओं और एक "संदर्भ स्विच" का कारण बनता है, तो धागा इंतजार करना पड़ता है, लेकिन फिर क्या लाभ Interlocked की है
6.Locking महंगा है? बस "संदर्भ स्विच" से बचने के लिए?
हाँ मूल रूप से। धागा कभी भी अंतःस्थापित संचालन के साथ ब्लॉक नहीं करता है।
7. रीडरवाइटर लॉकस्लिम और पुनर्संरचना के साथ क्या सौदा है? मुझे समझ में नहीं आया कि समस्या क्या है।
आप इसे रिलीज़ किए बिना उसी धागे पर दो बार लॉक प्राप्त नहीं कर सकते हैं। Joe Duffy's blog पर और जानकारी है।
इन महान सवाल कर रहे हैं, लेकिन वे अलग पोस्ट के रूप में कहा जाना चाहिए। मैं इस पोस्ट को हटाने और इसे कई छोटी पोस्टों में तोड़ने का सुझाव देता हूं। – jason
मुझे लगता है कि मुझे विस्तार से क्यों विस्तार करना चाहिए: 1. लंबी पोस्ट पाठकों को खत्म करने के लिए हतोत्साहित करती है (इसलिए आप संभावित उत्तरदाताओं को खत्म करते हैं)। 2. कोई भी माइग्रेट इन सवालों में से किसी एक को उत्तर में जानता है लेकिन सभी नहीं और महसूस करते हैं कि उन्हें अपूर्ण उत्तर पोस्ट नहीं करना चाहिए (इसलिए आप अधिक उत्तरदाताओं को खत्म करते हैं)। 3. कई प्रश्नों के साथ लंबे प्रश्नों का जवाब देने में काफी समय लगता है (इसलिए आप और भी उत्तरदाताओं को हतोत्साहित करते हैं)। यदि आप इस पोस्ट को तोड़ते हैं तो आपको बेहतर और अधिक प्रतिक्रिया मिल जाएगी। – jason
उपरोक्त में टाइपो के लिए खेद है; "माइग्रेट को उत्तर दें" को "उत्तर पता हो सकता है" को प्रतिस्थापित करें। – jason