2013-03-12 18 views
10

जावा, जब हम साझा करने के निम्न चर दो धागे है में:लोडलोड लोडर वास्तव में क्या करता है?

int a; 
volatile int b; 

अगर धागा 1 करता है:

a = 5; 
b = 6; 

फिर एक StoreStore बाधा इन दोनों निर्देश और के बीच डाला जाता है 'एक' किया जा रहा है मुख्य स्मृति में वापस flushed।

अब अगर धागा 2 करता है:

if(b == 6) 
a++; 

एक LoadLoad बाधा के बीच डाला जाता है और हम एक गारंटी है कि अगर 'बी' के नए मूल्य के दृश्य तो नया मान है 'एक' के साथ-साथ दिखाई दे रहा है है । लेकिन वास्तव में यह कैसे हासिल किया जाता है? क्या लोडलोड लोड सीपीयू कैश/रजिस्टर्स को अमान्य करता है? या सिर्फ सीपीयू से अस्थिर से पढ़ने वाले चर के मान लाने के लिए एक सीपीयू निर्देशित करता है?

LoadLoad बाधाओं अनुक्रम:

मैं LoadLoad बाधा (http://gee.cs.oswego.edu/dl/jmm/cookbook.html) के बारे में इस जानकारी पाया है Load1; LoadLoad; लोड 2 सुनिश्चित करता है कि लोड 1 का डेटा लोड 2 द्वारा एक्सेस किए गए डेटा से पहले लोड किया गया है और सभी बाद के लोड निर्देश लोड किए गए हैं। सामान्य रूप से, स्पष्ट लोडलोड प्रोसेसर पर बाधाओं की आवश्यकता होती है जो सट्टा भार और/या आउट ऑफ़ ऑर्डर प्रोसेसिंग करते हैं जिसमें प्रतीक्षा लोड निर्देश बाईपास प्रतीक्षा स्टोर कर सकते हैं। प्रोसेसर पर जो लोड ऑर्डरिंग को हमेशा सुरक्षित रखने की गारंटी देते हैं, बाधाएं नो-ऑप्स की होती हैं।

लेकिन यह वास्तव में यह नहीं समझाता कि यह कैसे प्राप्त किया जाता है।

+0

उत्तर प्रोसेसर आर्किटेक्चर पर निर्भर करता है - उसी दस्तावेज़ में प्रत्येक प्रोसेसर निर्देश के साथ एक तालिका होती है जो दिखाती है कि 'लोडलोड' उदाहरण के लिए x86 पर नो-ऑप है। – assylias

+0

तो यह बिल्कुल कैसे काम करता है? मेरा मतलब है, स्टोरस्टोर के बाद मान स्मृति में वापस आ गए हैं। लेकिन फिर थ्रेड 2 उन्हें कैसे देखना चाहिए? यदि वह लोडलोड लोड-ऑप का मूल्यांकन करता है तो थ्रेड 2 कैश किए गए मानों का उपयोग जारी रख सकता है। – Janek

+0

क्योंकि प्रोसेसर का मेमोरी मॉडल इतना मजबूत है कि यह गारंटी देता है कि यह मामला होगा। मैं जो कहने की कोशिश कर रहा हूं वह यह है कि जावा एक वादा करता है कि यदि आप अस्थिरता का उपयोग करते हैं, तो कुछ नहीं होगा/नहीं होगा। यह JVM में कैसे कार्यान्वित किया गया है प्रोसेसर विशिष्ट है और विज्ञापन निर्देशों का उपयोग करता है (या यदि कोई प्रासंगिक है तो कोई निर्देश नहीं)। आप यहां लोडलोड/x86 बिंदु के बारे में अधिक पढ़ सकते हैं: http://altair.cs.oswego.edu/pipermail/concurrency-interest/2012-July/009615.html – assylias

उत्तर

3

मैं एक उदाहरण दूंगा कि यह कैसे प्राप्त किया जाता है। आप विवरण here पर और अधिक पढ़ सकते हैं। X86 प्रोसेसर के लिए जैसा कि आपने इंगित किया था कि लोडलोड लोड नहीं होता है। लेख में मैं मार्क बताते हैं कि

डौग StoreStore, LoadLoad और LoadStore

तो संक्षेप में केवल बाधा जरूरत x86 आर्किटेक्चर के लिए एक StoreLoad है सूचीबद्ध करता जुड़े। तो यह निम्न स्तर पर कैसे प्राप्त किया जाता है?

इस ब्लॉग से एक अंश है:

यहाँ कोड यह दोनों अस्थिर और गैर वाष्पशील के लिए उत्पन्न पढ़ने है:

nop      ;*synchronization entry 
mov 0x10(%rsi),%rax ;*getfield x 

और अस्थिर लेखन के लिए:

xchg %ax,%ax 
movq $0xab,0x10(%rbx) 
lock addl $0x0,(%rsp)  ;*putfield x 

lock निर्देश स्टोरलोड को डॉग के सी द्वारा सूचीबद्ध किया गया है ookbook।लेकिन ताला अनुदेश भी सिंक्रनाइज़ करता है सभी के रूप में listed

बंद निर्देश एक प्रोसेसर द्वारा लिखित और एक अन्य प्रोसेसर के द्वारा पढ़ा डेटा सिंक्रनाइज़ किया जा सकता है अन्य प्रक्रियाओं के साथ पढ़ता है।

यह अस्थिर भार के लिए लोड लोड लोडस्टोर बाधाओं को जारी करने के ऊपरी हिस्से को कम करता है।

यह सब कहा जा रहा है, मैं फिर से विचार करूँगा कि क्या assylias नोट किया। जिस तरह से ऐसा होता है वह डेवलपर के लिए महत्वपूर्ण नहीं होना चाहिए (यदि आप प्रोसेसर/कंपाइलर कार्यान्वयन में रुचि रखते हैं जो कि एक और कहानी है)। volatile कीवर्ड एक अंतरफलक

  1. कह की तरह है आप दिनांक पढ़ा जो एक और धागा
  2. आप JIT कम्पाइलर अनुकूलन द्वारा जला दिया नहीं किया जाएगा ने लिखा है करने के लिए सबसे ऊपर मिल जाएगा।
+0

अच्छा लिंक। मैं चुपचाप rephrase होगा: "* आपको सबसे पुराना पढ़ा जाएगा जो किसी अन्य धागे द्वारा लिखा गया है *" => "* अंत में अस्थिर चर से पढ़ने के बाद आप अंततः लिखेंगे -" आखिरकार "जिसका मतलब लगभग तुरंत अभ्यास में है * ";-) – assylias

+0

दरअसल, यह महत्वपूर्ण है कि आप इस बारे में रुचि रखते हैं कि आपका एप्लिकेशन कौन सा हार्डवेयर सबसे तेज़ चलता है या उच्चतम प्रदर्शन कैसे प्राप्त किया जाए। हम अंततः हमारे द्वारा किए गए चार-सॉकेट ज़ीऑन (64 एसएमटी) पर जाने से लाभ उठाने की उम्मीद कर रहे थे। यदि आपके पास हार्डवेयर पर कोई नियंत्रण नहीं है या केवल एकल सॉकेट पर चल रहा है, तो यह कोई समस्या नहीं हो सकती है, लेकिन समेकन कार्यान्वयन के विवरण और बड़े मशीनों पर स्केलेबिलिटी को कैसे प्रभावित करते हैं, वे निश्चित रूप से डिज़ाइन को प्रभावित कर सकते हैं यदि वे जल्दी से ज्ञात हैं। –

+0

@RalfH मैं 'अस्थिर' कीवर्ड का उपयोग कर औसत डेवलपर की तरफ से बात कर रहा था। आम तौर पर एक डेवलपर को इस बात की चिंता करने की आवश्यकता नहीं है कि अस्थिर कैसे कार्यान्वित किया जाता है।क्या आप एक उदाहरण देखते हैं जब अंतर्निहित वास्तुकला को जानना बदलता है कि आप अस्थिरता का अलग-अलग उपयोग कैसे करेंगे? –

0

यदि लोडलोड लोड-ऑप का मूल्यांकन करता है तो थ्रेड 2 कैश किए गए मानों का उपयोग जारी रख सकता है।

यह कुकबुक में "ऑर्डर ऑर्डर" तालिका द्वारा कवर किया गया है।

प्रोग्रामिंग आदेश

read b 
read a 
write a 
द्वारा "कैशिंग एक"

है, तो आप इसका मतलब यह कोड पुनर्क्रमित है

read a 
... 
read b 

यह पुनर्व्यवस्था निषिद्ध है।

+0

मैं वास्तव में सीपीयू कैश में असली कैशिंग का मतलब था, निर्देश पुनर्निर्देशन नहीं। – Janek

+0

लोड लोड है, यह CPU रजिस्टरों से नहीं पढ़ेगा। – ZhongYu

+0

@zhong मुझे लगता है कि जेनेक की चिंता थी, 'एक प्रोसेसर के रजिस्टर में एक क्षेत्र अद्यतित कैसे हो सकता है अगर यह किसी अन्य प्रोसेसर द्वारा लिखे जाने के बाद लोड शुरू नहीं करता है।' –

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