अलियासिंग (कंप्यूटिंग)

From Vigyanwiki
Revision as of 11:42, 7 August 2023 by alpha>Mahima Patel

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

उदाहरण

बफर अतिप्रवाह

उदाहरण के लिए, सी (प्रोग्रामिंग भाषा) के अधिकांश कार्यान्वयन सरणी सीमाओं की जांच नहीं करते हैं। फिर कोई व्यक्ति कंपाइलर और कंप्यूटर आर्किटेक्चर की असेंबली भाषा सम्मेलनों द्वारा प्रोग्रामिंग भाषा के कार्यान्वयन का लाभ उठा सकता है, ताकि सरणी के बाहर (एक प्रकार का बफ़र अधिकता) लिखकर अलियासिंग प्रभाव प्राप्त किया जा सके। यह सी भाषा विनिर्देश के अनुसार अपरिभाषित व्यवहार का आह्वान करता है; हालाँकि C के कई कार्यान्वयन यहाँ वर्णित अलियासिंग प्रभाव दिखाएंगे।

यदि कॉल स्टैक पर एक ऐरे बनाया जाता है, तो उस ऐरे डेटा संरचना के ठीक बगल में मेमोरी में एक वेरिएबल रखा जाता है, कोई ऐरे के बाहर इंडेक्स कर सकता है और संबंधित ऐरे तत्व को बदलकर वेरिएबल को सीधे बदल सकता है। उदाहरण के लिए, यदि कोई है int आकार 2 की सरणी (इस उदाहरण के लिए, इसे कॉल करना arr), दूसरे के बगल में int वेरिएबल (इसे कॉल करें i), arr[2] (यानी, तीसरा तत्व) को उपनाम दिया जाएगा i यदि वे स्मृति में आसन्न हैं।

# include <stdio.h>

int main()
{
  int arr[2] = { 1, 2 };
  int i=10;

  /* Write beyond the end of arr. Undefined behaviour in standard C, will write to i in some implementations. */
  arr[2] = 20;

  printf("element 0: %d \t", arr[0]); // outputs 1
  printf("element 1: %d \t", arr[1]); // outputs 2
  printf("element 2: %d \t", arr[2]); // outputs 20, if aliasing occurred
  printf("i: %d \t\t", i); // might also output 20, not 10, because of aliasing, but the compiler might have i stored in a register and print 10
  /* arr size is still 2. */
  printf("arr size: %lu \n", (long) (sizeof(arr) / sizeof(int)));
}

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

किसी कंपाइलर के लिए किसी ऐरे की सीमा से बाहर आने वाले एक्सेस के लिए अलियासिंग प्रभाव को छोड़ना गलत नहीं है।

उपनाम सूचक

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

निर्दिष्ट उपनाम

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

my @array = (1, 2, 3);

foreach my $element (@array) {
    # Increment $element, thus automatically
    # modifying @array, since $element is ''aliased''
    # to each of @array's elements in turn.
    $element++;
}

print "@array \n";

परिणामस्वरूप 2 3 4 प्रिंट आउट हो जाएगा। यदि कोई अलियासिंग प्रभावों को बायपास करना चाहता है, तो वह इंडेक्स वेरिएबल की सामग्री को दूसरे में कॉपी कर सकता है और कॉपी को बदल सकता है।

अनुकूलन के साथ संघर्ष

जब अलियासिंग संभव हो तो कंपाइलर का अनुकूलन को अक्सर वेरिएबल्स के बारे में रूढ़िवादी धारणाएँ बनानी पड़ती हैं। उदाहरण के लिए, किसी वेरिएबल का मान जानना (जैसे x 5 है) आम तौर पर कुछ अनुकूलन की अनुमति देता है (जैसे कि निरंतर तह#निरंतर प्रसार)। हालाँकि, कंपाइलर किसी अन्य वेरिएबल को असाइनमेंट के बाद इस जानकारी का उपयोग नहीं कर सकता है (उदाहरण के लिए, सी में, *y = 10) क्योंकि ऐसा हो सकता है *y का उपनाम है x. जैसे असाइनमेंट के बाद ऐसा हो सकता है y = &x. इस असाइनमेंट के प्रभाव के रूप में *y, का मान है x भी बदल दिया जाएगा, इसलिए जानकारी का प्रचार-प्रसार कर रहे हैं x निम्नलिखित कथनों में 5 है *y = 10 संभावित रूप से गलत होगा (यदि *y वास्तव में का एक उपनाम है x). हालाँकि, यदि पॉइंटर्स के बारे में जानकारी है, तो निरंतर प्रसार प्रक्रिया एक क्वेरी बना सकती है जैसे: कर सकते हैं x का उपनाम हो *y? फिर, यदि उत्तर नहीं है, x = 5 सुरक्षित रूप से प्रचारित किया जा सकता है।

अलियासिंग से प्रभावित एक अन्य अनुकूलन कोड पुनः व्यवस्थित करना है। यदि संकलक यह निर्णय लेता है x द्वारा उपनाम नहीं दिया गया है *y, फिर वह कोड जो के मान का उपयोग करता है या बदलता है x असाइनमेंट से पहले स्थानांतरित किया जा सकता है *y = 10, यदि इससे निर्देश शेड्यूलिंग में सुधार होगा या अधिक लूप अनुकूलन किए जाने में सक्षम होगा।

ऐसे अनुकूलन को पूर्वानुमेय तरीके से सक्षम करने के लिए, C (प्रोग्रामिंग भाषा) #ANSI C और C (प्रोग्रामिंग भाषा) के लिए ISO C (इसके नए C (प्रोग्रामिंग भाषा) #C99 संस्करण सहित, अनुभाग 6.5, पैराग्राफ 7 देखें) निर्दिष्ट करता है कि विभिन्न प्रकार के पॉइंटर्स का उपयोग करके एक ही मेमोरी स्थान तक पहुंचना अवैध है (कुछ अपवादों के साथ)। इसलिए एक कंपाइलर यह मान सकता है कि ऐसे पॉइंटर्स उपनाम नहीं देते हैं। यह नियम, जिसे सख्त अलियासिंग नियम के रूप में जाना जाता है, कभी-कभी प्रदर्शन में प्रभावशाली वृद्धि की अनुमति देता है,[1] लेकिन कुछ अन्यथा वैध कोड को तोड़ने के लिए जाना जाता है। कई सॉफ़्टवेयर प्रोजेक्ट जानबूझकर C99 मानक के इस भाग का उल्लंघन करते हैं। उदाहरण के लिए, CPython|Python 2.x ने संदर्भ गिनती को लागू करने के लिए ऐसा किया,[2] और इस अनुकूलन को सक्षम करने के लिए पायथन 3 में मूल ऑब्जेक्ट संरचनाओं में आवश्यक परिवर्तन। लिनक्स कर्नेल ऐसा इसलिए करता है क्योंकि सख्त एलियासिंग इनलाइन कोड के अनुकूलन में समस्याओं का कारण बनता है।[3] ऐसे मामलों में, जब जीएनयू कंपाइलर संग्रह के साथ संकलित किया जाता है, तो विकल्प -fno-strict-aliasing अवांछित अनुकूलन को रोकने के लिए लागू किया जाता है जो अप्रत्याशित कोड उत्पन्न कर सकता है।

हार्डवेयर एलियासिंग

अलियासिंग शब्द का उपयोग उस स्थिति का वर्णन करने के लिए भी किया जाता है, जहां हार्डवेयर डिज़ाइन विकल्प या हार्डवेयर विफलता के कारण, मेमोरी चयन प्रक्रिया में एक या अधिक उपलब्ध एड्रेस बिट्स का उपयोग नहीं किया जाता है।[4] यह एक डिज़ाइन निर्णय हो सकता है यदि स्थापित मेमोरी डिवाइस(डिवाइसों) का समर्थन करने के लिए आवश्यक से अधिक एड्रेस अंश ्स उपलब्ध हैं। विफलता में, एक या अधिक एड्रेस बिट्स को एक साथ छोटा किया जा सकता है, या ग्राउंड (बिजली) (तर्क 0) या आपूर्ति वोल्टेज (तर्क 1) के लिए मजबूर किया जा सकता है।

उदाहरण

इस उदाहरण के लिए, 8 स्थानों के साथ एक मेमोरी डिज़ाइन मानते हुए, 2 के बाद से केवल 3 पता पंक्तियों (या बिट्स) की आवश्यकता होती है3=8). मानक काउंटर (डिजिटल) फैशन में, अद्वितीय मेमोरी स्थानों का चयन करने के लिए एड्रेस बिट्स (ए 2 से ए 0 नामित) को डीकोड किया जाता है:

A2 A1 A0 Memory location
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

उपरोक्त तालिका में, पता बिट्स के 8 अद्वितीय संयोजनों में से प्रत्येक एक अलग मेमोरी स्थान का चयन करता है। हालाँकि, यदि एक एड्रेस बिट (मान लीजिए A2) को ग्राउंड पर छोटा किया जाना है, तो तालिका को निम्नानुसार संशोधित किया जाएगा:

A2 A1 A0 Memory location
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3

इस मामले में, A2 हमेशा शून्य होने पर, पहले चार मेमोरी स्थान डुप्लिकेट हो जाते हैं और दूसरे चार के रूप में फिर से दिखाई देते हैं। स्मृति स्थान 4 से 7 अप्राप्य हो गए हैं।

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

यह भी देखें

  • उपघटन प्रतिरोधी
  • कंप्यूटर ग्राफिक्स सहित सिग्नल प्रोसेसिंग पर लागू होने पर शब्द के उपयोग के लिए उपनाम

संदर्भ

  1. Mike Acton (2006-06-01). "Understanding Strict Aliasing".
  2. Neil Schemenauer (2003-07-17). "ANSI strict aliasing and Python".
  3. Linus Torvalds (2003-02-26). "Re: Invalid compilation without -fno-strict-aliasing".
  4. Michael Barr (2012-07-27). "Software Based Memory Testing".


बाहरी संबंध