2012-06-16 7 views
5

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

मुझे आश्चर्य है कि इतनी सारी सीमाएं क्यों हैं, इतने सारे प्रतिबंध LOCK को बेकार लगते हैं। मैं इसका उपयोग सामान्य लेखन ऑपरेशन की गारंटी के लिए नहीं कर सकता, जिसमें गंदे डेटा या समांतरता के कारण अन्य समस्याएं नहीं हैं।

उदा। मैंने सी + पी में कोड ++ (* पी) लिखा है जो एक साझा स्मृति में सूचक है।

movl 28(%esp), %eax 
movl (%eax), %eax 
leal 1(%eax), %edx 
movl 28(%esp), %eax 
movl %edx, (%eax) 

मैंने पहले "movl" और "लील" जोड़ा "ताला", लेकिन प्रोसेसर शिकायत "अवैध निर्देश": की तरह इसी विधानसभा है। :-(मैं लिखने के संचालन धारावाहिक बनाने के लिए एक ही रास्ता लगता है, सही सॉफ्टवेयर म्युटेक्स उपयोग करने के लिए है?

+1

http://en.wikipedia.org/wiki/Fetch-and-add – Mysticial

+1

http://en.wikipedia.org/wiki/compare-and-swap – Mysticial

+2

एक गठबंधन पते पर 'movl' हमेशा परमाणु है , तो लॉक बिल्कुल कोई फर्क नहीं पड़ता। – hirschhornsalz

उत्तर

12

मैं निश्चित रूप से lock बेकार फोन नहीं होता। lock cmpxchgcompare-and-swap प्रदर्शन करने के लिए मानक तरीका है, जिनमें से मूल निर्माण खंड है है कई तुल्यकालन एल्गोरिदम।

इसके अलावा, fetch-and-add देखते हैं।

+0

धन्यवाद। मैं इसकी जांच करुँगा। – Sean

5

lock के प्रयोजन के संचालन सुनिश्चित करने के लिए है परमाणु, धारावाहिक। इस तरह सीपीयू से पहले आपरेशन प्रभावी होता है रोका नहीं जा सकता है नहीं।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे इन शब्दावली के बारे में बहुत यकीन नहीं है। मुझे लगता है कि परमाणु का मतलब है कि ऑपरेशन पूरी तरह से किया जाएगा, कोई रुकावट नहीं, अन्यथा रद्द कर दिया जाएगा। इस समस्या में, भले ही "लॉक एड" एक परमाणु तरीके से किया जाता है, अगर इसका मतलब यह नहीं है कि अन्य प्रोसेसर एक ही समय में उस स्मृति स्थान को चुपचाप एक्सेस नहीं कर सकता है। तो एक ही मेमोरी लोकेशन के समानांतर पहुंच को रोकने के लिए "लॉक" क्या कर रहा है। मुझे लगता है कि इसे धारावाहिक कहा जाता है, जिससे हर थ्रेड मेमोरी को एक-एक करके एक्सेस करता है। – Sean

+1

परमाणु संचालन प्राइमेटिव का उपयोग * क्रमशः * क्रमबद्ध करने के लिए किया जाता है, लेकिन वे खुद को क्रमबद्ध नहीं कर रहे हैं; क्रमबद्धता कई इकाइयों को संदर्भित करती है * एक ही ऑपरेशन * एक समय में प्रदर्शन करते हुए, जबकि परमाणु संचालन एक अलग गति में एक मनमानी ऑपरेशन को पूर्ववत करता है, जो दूसरों द्वारा निर्विवाद होता है। –

0

यह उपयोगी है जब, एक मल्टीप्रोसेसर मशीन पर, दो समवर्ती प्रक्रियाएं होती हैं जो समान डेटा का उपयोग कर रही हैं लेकिन वे इसे एक साथ संशोधित नहीं कर सकते हैं।

जब प्रक्रियाओं में से कोई एक डेटा संशोधित कर रहा है, तो यह संशोधित निर्देश पर ताला का उपयोग करता है ताकि जब दूसरी प्रक्रिया इसे संशोधित करने का प्रयास करे, तो इसे करने में सक्षम होने से पहले इसे पहले नौकरी खत्म करने की प्रतीक्षा करनी होगी इसकी बारी पर खुद का।

मुझे आशा है कि इससे थोड़ा सा मदद मिलेगी।

2

x86 प्रोसेसर बालों के डिज़ाइन के लिए जाने जाते हैं जिनमें कई सुविधाएं, बहुत सारे नियम और उन सभी नियमों के लिए और भी अपवाद हैं। यह परिवार के लिए लंबे इतिहास से संबंधित है।

जब कंपाइलर या लोग LOCK का उपयोग कर रहे हैं, तो वे हमेशा इसकी सभी सीमाओं के साथ इसका उपयोग कर रहे हैं, अक्सर विशेष रूप से थ्रेड के बीच सिंक्रनाइज़ेशन करने के लिए पेश किए गए डेटा पर, एल्गोरिदम अंततः हेरफेर करने वाले अनुप्रयोग डेटा के विपरीत। एक तो इसके विपरीत थ्रेड सिंक्रनाइज़ेशन प्रोटोकॉल को LOCK उनके विपरीत कर सकता है, इसके विपरीत।

सामान्य प्रकार के निर्देश को आप देख रहे हैं memory barriers कहा जाता है। दरअसल, x86 में इस परिवार (MFENCE, LFENCE, SFENCE) से कई "आधुनिक" निर्देश हैं। वे क्रमशः पूर्ण बाड़, भार बाड़, और स्टोर बाड़ हैं। हालांकि, निर्देश सेट में उनका महत्व SSE तक सीमित है, क्योंकि इंटेल निर्देश सेट के पारंपरिक भाग पर लिखने के क्रमिकरण की गारंटी देता है, और यह बहुत अधिक कारण है कि यह वृद्ध वास्तुकला बहुप्रचारित प्रोग्रामिंग के लिए एक आसान लक्ष्य है।

अधिक जानकारी के लिए this answer भी देखें।

0

उदाहरण उपलब्ध कराने में, आप एक lock उपसर्ग एक inc अनुदेश इस तरह (यह मानते हुए p%eax में स्थित है) के साथ उपयोग कर सकते हैं: अधिक सामान्य मामलों में

lock inc (%eax) 

, आप हालांकि ताले उपयोग करना होगा।

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