2012-06-05 14 views
7

की सी ++ 11 एक मसौदा पढ़ना मैं खंड 1.7.3 द्वारा रुचि थी:क्या सी ++ 11 मेमोरी मॉडल मेमोरी फायरिंग और टकराव को रोकता है?

एक स्मृति स्थान या तो अदिश प्रकार का ऑब्जेक्ट या आसन्न बिट क्षेत्रों सब होने गैर शून्य चौड़ाई का एक अधिक से अधिक अनुक्रम है । ... निष्पादन के दो धागे (1.10) एक दूसरे के साथ हस्तक्षेप किए बिना अलग स्मृति स्थानों को अद्यतन और एक्सेस कर सकते हैं।

इस खंड जैसे हार्डवेयर से संबंधित दौड़ की स्थिति से बचाने के लिए है:

  • असंरेखित डेटा का उपयोग जहां स्मृति दो बस लेनदेन (स्मृति फाड़) में अद्यतन किया जाता है?
  • जहां आपके पास सिस्टम मेमोरी यूनिट के भीतर विशिष्ट ऑब्जेक्ट्स हैं, उदा। 32-बिट शब्द में दो 16-बिट हस्ताक्षरित पूर्णांक, और अलग-अलग ऑब्जेक्ट्स के प्रत्येक स्वतंत्र अपडेट को पूरी मेमोरी इकाई को लिखे जाने की आवश्यकता होती है (मेमोरी टकराव)?
+0

[मेमोरी मॉडल ऑर्डरिंग और दृश्यता?] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/7461484/memory-model-ordering- और दृश्यता) –

+0

@ हंसपैसेंट: मेरे त्वरित पढ़ने से, यह प्रश्न धागे के बीच साझा ऑब्जेक्ट की दृश्यता से अधिक संबंधित प्रतीत होता है, मैं यहां अलग-अलग ऑब्जेक्ट्स को अपडेट करके स्मृति विवादों के बारे में पूछ रहा हूं। – TheJuice

उत्तर

5

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

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

फिर से यह लागू करना कठिन या असंभव हो सकता है। यदि आपका unaligned डेटाम कैश लाइन में जाता है, तो प्रदर्शन के लिए भारी लागत लगाए बिना कोड की शुद्धता की गारंटी देना लगभग असंभव होगा। आपको इस और अन्य कारणों के लिए जितना संभव हो सके असाइन किए गए चर से बचने की कोशिश करनी चाहिए (कच्चे प्रदर्शन सहित, दो कैश लाइनों को छूने वाली ऑब्जेक्ट को लिखने में स्मृति के लिए 32 बाइट्स लिखना शामिल है, और यदि कोई अन्य थ्रेड किसी भी को छू रहा है कैश लाइनों में, इसमें कैश के सिंक्रनाइज़ेशन की लागत भी शामिल है ...

1

यह स्मृति फाड़ है, जो केवल दिख रहा है जब दो धागे (लेकिन खंड केवल अलग स्मृति स्थल के लिए लागू होता है) एक ही स्मृति स्थान का उपयोग के खिलाफ की रक्षा नहीं करता है।

यह आपके उदाहरण के अनुसार स्मृति संघर्ष के खिलाफ सुरक्षा प्रतीत होता है। इसे प्राप्त करने का सबसे अधिक संभावित तरीका यह है कि एक प्रणाली जो 32 बिट्स से कम समय में 32 बिट्स नहीं लिख सकती है, में 32-बिट char होगा, और फिर दो अलग-अलग ऑब्जेक्ट्स "सिस्टम मेमोरी यूनिट" साझा नहीं कर पाएंगे। (एक ही रास्ता दो 16-बिट पूर्णांक 32-बिट char bitfields के रूप में है के साथ एक सिस्टम पर आसन्न हो सकता है।)

+0

समस्या कुछ और जटिल है मल्टीथ्रेडिंग, केवल 8/32 बाइट्स नहीं। एल 1 कैश से वास्तविक लेखन कैश लाइन आकार ग्रैन्युलरिटी के साथ किया जाता है।वर्तमान कंपाइलर आमतौर पर एक्स से कम लिख नहीं सकते हैं (16 बाइट इंटेल के लिए यहां एक आम संख्या है) ब्लॉक में बाइट्स। दूसरी तरफ, प्रोसेसर गारंटी देने के लिए अन्य तकनीकों का उपयोग करते हैं (या कोशिश करते हैं) कि यह कोई मुद्दा नहीं है, उदाहरण के लिए कैश लाइन को गंदे के रूप में चिह्नित करना और अन्य प्रोसेसर को इसे लिखने से पहले पुनः लोड करना या अधिक जटिल सिंक्रनाइज़ेशन एल्गोरिदम को मजबूर करना। –

+2

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

+0

हां ... और नहीं। असाइन किए गए एक्सेस की समस्या प्रोसेसर से कैश में लिखने के आकार से नहीं आती है, लेकिन तथ्य यह है कि लेखन वास्तव में कैश सीमा पार कर सकता है। एक कैश को लिखने के दौरान कैश कोहेन्सी एल्गोरिदम द्वारा संभाला जाता है, मुझे यकीन नहीं है कि वे एल्गोरिदम विभिन्न कैश लाइनों को लिखने के अनुकरण परमाणुता को संभाल सकते हैं (यानी हार्डवेयर को दोनों कैश लाइनों को लॉक करना होगा, लिखना और रिलीज़ करना होगा; या दोनों को चिह्नित करना होगा ऑनर्स पर गंदे के रूप में लाइनें या ... जो भी एल्गोरिदम करता है लेकिन * दोनों * लाइनों पर एक बार) –