سؤال كيف تزيد الذاكرة الظاهرية فعليًا من مساحة الذاكرة؟


أفهم أن الذاكرة الظاهرية تنطلي على البرنامج من خلال عرض ذاكرة أكثر مما هو متاح بالفعل.

ولكن في النهاية يجب أن تقوم بتعيين العنوان المنطقي للعنوان الفعلي الفعلي. الآن كيف هو زيادة الذاكرة؟


68
2018-01-10 07:34


الأصل


هذا هو المفهوم القديم. كان الدافع الأصلي للذاكرة الظاهرية هو شكل من أشكال إدارة الذاكرة لتوفير مساحة عنوان أكبر من الذاكرة الفعلية. لكن ذلك كان عندما كانت الذاكرة منخفضة الكثافة ومكلفة للغاية. في الوقت الحاضر ، السبب الرئيسي لاستخدام الذاكرة الظاهرية هو أمان العملية. - sawdust
"الآن كيف هو زيادة الذاكرة؟". لا. التطبيق ليس على دراية بالذاكرة الفعلية للنظام إلا أنه على دراية بالذاكرة الظاهرية وهذا هو السبب الذي يجعل التطبيق يشتكي من عدم وجود ذاكرة كافية يتحدث عن الذاكرة الظاهرية وليس الذاكرة الفعلية - Ramhound
ضع في اعتبارك أن أنظمة الذاكرة الظاهرية ذكية إلى حد كبير. إذا كانت العمليات n لها نفس الصفحة للقراءة فقط ، يمكن لجميع العمليات n استخدام نفس الصفحة الواحدة من الذاكرة الفعلية. - Eric Lippert
لا تفكر في الذاكرة الظاهرية ممازحة اى شى. الذاكرة هي القدرة المجردة على تخزين واسترجاع البيانات. توفر الذاكرة الظاهرية تطبيقًا لذلك التجريد. أن جزءًا من هذا التجريد مدعومًا بذاكرة الوصول العشوائي وبعضها مدعوم بالقرص هو عبارة عن تفاصيل تنفيذ للتجريد. - Eric Lippert
لا أعرف كيف تكون الذاكرة "دائمًا" على القرص ... بصرف النظر عن الصفحات التي تمت قراءتها في الأصل من القرص ، ما لم يتم استبدال الصفحة بمحتوياتها أبدا يكون على القرص ، وهذا ينطبق بشكل خاص على الصفحات التي يتم تثبيتها في الذاكرة على سبيل المثال. نظرا لكونها حاسمة لوظائف النواة. - Michael


الأجوبة:


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

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

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

يتم إنشاء مساحة الذاكرة الظاهرية لتطبيق ما حسب الحاجة. يبدو أن أحد التطبيقات (لنفسه) موجود في كتلة واحدة متجاورة من الذاكرة ، ولكن يمكن أن يكون مبعثرًا بالكامل عبر الذاكرة الفعلية.

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

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

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

يتم تمكين ملف المبادلة بواسطة أنظمة الذاكرة الظاهرية ، ولكن في الماضي كان مرتبكًا يجرى الذاكرة الظاهرية.


116
2018-01-10 07:56



التعليقات ليست للمناقشة الموسعة. كانت هذه المحادثة انتقل إلى الدردشة. - Sathya♦


شرح العلماني

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

جوانب أكثر تعقيدًا

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

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


21
2018-01-10 12:55



من المحزن أننا نعيش في عالم حيث تتطلب كل علامة تبويب المتصفح 1 غيغابايت من الذاكرة - tbodt
tbodt ألوم المصريين القدماء. فقط إذا عرفوا ما كانوا يفعلون من خلال تدجين تلك القطط المزعجة! - Dmitry Grigoryev
tbodt إنه شيء من المبالغة أيضًا. المتصفح الخاص بي مع 8 علامات تبويب مفتوحة لا يستغرق سوى 500 ميغابايت من الذاكرة. - Random832
@ Random832 متأكد من أنها مبالغة ، على الرغم من أنني لست متأكدا من الخط الفاصل بين المبالغة وكونه مستقبلا. كان جهاز الكمبيوتر الخاص بي الأول 32 ميغابايت من ذاكرة الوصول العشوائي ويمكن بسهولة فتح 8 علامات التبويب في الأوبرا دون مبادلة ملحوظة. الآن يأخذ 500MB ، لذلك في 20 سنة أخرى قد تصل إلى 8GB. - Dmitry Grigoryev


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


5
2018-01-10 16:14





أفهم أن الذاكرة الظاهرية تنطلي على البرنامج من خلال عرض ذاكرة أكثر مما هو متاح بالفعل.

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

ولكن في النهاية يجب أن تقوم بتعيين العنوان المنطقي للعنوان الفعلي الفعلي. الآن كيف هو زيادة الذاكرة؟

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

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

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

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


4
2018-01-10 21:10





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

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

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

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

if data is not in memory
    read data from disk into memory
operate on data

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

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

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

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


3
2018-01-10 20:01





يفعل ذلك عن طريق جعل مداخل الخريطة مؤقتة.

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

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

(هذا أبعد ما يكون عن وصف شامل ، فهو يهدف إلى الإجابة على السؤال الفوري دون الدخول في تفاصيل ذات صلة ولكن غير ضرورية).


2
2018-01-11 20:16





يعتمد المفهوم الأساسي على حقيقة أن وحدة المعالجة المركزية الحديثة يمكنها إدارة جداول الترجمة مع تتبع "نطاقات العناوين التي تم تخصيص عملية معينة لاستخدامها ، وأي عناوين فعلية (فكر في A00..Axx في ناقل الذاكرة) ، إذا كان أي وتستخدم حاليا لتخزين البيانات بالفعل. "إذا كان أي" لأن "لا شيء على الإطلاق" هو ​​حالة ممكنة ومقبولة: في هذه الحالة ، سيتم رفع حالة خطأ (ما يسمى ب "خطأ الصفحة") على مستوى الأجهزة - وسيؤدي هذا الخطأ إلى تشغيل معالج على مستوى نظام التشغيل ، على سبيل المثال ، تحميل محتويات الذاكرة التي تمت كتابتها إلى ملف المبادلة مرة أخرى إلى أي موقع مجاني في الذاكرة الفعلية (في حالة القراءة) أو العثور على موقع فعلي لوضع الأشياء (في حالة كتابة) ، وتحديث جدول الترجمة المذكورة آنفا ، وثانية فقط التحكم اليد مرة أخرى إلى العملية التي حاولت الوصول إلى تلك الذاكرة .. والتي لن تكون أكثر حكمة لما حدث.


1
2018-01-10 10:48





ذاكرة افتراضية:

1) يسمح مساحة العنوان الظاهرية الكبيرة ليتم تعيينها إلى كمية أصغر من الذاكرة الفعلية ، مع "المبادلة" الزائدة إلى القرص ، أو SSD ، أو مستقبلي إلى NVRAM والأجهزة الأخرى.

2) يسمح بتخصيص مساحة العنوان الظاهرية الأكبر (مثل 64 بت) لمساحة العنوان الفعلية الأصغر (مثل 32 أو 64 بت)

3) يتيح مساحة عنوان افتراضية أصغر (مثل 32 بت) ليتم تعيينها إلى مساحة عنوان فيزيائية أكبر (مثل 40 بت) ، وبالتالي تسمح للتطبيقات القديمة بالاستفادة من المزيد من الدرهم الفيزيائي.

4) يسمح للذاكرة المادية التي تجزأنا وغير متجاورة في مساحة العنوان الفعلي ليتم تقديمه في مساحة العنوان الظاهرية.

5) تسمح للعمليات بإعطاء مساحات العنوان الافتراضية الخاصة بها ، وبالتالي يتم عزلها عن بعضها البعض.

6) يسمح للعناوين الافتراضية المختلفة التي تحدث لمشاركة نفس قيم البيانات لتخصيص صفحة مادية واحدة.

يمكن أن يحدث هذا داخل عملية واحدة أو نظام تشغيل - معظم أنظمة تشغيل UNIX المشتقة من BSD لها صفحة قراءة واحدة فقط من الأصفار ، يمكن تعيينها في أي صفحة افتراضية مملوءة صفرًا ، عادةً COW (نسخ على الكتابة - قراءة الأصفار فقط ، يكتب المحاصرين وصفحة غير منسقة وجعلها قابلة للكتابة).

يمكن أن يحدث بين العمليات - على سبيل المثال ينشئ UNIX fork () عمليات تابعة تشترك في كل الذاكرة الظاهرية تقريبًا بطريقة COW.

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

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


0
2018-01-17 05:26