स्वैप (कंप्यूटर प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
(Created page with "{{distinguish|text=Virtual memory, known as "swap" in some operating systems}} {{Multiple issues| {{more footnotes|date=February 2016}} {{one source|date=February 2016}} }...")
 
No edit summary
 
(14 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{distinguish|text=[[Virtual memory]], known as "swap" in some operating systems}}
[[कंप्यूटर प्रोग्राम|कंप्यूटर]] प्रोग्रामिंग में, दो [[चर (प्रोग्रामिंग)|चर]] की परस्पर परिवर्तन का कार्य चर के मूल्यों के परस्पर आदान-प्रदान को संदर्भित करता है। सामान्यतः, यह [[ कंप्यूटर भंडारण |कंप्यूटर भंडारण]] में डेटा के साथ किया जाता है। उदाहरण के लिए, एक कंप्यूटर प्रोग्राम में, दो चर राशि को इस प्रकार परिभाषित किया जा सकता है:
{{Multiple issues|
{{more footnotes|date=February 2016}}
{{one source|date=February 2016}}
}}
 
[[[[कंप्यूटर प्रोग्राम]]िंग]] में, दो [[चर (प्रोग्रामिंग)]] की अदला-बदली का कार्य चर के मूल्यों के परस्पर आदान-प्रदान को संदर्भित करता है। आमतौर पर, यह [[ कंप्यूटर भंडारण ]] में डेटा के साथ किया जाता है। उदाहरण के लिए, एक कंप्यूटर प्रोग्राम में, दो वेरिएबल्स को इस प्रकार परिभाषित किया जा सकता है ([[स्यूडोकोड]] में):
 
<पूर्व>data_item x:= 1
डेटा_आइटम वाई: = 0


स्वैप (एक्स, वाई); </प्री>
<pre>data_item x := 1
data_item y := 0


स्वैप () करने के बाद, ''x'' में 0 मान होगा और ''y'' में 1 होगा; उनके मूल्यों का आदान-प्रदान किया गया है। इस ऑपरेशन को अन्य प्रकार के मानों के लिए सामान्यीकृत किया जा सकता है, जैसे कि [[स्ट्रिंग (कंप्यूटर विज्ञान)]] और एकत्रित [[डेटा प्रकार]]। तुलना प्रकार डेटा की स्थिति बदलने के लिए स्वैप का उपयोग करते हैं।
swap (x, y);</pre>


कई [[प्रोग्रामिंग भाषा]]ओं में स्वैप [[सबरूटीन]] बिल्ट-इन होता है। [[सी ++]] में, [[समारोह अधिभार]] प्रदान की जाती है जिससे ओ (1) समय में कुछ बड़ी संरचनाओं का आदान-प्रदान करने के लिए std :: स्वैप की अनुमति मिलती है।
स्वैप निष्पादित होने के बाद, ''x'' में मान 0 होगा और ''y'' में 1 होगा; तथा उनके मूल्यों का आदान-प्रदान किया जा सकता है। इस ऑपरेशन को अन्य प्रकार के मानों के लिए सामान्यीकृत किया जा सकता है, जैसे कि [[स्ट्रिंग (कंप्यूटर विज्ञान)|स्ट्रिंग]] और समेकित [[डेटा प्रकार]]। तुलनात्मक डेटा की स्थिति को परिवर्तित करने के लिए स्वैप का उपयोग करते हैं।


== एक अस्थायी चर == का उपयोग करना
कई [[प्रोग्रामिंग भाषा]]ओं में स्वैप अंतर्निर्मित होता है। [[सी ++]] में, [[समारोह अधिभार|फंक्शन अधिभार]] प्रदान की जाती है जिससे o (1) समय में कुछ बड़ी संरचनाओं का आदान-प्रदान करने के लिए स्वैप की अनुमति मिलती है।
{{See also|CPU cache}}


दो वेरिएबल्स को स्वैप करने के लिए सबसे सरल और शायद सबसे व्यापक रूप से इस्तेमाल की जाने वाली विधि तीसरे अस्थायी वेरिएबल का उपयोग करना है:
=== एक टेम्प का उपयोग करना ===
{{See also|सीपीयू कैश}}


<पूर्व>
दो चर राशि को स्वैप करने के लिए सबसे सरल और सबसे व्यापक रूप से प्रयोग की जाने वाली विधि तीसरे अस्थायी चर राशि का उपयोग करता है
स्वैप परिभाषित करें (एक्स, वाई)
स्वैप परिभाषित करें                                                                                                   (x , y)
     अस्थायी: = x
<pre>
     एक्स :=
define swap (x, y)
     वाई: = अस्थायी
     temp := x
</पूर्व>
     x := y
     y := temp
</pre>
जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होता है, परस्परित परिवर्तन किए जाने वाले मानों का आकार बहुत बड़ा होता है, जिसका अर्थ है कि [[अस्थायी चर]] बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में।


जबकि यह वैचारिक रूप से सरल है और कई मामलों में दो चर स्वैप करने का एकमात्र सुविधाजनक तरीका है, यह अतिरिक्त मेमोरी का उपयोग करता है। हालांकि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, अदला-बदली किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है (जिसका अर्थ है कि [[अस्थायी चर]] बहुत अधिक मेमोरी भी ले सकते हैं), या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि छँटाई एल्गोरिदम में।
इसके अतिरिक्त, C++ जैसी ऑब्जेक्ट-ओरिएंटेड भाषाओं में दो चरों को प्रतिस्थापित करने पर अस्थायी चरों के लिए क्लास कंस्ट्रक्टर और डिस्ट्रक्टर को एक कॉल और कॉपी कंस्ट्रक्टर के लिए तीन कॉल सम्मिलित हो सकते हैं। कुछ वर्ग कंस्ट्रक्टर में मेमोरी आवंटित नहीं किया जा सकता हैं और इसे डिस्ट्रक्टर से हटाया जा सकता हैं, इस प्रकार प्रणाली में महंगा कॉल निर्मित किया जाता हैं।
 
इसके अलावा, [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ]] में दो वेरिएबल्स की अदला-बदली | ऑब्जेक्ट-ओरिएंटेड लैंग्वेज जैसे C++ में अस्थायी वेरिएबल के लिए [[ कक्षा (कंप्यूटर विज्ञान) ]] [[कंस्ट्रक्टर (कंप्यूटर साइंस)]] और [[ विध्वंसक (कंप्यूटर विज्ञान) ]] के लिए एक कॉल और तीन कॉल शामिल हो सकते हैं। वस्तु जीवनकाल # निर्माण विधियाँ। कुछ वर्ग कंस्ट्रक्टर में मेमोरी आवंटित कर सकते हैं और इसे डिस्ट्रक्टर में हटा सकते हैं, इस प्रकार सिस्टम को महंगी कॉल बना सकते हैं। बहुत अधिक डेटा वाली कक्षाओं के लिए कॉपी कंस्ट्रक्टर, उदा। एक [[सरणी डेटा संरचना]] में, डेटा को मैन्युअल रूप से कॉपी करने की आवश्यकता भी हो सकती है।


== एक्सओआर स्वैप ==
== एक्सओआर स्वैप ==


:{{main|XOR swap algorithm}}
:{{main|एक्सओआर स्वैप प्रारूप}}
XOR स्वैप दो न्यूमेरिक वेरिएबल्स को स्वैप करने के लिए बिटवाइज़ ऑपरेशन#XOR ऑपरेशन का उपयोग करता है। यह आम तौर पर ऊपर उल्लिखित भोली विधि की तुलना में तेज़ होने के लिए कहा जाता है; हालाँकि इसमें XOR स्वैप एल्गोरिथम है # व्यवहार में परिहार के कारण। XOR स्वैप का उपयोग आमतौर पर [[पूर्णांक]] जैसे निम्न-स्तरीय डेटा प्रकारों को स्वैप करने के लिए किया जाता है। हालांकि, सिद्धांत रूप में, यह किन्हीं भी दो मूल्यों की अदला-बदली करने में सक्षम है, जिन्हें निश्चित-लंबाई [[ bitstring ]]्स द्वारा दर्शाया जा सकता है।
एक्सओआर स्वैप दो न्यूमेरिक चर राशि को स्वैप करने के लिए एक्सओआर ऑपरेशन का उपयोग करता है यह सामान्यतः ऊपर उल्लिखित सरल विधि की तुलना में तेज़ होने का दावा करता है। यद्यपि इसमें एक्सओआर स्वैप प्रारूप है व्यवहार में परिहार के कारण एक्सओआर स्वैप का उपयोग सामान्यतः [[पूर्णांक]] जैसे निम्न-स्तरीय डेटा प्रकारों को स्वैप करने के लिए किया जाता है। यद्यपि, सिद्धांत रूप में, यह किन्हीं भी दो मूल्यों की परस्परित आदान - प्रदान करने में सक्षम है, जिन्हें निश्चित-लंबाई बिटस्ट्रीम द्वारा दर्शाया जा सकता है।


== जोड़ और घटाव के माध्यम से स्वैप करें ==
== जोड़ और घटाव के माध्यम से स्वैप करें ==
{{main|Swap by addition and subtraction}}
{{main|जोड़ और घटाव द्वारा स्वैप करें}}
यह विधि दो चरों को उनके मानों को जोड़कर और घटाकर स्वैप करती है। व्यावहारिक अनुप्रयोगों में इसका शायद ही कभी उपयोग किया जाता है, मुख्यतः क्योंकि:
मुख्यतः यह विधि दो चरों को उनके मानों को जोड़कर और घटाकर स्वैप किया जाता है। क्योंकि व्यावहारिक अनुप्रयोगों में इसका किंचित ही कभी उपयोग किया जाता है, समांतर
* यह केवल संख्यात्मक चर स्वैप कर सकता है; [[कंटेनर (डेटा संरचना)]] जैसे जटिल डेटा प्रकारों को जोड़ना या घटाना संभव या तार्किक नहीं हो सकता है।
* यह मात्र संख्यात्मक चर स्वैप कर सकता है; [[कंटेनर (डेटा संरचना)]] जैसे जटिल डेटा प्रकारों को जोड़ना या घटाना संभव या तार्किक नहीं हो सकता है।
* एक निश्चित आकार के चर स्वैप करते समय, [[अंकगणितीय अतिप्रवाह]] एक मुद्दा बन जाता है।
* एक निश्चित आकार के चर स्वैप करते समय, [[अंकगणितीय अतिप्रवाह]] एक विषय बन गया है।
* यह आम तौर पर फ़्लोटिंग-पॉइंट मानों के लिए काम नहीं करता है, क्योंकि [[फ़्लोटिंग-पॉइंट अंकगणित]] सहयोगीता # गैर-सहयोगी है। गैर-सहयोगी।
* यह सामान्यतः चल बिन्दु मानों के लिए काम नहीं करता है, क्योंकि [[फ़्लोटिंग-पॉइंट अंकगणित|चल बिन्दु समांतर]] गैर-सहयोगी है।


== कंटेनरों की अदला-बदली ==
== कंटेनरों का परस्पर परिवर्तन ==


कंटेनर (डेटा संरचना) जो [[डेटा सूचक]] का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, केवल पॉइंटर्स को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह आमतौर पर प्रोग्रामिंग लैंग्वेज सपोर्टिंग पॉइंटर्स में पाया जाता है, जैसे c (प्रोग्रामिंग लैंग्वेज) या C ++। [[मानक टेम्पलेट लाइब्रेरी]] कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।<ref>{{Cite web|url=http://www.sgi.com/tech/stl/swap.html#2|title = HPPSocialUserSignonPage - Hewlett Packard Enterprise Community}}</ref>
कंटेनर जो [[डेटा सूचक]] का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, मात्र संकेत को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह सामान्यतः प्रोग्रामिंग भाषा सहायक संकेतो में पाया जाता है,जैसे C या C++। [[मानक टेम्पलेट लाइब्रेरी]] कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।<ref>{{Cite web|url=http://www.sgi.com/tech/stl/swap.html#2|title = HPPSocialUserSignonPage - Hewlett Packard Enterprise Community}}</ref>जैसा कि संकेत चर सामान्यतः  एक निश्चित आकार के होते हैं उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 [[ अंश |अंश]] लंबे संकेत होते हैं, और वे संख्यात्मक होते हैं, उन्हें एक्सओआर स्वैप का उपयोग करके तुरंत से स्वैप किया जा सकता है।
जैसा कि पॉइंटर चर आमतौर पर एक निश्चित आकार के होते हैं (उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 [[ अंश ]] लंबे पॉइंटर्स होते हैं), और वे संख्यात्मक होते हैं, उन्हें #XOR स्वैप का उपयोग करके जल्दी से स्वैप किया जा सकता है।


== समानांतर असाइनमेंट ==
== समानांतर असाइनमेंट ==


[[ रूबी (प्रोग्रामिंग भाषा) ]] या पायथन (प्रोग्रामिंग लैंग्वेज) जैसी कुछ भाषाएं असाइनमेंट (कंप्यूटर साइंस)#Parallel असाइनमेंट को सपोर्ट करती हैं, जो दो वेरिएबल्स की अदला-बदली के लिए नोटेशन को सरल बनाता है:
रूबी या पायथन जैसी कुछ भाषाएँ समानांतर असाइनमेंट का समर्थन करती हैं, जो दो चरों की परस्पर परिवर्तन के लिए संकेतन को सरल बनाती हैं:


<पूर्व>
<pre>
, बी = बी,
a, b = b, a
</पूर्व>
</pre>


यह एक मध्यवर्ती डेटा संरचना से जुड़े ऑपरेशन के लिए आशुलिपि है: पायथन में, एक टपल; रुबी में, एक सरणी।
यह एक मध्यवर्ती डेटा संरचना से जुड़े ऑपरेशन के लिए आशुलिपि है: पायथन में, एक टपल रुबी में, एक सरणी जावास्क्रिप्ट 6+ विनाशकारी ऑपरेटरों का समर्थन करता है जो एक ही काम करते हैं:


जावास्क्रिप्ट 6+ विनाशकारी ऑपरेटरों का समर्थन करता है जो एक ही काम करते हैं:
<pre>
 
[a, b] = [b, a];
<पूर्व>
</pre>
[, बी] = [बी, ];
</पूर्व>


== फंक्शन स्वैप ==
== फंक्शन स्वैप ==
Line 85: Line 75:
}}
}}


==आधुनिक कम्प्यूटरों में अदला-बदली की सुविधा==
==आधुनिक कम्प्यूटरों में परस्पर परिवर्तन की सुविधा==


===समर्पित निर्देश===
===समर्पित निर्देश===
कंप्यूटर में डेटा की अदला-बदली के कई अनुप्रयोगों के कारण, अधिकांश केंद्रीय प्रसंस्करण इकाइयां अब अंतर्निहित निर्देशों के माध्यम से चर को सीधे स्वैप करने की क्षमता प्रदान करती हैं। [[x86 आर्किटेक्चर]] प्रोसेसर, उदाहरण के लिए, एक तीसरे अस्थायी रजिस्टर का उपयोग करने की आवश्यकता के बिना दो [[प्रोसेसर रजिस्टर]]ों को सीधे स्वैप करने के लिए एक XCHG निर्देश शामिल करें। कुछ प्रोसेसर आर्किटेक्चर में एक तुलना-और-स्वैप निर्देश भी प्रदान किया जाता है, जो दो रजिस्टरों की तुलना करता है और सशर्त रूप से स्वैप करता है। इसका उपयोग पारस्परिक बहिष्करण तकनीकों का समर्थन करने के लिए किया जाता है।
कंप्यूटर में डेटा की परस्पर परिवर्तन के कई अनुप्रयोगों के कारण,अधिकांश केंद्रीय प्रसंस्करण इकाइयां अब अंतर्निहित निर्देशों के माध्यम से चर को सीधे स्वैप करने की क्षमता प्रदान करती हैं जैसे [[x86 आर्किटेक्चर|x86]] प्रोसेसर, उदाहरण के लिए, एक तीसरे अस्थायी रजिस्टर का उपयोग करने की आवश्यकता के अतिरिक्त दो [[प्रोसेसर रजिस्टर|प्रोसेसर रजिस्टरो]] को सीधे स्वैप करने के लिए एक एक्ससीएचजी निर्देश सम्मिलित करें। कुछ प्रोसेसर संरचना में एक तुलना-और-स्वैप निर्देश भी प्रदान किया जाता है, जो दो रजिस्टरों की तुलना करता है और सशर्त रूप से स्वैप करता है। इसका उपयोग पारस्परिक बहिष्करण तकनीकों का समर्थन करने के लिए किया जाता है।


XCHG उतना कुशल नहीं हो सकता जितना लगता है। उदाहरण के लिए, x86 आर्किटेक्चर प्रोसेसर में, XCHG [[रैंडम एक्सेस मेमोरी]] में किसी भी ऑपरेंड तक पहुंच को पूरी तरह से लॉक कर देगा, यह सुनिश्चित करने के लिए कि ऑपरेशन [[ परमाणु संचालन ]] है, और इसलिए मेमोरी स्वैप करते समय कुशल नहीं हो सकता है। ऐसा लॉकिंग महत्वपूर्ण है जब इसका उपयोग थ्रेड-सुरक्षित सिंक्रनाइज़ेशन को लागू करने के लिए किया जाता है, जैसा कि [[ म्युटेक्स ]] में होता है। हालाँकि, एक XCHG आमतौर पर प्रोसेसर रजिस्टरों में रहने वाले दो मशीन-आकार के शब्दों को स्वैप करने का सबसे तेज़ तरीका है। रजिस्टर का नाम बदलने का उपयोग रजिस्टरों को कुशलतापूर्वक स्वैप करने के लिए भी किया जा सकता है।
एक्ससीएचजी उतना सक्षम नहीं हो सकता जितना लगता है। उदाहरण के लिए, x86 आर्किटेक्चर प्रोसेसर में, एक्ससीएचजी [[रैंडम एक्सेस मेमोरी]] में किसी भी ऑपरेंड तक पहुंच को पूरी तरह से बंद कर देता है, यह सुनिश्चित करने के लिए कि ऑपरेशन [[ परमाणु संचालन |परमाणु संचालन]] किया जाता है, और इसलिए मेमोरी स्वैप करते समय सक्षम नहीं होता है। ऐसा लॉकिंग महत्वपूर्ण है जब इसका उपयोग थ्रेड-सुरक्षित सिंक्रनाइज़ेशन को प्रारंभ करने के लिए किया जाता है, जैसा कि [[ म्युटेक्स |म्युटेक्स]] में होता है। यद्यपि, एक एक्ससीएचजी सामान्यतः प्रोसेसर रजिस्टरों में रहने वाले दो यंत्रों के आकार के शब्दों को स्वैप करने का सबसे तेज़ विधि है। रजिस्टर का नाम बदलने का उपयोग रजिस्टरों को कुशलतापूर्वक स्वैप करने के लिए भी किया जा सकता है।


=== समानांतर निष्पादन ===
=== समानांतर निष्पादन ===
आधुनिक कंप्यूटरों और [[ मल्टी-कोर (कम्प्यूटिंग) ]] में [[ निर्देश पाइपलाइन ]] के आगमन के साथ [[समानांतर कंप्यूटिंग]] की सुविधा देने वाले मल्टी-कोर प्रोसेसर, दो या दो से अधिक ऑपरेशन एक साथ किए जा सकते हैं। यह अस्थायी चर का उपयोग करके स्वैप को गति दे सकता है और इसे अन्य एल्गोरिदम पर बढ़त दे सकता है। उदाहरण के लिए, [[एक्सओआर स्वैप एल्गोरिदम]] को तीन निर्देशों के अनुक्रमिक निष्पादन की आवश्यकता होती है। हालाँकि, दो अस्थायी रजिस्टरों का उपयोग करते हुए, समानांतर में निष्पादित दो प्रोसेसर दो घड़ी चक्रों में दो चर स्वैप कर सकते हैं:
आधुनिक कंप्यूटरों और [[ मल्टी-कोर (कम्प्यूटिंग) |बहुक्रोडी]] में[[ निर्देश पाइपलाइन | निर्देश पाइपलाइन]] के आगमन के साथ [[समानांतर कंप्यूटिंग]] की सुविधा देने वाले बहुक्रोडी प्रोसेसर, दो या दो से अधिक ऑपरेशन एक साथ किए जा सकते हैं। यह अस्थायी चर का उपयोग करके स्वैप को गति दे सकता है और इसे अन्य प्रारूप पर बढ़त दे सकता है। उदाहरण के लिए, [[एक्सओआर स्वैप एल्गोरिदम|एक्सओआर स्वैप]] प्रारूप को तीन निर्देशों के अनुक्रमिक निष्पादन की आवश्यकता होती है। यद्यपि, दो अस्थायी रजिस्टरों का उपयोग करते हुए, समानांतर में निष्पादित दो प्रोसेसर दो घड़ी चक्रों में दो चर स्वैप कर सकते हैं।


  स्टेप 1
  '''Step 1'''
   प्रोसेसर 1: temp_1:= X
   Processor 1: temp_1 := X
   प्रोसेसर 2: temp_2 := Y
   Processor 2: temp_2 := Y
   
   
  चरण दो
  '''Step 2'''
   प्रोसेसर 1: X := temp_2
   Processor 1: X := temp_2
   प्रोसेसर 2: Y:= temp_1
   Processor 2: Y := temp_1


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


==संदर्भ==
==संदर्भ==
{{reflist}}
{{reflist}}


{{DEFAULTSORT:Swap (Computer Science)}}[[Category: प्रोग्रामिंग मुहावरे]]
{{DEFAULTSORT:Swap (Computer Science)}}
 
 


[[Category: Machine Translated Page]]
[[Category:Articles with hatnote templates targeting a nonexistent page|Swap (Computer Science)]]
[[Category:Created On 21/03/2023]]
[[Category:Created On 21/03/2023|Swap (Computer Science)]]
[[Category:Machine Translated Page|Swap (Computer Science)]]
[[Category:Pages with script errors|Swap (Computer Science)]]
[[Category:Programming idioms|Swap (Computer Science)]]
[[Category:Templates Vigyan Ready|Swap (Computer Science)]]
[[Category:प्रोग्रामिंग मुहावरे|Swap (Computer Science)]]

Latest revision as of 16:11, 11 April 2023

कंप्यूटर प्रोग्रामिंग में, दो चर की परस्पर परिवर्तन का कार्य चर के मूल्यों के परस्पर आदान-प्रदान को संदर्भित करता है। सामान्यतः, यह कंप्यूटर भंडारण में डेटा के साथ किया जाता है। उदाहरण के लिए, एक कंप्यूटर प्रोग्राम में, दो चर राशि को इस प्रकार परिभाषित किया जा सकता है:

data_item x := 1
data_item y := 0

swap (x, y);

स्वैप निष्पादित होने के बाद, x में मान 0 होगा और y में 1 होगा; तथा उनके मूल्यों का आदान-प्रदान किया जा सकता है। इस ऑपरेशन को अन्य प्रकार के मानों के लिए सामान्यीकृत किया जा सकता है, जैसे कि स्ट्रिंग और समेकित डेटा प्रकार। तुलनात्मक डेटा की स्थिति को परिवर्तित करने के लिए स्वैप का उपयोग करते हैं।

कई प्रोग्रामिंग भाषाओं में स्वैप अंतर्निर्मित होता है। सी ++ में, फंक्शन अधिभार प्रदान की जाती है जिससे o (1) समय में कुछ बड़ी संरचनाओं का आदान-प्रदान करने के लिए स्वैप की अनुमति मिलती है।

एक टेम्प का उपयोग करना

दो चर राशि को स्वैप करने के लिए सबसे सरल और सबसे व्यापक रूप से प्रयोग की जाने वाली विधि तीसरे अस्थायी चर राशि का उपयोग करता है

स्वैप परिभाषित करें                                                                                                   (x , y)
define swap (x, y)
    temp := x
    x := y
    y := temp

जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होता है, परस्परित परिवर्तन किए जाने वाले मानों का आकार बहुत बड़ा होता है, जिसका अर्थ है कि अस्थायी चर बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में।

इसके अतिरिक्त, C++ जैसी ऑब्जेक्ट-ओरिएंटेड भाषाओं में दो चरों को प्रतिस्थापित करने पर अस्थायी चरों के लिए क्लास कंस्ट्रक्टर और डिस्ट्रक्टर को एक कॉल और कॉपी कंस्ट्रक्टर के लिए तीन कॉल सम्मिलित हो सकते हैं। कुछ वर्ग कंस्ट्रक्टर में मेमोरी आवंटित नहीं किया जा सकता हैं और इसे डिस्ट्रक्टर से हटाया जा सकता हैं, इस प्रकार प्रणाली में महंगा कॉल निर्मित किया जाता हैं।

एक्सओआर स्वैप

एक्सओआर स्वैप दो न्यूमेरिक चर राशि को स्वैप करने के लिए एक्सओआर ऑपरेशन का उपयोग करता है यह सामान्यतः ऊपर उल्लिखित सरल विधि की तुलना में तेज़ होने का दावा करता है। यद्यपि इसमें एक्सओआर स्वैप प्रारूप है व्यवहार में परिहार के कारण एक्सओआर स्वैप का उपयोग सामान्यतः पूर्णांक जैसे निम्न-स्तरीय डेटा प्रकारों को स्वैप करने के लिए किया जाता है। यद्यपि, सिद्धांत रूप में, यह किन्हीं भी दो मूल्यों की परस्परित आदान - प्रदान करने में सक्षम है, जिन्हें निश्चित-लंबाई बिटस्ट्रीम द्वारा दर्शाया जा सकता है।

जोड़ और घटाव के माध्यम से स्वैप करें

मुख्यतः यह विधि दो चरों को उनके मानों को जोड़कर और घटाकर स्वैप किया जाता है। क्योंकि व्यावहारिक अनुप्रयोगों में इसका किंचित ही कभी उपयोग किया जाता है, समांतर

  • यह मात्र संख्यात्मक चर स्वैप कर सकता है; कंटेनर (डेटा संरचना) जैसे जटिल डेटा प्रकारों को जोड़ना या घटाना संभव या तार्किक नहीं हो सकता है।
  • एक निश्चित आकार के चर स्वैप करते समय, अंकगणितीय अतिप्रवाह एक विषय बन गया है।
  • यह सामान्यतः चल बिन्दु मानों के लिए काम नहीं करता है, क्योंकि चल बिन्दु समांतर गैर-सहयोगी है।

कंटेनरों का परस्पर परिवर्तन

कंटेनर जो डेटा सूचक का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, मात्र संकेत को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह सामान्यतः प्रोग्रामिंग भाषा सहायक संकेतो में पाया जाता है,जैसे C या C++। मानक टेम्पलेट लाइब्रेरी कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।[1]जैसा कि संकेत चर सामान्यतः एक निश्चित आकार के होते हैं उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 अंश लंबे संकेत होते हैं, और वे संख्यात्मक होते हैं, उन्हें एक्सओआर स्वैप का उपयोग करके तुरंत से स्वैप किया जा सकता है।

समानांतर असाइनमेंट

रूबी या पायथन जैसी कुछ भाषाएँ समानांतर असाइनमेंट का समर्थन करती हैं, जो दो चरों की परस्पर परिवर्तन के लिए संकेतन को सरल बनाती हैं:

a, b = b, a

यह एक मध्यवर्ती डेटा संरचना से जुड़े ऑपरेशन के लिए आशुलिपि है: पायथन में, एक टपल रुबी में, एक सरणी जावास्क्रिप्ट 6+ विनाशकारी ऑपरेटरों का समर्थन करता है जो एक ही काम करते हैं:

[a, b] = [b, a];

फंक्शन स्वैप

यहां, दो विश्व स्तर पर स्कोप्ड चर एक फ़ंक्शन के माध्यम से मूल्य द्वारा पारित किए जाते हैं, अस्थायी भंडारण चर की आवश्यकता को समाप्त करते हैं।

x = 1;
y = 2;

console.log(x + " " + y); // outputs 1 2

function swap(a, b) {
  x = b;
  y = a;
}

swap(x, y);

console.log(x + " " + y); // outputs 2 1

आधुनिक कम्प्यूटरों में परस्पर परिवर्तन की सुविधा

समर्पित निर्देश

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

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

समानांतर निष्पादन

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

Step 1
 Processor 1: temp_1 := X
 Processor 2: temp_2 := Y

Step 2
 Processor 1: X := temp_2
 Processor 2: Y := temp_1

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

संदर्भ

  1. "HPPSocialUserSignonPage - Hewlett Packard Enterprise Community".