مشكلة مع الملفات تعيين دفعة الذاكرة: يذهبون إلى القرص بدلا من ذاكرة الوصول العشوائي

StackOverflow https://stackoverflow.com/questions/1936266

سؤال

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

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <boost/iostreams/device/mapped_file.hpp>
    using std::cout;
    using std::endl;

    int main(int argc, char** argv) {
     const int blockSize = 64;
     bool writer = false;

     if(argc > 1) {
      if(!strcmp(argv[1], "w"))
       writer = true;
     }

     boost::iostreams::mapped_file_params  params;
     params.path = "map.dat";
    // params.length = 1024;     // default: all the file
     params.new_file_size = blockSize;

     if(writer) {
      cout << "Writer" << endl;
      params.mode = std::ios_base::out;
     }
     else {
      cout << "Reader" << endl;
      params.mode = std::ios_base::in;
     }

        boost::iostreams::mapped_file  mf;
        mf.open(params);

     if(writer)
     {
      char *block = mf.data();
      strcpy(block, "Test data block...\0");
      cout << "Written: " << block << endl;
     }
     else
     {
      cout << "Reading: " << mf.const_data() << endl;
     }

     mf.close();

        return 0;
    }
/*
    Compiler options: -Wall -I$(PATH_BOOST_INCLUDE) -ggdb
    Linker options: -L$(PATH_BOOST_LIBS) -lboost_iostreams-mt -lboost_system-mt -lboost_filesystem-mt -DBOOST_FILESYSTEM_NO_DEPRECATED
*/

ومترجم المستخدمة: دول مجلس التعاون الخليجي 4.2.1
تعزيز 1.41.0
OS: ماك X 10.6.2

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

المحلول

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

تعديل: من تعليقاتكم، وهذا يبدو وكأنك تريد استخدام الذاكرة المشتركة - راجع <لأ href = "http://www.boost.org/doc/libs/1_41_0/doc/ أتش تي أم أل / بين العمليات / quick_guide.html "يختلط =" noreferrer "> http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

نصائح أخرى

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

إذا ما كنت تحاول القيام به هو خلق منطقة من الذاكرة المشتركة من قبل اثنين من العمليات، وملفات الذاكرة المعنونة يمكن أن نفعل ذلك بالنسبة لك، ولكن على حساب من وجود الملف على القرص الذي يعكس محتويات تلك الذاكرة. في لينكس هذا سيظل فعال بشكل معقول منذ ببساطة يكون مؤقتا محتويات الملف في الذاكرة وسوف صفحات الذاكرة البرنامج الخاص بك المقابلة لمحتويات الملف يكون نفس الصفحات الفعلية بالضبط كما يتم استخدامها من قبل ذاكرة التخزين المؤقت.

إذا ما تريده هو فقط رامديسك ...

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

نعم، يوجد نظام V الذاكرة المشتركة، ولها تصميم السيئ تماما. لم أكن على اتصال الأوليات الاتصالات V بين العمليات SYS مع قطب 10 قدما.

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