2009-08-11 10 views
5

क्या यादृच्छिक डेटा के साथ एक लिनक्स मशीन पर मुफ्त रैम भरने का कोई तरीका है?यादृच्छिक डेटा के साथ मेमोरी भरें

कारण मैं इस पूछ रहा हूँ: मैं एक समूह में काम कर रहा हूँ जहाँ हम फोरट्रान में संख्यात्मक प्रोग्रामिंग करते हैं। कभी-कभी, लोग डबल परिशुद्धता वास्तविकताओं के साथ काम करते हैं, ताकि प्रोग्राम जो डबल परिशुद्धता परिणाम दे, केवल एक परिशुद्धता दें।

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

मेरा विचार है कि यदि आप यादृच्छिक डेटा के साथ स्मृति के ऊपर लिख सकता है, आप वास्तव में अपने कार्यक्रम उत्पादन में यादृच्छिक उतार चढ़ाव देखना होगा है। इससे इन बगों को ढूंढना बहुत आसान हो जाएगा।

क्या यह विचार अजीब है, या नहीं, तो मैं स्मृति कैसे भरूं? क्या मैं राम में पाइप/dev/यादृच्छिक, या कुछ कर सकते हैं?

+0

किसी प्रक्रिया को दी गई स्मृति प्रारंभ की गई है (डिस्क से डेटा के साथ) या इस्तेमाल होने से पहले शून्य हो गई है। कोई अपवाद नहीं। तो आप यहां सब कुछ कर सकते हैं प्रोग्राम में प्रश्न के भीतर स्मृति यादृच्छिक है। – bdonlan

+0

मुझे कुछ हद तक यकीन है कि यह नहीं है ... खासकर तारों में जो प्रारंभ नहीं किए गए थे, मैं हर समय 'बाइनरी कचरा' देखता हूं ... यह हो सकता है कि स्मृति शुरुआत में शुरू हो, और कचरा स्मृति से है कार्यक्रम के अंदर पुन: उपयोग करें, लेकिन किसी भी मामले में, यादृच्छिक डेटा हो सकता है। –

+0

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

उत्तर

2

लिनक्स आपको अपनी खुशी के लिए /proc/pid/maps और /proc/pid/mem प्रदान करता है। बेशक आपको लिखते समय अतिरिक्त सावधान रहना होगा। साथ ही, ध्यान रखें कि प्रत्येक प्रक्रिया के लिए उपलब्ध एकमात्र मेमोरी सेगमेंट स्वयं है, इसलिए आपको जहां चाहें वहां कुछ अटैचिंग और कोड पैचिंग करना होगा। शुभकामनाएँ, वैसे भी। :)

संपादित करें: यह अभी भी कोड ऑडिट से कुछ गुना अधिक जटिल है - जिसमें समस्या के वास्तविक स्रोत को प्रकट करने की अधिक संभावनाएं भी हैं।

1

मुझे लगता है कि यादृच्छिक डेटा डीबगिंग को अधिक कठिन बना देगा। स्मृति में यादृच्छिक मानों या गणना बग के कारण उत्तरों में यादृच्छिकता है? मैं तय और ज्ञात मान बेहतर होगा।

FORTRAN ओर पर, आप 'मिश्रित परिशुद्धता' संख्या कह रहे हैं दूसरे शब्दों में उपयोग किया जाता है? मैं वास्तविक समस्या पर स्पष्ट नहीं हूँ।

लेकिन मुझे नहीं पता कि लिनक्स में किसी भी चीज़ के साथ मुफ्त मेमोरी कैसे भरें।

+0

समस्या उदाहरण के लिए हो सकती है यदि आप रूपांतरण करते हैं, और सटीकता को स्पष्ट करना भूल जाते हैं।उदाहरण के लिए (डबल परिशुद्धता के लिए idp = 8 के साथ): वास्तविक (idp) :: a; जटिल (आईडीपी) :: बी; ए = 1.0_आईडीपी; बी = सेमीप्लेक्स (ए, आईडीपी); यदि आप cmplx (जो आसानी से होता है) को कॉल में 'idp' भूल जाते हैं, तो बी का परिणामी मान केवल एक सटीक सीमा तक की एक प्रति होगी। शेष अंकों में यादृच्छिक उतार-चढ़ाव हो सकते हैं, जो इस बात पर निर्भर करता है कि स्मृति का पहले उपयोग कैसे किया गया था। इस तरह की समस्याओं के लिए अन्य उदाहरण भी हैं। यदि आप वास्तव में उतार चढ़ाव को मजबूर कर सकते हैं, तो डीबग करना आसान है। –

3

यदि आपके पास हालिया (> = 2.4 ऐसा लगता है) glibc है तो आप malloc() वापसी स्मृति को कुछ मान पर सेट करने के लिए पर्यावरण परिवर्तनीय MALLOC_PERTURB_ सेट कर सकते हैं। http://udrepper.livejournal.com/11429.html और http://people.redhat.com/drepper/defprogramming.pdf

फिर सवाल यह है कि यदि आपका फोरट्रान प्रोग्राम ग्लिबैक मॉलोक() का उपयोग करता है, तो मुझे लगता है कि यह फोरट्रान कंपाइलर पर निर्भर करता है।

+1

यह भी ध्यान दें कि, कई लोगों के विश्वास के विपरीत, स्मृति जो आप मॉलोक() (या आवंटन) फोर्ट्रान में प्राप्त करते हैं) को शून्य होने की गारंटी नहीं है, हालांकि कई ऑपरेटिंग सिस्टम इसे एक विकल्प के रूप में पेश करते हैं। – uekstrom

2

मैं fUnit जैसे कुछ का उपयोग करके यूनिट परीक्षण लिखने का प्रयास करता हूं ताकि यह सुनिश्चित किया जा सके कि डबल परिशुद्धता मान हमेशा कुछ परीक्षणों को लिखकर अपेक्षित रूप से काम करते हैं जिनके लिए एक सटीक परिणाम होता है जहां एक सटीक परिणाम संग्रहीत किया जाता है।

उदाहरण: एक परीक्षण लिखें जो विभिन्न इनपुट के साथ एक फ़ंक्शन को कॉल करता है जो डबल परिशुद्धता आउटपुट उत्पन्न करना चाहिए, और परीक्षण करें कि यह एक assert() के साथ काम करता है।

5

आपकी समझ गलत है। आप किसी प्रोग्राम की मेमोरी को निष्पादित करना शुरू करने से पहले यादृच्छिक डेटा के साथ भर नहीं सकते हैं, और यहां तक ​​कि यदि आप कर सकते हैं, तो यह आपकी समस्या का समाधान नहीं करेगा।

अपने फोरट्रान कार्यक्रम एक एकल परिशुद्धता चल बिन्दु चर वाणी हैं, तो संकलक स्मृति में एक 32 बिट सेल का आवंटन मूल्य धारण करने के लिए होगा। प्रत्येक बार जब आपका प्रोग्राम चर से पढ़ता है, तो प्रोसेसर सेल से 32 बिट मान प्राप्त करेगा। प्रत्येक बार जब आप चर को आवंटित करते हैं, प्रोसेसर सेल पर 32 बिट मान लिखेंगे। किसी भी परिस्थिति में यादृच्छिक बिट्स सेल से पहले या बाद में कोशिकाओं से मूल्य में "खून बहती" होनी चाहिए।

जबकि चल बिन्दु गणित सटीक नहीं है, यह नहीं यादृच्छिक या तो है।यदि आप 1.0/3.0 + 1.0/3.0 + 1.0/3.0) एक हजार बार गणना करते हैं, तो आपको प्रत्येक बार 0.99999... मिल जाएगा।

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

(Commenters: कृपया ध्यान दें कि मैं जानबूझ कर कई मुद्दों से अधिक skated गए स्पष्टीकरण सरल बनाने के लिए।)

+0

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

+0

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

1

आप मदद ITO एक समस्या के लिए अपने समाधान को लागू करने, स्मृति यादृच्छिकीकरण होने के लिए कहा है। हालांकि, मुझे लगता है कि समाधान को डीबग करना एक अजीब और संभवतः कठिन है।

यह मेरे लिए लगता है कि आप से अधिक लाभ होगा -, कोड की समीक्षा के लिए जाँच सूची, विशेष रूप से इस समस्या पर

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

2

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

यदि आपके पास समस्या है, तो इसका मतलब है कि आपके कोड में संरचनात्मक समस्या है, और आप अपने प्रोग्राम पर नियंत्रण खो रहे हैं। यद्यपि मैं पूरी तरह से जानता हूं कि अकादमिक, और किले में सॉफ्टवेयर कैसे विकसित किया गया है, खुद को चट्टान से नीचे फेंक रहा है क्योंकि बाकी दुनिया यह समस्याग्रस्त है।

आपको क्या करना चाहिए अपने कोड का एक लेखा परीक्षा है। और फिर कुछ ग्रेड छात्र को हराया अगर वह इसे फिर से गड़बड़ कर देता है।

+0

यह वास्तव में मेरा कार्यक्रम नहीं है, यह मेरे समूह में सिर्फ एक और लड़का है जिसने मुझे मदद के लिए कहा था। उनके पास एक कार्यक्रम की पुरानी जटिल गड़बड़ी है, और उसने पाया कि अगर उसके कुछ असंबद्ध बदलते हैं तो उसके नतीजे उतार-चढ़ाव होते हैं। मुझे यकीन है कि यह एक डबल/सिंगल सटीक समस्या है। इसके अलावा ... मैं स्नातक छात्र हूं (लेकिन मैं वह नहीं था जो गड़बड़ कर रहा था;)) किसी भी मामले में, अपने कार्यक्रम का पूर्ण लेखा परीक्षा करना सवाल से बाहर है, यह उसके लिए बहुत गन्दा है और ले जाएगा बहुत सारा समय। –

+0

वह क्या बदलता है, वह कैसे बदलता है पर निर्भर करता है। कौन जानता है ? जैसा कि आप कह सकते हैं, लेकिन यह वास्तव में निश्चित रूप से कौन कह सकता है? मैं इसे डीबग करने की कोशिश में आपका बिंदु देखता हूं, लेकिन फिर भी, आपको लगता है कि यह वास्तव में पता चलता है कि यह एक सटीक मुद्दा है, आपको अभी भी पता नहीं है कि यह कहां होता है, इसलिए आपको किसी ऑडिट की आवश्यकता होगी। –

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