2010-11-18 23 views
7

के बारे में कुछ सवाल मैं कुछ सवाल मैं स्पष्ट करना चाहते हैं हो रही है।धागा तुल्यकालन

  1. वाष्पशील पढ़ आप एक चर के नवीनतम मूल्य पढ़ लें। यह मतलब है कि यह करने के लिए सभी CPU के लिए बाध्य करती है कि चर के लिए अपने कैश की गई मूल्यों फ्लश करता है? केवल वह चर या सब? तो अगर यह फ्लश कैश्ड लेखन करने के लिए सभी सीपीयू बल और मुख्य स्मृति से नवीनतम संस्करण मिल जाएगा, यह एक स्मृति बाधा नहीं है?

  2. अस्थिर लेखन सुनिश्चित करें कि आप मान को मेमोरी में चर के मान दें। क्या इसका मतलब यह है कि यह सभी CPUs में चर के लिए सभी कैश किए गए मानों को शून्य करता है?

  3. क्या आप मेमोरी बाधा का उपयोग कर रहे हैं जब आप कीवर्ड अस्थिरता का उपयोग करते हैं?

  4. इंटरलोकड परमाणु ऑपरेशन में पढ़ने/संशोधित/लिखने का प्रदर्शन करता है। इंटरलॉक सुनिश्चित करता है कि आप उदाहरण के लिए चर के नवीनतम संस्करण को बढ़ा रहे हैं और अन्य CPUs इस परिवर्तन को देखेंगे? मुझे ऐसा लगता है, क्योंकि यह , एक स्मृति बाधा का उपयोग करने के माना जाता है, लेकिन मुझे यकीन है कि नहीं हूँ। इसलिए हम कह सकते हैं कि Interloked एक VolatileRead/संशोधित/VolatileWrite atomically कर रहा है?

  5. जब आप मेमोरी बाधा का उपयोग करते हैं, तो यह सीपीयूएस, या बस आसपास के लोगों में सभी चरों को प्रभावित करता है? क्योंकि यह दो स्मृति बाधाओं और एक "संदर्भ स्विच" का कारण बनता है, तो धागा है प्रतीक्षा करने के लिए है, लेकिन फिर Interlocked की लाभ क्या है

  6. लॉकिंग महंगा है? बस "संदर्भ स्विच" से बचें?

  7. रीडरवाइटर लॉकस्लिम और पुनर्संरचना के साथ क्या सौदा है? मुझे समझ में नहीं आया क्या समस्या है।

जैसा कि आप देख सकते हैं, मेरे पास अभी मेरे दिमाग में कुल गड़बड़ है।

अग्रिम धन्यवाद।

+4

इन महान सवाल कर रहे हैं, लेकिन वे अलग पोस्ट के रूप में कहा जाना चाहिए। मैं इस पोस्ट को हटाने और इसे कई छोटी पोस्टों में तोड़ने का सुझाव देता हूं। – jason

+2

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

+1

उपरोक्त में टाइपो के लिए खेद है; "माइग्रेट को उत्तर दें" को "उत्तर पता हो सकता है" को प्रतिस्थापित करें। – jason

उत्तर

7

आपके प्रश्नों का उत्तर इससे पहले कि मैं बाहर बिंदु चाहिए कि स्मृति बाधाओं सिर्फ सीपीयू की तुलना में अधिक प्रभावित करते हैं। जब कोई एप्लिकेशन चलता है तो वास्तव में दो मेमोरी मॉडल चलते हैं। एक हार्डवेयर स्तर पर है और दूसरा सॉफ्टवेयर स्तर पर है। एक डेवलपर के रूप में आपको दोनों के विभिन्न तत्वों के सबसे कमजोर संयोजन के लिए कोड करना होगा। सीएलआर और एक 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 पर और जानकारी है।

+0

मैं सिर्फ एक बार आपको कितनी शर्मिंदा कर सकता हूं। मुझे समझ में नहीं आता है कि क्यों एक स्मृति बाधा केवल एक सीपीयू को प्रभावित करती है, दूसरों के साथ क्या होता है? मेरा मतलब है, अगर CPU1 में उसके कैश में एक चर की एक प्रति है, और मैं उस चर को CPU2 से मेमोरी बाधा के साथ लिखता हूं, तो क्या आप यह कह रहे हैं कि CPU1 तब तक परिवर्तन नहीं देखेगा जब तक कि यह स्मृति बाधा भी न हो? और फिर धन्यवाद, मैं तुम्हें एक पिंट देय है। – vtortola

+1

@bitbitbit: यही वही है जो मैं कह रहा हूं! यही कारण है कि लॉक-फ्री कोडिंग रणनीतियों को सही होने के लिए अविश्वसनीय रूप से मुश्किल है। –

+0

अच्छा! अब सब कुछ और स्पष्ट है। एक बार फिर धन्यवाद। – vtortola

1

ताले के साथ एक समस्या यह है कि किसी भी धागे को लॉक प्राप्त करने वाले जोखिम को यह मानना ​​चाहिए कि अन्य धागे समय के लिए मनमाने ढंग से लॉक रख सकते हैं। एक थ्रेडिंग .Interlocked.CompareExchange कॉल लगभग तुरंत लौटने की गारंटी है (चाहे वह सफल हो या नहीं); जानबूझकर भारी विवाद की शर्तों के अलावा, लघु तुलना एक्सचेंज स्पिनलॉक भी जल्दी से वापस आ जाएगा। यदि कोई थ्रेड लॉक प्राप्त करता है और फिर बंद हो जाता है और इसे रिलीज़ करने से पहले अन्य चीजें करता है, तो अन्य धागे को उन अन्य चीज़ों को लॉक प्राप्त करने से पहले समाप्त करना होगा। तुलनात्मक विनिमय स्पिनलॉक के साथ ऐसा कोई खतरा मौजूद नहीं है। जब तक अन्य धागे सक्रिय रूप से स्पिनलॉक को मार नहीं रहे हैं, तो स्पिनलॉक जल्दी से पूरा हो जाएगा।

संबंधित मुद्दे