سؤال

هل هناك طريقة لملء ذاكرة الوصول العشوائي المجانية على آلة Linux مع بيانات عشوائية؟

السبب في أنني أسأل هذا: أنا أعمل في مجموعة حيث نفعل البرمجة العددية في فورتران. في بعض الأحيان، يفوض الناس يعملون بعمل مزدوج الدقة، بحيث تعطي البرامج التي يجب أن تعطي نتائج دقيقة مزدوجة فقط دقة واحدة.

إذا كان فهمي صحيحا، فإن المرء سيشهد تقلبات عشوائية للنتيجة بعد الحد الدقيقة الواحدة في مثل هذا البرنامج. وهذا هو، إذا قمت بتشغيل نفس البرنامج بنفس المدخلات عدة مرات، فستحصل على نتيجة مختلفة عشوائيا في كل مرة. ما تراه (الجزء العشوائي) يعتمد على القيم العشوائية في ذاكرة الوصول العشوائي المجانية للآلة. ولكن في الممارسة العملية، إذا قمت بتشغيل البرنامج مرارا وتكرارا على نفس الجهاز، فإن نفس أجزاء الذاكرة تميل إلى استخدامها بشكل متكرر، والتي لها نفس البيانات العشوائية فيها، مما يؤدي إلى نفس الإخراج في كل مرة.

فكرتي هي أنه إذا أمكنك الكتابة فوق الذاكرة ببيانات عشوائية، فسترى بالفعل تقلبات عشوائية في إخراج البرنامج الخاص بك. من شأنها أن تجعل الأمر أسهل كثيرا في العثور على هذه الأخطاء.

هل هذه الفكرة تضرب، أو إن لم يكن، كيف يمكنني ملء الذاكرة؟ هل يمكنني الأنابيب / dev / عشوائي في ذاكرة الوصول العشوائي، أو شيء من هذا؟

هل كانت مفيدة؟

المحلول

لينكس يوفر لك /proc/pid/maps و /proc/pid/mem, من دواعي سروري الخاص بك. بالطبع يجب أن تكون حذرا للغاية عند الكتابة هناك. أيضا، ضع في اعتبارك أن قطاع الذاكرة الوحيد المتاح لكل عملية هو خاص به، لذلك ربما يتعين عليك القيام ببعض التعلق وتصحيح التعليمات البرمجية للحصول على المكان الذي تريده. حظا سعيدا، على أي حال. :)

تحرير: لا تزال عدة مرات أكثر تعقيدا من تدقيق التعليمات البرمجية - والتي لديها أيضا فرص أكبر للكشف عن المصدر الفعلي للمشكلة.

نصائح أخرى

فهمك غير صحيح. لا يمكنك ملء ذاكرة البرنامج ببيانات عشوائية قبل بدء تشغيله، وحتى لو كان بإمكانك، فلن يحل مشكلتك.

إذا تعلن برنامج FORTRAN الخاص بك متغير نقطة عائمة بدقة واحدة، فسيقوم المحول البرمجي بتخصيص خلية 32 بت في الذاكرة لعقد القيمة. في كل مرة يقرأ فيها البرنامج من المتغير، سيحصل المعالج قيمة 32 بت من الخلية. في كل مرة تقوم فيها بتعيين المتغير، سيكتب المعالج قيمة 32 بت إلى الخلية. تحت أي ظرف من الظروف يجب أن BITS عشوائي "تنزف" في القيمة من الخلايا قبل أو بعد الخلية.

في حين أن الحساب النقطة العائمة ليست دقيقة، إلا أنها ليست عشوائية أيضا. إذا كنت تحسب 1.0 / 3.0 + 1.0 / 3.0 + 1.0 / 3.0) ألف مرة، سوف تحصل 0.99999... كل مرة في كل مرة.

النقطة الثانية هي أنه عند تنفيذ برنامج في Linux، تتم إعادة تشغيل جميع ذاكرة البيانات بعناية إلى الصفر بواسطة نظام التشغيل. يتم ذلك لتجنب التصرف البرنامج الخاص بك بشكل مختلف في كل مرة تقوم فيها بتشغيله: سيكون ذلك شيئا سيئا. تحرير: سبب آخر يتم ذلك هو منع تسرب المعلومات الخاصة من عملية إلى أخرى.

(المعلقون: يرجى ملاحظة أنني توقف عمدا على عدد من القضايا لجعل التفسير بسيطا.)

إذا كان لديك مؤخرا (> = 2.4 يبدو) Clibc، فيمكنك استخدام تعيين البيئة Malloc_perturb_ لإجراء Malloc () الذاكرة التي تم ضبطها على بعض القيمة. يرى http://udrepper.livejournal.com/11429.html. داخليا ايضا http://people.redhat.com/drepper/defprogramming.pdf.

ثم السؤال هو إذا كان برنامج Fortran الخاص بك يستخدم Glibc Malloc ()، فما أعتقد أنه يعتمد على مترجم FORTRAN.

سأحاول كتابة اختبارات وحدة باستخدام شيء مثل funit للتأكد من أن القيم الدقيقة المزدوجة تعمل دائما كما هو متوقع من خلال كتابة بعض الاختبارات التي تتطلب نتيجة دقة مزدوجة في الحالات التي يتم فيها تخزين نتيجة دقة واحدة في كثير من الأحيان.

على سبيل المثال: اكتب اختبارا يستدعي وظيفة بمختلف المدخلات التي يجب أن تولد مخرجات دقيقة مزدوجة، واختبار أن هذا يعمل مع تأكيد ().

ما تريد تحقيقه، على الرغم من أن النبيل في النية، ومثيرة للاهتمام، يتذكرني، خطط WILE E. Coyote للقبض على Roadrunner، في حين أن بندقية وعمل القنص سيكون أفضل خيار.

إذا كانت لديك المشكلة التي تقدمها، فهذا يعني أن هناك مشكلة هيكلية في التعليمات البرمجية الخاصة بك، وأنت تفقد السيطرة على البرنامج الخاص بك. على الرغم من أنني أعرف تماما كيف يتم تطوير البرنامج في الأوساط الأكاديمية، وفي فورتران، قم بإلقاء نفسك على الهاوية لمجرد أن بقية العالم يفعل مشكلة.

ما يجب عليك فعله هو مراجعة التعليمات البرمجية الخاصة بك. ثم تغلب على بعض طالب الخريج إذا كان يفسدها مرة أخرى.

أعتقد أن البيانات العشوائية ستجعل تصحيح الأخطاء كثيرا بكثير. هل العشوائية في الإجابات الناجمة عن قيم عشوائية في الذاكرة أو خطأ حساب؟ وأود أن Thnk. مثبت و معروف القيم ستكون أفضل.

على الجانب FORTRAN، هل تقول أن أرقام "الدقة المختلطة" تستخدم بالتبطل أنا لست واضحا في المشكلة الفعلية.

لكن ليس لدي أي فكرة عن كيفية ملء الذاكرة المجانية في لينكس مع أي شيء.

لقد طلبت مساعدة ITO في تطبيق الحل الخاص بك بمشكلة، كونها عشوائية الذاكرة. ومع ذلك، أشعر أنه من الغريب وربما يصعب تصحيح الحل.

يبدو لي أنك ستستفيد أكثر من أدوات تحليل الكود الثابتة - اختبار الوحدة المحددة - قوائم المراجعة لمراجعة التعليمات البرمجية، المستهدفين خصيصا في هذه المشكلة

في بعض الأحيان، يمكن للمرء أن يفكر في الحلول حتى أبسط؛ إذا كنت تستطيع الاستغناء عن الرياضيات الواحدة، فقد تمنع ربط هذه المكتبات، لذلك سيظهر الخطأ خطأ في الارتباط؛ في وقت مبكر من عملية التطوير الخاصة بك. حظ سعيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top