كيف تتم إدارة ذكريات الكومة والمكدس وتنفيذها وتخصيصها [نسخة مكررة]

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

سؤال

التكرارات المحتملة:
كيف تتم إدارة وتنفيذ وتخصيص ذكريات الكومة والمكدس؟
المكدس والثابت والكومة في C++

في C/C++ يمكننا تخزين المتغيرات والوظائف ووظائف الأعضاء ومثيلات الفئة إما على مكدس أو كومة.

كيف يتم تنفيذ كل منها؟كيف تتم إدارتها (المستوى العالي)؟هل يقوم gcc بتخصيص جزء من الذاكرة مسبقًا لاستخدامه في المكدس والكومة، ثم يتم توزيعه عند الطلب؟هل الذاكرة الأصلية تأتي من RAM؟

هل يمكن تخصيص وظيفة على الكومة بدلاً من المكدس؟

             --Clarification--

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

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

المحلول

أعتقد أنه يمكن للمرء بسهولة كتابة بعض الفصول على الأقل لكتاب أنظمة التشغيل بالنسبة لسؤالك.أنصحك بقراءة تانينباوم:أنظمة التشغيل الحديثة.

الفرق الرئيسي بين الكومة والمكدس هو أن أحدهما لكل عنصر عملية والآخر لكل عنصر مؤشر ترابط.في البداية، عند بدء تشغيل البرنامج، فإنه يحصل على الحد الأدنى من الكومة وبعض أجزاء المكدس.تمت زيادة الكومة، والمكدس ثابت (لكل مؤشر ترابط).إذا كتبت دالة متكررة لا تنتهي (العودة التي لا نهاية لها) فسوف تحصل على تجاوز سعة المكدس؛) أي استدعاء دالة يحتوي على إطار مكدس على مقطع المكدس، عندما تغادر الوظيفة، يتم فك المكدس ويكون الإطار مجانيًا للاستخدام بواسطة الوظيفة التالية.المكدس هو هيكل خطي مستمر.في Linux، يمكنك تكوين حجم مقطع المكدس لعملية ما عبر متغير البيئة.في نظام التشغيل windows (على الأقل مع MS Visual C++) يمكنك تمرير علامة رابط بحجم مقطع المكدس.يمكن أيضًا إنتاج تجاوزات المكدس عند تخصيص بعض المصفوفات الكبيرة في وقت الترجمة:

char test[1000000];

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

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

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

يعتبر،
أوفانيس

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