2009-10-18 11 views
13

मैं समझता हूं कि मेमोरी तक पहुंचने का क्या अर्थ है कि यह गठबंधन है लेकिन मुझे समझ में नहीं आता कि यह क्यों जरूरी है। उदाहरण के लिए, मैं एक पते से एक बाइट को 0x…1 से क्यों एक्सेस कर सकता हूं लेकिन मैं उसी पते से आधा शब्द (दो बाइट) तक नहीं पहुंच सकता।शब्द संरेखण को समझना

फिर से, मैं समझता हूं कि यदि आपके पास A पता है और s आकार का एक ऑब्जेक्ट है कि A mod s = 0 पर पहुंच गठबंधन है। लेकिन मुझे समझ में नहीं आता कि यह हार्डवेयर स्तर पर क्यों महत्वपूर्ण है।

उत्तर

26

हार्डवेयर जटिल है; यह एक सरल व्याख्या है।

एक विशिष्ट आधुनिक कंप्यूटर में 32-बिट डेटा बस हो सकती है। इसका मतलब यह है कि सीपीयू को जो भी लाने की ज़रूरत है वह किसी विशेष मेमोरी पते के सभी 32 बिट्स लाएगा। चूंकि डेटा बस 32 बिट्स से कम कुछ भी नहीं ला सकती है, इसलिए पता बस पर सबसे कम दो एड्रेस बिट्स का भी उपयोग नहीं किया जाता है, इसलिए ऐसा लगता है कि रैम को 32-बिट शब्दों के अनुक्रम में व्यवस्थित किया गया है 8- बिट बाइट्स

जब सीपीयू एक बाइट के लिए एक fetch करता है, बस पर पढ़ने चक्र 32 बिट लाएगा और फिर सीपीयू उन बिट्स में से 24 को त्याग देगा, शेष 8 बिट्स जो भी रजिस्टर में लोड हो जाएगा।

  • की उचित भागों लोड करने के लिए बस में दो अलग-अलग पढ़ने चक्र निष्पादित करें: सीपीयू एक 32 बिट मूल्य है कि नहीं एक 32-बिट सीमा पर गठबंधन लाने के लिए चाहता है, यह कई सामान्य विकल्प है डेटा शब्द और उन्हें दोबारा इकट्ठा करें
  • पता
  • के कम दो बिट्स को फेंकने वाले पते पर 32-बिट शब्द को पढ़ें, 32-बिट शब्द में एकत्रित बाइट्स के कुछ अप्रत्याशित संयोजन को पढ़ें, संभवतः वह नहीं चाहता था
  • एक अपवाद फेंक

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

+0

http://www.ibm.com/developerworks/library/pa-dalign/ – KawaiKx

+0

* पता बस पर सबसे कम दो पता बिट्स का भी उपयोग नहीं किया जाता है * यदि ऐसा है तो 32 बिट पते को केवल 30 के साथ कैसे संबोधित किया जाता है बिट? अगर मैं ग़लत हूं तो मेरी गलती सुझाएं। –

7

कंप्यूटर हमेशा कुछ निश्चित आकार के हिस्सों में पढ़ता है जो गठबंधन होते हैं।

तो, यदि आप स्मृति में अपना डेटा संरेखित नहीं करते हैं, तो आपको शायद एक से अधिक बार पढ़ना होगा।

उदाहरण

  • शब्द आकार 8 बाइट्स
  • अपने संरचना है भी 8 बाइट्स
  • है अगर आप इसे संरेखित, यदि आप डॉन 'एक हिस्सा
  • पढ़नी होगी इसे संरेखित करें, आपको दो भाग

पढ़ना होगा, इसलिए, मूल रूप से तेज़ी से बढ़ना है।

-1

मेरे पास बहुत बुनियादी (शायद गूंगा) प्रश्न है: यह स्मृति पहली जगह क्यों गठबंधन नहीं होगी? मेरा मतलब है, अगर आप दिए गए मशीन के लिए डेटा पढ़ रहे हैं और लिख रहे हैं, तो आप इसके संरेखण नियमों का पालन करेंगे। 32-बिट सिस्टम पर, मैं डेटा लिखना सुनिश्चित करूंगा जो 32-बिट गठबंधन है।

क्या इसका नेटवर्क बाइट ऑर्डरिंग के साथ कुछ करना है?

+0

यह एक सिद्धांत प्रश्न है। – ChrisDiRulli

+1

नेटवर्क बाइट ऑर्डरिंग के साथ इसका कोई संबंध नहीं है। इसका कारण यह है कि डेटा को एल 1- (डेटा)-कैश में संग्रहीत किया जाना चाहिए, प्रत्येक कैश लाइन में 64 बाइट का आकार होता है (यह किसी अन्य आर्किटेक्चर के लिए अलग हो सकता है लेकिन नियम समान हैं) , इसलिए यदि आप इसे कैश लाइन की सीमा पर सहेजने का प्रयास करते हैं, तो दो पंक्तियों को पढ़ना और लिखा जाना चाहिए क्योंकि वे संशोधित हो गए हैं, और इससे वृद्धिशील प्रदर्शन प्रभावित होता है। इस डेटा के कारण "सीमाएं" पर गठबंधन होना है। – Quonux

0

एक सीरियल पोर्ट पढ़ने का प्रयास करें। डेटा 8 बिट चौड़ा है। अच्छा हार्डवेयर डिजाइनर यह सुनिश्चित करते हैं कि यह शब्द के कम से कम महत्वपूर्ण बाइट पर स्थित है।

यदि आपके पास सी संरचना है जिसमें तत्वों को गठबंधन नहीं किया गया है (पिछली संगतता या स्मृति के संरक्षण से) तो संरचना के भीतर किसी भी बाइट का पता शब्द गठबंधन नहीं है।

2

कारण के लिए सभी संरेखण नियमों कैश लाइन्स (निर्देश-कैश Core2 आर्किटेक्चर, और डेटा-कैश के लिए 16 बाइट लाइनों है एल 1 और 128- के लिए 64-बाइट लाइन्स की क्या ज़रूरत है की विभिन्न चौड़ाई हैं एल 2 के लिए बाइट लाइन्स)।

तो अगर आप/लोड डेटा है कि एक Cahce लाइन सीमा को पार संग्रहीत करना चाहते हैं आप लोड और दोनों कैश लाइनों, जो प्रदर्शन हिट स्टोर करने के लिए की जरूरत है। तो आप प्रदर्शन हिट की वजह से ऐसा नहीं करते हैं, यह इतना आसान है।

+1

क्या आप अपना उत्तर अधिक विस्तृत कर सकते हैं? यह दिलचस्प लगता है। आधुनिक प्रोसेसर शायद ही कभी स्मृति को संबोधित करते हैं। वे वास्तव में कैश से डेटा प्राप्त करते हैं। तो शब्द संरेखण केवल कैश के साथ कुछ करने के लिए होना चाहिए? बहुत धन्यवाद – KawaiKx