अशक्त संदर्भ

From Vigyanwiki
Revision as of 12:10, 17 May 2023 by alpha>Artiverma

कंप्यूटर प्रोग्रामिंग में, संदर्भ (कंप्यूटर विज्ञान) है जो संदर्भित वस्तु (कंप्यूटर विज्ञान) को गार्बेज संग्रह (कंप्यूटर विज्ञान) द्वारा संग्रह से सुरक्षित नहीं करता है, ठोस संदर्भ के विपरीत होता है। वीक संदर्भों द्वारा मात्र संदर्भित वस्तु - जिसका अर्थ है कि वस्तु तक पहुंचने वाले संदर्भों की प्रत्येक श्रृंखला में लिंक के रूप में अल्प से अल्प वीक संदर्भ सम्मिलित है - इसे वीक पहुंच योग्य माना जाता है और इसे अगम्य स्मृति के रूप में माना जा सकता है और इसलिए हो सकता है किसी भी समय एकत्र किया जा सकता है। कुछ गार्बेज -संग्रहित भाषाएं वीक संदर्भों के विभिन्न स्तरों को प्रदर्शित करती हैं या उनका समर्थन करती हैं, जैसे सी शार्प (प्रोग्रामिंग भाषा)| सी#, जावा (प्रोग्रामिंग भाषा), लिस्प (प्रोग्रामिंग भाषा), OCaml , पर्ल, पायथन (प्रोग्रामिंग भाषा)[1] और PHP संस्करण 7.4 के बाद से होता है।[2]


उपयोग करता है

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

गार्बेज संग्रह

गार्बेज संग्रह का उपयोग अप्रयुक्त वस्तुओं को साफ करने के लिए किया जाता है और इस प्रकार मेमोरी लीक और डेटा भ्रष्टाचार की संभावना को अल्प करता है। गार्बेज संग्रह के दो मुख्य प्रकार हैं: ट्रेसिंग और रेफरेंस काउंटिंग है। रेफरेंस काउंटिंग स्कीम किसी दिए गए ऑब्जेक्ट के संदर्भों की संख्या को रिकॉर्ड करती है और रेफरेंस काउंट शून्य होने पर ऑब्जेक्ट को कलेक्ट करती है। संदर्भ-गिनती चक्रीय (या परिपत्र) संदर्भों को एकत्र नहीं कर सकती क्योंकि समय में मात्र वस्तु एकत्र की जा सकती है। पारस्परिक रूप से संदर्भित वस्तुओं के समूह जो सीधे अन्य वस्तुओं द्वारा संदर्भित नहीं हैं और अगम्य हैं इस प्रकार स्थायी रूप से निवासी बन सकते हैं; यदि कोई एप्लिकेशन लगातार ऐसे अगम्य समूहों को अगम्य वस्तुओं के रूप में उत्पन्न करता है, तो इसका प्रभाव स्मृति रिसाव पर पड़ेगा। यदि समूह के भीतर कुछ संदर्भों के लिए वीक संदर्भों का उपयोग करके संदर्भ चक्रों से बचा जाता है, तो वीक संदर्भ (संदर्भ जिन्हें संदर्भ गिनती में नहीं गिना जाता है) का उपयोग परिपत्र संदर्भों की समस्या को हल करने के लिए किया जा सकता है।

इस प्रकार के ठोस बनाम वीक संदर्भ भेद का बहुत ही सामान्य स्थिति वृक्ष संरचनाओं में है, जैसे दस्तावेज़ ऑब्जेक्ट मॉडल (डीओएम), जहां माता-पिता से बच्चे के संदर्भ ठोस हैं, लेकिन बच्चे से माता-पिता के संदर्भ वीक हैं। उदाहरण के लिए, ऐप्पल का कोको (एपीआई) ढांचा इस दृष्टिकोण की सिफारिश करता है।[3] वास्तव में, यहां तक ​​कि जब ऑब्जेक्ट ग्राफ पेड़ नहीं है, तो पेड़ की संरचना अधिकतर वस्तु स्वामित्व की धारणा से प्रारम्भ की जा सकती है, जहां स्वामित्व संबंध ठोस होते हैं और पेड़ बनाते हैं, और गैर-स्वामित्व संबंध वीक होते हैं और पेड़ बनाने की आवश्यकता नहीं होती है। यह दृष्टिकोण सी ++ (प्री-सी ++ 11) में सामान्य है, कच्चे पॉइंटर्स को वीक संदर्भों के रूप में उपयोग करते हुए। यदि, इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह पता लगाने की क्षमता की अनुमति नहीं है कि कब मूल शाखा को हटा दिया गया और हटा दिया गया। C++ 11 मानक के बाद से, Boost (C++ लाइब्रेरी) लाइब्रेरी से विरासत में प्राप्त shared_ptr और Weak_ptr का उपयोग करके समाधान जोड़ा गया था।

स्मृति में अनावश्यक वस्तुओं की संख्या को अल्प करने के लिए वीक संदर्भों का भी उपयोग किया जाता है, जिससे कार्यक्रम को यह इंगित करने की अनुमति मिलती है कि कौन सी वस्तुओं को मात्र वीक रूप से संदर्भित करके साधारण महत्व है।[citation needed]

विविधताएं

कुछ भाषाओं में वीक संदर्भ शक्ति के कई स्तर होते हैं। उदाहरण के लिए, जावा में घटती ताकत, नरम, कमजोर और प्रेत संदर्भों के क्रम में, पैकेज java.lang.ref में परिभाषित किया गया है।[4] प्रत्येक संदर्भ प्रकार में पुन: योग्यता की एक संबद्ध धारणा होती है। गार्बेज संग्राहक (जीसी) वस्तु को निर्बाध करने के लिए यह निर्धारित करने के लिए किसी वस्तु के प्रकार की पहुंच क्षमता का उपयोग करता है। जीसी के लिए किसी ऐसी वस्तु को निर्बाध करना सुरक्षित है जो धीरे-धीरे पहुंच योग्य है, लेकिन जीसी ऐसा नहीं करने का निर्णय ले सकती है यदि उसे लगता है कि जेवीएम मेमोरी को बचा सकता है (उदाहरण के लिए जेवीएम में बहुत अधिक अप्रयुक्त हीप स्पेस है)। जैसे ही जीसी वस्तु को नोटिस करता है, जीसी वीक रूप से पहुंच योग्य वस्तु को मुक्त कर देगा। अन्य संदर्भ प्रकारों के विपरीत, प्रेत संदर्भ का पालन नहीं किया जा सकता है। दूसरी ओर, प्रेत संदर्भ कार्यक्रम को सूचित करने के लिए तंत्र प्रदान करते हैं जब किसी वस्तु को निर्बाध किया गया हो (संदर्भ कतारों का उपयोग करके अधिसूचना प्रारम्भ की जाती है)।

ठोस C# में, वीक संदर्भ इस बात से भिन्न हैं कि वे वस्तु पुनरुत्थान को ट्रैक करते हैं या नहीं। यह भेद ठोस संदर्भों के लिए नहीं होता है, क्योंकि वस्तुओं को अंतिम रूप नहीं दिया जाता है यदि उनके निकट कोई ठोस संदर्भ है। डिफ़ॉल्ट रूप से, सी # वीक संदर्भ में पुनरुत्थान को ट्रैक नहीं करते हैं, जिसका अर्थ है कि यदि कोई वस्तु पुनर्जीवित होती है तो वीक संदर्भ अद्यतन नहीं होता है; इन्हें छोटा वीक संदर्भ कहा जाता है, और वीक संदर्भ जो पुनरुत्थान को ट्रैक करते हैं उन्हें लंबे वीक संदर्भ कहा जाता है।[5]

कुछ गैर- गार्बेज -संग्रहित भाषाएँ, जैसे कि C++, गार्बेज संग्रह पुस्तकालयों के समर्थन के भाग के रूप में वीक/ ठोस संदर्भ कार्यक्षमता प्रदान करती हैं। बूस्ट सी ++ लाइब्रेरी ठोस और वीक संदर्भ प्रदान करती है। स्मार्ट सूचक के वीक समकक्षों के रूप में नियमित सी ++ पॉइंटर्स का उपयोग करना गलती है क्योंकि इस प्रकार के उपयोग से यह ज्ञात लगाने की क्षमता को हटा दिया जाता है कि ठोस संदर्भ संख्या 0 हो गई है और ऑब्जेक्ट हटा दिया गया है। इससे, यह पता लगाने की अनुमति नहीं देता है कि क्या ठोस संदर्भ पूर्व से ही दिए गए सादे सूचक को ट्रैक कर रहा है। यह ही प्लेन पॉइंटर को ट्रैक करने वाले दो (या अधिक) स्मार्ट पॉइंटर्स होने की संभावना का परिचय देता है (जैसे ही इन स्मार्ट पॉइंटर्स में से की रेफरेंस काउंट 0 तक पहुंचता है और ऑब्जेक्ट डिलीट हो जाता है) भ्रष्टाचार का कारण बनता है।

उदाहरण

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

जावा

1998 में जावा 1.2[6] दो प्रकार के वीक संदर्भ प्रस्तुत किया गया, एक को सॉफ्ट रेफरेंस के रूप में जाना जाता है (जीसी-प्रबंधित इन-मेमोरी कैश को बनाए रखने के लिए उपयोग करने का संकल्प है, लेकिन जो कुछ प्लेटफॉर्म पर व्यवहार में बहुत उत्तम कार्य नहीं करता है[7]) एंड्रॉइड जैसे डायनेमिक हीप के साथ और दूसरा मात्र वीक संदर्भ के रूप में जाना जाता है। इसने खतरनाक और अकुशल finalize() तंत्र के विकल्प के रूप में "प्रेत संदर्भ" नामक संबंधित प्रायोगिक तंत्र को भी जोड़ा जायेगा।[8]

यदि वीक संदर्भ बनाया गया है, और फिर कोड में कहीं और get()वास्तविक वस्तु प्राप्त करने के लिए उपयोग किया जाता है, वीक संदर्भ गार्बेज संग्रहण को रोकने के लिए पर्याप्त ठोस नहीं है, इसलिए यह हो सकता है (यदि वस्तु के लिए कोई ठोस संदर्भ नहीं है)get()अचानक अशक्त होने लगता है।[9]

import java.lang.ref.WeakReference;

public class ReferenceTest {
    public static void main(String[] args) throws InterruptedException {
        WeakReference r = new WeakReference("I'm here");
        StrongReference sr = new StrongReference("I'm here");
        System.out.println("Before gc: r=" + r.get() + ", static=" + sr.get());
        System.gc();
        Thread.sleep(100);

        // Only r.get() becomes null.
        System.out.println("After gc: r=" + r.get() + ", static=" + sr.get());
    }
}

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

स्मालटॉक

|a s1 s2|

s1 := 'hello' copy.     "that's a strong reference"
s2 := 'world' copy.     "that's a strong reference"
a := WeakArray with:s1 with:s2.
a printOn: Transcript. 
ObjectMemory collectGarbage.
a printOn: Transcript.  "both elements still there"

s1 := nil.              "strong reference goes away" 
ObjectMemory collectGarbage.
a printOn: Transcript.  "first element gone"

s2 := nil.              "strong reference goes away" 
ObjectMemory collectGarbage.
a printOn: Transcript.  "second element gone"


दो

weak_table = setmetatable({}, {__mode="v"})
weak_table.item = {}
print(weak_table.item)
collectgarbage()
print(weak_table.item)


उद्देश्य-सी 2.0

उद्देश्य सी 2.0 में, न मात्र गार्बेज संग्रह, किन्तु स्वचालित संदर्भ गणना भी वीक संदर्भों से प्रभावित होगी। निम्नलिखित उदाहरण में सभी चर और गुण वीक हैं।

@interface WeakRef : NSObject
{
    __weak NSString *str1;
    __unsafe_unretained NSString *str2;
}

@property (nonatomic, weak) NSString *str3;
@property (nonatomic, unsafe_unretained) NSString *str4;

@end

weak (__weak) और unsafe_unretained (__unsafe_unretained) के मध्य का अंतर यह है कि जब वेरिएबल की ओर संकेत किया गया ऑब्जेक्ट डिलीकेट किया जा रहा है, तो वेरिएबल का मान बदला जा रहा है या नहीं। weak लोगों को नल पॉइंटर में अपडेट किया जाएगा और nil और unsafe_unretained को झूलने वाले सूचक के रूप में अपरिवर्तित छोड़ दिया जाएगा। मैक ओएस एक्स 10.7 लायन और आईओएस 5 के साथ-साथ एक्सकोड 4.1 (आईओएस के लिए 4.2) और मात्र एआरसी का उपयोग करते समय weak ऑब्जेक्टिव-सी में ई> संदर्भ जोड़े गए हैं। मैक ओएस एक्स, आईओएस, और जीएनयूस्टेप के प्राचीन संस्करण वीक संदर्भ के रूप में मात्र unsafe_unretained संदर्भों का समर्थन करते हैं।

वाला (प्रोग्रामिंग लैंग्वेज)

class Node {
    public weak Node prev; // a weak reference is used to avoid circular references between nodes of a doubly-linked list
    public Node next;
}


पायथन

>>> import weakref
>>> import gc
>>> class Egg:
...     def spam(self):
...         print("I'm alive!")
...
>>> obj = Egg()
>>> weak_obj = weakref.ref(obj)
>>> weak_obj().spam()
I'm alive!
>>> obj = "Something else"
>>> gc.collect()
35
>>> weak_obj().spam()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'spam'


यह भी देखें

संदर्भ

  1. 8.8. weakref — Weak references, The Python Standard Library
  2. "PHP: WeakReference - Manual".
  3. "प्रैक्टिकल मेमोरी प्रबंधन". developer.apple.com.
  4. Nicholas, Ethan (May 4, 2006). "कमजोर संदर्भों को समझना". java.net. Archived from the original on 2011-03-03. Retrieved October 1, 2010.
  5. Goldshtein, Zurbalev & Flatow 2012, p. 131.
  6. "WeakReference (Java Platform SE 7 )". docs.oracle.com.
  7. "सॉफ्ट रेफरेंस - एंड्रॉइड डेवलपर्स". developer.android.com.
  8. "PhantomReference (Java Platform SE 7 )". docs.oracle.com.
  9. https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references Java Examples


बाहरी संबंध

सी ++

जावा

पीएचपी

पायथन


श्रेणी:डेटा प्रकार श्रेणी:स्मृति प्रबंधन