2010-08-26 14 views
5

मुझे लगता है कि मैं एक "बेवकूफ" सवाल पूछने के लिए जा रहा हूँ है, फिर भी मैं पूछना चाहिए ...प्रतिलिपि वस्तुओं कुशलतापूर्वक

2 आभासी मशीनों की है।

मैं एक से दूसरे एक वस्तु का एक उदाहरण को कॉपी,

यह संभव बिट्स कि वी एम के ढेर में इस वस्तु का प्रतिनिधित्व करता है कॉपी करने के लिए है, अन्य वी एम के लिए भेज, अन्य ऐसे ही चाहते हैं वीएम को बस इसकी स्मृति में बिट्स आवंटित करने की आवश्यकता है और इस मेमोरी स्लॉट में इसके ढेर में एक संदर्भ जोड़ें ...?

वर्तमान में, ऐसी चीज करने के लिए हम ऑब्जेक्ट को क्रमबद्ध करते हैं और इसे अनसुलझा करते हैं, जो कि उदाहरण की प्रतिलिपि बनाने की तुलना में बहुत कम कुशल (कम्प्यूटेशनल वार) है ... पार्सिंग एक कम्प्यूटेशनल अपशिष्ट है ...

जे एस क्रमबद्धता उदाहरण: वीएम V8 का एक उदाहरण (जावास्क्रिप्ट), यह JSON (JSON.stringify) करने के लिए वस्तु कन्वर्ट करने के लिए है करने के एक ही रास्ता है, यह अन्य वी एम के लिए कुछ कैसे जो स्ट्रिंग प्राप्त भेजने और परिवर्तित ऑब्जेक्ट पर वापस (उदाहरण के लिए var myObject = eval('(' + myJSONtext + ')');) .. (जावास्क्रिप्ट सिर्फ एक उदाहरण है, यह कुछ प्रकार का क्रमबद्धता है)

+0

जावा या पायथन के साथ इसका क्या संबंध है? – katrielalex

+2

जावा और पायथन ने एक वीएम के अंदर भी निष्पादित किया ... – DuduAlul

+0

आपका आवेदन वीएम के भीतर या उसके बाहर चल रहा होगा? यदि वीएम में से एक के अंदर, तो मुझे नहीं लगता कि यह संभव है, क्योंकि यह पूरी तरह से सैंडबॉक्स होगा। –

उत्तर

7

किसी के लिए अनदेखा करते हैं दूसरी बेवकूफ धारणा है कि आप आसानी से एकाधिक प्रश्नों पर इस प्रश्न को सामान्यीकृत कर सकते हैं। इस तरह की एक तंत्र बनाने का कोई भी प्रयास वीएम के कार्यान्वयन विवरण पर निर्भर करेगा, जिसके लिए आप तंत्र बना रहे थे।

यहाँ कई कारण ऐसा नहीं किया जाता:

  1. में कोर प्रतिनिधित्व आम तौर पर पोर्टेबल भर में आर्किटेक्चर नहीं है। अगर मैं एक वी एम से एक "वस्तु" एक स्पार्क मशीन पर एक वी एम के लिए एक x86 मशीन पर इसकी संरचना के ज्ञान के बिना भेज रहे थे, वस्तु दूसरी तरफ भ्रष्ट प्रदर्शित होगी।

  2. ऑब्जेक्ट दोनों मशीनों पर उसी स्मृति स्थान पर सफलतापूर्वक मौजूद नहीं होगा, इसलिए ऑब्जेक्ट के भीतर आंतरिक पॉइंटर्स को दूसरे वीएम तक पहुंचने के बाद पैच करने की आवश्यकता होगी। इसके लिए ऑब्जेक्ट की संरचना के आंतरिक ज्ञान की भी आवश्यकता होती है।

  3. ऑब्जेक्ट में शायद अन्य ऑब्जेक्ट्स के संदर्भ शामिल हैं, इस प्रकार ऑब्जेक्ट की प्रतिलिपि बनाना ऑब्जेक्ट्स का पेड़ कॉपी करना और आम तौर पर एक विश्वकोश पेड़ नहीं है। आप बिल्डिंग कोड को समाप्त करते हैं जो विश्वसनीय रूप से ऐसा करने के लिए एक क्रमबद्ध लाइब्रेरी की तरह एक भयानक लग रहा है।

  4. ऑब्जेक्ट्स अक्सर देशी संसाधनों (जैसे फ़ाइल हैंडल और सॉकेट) पर निर्भर करते हैं जिन्हें विश्वसनीय रूप से मशीनों पर प्रेषित नहीं किया जा सकता है।

  5. कई वीएम में, डेटा (ऑब्जेक्ट जिसे आप प्रतिलिपि बनाने का प्रयास कर रहे हैं) और मेटाडेटा (उदाहरण के लिए, उस ऑब्जेक्ट का वर्ग जिसे आप प्रतिलिपि बनाने का प्रयास कर रहे हैं) के बीच एक अंतर है। इन प्रकार के वीएम में, भले ही आप ऑब्जेक्ट को बिट-फॉर-बिट बेकार की प्रतिलिपि बना सकें, यह मेटाडेटा के समूह पर निर्भर हो सकता है जो रिमोट एंड पर मौजूद नहीं है। मेटाडेटा बिट-फॉर-बिट की प्रतिलिपि बनाना भी मुश्किल है, क्योंकि कई वीएम कार्यान्वयन तकनीकों का उपयोग करते हैं (जैसे इंटर्न वाले तारों या मेमोरी मैप किए गए ऑब्जेक्ट कोड का वैश्विक पूल) जो डेटा को मूल रूप से गैर पोर्टेबल बनाता है। आप जितना चाहें उतना अधिक मेटाडेटा समाप्त कर सकते हैं (उदा। मेटाडेटा की सबसे छोटी इकाई .NET में जिसे आप पैकेज कर सकते हैं और कहीं भी भेज सकते हैं आम तौर पर एक असेंबली है)।

  6. इन-कोर प्रतिनिधित्व आम तौर पर एक ही वीएम के विभिन्न संस्करणों के बीच पोर्टेबल नहीं होता है और इसमें आंतरिक संस्करण जानकारी नहीं होती है जिसका उपयोग डेटा को पैच करने के लिए किया जा सकता है।

  7. इन-कोर प्रतिनिधित्व में बहुत सी चीजें हैं (जैसे इनलाइन कैश, कचरा संग्रहण जानकारी) जिन्हें प्रतिलिपि बनाने की आवश्यकता नहीं है। इस सामान की प्रतिलिपि अपमानजनक होगी, और जानकारी दूसरी तरफ समझदार भी नहीं हो सकती है।

मूलतः, यह मज़बूती से ऐसा करने के लिए, आप दुनिया के सबसे अजीब और अविश्वसनीय क्रमबद्धता लाइब्रेरी बनाना समाप्त होते है और सरल स्मृति कॉपी के प्रदर्शन में सुधार को कई चीजें हैं जो टूटा जब आप ऐसा करेंगे अप पैचिंग में खो जाते हैं प्रतिलिपि प्रतिलिपि बनाएँ।

इस प्रकार, ये तंत्र मौजूद नहीं हैं।

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

0

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

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

लेकिन मुझे आश्चर्य है कि क्या आपको वास्तव में पूरी ऑब्जेक्ट को छीनने और फिर से बनाए जाने की आवश्यकता है, या यह केवल कुछ डेटा शामिल है। यदि डेटा अत्यधिक नहीं है, तो आप किसी भी प्रकार के remote method invocation का उपयोग स्रोत वीएम से प्राप्तकर्ता को इस संदेश के साथ एक ऑब्जेक्ट बनाने के लिए कहने वाले रिसीवर को संदेश भेजने के लिए कर सकते हैं। इस मामले में, आप केवल आवश्यक डेटा को क्रमबद्ध करेंगे, और लक्ष्य मशीन को ऑब्जेक्ट को अपनी स्मृति में फिर से बनाने दें।

+0

मुझे पूरा यकीन है कि जब वह "वीएम" शब्द का उपयोग करता है तो वह वर्चुअल मशीनों जैसे हॉटस्पॉट और वी 8 के बारे में बात कर रहा है, वर्चुअल मशीन जैसे वीएमवेयर और ज़ेन नहीं। – blucz

+0

@blucz सही है। – DuduAlul

2

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

संबंधित मुद्दे