2010-05-17 9 views
16

मेरे पास एक साधारण छोटा सवाल है जो कोई जानता है आसानी से जवाब देने में सक्षम होगा, मैंने Google की खोज की लेकिन जवाब नहीं मिला।क्या .dll फ़ाइलें प्रत्येक प्रोग्राम के लिए या एक बार सभी प्रोग्रामों के लिए लोड हो जाती हैं?

कंप्यूटर पर एक बार में कई प्रोग्राम चल रहे हैं, और मेरा सवाल यह है कि: जब कोई प्रोग्राम डीएलएल लोड करता है, तो क्या यह वास्तव में डीएलएल फ़ाइल लोड करता है या क्या यह स्मृति को मिलती है जिसमें डीएलएल पहले ही लोड हो चुका है? उदाहरण के लिए, wins2_32.dll (winsock 2) winsock का उपयोग करने वाले प्रत्येक प्रोग्राम के लिए लोड किया गया है, या यह एक बार लोड हो गया है और इसका उपयोग करने वाले सभी प्रोग्राम फ़ंक्शंस को कॉल करने के लिए समान स्मृति पते का उपयोग करते हैं?

उत्तर

18

यह एक बार लोड हो गया है और सभी प्रोग्राम कोड की समान स्मृति-स्मृति प्रति साझा करते हैं। यह जटिल है, लेकिन डीएलएल (यानी, कोड) के केवल पढ़ने वाले वर्गों के लिए ऑपरेटिंग सिस्टम लोडर डीएलएल को प्रक्रिया के पता स्थान में मैप करने के लिए "मेमोरी मैपिंग" नामक तकनीक का उपयोग करता है। पृष्ठों को केवल सभी प्रक्रियाओं के लिए भौतिक स्मृति में लोड किया जाता है, भले ही उनके पृष्ठ को उनके वर्चुअल एड्रेस स्पेस में अलग-अलग पते पर मैप किया गया हो।

हालांकि, प्रत्येक प्रक्रिया में एक अलग डेटा अनुभाग होता है (ताकि वैश्विक चर साझा नहीं किए जाते - जब तक कि आप उन्हें स्पष्ट रूप से नहीं पूछते) और उनके पास स्पष्ट रूप से एक अलग ढेर भी है ताकि गतिशील रूप से आवंटित स्मृति साझा नहीं की जा सके।

+0

ठीक है धन्यवाद, यह समझ में आता है। मुझे बस यह जानने की ज़रूरत है कि क्या डीएलएल से किसी फ़ंक्शन के लिए पॉइंटर उसी पते पर इंगित करता है जो फ़ंक्शन का उपयोग करने वाले सभी प्रोग्रामों द्वारा उपयोग किया जाता है। – Nilbert

+2

उस प्रश्न का उत्तर "नहीं" है। फ़ंक्शन पॉइंटर्स प्रक्रियाओं में पते हैं * आभासी पता स्थान *, और यह निश्चित रूप से प्रक्रियाओं के बीच साझा नहीं किया जाता है। विभिन्न प्रक्रियाओं में विभिन्न पते पर एक डीएलएल लोड किया जा सकता है, और इसलिए फ़ंक्शन पॉइंटर का पता अलग-अलग होगा - भले ही एक ही भौतिक पृष्ठ का उपयोग किया जाए। –

+0

वास्तव में, फ़ंक्शन के लिए दो अलग-अलग कार्यक्रमों में एक ही पते के लिए यह बेहद असंभव होगा। डीएलएल का कोड अगले कोड पता योगदान के बाद अगले उपलब्ध पता स्थान में मैप किया जाएगा। सिक्योर लिनक्स में लोड लोड एड्रेसिंग का उपयोग किया जाता है (वायरि को हमलों में हार्डकोडेड पतों का उपयोग करने से रोकने के लिए)। आप एक वायरस नहीं लिख रहे हैं, है ना? :-) – wallyk

5

यह "लोड" से आपका क्या मतलब है इस पर निर्भर करता है।

डीएलएल कोड और डेटा के साझा उपयोग के लिए तैयार है: अधिकांश विंडोज वातावरण स्मृति की रक्षा के लिए शेयरबैकिटी (प्रत्येक प्रक्रिया की मेमोरी स्पेस में कोड की उसी स्मृति प्रतिलिपि को मैप करके) का सम्मान करते हैं।

हालांकि, "लोड" ऑपरेशन (प्रक्रिया के बिंदु से) का हिस्सा डीएलएल के प्रारंभिकरण को चला रहा है: यह प्रत्येक प्रक्रिया में अलग-अलग डेटा क्षेत्रों की अलग-अलग प्रतियों के साथ अलग-अलग किया जाता है जो प्रत्येक प्रक्रिया के लिए निजी होते हैं।