2011-01-13 8 views
10

मैं सोच रहा था कि किसी वस्तु (कक्षा या संरचना) की स्मृति को डिस्क पर बदलने से रोकने के लिए संभव था?क्या आप डिस्क पर स्वैप होने से स्मृति को रोक सकते हैं?

संपादित करें: क्यों मुझे कुछ डेटा बताया गया है जिसके साथ मैं काम करने जा रहा हूं डिस्क पर नहीं लिखा जा सकता है।
मुझे उम्मीद नहीं है कि डेटा को स्वैप आउट करने के लिए काफी देर तक छोड़ा जाए लेकिन सोचा कि यह जांच के लायक है।

+4

आप इसे क्यों रोकना चाहते हैं? =) – Jens

+2

इसका मतलब है इसका उपयोग करने के अलावा? आम तौर पर उस तरह की चीज के बारे में चिंता करना ऑपरेटिंग सिस्टम तक छोड़ दिया जाता है। बस इसका उपयोग करके आप इसे अपने स्वैप स्पेस में रखने का मौका कम कर देते हैं। यदि आपने हाल ही में इसका उपयोग नहीं किया है, संभावना है कि इसे डिस्क पर रखना ठीक है। क्या आप ऐसी ऑब्जेक्ट्स देख रहे हैं जो अक्सर डिस्क पर रखे जा रहे हैं? – Crisfole

+2

मैं एक माइक्रो अनुकूलन गंध। आप कैसे जानते हैं कि यह आपके लिए एक समस्या है? –

उत्तर

4

आप SecureString class की तलाश कर रहे हैं, जो डिस्क पर नहीं बदला जाएगा।

+0

मुझे संदेह है कि पूछताछ करने वाला यह क्या है, लेकिन लिंक के लिए धन्यवाद :) –

+3

क्या कोई संदर्भ उपलब्ध है जो सिक्योरस्टिंग को स्वैप नहीं किया जाता है? मैं देखता हूं कि यह जीसीड किया जा सकता है, पूल नहीं किया जाता है और यह पूरी तरह से एन्क्रिप्टेड है। यदि सिक्योरस्ट्रिंग को स्वैप नहीं किया जाता है, तो इसका कार्यान्वयन संकेत दे सकता है। – atamanroman

+1

यह सही नहीं है। SecureString विशेष रूप से पेजिंग फ़ाइल में स्ट्रिंग को वापस देखने से बचने के लिए मौजूद है। –

0

वास्तव में, यह एक ऑपरेटिंग सिस्टम चीज नहीं है।

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

0

उम, अच्छा सवाल .. आप विंडोज़ में स्वैप को अक्षम कर सकते हैं (आकार = 0), लेकिन अगर यह स्वैपिंग से .NET को रोकने के लिए पर्याप्त है।

+0

का उपयोग करें ऐसा लगता है कि यह एकमात्र तरीका हो सकता है :( – Dreaddan

3

यह केवल तकनीकी रूप से संभव है। मेमोरी पेज वर्चुअल लॉक() एपीआई फ़ंक्शन के साथ रैम में लॉक किया जा सकता है। समस्या यह है कि, उस पृष्ठ के पते की आपूर्ति करने की आवश्यकता है जिसे आप लॉक करना चाहते हैं। आप इस पते को कचरा कलेक्टर से किसी भी दस्तावेज तरीके से नहीं प्राप्त कर सकते हैं। न ही यह कोई वादा करता है कि समान पता, कहने के लिए, gen # 0 ढेर दोहराने योग्य होगा। एक के लिए, उस ढेर का आकार गतिशील होता है, आमतौर पर कार्यक्रम के आवंटन पैटर्न के आधार पर, 2 और 8 मेगाबाइट के बीच कहीं भी होता है।

बस बेतरतीब ढंग से आशा है कि आप उनमें से ज्यादातर को पकड़ने या तो काम नहीं करता है के साथ एक बड़ी रेंज पर ताला लगा। एक प्रक्रिया को लॉक करने योग्य पृष्ठों का कोटा मिलता है। यह बहुत बड़ा नहीं है, सब से ऊपर क्योंकि यह मशीन के संचालन के लिए इतना अस्थिर है। ड्रेगन यहाँ रहते हैं।

+0

आपने सोचा होगा कि एमएस वर्चुअल लॉक के .net equiv प्रदान करेगा। – Dreaddan

8

मैं अभी भी स्पष्ट नहीं हूं कि आप ऐसा क्यों करना चाहते हैं। सी # के संदर्भ में, आपको दो चीजें करना है: स्मृति को "पिन करें" ताकि इसे कचरा संग्रह द्वारा स्थानांतरित नहीं किया जा सके, और फिर इसे लॉक कर दें ताकि यह स्वैप न हो जाए।

यहाँ एक अच्छा ब्लॉग पोस्ट का वर्णन करता है कि कैसे पहले भाग (पिन करने) करने के लिए है:

http://www.matthew-long.com/2005/10/18/memory-pinning/

अब आप पता और वस्तु की हद तक जरूरत VirtualLock आह्वान करने के लिए सक्षम होने के लिए:

http://msdn.microsoft.com/en-us/library/Aa366895

ध्यान दें कि VirtualLock केवल ताले पृष्ठों (4K की इकाइयों), तो अपनी स्मृति क्षेत्र में कम से कम है कि बड़े होने की जरूरत है, और एक पृष्ठ के शुरू करने के गठबंधन । मुझे लगता है कि इसे unsafe संदर्भ में शामिल करने की आवश्यकता है, हालांकि मुझे यकीन नहीं है।

विषय पर पिछले पोस्टिंग: Prevent an object from being paged out (VirtualLock equivalent)

एक अन्य संबंधित ब्लॉग पोस्ट: http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx

4

मैं कुछ पूरी तरह से अलग कर चाहते हैं:

के साथ एक अच्छा देशी रैपिंग सी ++ DLL बिल्ड अपने वांछित फ़ंक्शंस/आवंटन/जो भी जो यह भी सुनिश्चित करेगा कि डेटा को (वर्चुअल लॉक जैसा कोई यहां कहा गया है) को स्वैप नहीं किया जाएगा। इसे सी # से प्रयोग करें।

आखिरकार, यह संभव है, यह सिर्फ इतना है कि अब आप सी # से बंधे हैं। तो, इसके चारों ओर जाओ!

0

अपने पर्यावरण के आधार पर आप इसे ओएस स्तर पर भी कर सकते हैं - बस बहुत सी रैम के साथ वास्तव में एक बीफ़ी मशीन का उपयोग करें, और पूरी तरह से पेजिंग/स्वैप अक्षम करें। इसका मतलब यह है कि आप उस रैम को कभी भी बेहतर नहीं करते हैं, लेकिन यही वह जगह है जहां कार्य सी # पर आता है - आप स्मार्ट डिज़ाइन के साथ अधिकतम मेमोरी उपयोग को बाधित कर सकते हैं।

https://www.howtogeek.com/126430/htg-explains-what-is-the-windows-page-file-and-should-you-disable-it/

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