.net - AppDomain पता स्थान




memory pointers (2)

मेरे पास आपका कोई सीधा जवाब नहीं है मार्शलबीरफ ओब्जेक्ट का अस्तित्व यह संकेत दे सकता है कि एक सामान्य पता स्थान का उपयोग किया जाता है, लेकिन शायद नहीं।

आप मेमोरी-मैप किए गए फ़ाइलों में भी देख सकते हैं

सबसे पहले, सवाल: सीएलआर विनिर्देशों की गारंटी क्या है कि एक ही प्रक्रिया के भीतर एकाधिक एपी डोमेन में कोड को उसी पते के स्थान पर साझा किया जाएगा? "पता स्थान साझा करना" मेरा मतलब है कि एक ऐप डोमेन में आवंटित स्मृति को पॉइंटर्स उसी प्रक्रिया के अंदर होस्ट किए गए सभी एप डोमेन पढ़ने और लिखने के लिए मान्य होंगे।

इस सवाल को समझाते हुए इस आत्मनिहित उदाहरण पर विचार करें: कार्यक्रम एक अलग ऐप डोमेन में एक Worker ऑब्जेक्ट को आवंटित करता है। Worker 10,000 पूर्णांक के लिए एक स्मृति ब्लॉक आवंटित करता है, और डेटा के साथ इसे भरता है कार्यक्रम तब आवंटित ब्लॉक में पॉइंटर प्राप्त करने के लिए एप डोमेन सीमा पर कॉल करता है, और यह सत्यापित करता है कि वह 10,000 आइटमों में से हर एक को पढ़ सकता है।

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace crossapp {
    public class Worker : MarshalByRefObject {
        private readonly IntPtr myData;
        public const int DataLength = 10000;
        public Worker() {
            Console.Error.WriteLine(
                "Memory allocation happens in app domain '{0}'"
            ,   Assembly.GetExecutingAssembly().FullName
            );
            myData = Marshal.AllocHGlobal(sizeof(int) * DataLength);
            unsafe {
                var ptr = (int*) myData.ToPointer();
                for (var i = 0 ; i != DataLength ; i++) {
                    ptr[i] = 2*i + 1;
                }
            }
        }
        public IntPtr GetData() {
            return myData;
        }
    }
    class Program {
        static void Main() {
            var ad = AppDomain.CreateDomain("New domain");
            var wrk = (Worker)ad.CreateInstanceAndUnwrap(
                Assembly.GetExecutingAssembly().FullName
            ,   "crossapp.Worker"
            );
            var data = wrk.GetData();
            var badCount = 0;
            unsafe {
                var ptr = (int*)data.ToPointer();
                for (var i = 0 ; i != Worker.DataLength ; i++) {
                    var expect = 2*i + 1;
                    if (ptr[i] != expect) {
                        Console.Error.WriteLine(
                            "Mismatch in position {0}: {1} != {2}"
                        ,   i, expect, ptr[i]
                        );
                        badCount++;
                    }
                }
                if (badCount == 0) {
                    Console.Error.WriteLine(
                        "All {0} items have matched."
                    ,   Worker.DataLength
                    );
                } else {
                    Console.Error.WriteLine(
                        "Found {0} mismatches out of {1}."
                    ,   badCount
                    ,   Worker.DataLength
                    );
                }
            }
        }
    }
}

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

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


को देखो: कोई भी मार्शलबीरफ ऑब्जेक्ट के प्रमुख उपयोग को समझा सकता है आपके परिदृश्य में, आप केवल एक प्रॉक्सी पास कर रहे हैं और वास्तविक वस्तु नहीं है और मेमोरी की प्रतिलिपि नहीं की जा रही है।

संपादित करें:

  1. "वैधता"! = "चाल", आपका हैक दूसरे ऐपडोमेन में डेटा को कॉल करने के लिए कॉल करने से नहीं AppDomains को कम कर रहा है। रन-टाइम कंटेनर सुरक्षा सेटिंग सेट कर सकता है / बदल सकता है जो आपकी ऐप को तोड़ सकता है, जैसे यह आईआईएस में चल रहा है? (आपके मामले में, आप किसी ऑब्जेक्ट तक पहुंच नहीं कर रहे हैं, लेकिन मेमोरी, इसलिए शायद यह "इतनी बुरी तरह" नहीं है।) क्या यह एक ऐसा उत्पाद है जिसे आप किसी ग्राहक की साइट पर तैनात कर रहे हैं?
  2. मुझे लगता है कि प्रॉक्सी के माध्यम से मार्शलिंग के साथ एक प्रदर्शन समस्या थी, इसलिए आपने इंटपेट (मध्य आदमी को काट लिया) का सहारा लिया
  3. क्या विभिन्न "कार्यकर्ता" ऐप्पडॉमें ब्लॉब में हेरफेर करते हैं? यदि हां, तो मुझे चिन्तित होगा कि अंततः स्मृति भ्रष्ट हो जाएगी ... क्योंकि आप अपने कॉलों को मार्शल नहीं कर रहे हैं।
  4. यह सी # में अप्रबंधित स्मृति है। यदि वास्तविकता में, ब्लॉब को एक अप्रबंधित DLL द्वारा आवंटित किया गया है, तो आपको यह सुनिश्चित करना होगा कि अप्रबंधित DLL उतार नहीं है। फिर, अगर आईआईएस में तैनात हो रहे हैं, तो आप अपने ऐपडॉमेन्स लाइफसाइक्सेस को नियंत्रित नहीं कर सकते, IIS करता है यह आपके हैक को तोड़ देगा।
  5. हां, वर्चुअल मेमोरी प्रत्येक प्रक्रिया के अनुसार है और प्रति ऐप्लिकेशन नहीं है, इसलिए सभी ऐपडेमैन एक ही वर्चुअल पता स्थान को साझा करते हैं।
  6. मेरे आरक्षण के बावजूद, यह बहुत ही शांत है :)




address-space