अशक्त संदर्भ

From Vigyanwiki

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

उपयोग

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

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

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

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

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

विविधताएं

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

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

कुछ गैर-गार्बेज संग्रहित भाषाएँ, जैसे कि सी++, गार्बेज संग्रह पुस्तकालयों के समर्थन के भाग के रूप में वीक/ ठोस संदर्भ कार्यक्षमता प्रदान करती हैं। बूस्ट सी++ लाइब्रेरी ठोस और वीक संदर्भ प्रदान करती है। स्मार्ट पॉइंटर्स के वीक समकक्षों के रूप में नियमित सी++ पॉइंटर्स का उपयोग करना त्रुटिपूर्ण है क्योंकि इस प्रकार के उपयोग से यह ज्ञात लगाने की क्षमता को हटा दिया जाता है कि ठोस संदर्भ संख्या 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

बाहरी संबंध

सी ++

जावा

पीएचपी

पायथन