सवाल सी ++ 11 ने एक मानक स्मृति मॉडल पेश किया। इसका क्या मतलब है? और यह सी ++ प्रोग्रामिंग को कैसे प्रभावित करेगा?


सी ++ 11 ने एक मानक स्मृति मॉडल पेश किया, लेकिन इसका क्या अर्थ है? और यह सी ++ प्रोग्रामिंग को कैसे प्रभावित करेगा?

यह लेख (द्वारा गेविन क्लार्क उद्धरण कौन करता है हर्ब सटर) कहता है कि,

मेमोरी मॉडल का मतलब है कि सी ++ कोड   अब कॉल करने के लिए एक मानक लाइब्रेरी है   इस पर ध्यान दिए बिना कि संकलक किसने बनाया   और यह किस मंच पर चल रहा है।   कैसे नियंत्रित करने के लिए एक मानक तरीका है   विभिन्न धागे से बात करते हैं   प्रोसेसर की स्मृति।

"जब आप विभाजन के बारे में बात कर रहे हैं   [कोड] अलग-अलग कोरों में है   मानक में, हम बात कर रहे हैं   मेमोरी मॉडल हम जा रहे हैं   इसे तोड़ने के बिना अनुकूलित करें   निम्नलिखित धारणाएं लोग जा रहे हैं   कोड में बनाने के लिए, " सूटर कहा हुआ।

हाँ मैं कर सकता हूँ याद करना यह और इसी तरह के पैराग्राफ ऑनलाइन उपलब्ध हैं (जैसा कि मेरे जन्म से मेरा अपना मेमोरी मॉडल है: पी) और दूसरों द्वारा पूछे गए प्रश्नों के उत्तर के रूप में भी पोस्ट कर सकते हैं, लेकिन ईमानदार होने के लिए, मैं इसे बिल्कुल समझ नहीं पा रहा हूं।

तो, जो मैं मूल रूप से जानना चाहता हूं वह है, सी ++ प्रोग्रामर बहु-थ्रेडेड अनुप्रयोगों को पहले भी विकसित करते थे, तो यह कैसे मायने रखता है कि यह पॉज़िक्स थ्रेड, या विंडोज थ्रेड, या सी ++ 11 धागे हैं? क्या लाभ हैं? मैं निम्न स्तर के विवरण को समझना चाहता हूं।

मुझे यह भी महसूस होता है कि सी ++ 11 मेमोरी मॉडल किसी भी तरह से सी ++ 11 बहु-थ्रेडिंग समर्थन से संबंधित है, क्योंकि मैं अक्सर इन दोनों को एक साथ देखता हूं। यदि यह है, तो वास्तव में कैसे? उन्हें क्यों संबंधित होना चाहिए?

जैसा कि मुझे नहीं पता कि बहु-थ्रेडिंग के आंतरिक कैसे काम करते हैं, और सामान्य रूप से स्मृति मॉडल का अर्थ क्या है, कृपया इन अवधारणाओं को समझने में मेरी सहायता करें। :-)


1555
2018-06-11 23:30


मूल




जवाब:


सबसे पहले, आपको एक भाषा वकील की तरह सोचना सीखना है।

सी ++ विनिर्देश किसी विशेष कंपाइलर, ऑपरेटिंग सिस्टम या सीपीयू का संदर्भ नहीं देता है। यह एक संदर्भ देता है सार मशीन यह वास्तविक प्रणालियों का एक सामान्यीकरण है। भाषा वकील की दुनिया में, प्रोग्रामर का काम सार मशीन के लिए कोड लिखना है; कंपाइलर का काम उस कोड को कंक्रीट मशीन पर वास्तविक बनाना है। Specidly specidly कोडिंग करके, आप निश्चित हो सकते हैं कि आपका कोड किसी भी सिस्टम पर एक अनुपालन C ++ कंपाइलर के साथ संकलन के बिना संकलित और चलाएगा, चाहे आज या 50 साल से हो।

सी ++ 98 / सी ++ 03 विनिर्देश में सार मशीन मूल रूप से सिंगल-थ्रेडेड है। तो बहु-थ्रेडेड सी ++ कोड लिखना संभव नहीं है जो spec के संबंध में "पूरी तरह से पोर्टेबल" है। कल्पना के बारे में कुछ भी नहीं कहता है atomicity मेमोरी लोड और स्टोर्स या क्रम जिसमें लोड और स्टोर हो सकते हैं, म्यूटेक्स जैसी चीज़ों को कभी भी ध्यान न दें।

बेशक, आप विशेष कंक्रीट सिस्टम के लिए अभ्यास में बहु थ्रेडेड कोड लिख सकते हैं - जैसे कि पेंथ्रेड या विंडोज। लेकिन कोई नहीं है मानकसी ++ 98 / सी ++ 03 के लिए बहु थ्रेडेड कोड लिखने का तरीका।

सी ++ 11 में सार मशीन डिज़ाइन द्वारा बहु-थ्रेडेड है। यह भी एक अच्छी तरह से परिभाषित है मेमोरी मॉडल; यानी, यह कहता है कि स्मृति तक पहुंचने के लिए कंपाइलर क्या कर सकता है और नहीं कर सकता है।

निम्नलिखित उदाहरण पर विचार करें, जहां वैश्विक चर की एक जोड़ी दो धागे द्वारा समवर्ती रूप से उपयोग की जाती है:

           Global
           int x, y;

Thread 1            Thread 2
x = 17;             cout << y << " ";
y = 37;             cout << x << endl;

थ्रेड 2 आउटपुट क्या हो सकता है?

सी ++ 98 / सी ++ 03 के तहत, यह अपरिभाषित व्यवहार भी नहीं है; सवाल ही है व्यर्थ क्योंकि मानक "थ्रेड" नामक किसी भी चीज पर विचार नहीं करता है।

सी ++ 11 के तहत, परिणाम अपरिभाषित व्यवहार है, क्योंकि लोड और स्टोर सामान्य रूप से परमाणु नहीं होना चाहिए। जो अधिक सुधार की तरह प्रतीत नहीं हो सकता है ... और स्वयं ही, यह नहीं है।

लेकिन सी ++ 11 के साथ, आप इसे लिख सकते हैं:

           Global
           atomic<int> x, y;

Thread 1                 Thread 2
x.store(17);             cout << y.load() << " ";
y.store(37);             cout << x.load() << endl;

अब चीजें ज्यादा दिलचस्प हो जाती हैं। सबसे पहले, यहां व्यवहार है परिभाषित। थ्रेड 2 अब प्रिंट कर सकता है 0 0 (यदि यह थ्रेड 1 से पहले चलता है) 37 17 (यदि यह थ्रेड 1 के बाद चलता है), या 0 17 (यदि यह थ्रेड 1 के बाद चलता है तो x को असाइन किया जाता है लेकिन इससे पहले कि यह y को असाइन करता है)।

यह प्रिंट नहीं कर सकता है 37 0, क्योंकि सी ++ 11 में परमाणु भार / स्टोर के लिए डिफ़ॉल्ट मोड लागू करना है अनुक्रमिक स्थिरता। इसका मतलब यह है कि सभी लोड और स्टोर्स "जैसे" हो सकते हैं, जैसा कि आपने उन्हें प्रत्येक थ्रेड के भीतर लिखा था, जबकि धागे के बीच संचालन को अंतःस्थापित किया जा सकता है, हालांकि सिस्टम पसंद करता है। तो परमाणुओं का डिफ़ॉल्ट व्यवहार दोनों प्रदान करता है atomicity तथा आदेश भार और दुकानों के लिए।

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

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_relaxed);   cout << y.load(memory_order_relaxed) << " ";
y.store(37,memory_order_relaxed);   cout << x.load(memory_order_relaxed) << endl;

सीपीयू जितना आधुनिक होगा, उतना ही अधिक संभावना है कि यह पिछले उदाहरण की तुलना में तेज़ हो।

अंत में, अगर आपको केवल विशेष भार और स्टोर रखने की आवश्यकता है, तो आप लिख सकते हैं:

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_release);   cout << y.load(memory_order_acquire) << " ";
y.store(37,memory_order_release);   cout << x.load(memory_order_acquire) << endl;

यह हमें आदेशित लोड और स्टोर पर वापस ले जाता है - इसलिए 37 0 अब एक संभावित आउटपुट नहीं है - लेकिन यह न्यूनतम ओवरहेड के साथ ऐसा करता है। (इस छोटे उदाहरण में, परिणाम पूर्ण उड़ा अनुक्रमिक स्थिरता के समान है; एक बड़े कार्यक्रम में, यह नहीं होगा।)

बेशक, यदि आप केवल एक ही आउटपुट देखना चाहते हैं 0 0 या 37 17, आप बस मूल कोड के चारों ओर एक म्यूटेक्स लपेट सकते हैं। लेकिन अगर आपने इसे अभी तक पढ़ा है, तो मुझे यकीन है कि आप पहले ही जानते हैं कि यह कैसे काम करता है, और यह उत्तर मेरे इरादे से पहले से ही लंबा है :-)।

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

हालांकि फ्रैंक होने के बावजूद, जब तक कि आप एक विशेषज्ञ न हों और कुछ गंभीर निम्न-स्तरीय कोड पर काम न करें, आपको शायद म्यूटेक्स और हालत चर के साथ रहना चाहिए। यही वह है जो मैं करना चाहता हूं।

इस सामान पर अधिक जानकारी के लिए, देखें यह ब्लॉग पोस्ट


1803
2018-06-12 00:23



अच्छा जवाब है, लेकिन यह वास्तव में नए प्राइमेटिव के कुछ वास्तविक उदाहरणों के लिए भीख मांग रहा है। साथ ही, मुझे लगता है कि प्राइमेटिव के बिना मेमोरी ऑर्डरिंग प्री-सी ++ 0x जैसा ही है: इसकी कोई गारंटी नहीं है। - John Ripley
@ जॉन: मुझे पता है, लेकिन मैं अभी भी खुद को primitives सीख रहा हूँ :-)। इसके अलावा मुझे लगता है कि वे बाइट एक्सेस की गारंटी परमाणु हैं (हालांकि आदेश नहीं दिया गया) यही कारण है कि मैं अपने उदाहरण के लिए "char" के साथ गया ... लेकिन मैं इसके बारे में भी 100% निश्चित नहीं हूं ... अगर आप किसी भी अच्छे सुझाव देना चाहते हैं " ट्यूटोरियल "संदर्भ मैं उन्हें अपने उत्तर में जोड़ दूंगा - Nemo
@ नवाज: हाँ! मेमोरी एक्सेस को कंपाइलर या सीपीयू द्वारा पुन: व्यवस्थित किया जा सकता है। (उदाहरण के लिए) कैश और सट्टा भार के बारे में सोचें। जिस क्रम में सिस्टम मेमोरी हिट हो जाती है वह कुछ भी नहीं हो सकता है जिसे आपने कोड किया था। कंपाइलर और सीपीयू यह सुनिश्चित करेगा कि इस तरह के पुनर्मूल्यांकन टूट जाएंगे एकल थ्रेड कोड। बहु थ्रेडेड कोड के लिए, "मेमोरी मॉडल" संभावित पुन: ऑर्डरिंग का वर्णन करता है, और क्या होता है यदि दो थ्रेड एक ही स्थान पर एक ही स्थान को पढ़ते / लिखते हैं, और आप दोनों पर नियंत्रण कैसे बढ़ाते हैं। सिंगल थ्रेडेड कोड के लिए, मेमोरी मॉडल अप्रासंगिक है। - Nemo
@ नवाज, @ नीमो - एक मामूली विस्तार: नया मेमोरी मॉडल सिंगल-थ्रेडेड कोड में प्रासंगिक है क्योंकि यह कुछ अभिव्यक्तियों की अनिश्चितता को निर्दिष्ट करता है, जैसे कि i = i++। की पुरानी अवधारणा अनुक्रम अंक छोड़ दिया गया है; नया मानक एक का उपयोग कर एक ही चीज़ निर्दिष्ट करता है अनुक्रम-से पहले संबंध जो अधिक सामान्य अंतर-धागे का एक विशेष मामला है होता है-पहले अवधारणा। - JohannesD
@ AJG85: मसौदे सी ++ 0x स्पेक के खंड 3.6.2 का कहना है, "स्थिर भंडारण अवधि (3.7.1) या थ्रेड स्टोरेज अवधि (3.7.2) के साथ चर किसी भी प्रारंभिक होने से पहले शून्य-प्रारंभिक (8.5) होगा जगह।" चूंकि x, y इस उदाहरण में वैश्विक हैं, इसलिए उनके पास स्थिर भंडारण अवधि है और इसलिए शून्य-प्रारंभिक होगा, मुझे विश्वास है। - Nemo


मैं केवल समानता दूंगा जिसके साथ मैं स्मृति स्थिरता मॉडल (या स्मृति मॉडल, संक्षिप्त के लिए) समझता हूं। यह लेस्ली लैमपोर्ट के मौलिक पेपर से प्रेरित है "एक वितरित प्रणाली में समय, घड़ियां, और घटनाक्रम की व्यवस्था"। समानता उपयुक्त है और इसका मौलिक महत्व है, लेकिन कई लोगों के लिए अधिक हो सकता है। हालांकि, मुझे उम्मीद है कि यह एक मानसिक छवि (एक चित्रमय प्रतिनिधित्व) प्रदान करता है जो स्मृति स्थिरता मॉडल के बारे में तर्क की सुविधा प्रदान करता है।

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

से उद्धरण "मेमोरी संगति और कैश समेकन पर एक प्राइमर"

अंतर्ज्ञानी (और सबसे प्रतिबंधित) मेमोरी मॉडल अनुक्रमिक स्थिरता (एससी) है जिसमें एक बहुप्रचारित निष्पादन प्रत्येक घटक धागे के अनुक्रमिक निष्पादन की अंतःक्रिया की तरह दिखना चाहिए, जैसे कि धागे एक-कोर प्रोसेसर पर समय-मल्टीप्लेक्स किए गए थे।

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

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

[विकिपीडिया से चित्र] Picture from Wikipedia

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

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

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

सी ++ 11 मेमोरी मॉडल में, इन्हें स्थापित करने के लिए एक समान तंत्र (अधिग्रहण-रिलीज स्थिरता मॉडल) का उपयोग किया जाता है स्थानीय कारणता संबंध

स्मृति स्थिरता की परिभाषा और अनुसूचित जाति को त्यागने के लिए एक प्रेरणा प्रदान करने के लिए, मैं उद्धरण दूंगा "मेमोरी संगति और कैश समेकन पर एक प्राइमर"

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

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

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

चूंकि कैश समेकन और स्मृति स्थिरता कभी-कभी भ्रमित होती है, इसलिए यह उद्धरण भी निर्देशक है:

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

हमारी मानसिक तस्वीर के साथ जारी रखते हुए, एसडब्ल्यूएमआर आविष्कार भौतिक आवश्यकता से मेल खाता है कि किसी एक स्थान पर स्थित एक कण पर होता है लेकिन किसी भी स्थान के पर्यवेक्षकों की असीमित संख्या हो सकती है।


281
2017-08-29 20:42



विशेष सापेक्षता के साथ समानता के लिए +1, मैं खुद को समान समानता बनाने की कोशिश कर रहा हूं। प्रायः मैं प्रोग्रामर्स को व्यवहार की व्याख्या करने की कोशिश कर रहे थ्रेडेड कोड की जांच करता हूं, जो एक अलग क्रम में एक-दूसरे के साथ एक दूसरे के साथ अंतःस्थापित होता है, और मुझे उन्हें बताना होगा, बहु-प्रोसेसर सिस्टम के साथ, अलग-अलग <s के बीच एक साथ की धारणा > संदर्भ के फ्रेम </ s> धागे अब अर्थहीन है। विशेष सापेक्षता की तुलना करना समस्या की जटिलता का सम्मान करने का एक अच्छा तरीका है। - Pierre Lebeaupin
@ अहमद नासर: स्टैनफोर्ड से साझा किया गया लिंक मर चुका है। - Joze
@ जॉज़: धन्यवाद। मैंने इसे एसीएम लाइब्रेरी के बजाय संदर्भित किया है। यह अभी भी वेब पर कहीं और आसानी से उपलब्ध है। - Ahmed Nassar
तो क्या आप निष्कर्ष निकालना चाहिए कि ब्रह्मांड बहुआयामी है? - Peter K
@ पीटरके: बिल्कुल :) और यहां भौतिक विज्ञानी ब्रायन ग्रीन द्वारा समय की इस तस्वीर का एक बहुत अच्छा दृश्य है: youtube.com/watch?v=4BjGWLJNPcA&t=22m12s  यह 22 और 12 सेकंड में "समय का भ्रम [पूर्ण वृत्तचित्र]" है। - Ahmed Nassar


यह अब एक बहु-वर्षीय प्रश्न है, लेकिन बहुत लोकप्रिय होने के कारण, सी ++ 11 मेमोरी मॉडल के बारे में सीखने के लिए एक शानदार संसाधन का उल्लेख करना उचित है। मुझे यह एक और पूर्ण जवाब देने के लिए अपनी बातचीत को संक्षेप में कोई बात नहीं दिखती है, लेकिन यह वह व्यक्ति है जिसने वास्तव में मानक लिखा है, मुझे लगता है कि यह बात देखने के लायक है।

हर्ब सटर में चैनल 9 साइट पर उपलब्ध "परमाणु <> हथियार" नामक सी ++ 11 मेमोरी मॉडल के बारे में तीन घंटे की लंबी बात है - भाग 1 तथा भाग 2। बात बहुत तकनीकी है, और निम्नलिखित विषयों को शामिल करती है:

  1. अनुकूलन, दौड़, और मेमोरी मॉडल
  2. ऑर्डरिंग - क्या: प्राप्त करें और रिलीज़ करें
  3. ऑर्डरिंग - कैसे: म्यूटेक्स, परमाणु, और / या बाड़
  4. कंपाइलर्स और हार्डवेयर पर अन्य प्रतिबंध
  5. कोड जनरल और प्रदर्शन: x86 / x64, आईए 64, पावर, एआरएम
  6. आराम से परमाणु

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


80
2017-12-20 13:22



यह बात वास्तव में शानदार है, इसे देखने में 3 घंटे का पूरा मूल्य है। - ZunTzu
@ZunTzu: अधिकांश वीडियो प्लेयर पर आप गति को 1.25, 1.5 या यहां तक ​​कि 2 बार मूल सेट कर सकते हैं। - Christian Severin
@ क्या आप लोग स्लाइड करने के लिए होते हैं? चैनल 9 टॉक पेज पर लिंक काम नहीं करते हैं। - athos
@athos मैं उन्हें नहीं है, क्षमा करें। चैनल 9 से संपर्क करने का प्रयास करें, मुझे नहीं लगता कि निष्कासन जानबूझकर था (मेरा अनुमान है कि उन्हें हर्ब सटर से लिंक मिला है, जैसा कि पोस्ट किया गया है, और बाद में उन्होंने फाइलों को हटा दिया, लेकिन यह सिर्फ एक अटकलें है ...)। - eran


इसका मतलब है कि मानक अब बहु-थ्रेडिंग को परिभाषित करता है, और यह परिभाषित करता है कि एकाधिक धागे के संदर्भ में क्या होता है। बेशक, लोग अलग-अलग कार्यान्वयन का इस्तेमाल करते थे, लेकिन यह पूछना है कि हमें क्यों होना चाहिए std::string जब हम सभी घर-लुढ़काए इस्तेमाल कर रहे थे string कक्षा।

जब आप POSIX थ्रेड या विंडोज थ्रेड के बारे में बात कर रहे हैं, तो यह एक भ्रम का थोड़ा सा है क्योंकि वास्तव में आप x86 थ्रेड के बारे में बात कर रहे हैं, क्योंकि यह एक हार्डवेयर फ़ंक्शन एक साथ चलने के लिए है। सी ++ 0 एक्स मेमोरी मॉडल गारंटी देता है, चाहे आप x86, या एआरएम पर हों, या MIPS, या कुछ भी जिसके साथ आप आ सकते हैं।


68
2018-06-11 23:42



Posix धागे x86 तक सीमित नहीं हैं। दरअसल, उन प्रणालियों पर लागू किए गए पहले सिस्टम शायद x86 सिस्टम नहीं थे। Posix धागे सिस्टम-स्वतंत्र हैं, और सभी Posix प्लेटफॉर्म पर मान्य हैं। यह वास्तव में भी सच नहीं है कि यह एक हार्डवेयर संपत्ति है क्योंकि पॉज़िक्स थ्रेड को सहकारी मल्टीटास्किंग के माध्यम से भी कार्यान्वित किया जा सकता है। लेकिन निश्चित रूप से अधिकांश थ्रेडिंग मुद्दे केवल हार्डवेयर थ्रेडिंग कार्यान्वयन पर सतर्क होते हैं (और कुछ मल्टीप्रोसेसर / मल्टीकोर सिस्टम पर भी)। - celtschk


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

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

दिलचस्प बात यह है कि सी ++ के लिए माइक्रोसॉफ्ट कंपाइलर्स ने अस्थिरता के लिए अर्थशास्त्र प्राप्त / रिलीज़ किया है जो सी ++ में स्मृति मॉडल की कमी से निपटने के लिए एक सी ++ एक्सटेंशन है। http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx। हालांकि, यह देखते हुए कि विंडोज केवल x86 / x64 पर चलता है, यह ज्यादा नहीं कह रहा है (इंटेल और एएमडी मेमोरी मॉडल एक भाषा में अधिग्रहण / रिलीज सेमेन्टिक्स को लागू करने के लिए आसान और कुशल बनाते हैं)।


49
2017-07-26 04:27



यह सच है कि, जब उत्तर लिखा गया था, तो विंडोज केवल x86 / x64 पर चलता है, लेकिन कुछ समय पर विंडोज़ आईए 64, एमआईपीएस, अल्फा एएक्सपी 64, पावरपीसी और एआरएम पर चलता है। आज यह एआरएम के विभिन्न संस्करणों पर चलता है, जो कि x86 से काफी अलग स्मृति है, और लगभग कहीं भी क्षमा नहीं है। - Lorenzo Dematté
वह लिंक कुछ हद तक टूटा हुआ है (कहता है "विजुअल स्टूडियो 2005 सेवानिवृत्त दस्तावेज")। इसे अपडेट करने की देखभाल? - Peter Mortensen
जब जवाब लिखा गया था तब भी यह सच नहीं था। - Ben
"एक ही स्मृति को समवर्ती रूप से एक्सेस करने के लिए"ए में पहुंचने के लिए परस्पर-विरोधी मार्ग - curiousguy


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

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

पहले, परमाणु संकलक इंट्रिनिक्स, या कुछ उच्च स्तरीय पुस्तकालय का उपयोग करके किया जाएगा। बाड़ सीपीयू-विशिष्ट निर्देशों (स्मृति बाधाओं) का उपयोग करके किया गया होगा।


22
2018-06-11 23:49



इससे पहले समस्या यह थी कि म्यूटेक्स (सी ++ मानक के मामले में) जैसी कोई चीज़ नहीं थी। इसलिए आपको प्रदान की जाने वाली एकमात्र गारंटी म्यूटेक्स निर्माता द्वारा की गई थी, जो तब तक ठीक था जब तक आपने कोड को पोर्ट नहीं किया था (क्योंकि गारंटी के लिए मामूली परिवर्तन स्पॉट करना मुश्किल है)। अब हमें मानक द्वारा प्रदान की गई गारंटी मिलती है जो प्लेटफार्मों के बीच पोर्टेबल होना चाहिए। - Martin York
@ मार्टिन: किसी भी मामले में, एक बात मेमोरी मॉडल है, और दूसरा परमाणु और थ्रेडिंग प्राइमेटिव हैं जो उस मेमोरी मॉडल के शीर्ष पर चलते हैं। - ninjalj
इसके अलावा, मेरा मुद्दा अधिकतर था कि पहले भाषा स्तर पर ज्यादातर स्मृति मॉडल नहीं था, यह अंतर्निहित CPU का मेमोरी मॉडल था। अब एक मेमोरी मॉडल है जो कोर भाषा का हिस्सा है; ओटीओएच, म्यूटेक्स और पसंद लाइब्रेरी के रूप में हमेशा किया जा सकता है। - ninjalj
यह कोशिश करने वाले लोगों के लिए भी एक वास्तविक समस्या हो सकती है लिखना म्यूटेक्स लाइब्रेरी। जब सीपीयू, मेमोरी कंट्रोलर, कर्नेल, कंपाइलर, और "सी लाइब्रेरी" सभी विभिन्न टीमों द्वारा लागू किए जाते हैं, और उनमें से कुछ हिंसक असहमति में हैं कि इस सामान को कैसे काम करना है, ठीक है, कभी-कभी सामान हम सिस्टम प्रोग्रामर को अनुप्रयोग स्तर पर एक सुंदर मुखौटा पेश करने के लिए करना है बिल्कुल सुखद नहीं है। - zwol
दुर्भाग्य से यदि आपकी भाषा में एक सतत मेमोरी मॉडल नहीं है तो सरल म्यूटेक्स के साथ अपने डेटा संरचनाओं को सुरक्षित रखने के लिए पर्याप्त नहीं है। विभिन्न कंपाइलर ऑप्टिमाइज़ेशन हैं जो एक थ्रेडेड संदर्भ में समझ में आते हैं, लेकिन जब कई धागे और सीपीयू कोर खेलते हैं, तो मेमोरी एक्सेस और अन्य ऑप्टिमाइज़ेशन के पुनर्वितरण में अपरिभाषित व्यवहार हो सकता है। अधिक जानकारी के लिए हंस बोहेम द्वारा "थ्रेड को पुस्तकालय के रूप में लागू नहीं किया जा सकता" देखें: citeseer.ist.psu.edu/viewdoc/... - exDM69