مشكلة مع الملفات تعيين دفعة الذاكرة: يذهبون إلى القرص بدلا من ذاكرة الوصول العشوائي
-
20-09-2019 - |
سؤال
وأنا أحاول أن نفهم كيف الذاكرة المعنونة دفعة ملفات العمل. يعمل التعليمة البرمجية التالية، فإنه يفعل ما يفترض القيام به، ولكن المشكلة هي أن يتم تخزين الملف فإنه يولد على القرص (في نفس الدليل القابل للتنفيذ) بدلا من الذاكرة. ربما يكون هناك إشارة لمكان ما مجموعة، لكني لم أستطع العثور عليه ...
شكرا مقدما على أي معلومات!
#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 قدما.