साझा स्वामित्व दुर्लभता नब्ज बनाता है
यह उत्तर थोड़ा-सा पेचीदा हो सकता है, लेकिन मुझे पूछना होगा कि स्वामित्व को साझा करने के लिए उपयोगकर्ता के अंत के दृष्टिकोण से कितने मामले हैं ? कम से कम जिन डोमेन में मैंने काम किया है, वहाँ व्यावहारिक रूप से कोई नहीं था क्योंकि अन्यथा इसका अर्थ यह होगा कि उपयोगकर्ता को केवल एक समय में एक जगह से कुछ हटाने की आवश्यकता नहीं है, लेकिन संसाधन से पहले सभी संबंधित मालिकों से स्पष्ट रूप से हटा दें सिस्टम से निकाल दिया गया।
संसाधनों को नष्ट होने से रोकने के लिए यह अक्सर निचले स्तर का इंजीनियरिंग विचार होता है, जबकि कुछ और अभी भी इसे एक्सेस कर रहा है, दूसरे धागे की तरह। अक्सर जब कोई उपयोगकर्ता सॉफ़्टवेयर से किसी चीज़ को बंद / हटाने / हटाने का अनुरोध करता है, तो इसे जल्द से जल्द हटा दिया जाना चाहिए (जब भी इसे हटाने के लिए सुरक्षित है), और यह निश्चित रूप से चारों ओर नहीं घूमना चाहिए और जितनी देर तक संसाधन रिसाव हो सकता है एप्लिकेशन चल रहा है।
एक उदाहरण के रूप में, वीडियो गेम में एक खेल संपत्ति सामग्री पुस्तकालय से एक सामग्री को संदर्भित कर सकती है। हम निश्चित रूप से नहीं चाहते हैं, कहते हैं, एक झंझरी सूचक दुर्घटना अगर सामग्री को एक धागे में सामग्री पुस्तकालय से हटा दिया जाता है, जबकि एक अन्य धागा अभी भी खेल संपत्ति द्वारा संदर्भित सामग्री तक पहुंच रहा है। लेकिन इसका मतलब यह नहीं है कि यह खेल परिसंपत्तियों के लिए सामग्री पुस्तकालय के संदर्भ में साझा करने के लिए खेल की संपत्ति के लिए कोई मतलब नहीं है । हम उपयोगकर्ता को संपत्ति और सामग्री पुस्तकालय दोनों से सामग्री को स्पष्ट रूप से हटाने के लिए मजबूर नहीं करना चाहते हैं। हम केवल यह सुनिश्चित करना चाहते हैं कि मैटेरियल लाइब्रेरी से सामग्री को हटाया नहीं जाता है, सामग्री के एकमात्र समझदार मालिक, जब तक कि अन्य थ्रेड्स सामग्री तक नहीं पहुंचते।
संसाधन लीक
फिर भी मैंने एक पूर्व टीम के साथ काम किया जिसने सॉफ्टवेयर के सभी घटकों के लिए GC को गले लगा लिया। और जब कि वास्तव में यह सुनिश्चित करने में मदद मिली कि हमारे पास कभी भी संसाधन नष्ट नहीं हुए थे जबकि अन्य धागे अभी भी उन तक पहुंच रहे थे, हमने इसके बजाय संसाधन लीक का अपना हिस्सा समाप्त कर दिया ।
और ये एक तरह के तुच्छ संसाधन लीक नहीं थे जो केवल डेवलपर्स को अपसेट करते हैं, जैसे कि एक किलोबाइट मेमोरी एक घंटे लंबे सत्र के बाद लीक हो जाती है। ये एक लीक थे, अक्सर एक सक्रिय सत्र में स्मृति के गीगाबाइट्स, बग रिपोर्ट के लिए अग्रणी। क्योंकि अब जब किसी संसाधन के स्वामित्व को संदर्भित किया जा रहा है (और इसलिए स्वामित्व में साझा किया गया है), सिस्टम के 8 अलग-अलग हिस्सों के बीच, कहें, तो उपयोगकर्ता के जवाब में संसाधन को हटाने में असफल होने में केवल एक ही समय लगता है, इसके लिए इसे हटाने का अनुरोध किया जाता है। और अनिश्चित काल के लिए लीक हो सकता है।
इसलिए मैं कभी भी जीसी का बहुत बड़ा प्रशंसक नहीं था या किसी भी व्यापक स्तर पर संदर्भ गणना लागू की गई क्योंकि उन्होंने लीक सॉफ्टवेयर बनाने के लिए इसे कितना आसान बना दिया। पूर्व में एक झूलने वाला पॉइंटर दुर्घटना क्या होता था जो कि एक बहुत ही मुश्किल से पता लगाने वाले संसाधन रिसाव में बदल जाता है जो आसानी से परीक्षण के रडार के नीचे उड़ान भर सकता है।
कमजोर संदर्भ इस समस्या को कम कर सकते हैं यदि भाषा / पुस्तकालय ये प्रदान करते हैं, लेकिन मुझे जब भी उपयुक्त हो, कमजोर संदर्भों का लगातार उपयोग करने में सक्षम होने के लिए मिश्रित कौशल के डेवलपर्स की एक टीम मिलना मुश्किल हो गया। और यह कठिनाई सिर्फ आंतरिक टीम से संबंधित नहीं थी, बल्कि हमारे सॉफ्टवेयर के लिए हर एक प्लगइन डेवलपर के लिए थी। वे आसानी से सिस्टम को लीक करने के लिए सिस्टम का कारण बन सकते हैं बस किसी वस्तु के लगातार संदर्भ को उन तरीकों से संग्रहीत करते हैं जिससे अपराधी के रूप में प्लगइन का पता लगाना मुश्किल हो जाता है, इसलिए हमें हमारे सॉफ़्टवेयर संसाधनों से उत्पन्न बग रिपोर्ट के हमारे शेर की हिस्सेदारी भी मिली केवल इसलिए लीक किया जा रहा है क्योंकि एक प्लगइन जिसका स्रोत कोड हमारे नियंत्रण से बाहर था, उन महंगे संसाधनों के संदर्भ जारी करने में विफल रहा।
समाधान: आस्थगित, आवधिक निष्कासन
इसलिए मेरा समाधान बाद में जिस पर मैंने अपनी व्यक्तिगत परियोजनाओं पर लागू किया, जिसने मुझे दोनों दुनियाओं से मुझे मिला सबसे अच्छा था कि इस अवधारणा को खत्म करना था, referencing=ownership
लेकिन अभी भी संसाधनों का विनाश टाल दिया है।
नतीजतन, अब जब भी उपयोगकर्ता कुछ ऐसा करता है जिसके कारण संसाधन को हटाने की आवश्यकता होती है, तो संसाधन को हटाने के संदर्भ में एपीआई व्यक्त किया जाता है:
ecs->remove(component);
... जो उपयोगकर्ता के अंत तर्क को बहुत ही सरल तरीके से प्रदर्शित करता है। हालाँकि, संसाधन (घटक) को तुरंत दूर नहीं किया जा सकता है यदि उनके प्रसंस्करण चरण में अन्य सिस्टम थ्रेड हैं जहां वे समान घटक को समवर्ती रूप से एक्सेस कर सकते हैं।
तो ये प्रसंस्करण धागे तब यहाँ और वहाँ समय उपजते हैं जो एक थ्रेड को इकट्ठा करने के लिए एक कचरा कलेक्टर जैसा दिखता है और " दुनिया को रोकें " और उन सभी संसाधनों को नष्ट कर देता है जिन्हें समाप्त होने तक उन घटकों को संसाधित करने से धागे को बाहर निकालने के दौरान हटाने का अनुरोध किया गया था। । मैंने इसे ट्यून किया है ताकि यहां किए जाने वाले काम की मात्रा आम तौर पर कम से कम हो और फ्रेम दर में उल्लेखनीय रूप से कटौती न हो।
अब मैं यह नहीं कह सकता कि यह कुछ आजमाया हुआ और परखा हुआ और अच्छी तरह से प्रलेखित पद्धति है, लेकिन यह कुछ ऐसा है जिसका उपयोग मैं कुछ वर्षों से कर रहा हूं, जिसमें कोई सिरदर्द नहीं है और कोई संसाधन लीक नहीं है। मैं इस तरह के दृष्टिकोण की खोज करने की सलाह देता हूं जब आपके आर्किटेक्चर के लिए इस तरह के संगामिति मॉडल को फिट करना संभव है क्योंकि यह जीसी या रेफ-काउंटिंग की तुलना में बहुत कम भारी-भरकम है और परीक्षण के रडार के तहत उड़ान भरने वाले इन प्रकार के संसाधन लीक का जोखिम नहीं उठाता है।
एक जगह जहां मुझे रिफ-काउंटिंग या जीसी उपयोगी पाया गया, वह है लगातार डेटा स्ट्रक्चर्स के लिए। उस मामले में यह डेटा संरचना क्षेत्र है, जो उपयोगकर्ता-अंत की चिंताओं से दूर है, और यह वास्तव में प्रत्येक अपरिवर्तनीय प्रतिलिपि के लिए समान अनमॉडिफाइड डेटा के स्वामित्व को साझा करने के लिए समझ में आता है।