थ्रेड पूल: Difference between revisions

From Vigyanwiki
m (Abhishek moved page धागा पूल to तंतु पूल without leaving a redirect)
m (Deepak moved page तंतु पूल to थ्रेड पूल without leaving a redirect)
 
(7 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Short description|Software design pattern}}
{{Short description|Software design pattern}}
[[File:Thread pool.svg|thumb|400px|प्रतीक्षा कार्यों (नीला) और पूर्ण कार्यों (पीला) के साथ एक नमूना थ्रेड पूल (हरा बॉक्स)]][[कंप्यूटर प्रोग्रामिंग]] में, एक थ्रेड पूल एक कंप्यूटर प्रोग्राम में निष्पादन की संगामिति (कंप्यूटर विज्ञान) प्राप्त करने के लिए एक [[सॉफ्टवेयर डिजाइन पैटर्न]] है। अक्सर इसे प्रतिरूपित श्रमिक या कार्यकर्ता-चालक दल मॉडल भी कहा जाता है,<ref>Garg, Rajat P. & Sharapov, Ilya ''Techniques for Optimizing Applications - High Performance Computing'' Prentice-Hall 2002, p. 394</ref> एक थ्रेड पूल पर्यवेक्षण कार्यक्रम द्वारा [[समवर्ती कंप्यूटिंग]] निष्पादन के लिए आवंटित किए जाने वाले [[कार्य (कंप्यूटर)]] के लिए प्रतीक्षा कर रहे कई थ्रेड (कंप्यूटर विज्ञान) को बनाए रखता है। थ्रेड्स के एक पूल को बनाए रखने से, मॉडल प्रदर्शन को बढ़ाता है और अल्पकालिक कार्यों के लिए थ्रेड्स के लगातार निर्माण और विनाश के कारण निष्पादन में विलंबता से बचता है।<ref>{{Cite book |first=Allen |last=Holub |authorlink=Allen Holub |title=जावा थ्रेड्स को टैमिंग करना|publisher=Apress |year=2000 |page=209}}</ref> उपलब्ध थ्रेड्स की संख्या प्रोग्राम के लिए उपलब्ध कंप्यूटिंग संसाधनों के लिए ट्यून की जाती है, जैसे कि निष्पादन पूरा होने के बाद एक समानांतर कार्य कतार।
[[File:Thread pool.svg|thumb|400px|प्रतीक्षा कृत्यों(नीला) और पूर्ण कृत्यों(पीला) के साथ एक प्रतिदर्श तंतु पूल(हरा डिब्बा)]][[कंप्यूटर प्रोग्रामिंग]] में, एक तंतु पूल एक कंप्यूटर प्रोग्राम में निष्पादन की संगामिति (कंप्यूटर विज्ञान) प्राप्त करने के लिए एक [[सॉफ्टवेयर डिजाइन पैटर्न]] है। प्रायः इसे प्रतिरूपित कर्मी या कार्यकर्ता-चालक दल मॉडल भी कहा जाता है,<ref>Garg, Rajat P. & Sharapov, Ilya ''Techniques for Optimizing Applications - High Performance Computing'' Prentice-Hall 2002, p. 394</ref> एक तंतु पूल पर्यवेक्षण प्रोग्राम द्वारा [[समवर्ती कंप्यूटिंग|समवर्ती संगणना]] निष्पादन के लिए आवंटित किए जाने वाले [[कार्य (कंप्यूटर)|कृत्य (कंप्यूटर)]] के लिए प्रतीक्षा कर रहे कई तंतु (कंप्यूटर विज्ञान) को बनाए रखता है। तंतु के एक पूल को बनाए रखने से, मॉडल निष्पादन को बढ़ाता है और अल्पकालिक कृत्यों के लिए तंतु के निरंतर निर्माण और विनाश के कारण निष्पादन में विलंबता से बचता है।<ref>{{Cite book |first=Allen |last=Holub |authorlink=Allen Holub |title=जावा थ्रेड्स को टैमिंग करना|publisher=Apress |year=2000 |page=209}}</ref> उपलब्ध तंतु की संख्या प्रोग्राम के लिए उपलब्ध संगणना संसाधनों के लिए ट्यून की जाती है, जैसे कि निष्पादन पूरा होने के बाद एक समानांतर कृत्य श्रेणी।


== प्रदर्शन ==
== निष्पादन ==
थ्रेड पूल का आकार कार्यों को निष्पादित करने के लिए रिजर्व में रखे थ्रेड्स की संख्या है। यह आमतौर पर एप्लिकेशन का एक ट्यून करने योग्य पैरामीटर होता है, जिसे प्रोग्राम के प्रदर्शन को अनुकूलित करने के लिए समायोजित किया जाता है।<ref name="ACM, Thread pool size" />प्रदर्शन को अनुकूलित करने के लिए इष्टतम थ्रेड पूल आकार तय करना महत्वपूर्ण है।
तंतु पूल का आकार कृत्यों को निष्पादित करने के लिए संरक्षित में रखे तंतु की संख्या है। यह सामान्यतः एप्लिकेशन का एक ट्यून करने योग्य पैरामीटर होता है, जिसे प्रोग्राम के निष्पादन को अनुकूलित करने के लिए समायोजित किया जाता है।<ref name="ACM, Thread pool size" /> निष्पादन को अनुकूलित करने के लिए इष्टतम तंतु पूल आकार निर्धारित करना महत्वपूर्ण है।


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


थ्रेड स्टार्टअप समय को अलग रखकर भी थ्रेड पूल का उपयोग करना उपयोगी हो सकता है। थ्रेड पूल के कार्यान्वयन हैं जो काम को कतारबद्ध करने के लिए तुच्छ बनाते हैं, समरूपता को नियंत्रित करते हैं और थ्रेड्स को मैन्युअल रूप से प्रबंधित करते समय आसानी से किया जा सकता है।<ref>{{Cite web | url=https://doc.qt.io/qt-5/qthreadpool.html | title=QThreadPool Class &#124; Qt Core 5.13.1}}</ref><ref>{{Cite web | url=https://github.com/vit-vit/ctpl |title =GitHub - vit-vit/CTPL: Modern and efficient C++ Thread Pool Library.|website =[[GitHub]]|date = 2019-09-24}}</ref> इन मामलों में उपयोग के प्रदर्शन लाभ गौण हो सकते हैं।
तंतु प्रवर्तन समय को अलग रखकर भी तंतु पूल का उपयोग करना उपयोगी हो सकता है। तंतु पूल के कार्यान्वयन हैं जो कार्य को श्रेणीबद्ध करने के लिए नगण्य बनाते हैं, समरूपता को नियंत्रित करते हैं और तंतु को हस्तचालन से प्रबंधित करते समय आसानी से किया जा सकता है।<ref>{{Cite web | url=https://doc.qt.io/qt-5/qthreadpool.html | title=QThreadPool Class &#124; Qt Core 5.13.1}}</ref><ref>{{Cite web | url=https://github.com/vit-vit/ctpl |title =GitHub - vit-vit/CTPL: Modern and efficient C++ Thread Pool Library.|website =[[GitHub]]|date = 2019-09-24}}</ref> इन स्थितियों में उपयोग के निष्पादन लाभ माध्यमिक हो सकते हैं।


आमतौर पर, एक थ्रेड पूल एक ही कंप्यूटर पर चलता है। हालाँकि, थ्रेड पूल वैचारिक रूप से [[सर्वर फार्म]] से संबंधित होते हैं जिसमें एक मास्टर प्रक्रिया, जो स्वयं एक थ्रेड पूल हो सकती है, समग्र थ्रूपुट को बढ़ाने के लिए विभिन्न कंप्यूटरों पर कार्यकर्ता प्रक्रियाओं को कार्य वितरित करती है। इस दृष्टिकोण के लिए शर्मनाक रूप से समानांतर समस्याएं अत्यधिक उत्तरदायी हैं।{{cn|date=December 2016}}
सामान्यतः, एक तंतु पूल एक ही कंप्यूटर पर चलता है। यद्यपि, तंतु पूल धारणात्मक रूप से [[वेब सर्वर|सर्वर]] रूप से संबंधित होते हैं जिसमें एक मास्टर प्रक्रिया, जो स्वयं एक तंतु पूल हो सकती है, संपूर्ण संदेश प्रवाह को बढ़ाने के लिए विभिन्न कंप्यूटरों पर कार्यकर्ता प्रक्रियाओं को कृत्य वितरित करती है। इस दृष्टिकोण के लिए शर्मनाक रूप से समानांतर समस्याएं अत्यधिक उत्तरदायी हैं।{{cn|date=December 2016}}


प्रतीक्षा कार्यों की संख्या के आधार पर किसी एप्लिकेशन के जीवनकाल के दौरान थ्रेड्स की संख्या को गतिशील रूप से समायोजित किया जा सकता है। उदाहरण के लिए, एक [[वेब सर्वर]] थ्रेड्स जोड़ सकता है यदि कई [[ वेब पृष्ठ ]] अनुरोध आते हैं और जब वे अनुरोध कम हो जाते हैं तो थ्रेड्स को हटा सकते हैं।{{disputed inline|reason=This sounds more like pre-spawning than like a pool pattern.|date=December 2015}} एक बड़ा थ्रेड पूल होने की लागत संसाधन उपयोग में वृद्धि है। थ्रेड बनाने या नष्ट करने के लिए निर्धारित करने के लिए उपयोग किया जाने वाला एल्गोरिदम समग्र प्रदर्शन को प्रभावित करता है:
प्रतीक्षा कृत्यों की संख्या के आधार पर किसी एप्लिकेशन के जीवनकाल के समय तंतु की संख्या को गतिशील रूप से समायोजित किया जा सकता है। उदाहरण के लिए, एक [[वेब सर्वर]] तंतु जोड़ सकता है यदि कई [[ वेब पृष्ठ |वेब पृष्ठ]] अनुरोध आते हैं और जब वे अनुरोध कम हो जाते हैं तो तंतु को हटा सकते हैं।{{disputed inline|reason=This sounds more like pre-spawning than like a pool pattern.|date=December 2015}} एक बड़ा तंतु पूल होने की लागत संसाधन उपयोग में वृद्धि है। तंतु बनाने या नष्ट करने के लिए निर्धारित करने के लिए उपयोग किया जाने वाला एल्गोरिदम संपूर्ण निष्पादन को प्रभावित करता है:
* बहुत सारे धागे बनाने से संसाधनों की बर्बादी होती है और अप्रयुक्त धागे बनाने में समय लगता है।
* बहुत सारे तंतु बनाने से संसाधनों की अंतर्हित होती है और अप्रयुक्त तंतु बनाने में समय लगता है।
* बहुत सारे धागों को नष्ट करने के लिए बाद में उन्हें फिर से बनाते समय अधिक समय की आवश्यकता होती है।
* बहुत सारे तंतु को नष्ट करने के लिए बाद में उन्हें फिर से बनाते समय अधिक समय की आवश्यकता होती है।
* थ्रेड्स को बहुत धीरे-धीरे बनाने से क्लाइंट का प्रदर्शन खराब हो सकता है (लंबे समय तक प्रतीक्षा करें)।
* तंतु को बहुत धीरे-धीरे बनाने से ग्राहक का निष्पादन अंतर्हित हो सकता है (लंबे समय तक प्रतीक्षा करें)।
* थ्रेड्स को बहुत धीरे-धीरे नष्ट करना संसाधनों की अन्य प्रक्रियाओं को भूखा कर सकता है।
* तंतु को बहुत धीरे-धीरे नष्ट करना संसाधनों की अन्य प्रक्रियाओं को क्षुधातुर कर सकता है।


== यह भी देखें ==
== यह भी देखें ==
* [[अतुल्यकालिक (कंप्यूटर प्रोग्रामिंग)]]
* [[अतुल्यकालिक (कंप्यूटर प्रोग्रामिंग)|अतुल्यकालिक(कंप्यूटर प्रोग्रामिंग)]]
* [[ऑब्जेक्ट पूल पैटर्न]]
* [[ऑब्जेक्ट पूल पैटर्न]]
* [[समवर्ती पैटर्न]]
* [[समवर्ती पैटर्न]]
* [[ग्रैंड सेंट्रल डिस्पैच]]
* [[ग्रैंड सेंट्रल डिस्पैच|उच्च केंद्रीय प्रेषण]]
* समानांतर विस्तार
* समानांतर विस्तार
* समानांतरीकरण
* समानांतरीकरण
*सर्वर फार्म
*सर्वर रूप
* [[मंचित घटना-संचालित वास्तुकला]]
* [[मंचित घटना-संचालित वास्तुकला|पदशः आयोजन-संचालित वास्तुकला]]


==संदर्भ==
==संदर्भ==
Line 43: Line 43:
* "[http://msdn.microsoft.com/en-us/library/ms973903.aspx Programming the Thread Pool in the .NET Framework]" by David Carmona
* "[http://msdn.microsoft.com/en-us/library/ms973903.aspx Programming the Thread Pool in the .NET Framework]" by David Carmona
* "[http://today.java.net/pub/a/today/2008/10/23/creating-a-notifying-blocking-thread-pool-executor.html Creating a Notifying Blocking Thread Pool in Java]" by Amir Kirsh
* "[http://today.java.net/pub/a/today/2008/10/23/creating-a-notifying-blocking-thread-pool-executor.html Creating a Notifying Blocking Thread Pool in Java]" by Amir Kirsh
* "[http://www.ibm.com/developerworks/aix/library/au-threadingpython/ Practical Threaded Programming with Python: Thread Pools and Queues]" by Noah Gift
* "[http://www.ibm.com/developerworks/aix/library/au-threadingpython/ Practical Threaded Programming with Python: Thread Pools and Queues]" by Noah Gift
* "[http://www.cs.wustl.edu/~schmidt/PDF/OM-01.pdf Optimizing Thread-Pool Strategies for Real-Time CORBA]" by Irfan Pyarali, Marina Spivak, [[Douglas C. Schmidt]] and Ron Cytron
* "[http://www.cs.wustl.edu/~schmidt/PDF/OM-01.pdf Optimizing Thread-Pool Strategies for Real-Time CORBA]" by Irfan Pyarali, Marina Spivak, [[Douglas C. Schmidt]] and Ron Cytron
* "[http://doi.acm.org/10.1145/1753196.1753218 Deferred cancellation. A behavioral pattern]" by Philipp Bachmann
* "[http://doi.acm.org/10.1145/1753196.1753218 Deferred cancellation. A behavioral pattern]" by Philipp Bachmann
Line 49: Line 49:


{{Design Patterns patterns}}
{{Design Patterns patterns}}
[[Category: थ्रेड्स (कंप्यूटिंग)]] [[Category: सॉफ्टवेयर डिजाइन पैटर्न]] [[Category: समवर्ती कंप्यूटिंग]] [[Category: समानांतर कंप्यूटिंग]]


 
[[Category:All accuracy disputes]]
 
[[Category:All articles with unsourced statements]]
[[Category: Machine Translated Page]]
[[Category:Articles with disputed statements from December 2015]]
[[Category:Articles with invalid date parameter in template]]
[[Category:Articles with unsourced statements from December 2016]]
[[Category:Collapse templates]]
[[Category:Created On 02/03/2023]]
[[Category:Created On 02/03/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates generating microformats]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that are not mobile friendly]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:Wikipedia metatemplates]]
[[Category:थ्रेड्स (कंप्यूटिंग)]]
[[Category:समवर्ती कंप्यूटिंग]]
[[Category:समानांतर कंप्यूटिंग]]
[[Category:सॉफ्टवेयर डिजाइन पैटर्न]]

Latest revision as of 16:42, 10 October 2023

प्रतीक्षा कृत्यों(नीला) और पूर्ण कृत्यों(पीला) के साथ एक प्रतिदर्श तंतु पूल(हरा डिब्बा)

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

निष्पादन

तंतु पूल का आकार कृत्यों को निष्पादित करने के लिए संरक्षित में रखे तंतु की संख्या है। यह सामान्यतः एप्लिकेशन का एक ट्यून करने योग्य पैरामीटर होता है, जिसे प्रोग्राम के निष्पादन को अनुकूलित करने के लिए समायोजित किया जाता है।[3] निष्पादन को अनुकूलित करने के लिए इष्टतम तंतु पूल आकार निर्धारित करना महत्वपूर्ण है।

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

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

सामान्यतः, एक तंतु पूल एक ही कंप्यूटर पर चलता है। यद्यपि, तंतु पूल धारणात्मक रूप से सर्वर रूप से संबंधित होते हैं जिसमें एक मास्टर प्रक्रिया, जो स्वयं एक तंतु पूल हो सकती है, संपूर्ण संदेश प्रवाह को बढ़ाने के लिए विभिन्न कंप्यूटरों पर कार्यकर्ता प्रक्रियाओं को कृत्य वितरित करती है। इस दृष्टिकोण के लिए शर्मनाक रूप से समानांतर समस्याएं अत्यधिक उत्तरदायी हैं।[citation needed]

प्रतीक्षा कृत्यों की संख्या के आधार पर किसी एप्लिकेशन के जीवनकाल के समय तंतु की संख्या को गतिशील रूप से समायोजित किया जा सकता है। उदाहरण के लिए, एक वेब सर्वर तंतु जोड़ सकता है यदि कई वेब पृष्ठ अनुरोध आते हैं और जब वे अनुरोध कम हो जाते हैं तो तंतु को हटा सकते हैं।[disputed ] एक बड़ा तंतु पूल होने की लागत संसाधन उपयोग में वृद्धि है। तंतु बनाने या नष्ट करने के लिए निर्धारित करने के लिए उपयोग किया जाने वाला एल्गोरिदम संपूर्ण निष्पादन को प्रभावित करता है:

  • बहुत सारे तंतु बनाने से संसाधनों की अंतर्हित होती है और अप्रयुक्त तंतु बनाने में समय लगता है।
  • बहुत सारे तंतु को नष्ट करने के लिए बाद में उन्हें फिर से बनाते समय अधिक समय की आवश्यकता होती है।
  • तंतु को बहुत धीरे-धीरे बनाने से ग्राहक का निष्पादन अंतर्हित हो सकता है (लंबे समय तक प्रतीक्षा करें)।
  • तंतु को बहुत धीरे-धीरे नष्ट करना संसाधनों की अन्य प्रक्रियाओं को क्षुधातुर कर सकता है।

यह भी देखें

संदर्भ

  1. Garg, Rajat P. & Sharapov, Ilya Techniques for Optimizing Applications - High Performance Computing Prentice-Hall 2002, p. 394
  2. Holub, Allen (2000). जावा थ्रेड्स को टैमिंग करना. Apress. p. 209.
  3. Yibei Ling; Tracy Mullen; Xiaola Lin (April 2000). "Analysis of optimal thread pool size". ACM SIGOPS Operating Systems Review. 34 (2): 42–55. doi:10.1145/346152.346320. S2CID 14048829.
  4. "QThreadPool Class | Qt Core 5.13.1".
  5. "GitHub - vit-vit/CTPL: Modern and efficient C++ Thread Pool Library". GitHub. 2019-09-24.


बाहरी संबंध