سؤال

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

بدلاً من ذلك ، يمكنني استخدام الملفات المعينة للذاكرة. في هذه الحالة ، تقل المشكلة إلى معرفة ما إذا كانت الصفحة تم تبديلها على القرص أم لا. هل يمكن القيام بذلك في أي نظام تشغيل مشترك؟

تحرير: ورقة ذات صلة http://www.azulsystems.com/events/mspc_2008/2008_mspc.pdf

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

المحلول

يمكنك بالفعل استخدام طريقتك الثانية ، على الأقل على Linux. mmap() الملف ، ثم استخدم mincore() وظيفة لتحديد الصفحات المقيمة. من صفحة الرجل:

int mincore(void *addr, size_t length, unsigned char *vec);

mincore() إرجاع ناقل يشير إلى ما إذا كانت صفحات الذاكرة الافتراضية لعملية الاتصال مقيمة في Core (RAM) ، وبالتالي لن تتسبب في الوصول إلى القرص (خطأ في الصفحة) إذا تمت الإشارة إليه. يعيد kernel معلومات الإقامة حول الصفحات التي تبدأ من العنوان addrوالاستمرار ل length بايت.

هناك بالطبع حالة سباق هنا - mincore() يمكن أن أخبرك أن صفحة مقيمة ، ولكن قد يتم تبديلها قبل الوصول إليها مباشرة. هذه هي الحياة.

نصائح أخرى

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

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

حاول التعامل مع هذا بطريقة مختلفة. قبل الاتصال بـ read () للحصول على المعلومات لك بحاجة إلى, ، مكالمة FADVISE () لإعلام نظام التشغيل بما أنت يريد لبدء التحميل ..

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

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

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

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

ما هي API التي يمكنني استخدامها لمعرفة ما هو موجود في ذاكرة التخزين المؤقت؟

من المؤكد أنه لا توجد طريقة قياسية للقيام بذلك لأي نظام Posix ، وأنا لست على دراية بأي طريقة غير قياسية خاصة بـ Linux. الشيء الوحيد الذي يمكنك معرفته (تقريبًا) بالتأكيد هو أن نظام الملفات سيقرأ في مضاعف حجم الصفحة ، عادة 4 كيلو بايت. لذلك ، إذا كانت قراءاتك صغيرة ، فيمكنك معرفة احتمال كبير (على الرغم من أنه ليس بالتأكيد) أن البيانات الموجودة في الصفحة المحيطة بها في الذاكرة.

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

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

أخيرًا ، أنا الثاني @اقتراح Karmastan: اشرح النهاية الأوسع التي تحاول تحقيقها. من المحتمل أن يكون هناك طريقة للقيام بذلك ، لكن الطريقة التي اقترحتها ليست كذلك.

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