إدارة ذاكرة بايثون

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



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

الذاكرة كتاب فارغ


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

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

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

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

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

إدارة الذاكرة: الطريق من الحديد إلى البرامج


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

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

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

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

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

تنفيذ بايثون المرجعي


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

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

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

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

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

هل سبق لك أن رأيت الملفات ذات الامتداد __pycache__ أو مجلد __pycache__ ؟ أنها تحتوي على نفس الرمز الفرعي الذي يتم تفسيره بواسطة الجهاز الظاهري.

من المهم الإشارة إلى أنه إلى جانب CPython ، هناك تطبيقات أخرى لـ Python. على سبيل المثال ، عند استخدام IronPython ، يتم تصنيف رمز Python في بيان Microsoft CLR. في Jython ، يتم تجميع الكود في Java bytecode ويتم تنفيذه في جهاز Java الظاهري. في عالم Python ، يوجد شيء مثل PyPy ، لكن الأمر يستحق مقالة منفصلة ، لذلك نذكرها هنا.

لغرض هذه المقالة ، سأركز على كيفية عمل آليات إدارة الذاكرة في تنفيذ مرجع Python - CPython.

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

لذا ، فإن حزمة برنامج CPython مكتوبة بلغة C ، وهي تفسر Python bytecode. ما علاقة هذا بإدارة الذاكرة؟ الحقيقة هي أن الخوارزميات وهياكل البيانات المستخدمة لإدارة الذاكرة موجودة في رمز CPython المكتوب ، كما قيل بالفعل ، في C. من أجل فهم كيف تعمل إدارة الذاكرة في Python ، تحتاج أولاً إلى فهم القليل عن CPython.

اللغة C التي يتم فيها كتابة CPython لا تحتوي على دعم مضمن للبرمجة الموجهة للكائنات. لهذا السبب ، يتم استخدام الكثير من الحلول المعمارية المثيرة للاهتمام في كود CPython.

ربما تكون قد سمعت أن كل شيء في Python هو كائن ، وحتى أنواع البيانات البدائية مثل int و str . وهذا هو الحال بالفعل على مستوى تنفيذ اللغة في CPython. هناك بنية تسمى PyObject ، والتي يتم استخدامها من قبل الكائنات التي تم إنشاؤها في CPython.

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

PyObject هو سلف كل كائنات Python. يحتوي هذا الهيكل على حقلين فقط:

  • ob_refcnt - عداد المرجع.
  • ob_type - مؤشر إلى نوع آخر.

يستخدم عداد المرجع لتنفيذ آلية جمع القمامة. حقل PyObject آخر هو مؤشر لنوع معين من الكائنات. يتم تمثيل هذا النوع بهيكل آخر يصف كائن Python (على سبيل المثال ، يمكن أن يكون dict أو int ).

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

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

مترجم غلوبال لوك


Global Interpreter Lock (GIL) هو حل لمشكلة شائعة تحدث عند العمل مع موارد الكمبيوتر المشتركة مثل الذاكرة. عندما يحاول مؤشر ترابط اثنين لتعديل نفس المورد في وقت واحد ، يمكنهم "الاصطدام" مع بعضها البعض. ستكون النتيجة حالة من الفوضى ولن يحقق أي من التدفقات ما يسعى إلى تحقيقه.

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

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

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

آلية GIL في بيثون تحقق ذلك عن طريق منع المترجم بأكمله. نتيجة لذلك ، لا شيء يمكن أن يتداخل مع تشغيل الخيط الحالي. وعندما يعمل CPython مع الذاكرة ، فإنه يستخدم GIL للتأكد من أن هذا العمل يتم بأمان وكفاءة.

هناك نقاط القوة والضعف في هذا النهج ، وجيل هو موضوع نقاش عنيف في مجتمع بيثون. لمعرفة المزيد عن GIL ، يمكنك إلقاء نظرة على هذه المواد .

جمع القمامة


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

يمكن مقارنة هذه الحكايات القديمة المنسية بأشياء بيثون التي تكون أعدادها المرجعية صفراً. هذه هي نفس العدادات التي تحدثنا عنها عند مناقشة بنية PyObject .

يتم زيادة عداد الارتباط لعدة أسباب. على سبيل المثال ، يتم زيادة العداد إذا تمت كتابة الكائن المخزن في متغير واحد إلى متغير آخر:

 numbers = [1, 2, 3] #   = 1 more_numbers = numbers #   = 2 

يزداد عندما يتم تمرير الكائن إلى بعض الدالة كوسيطة:

 total = sum(numbers) 

وهنا مثال آخر على الموقف الذي يزيد فيه الرقم في العداد المرجعي. يحدث هذا إذا تم تضمين الكائن في القائمة:

 matrix = [numbers, numbers, numbers] 

يسمح Python للمبرمج باكتشاف القيمة الحالية للعدد المرجعي لكائن معين باستخدام وحدة sys . لهذا ، يتم استخدام البناء التالي:

 sys.getrefcount(numbers) 

getfefcount() ، يجب أن تتذكر أن تمرير كائن إلى أسلوب getfefcount() يزيد من قيمة العداد بمقدار 1.

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

نحن الآن نسأل أنفسنا أسئلة حول ماهية "تحرير الذاكرة" وعن كيفية استخدام الكائنات الأخرى لهذه الذاكرة. للإجابة على هذه الأسئلة ، دعونا نتحدث عن آليات إدارة الذاكرة في CPython.

آليات إدارة الذاكرة في CPython


الآن سنتحدث عن كيفية احتفاظ CPython بهيكل للذاكرة وكيف تتم إدارة الذاكرة هناك.

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

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


مجالات الذاكرة المستخدمة من قبل CPython

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

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

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

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

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

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


الساحات والبرك والكتل

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

جميع الكتل في نفس التجمع تنتمي إلى نفس فئة الحجم. تحدد فئة الحجم التي ينتمي إليها الكتلة حجم هذه الكتلة ، والتي يتم تحديدها مع مراعاة حجم الذاكرة المطلوب. فيما يلي جدول مأخوذ من التعليمات البرمجية المصدر يوضح مقدار البيانات التي يطلبها النظام لتخزينها في الذاكرة ، وأحجام الكتل المخصصة ، ومعرفات فئات الحجم.
مقدار البيانات بالبايت
حجم الكتلة
حجم الطبقة idx
1-8
8
0
9-16
16
1
17-24
24
2
25- 32
32
3
33-40
40
4
41- 48
48
5
49-56
56
6
57-64
64
7
65-72
72
8
...
...
...
497-504
504
62
505-512
512
63

على سبيل المثال ، إذا طُلب تخزين 42 بايت ، سيتم وضع البيانات في كتلة 48 بايت.

حمامات


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

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

يجب أن تكون المجمعات نفسها في واحدة من ثلاث ولايات. وهي ، يمكن استخدامها (الحالة used ) ، ويمكن ملؤها ( full ) أو فارغة ( empty ). يحتوي التجمع المستخدم على كتل مجانية يمكن من خلالها حفظ البيانات ذات الحجم المناسب. يتم تخصيص كل كتل التجمع المعبأ للبيانات. لا يحتوي التجمع الفارغ على بيانات ، وإذا لزم الأمر ، يمكن تعيينه لتخزين الكتل التي تنتمي إلى أي فئة حجم.

قائمة freepools بتخزين معلومات حول كافة تجمعات الموجودة في حالة empty . على سبيل المثال ، إذا لم تكن هناك إدخالات في قائمة usedpools حول تجمعات تخزين كتل 8 بايت (الفئة ذات idx 0) ، فسيتم تهيئة تجمع جديد ، وهو في الحالة empty ، مصمم لتخزين هذه الكتل. تتم إضافة هذا التجمع الجديد إلى قائمة usedpools ، ويمكن استخدامه لتلبية طلبات حفظ البيانات المستلمة بعد إنشائه.

افترض أنه في تجمع في حالة full ، يتم تحرير بعض الكتل. هذا يرجع إلى حقيقة أن البيانات المخزنة فيها لم تعد هناك حاجة. سيكون هذا التجمع مرة أخرى في قائمة usedpools ويمكن استخدامه للبيانات من فئة حجم المقابلة.

تتيح لنا معرفة هذه الخوارزمية أن نفهم كيف تتغير حالة التجمعات أثناء العملية (وكيف تتغير فئات الحجم ، ويمكن تخزين الكتل التي تنتمي إليها).

كتل



حمامات مستعملة وكاملة وفارغة

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

هذا يعني أن التجمعات يمكن أن تحتوي على كتل موجودة في واحدة من ثلاث حالات:

  • untouched هو جزء الذاكرة الذي لم يتم تخصيصه بعد.
  • free - جزء الذاكرة الذي تم تخصيصه بالفعل ، ولكن في وقت لاحق أصبح "مجانيًا" بواسطة CPython ولم يعد يحتوي على أي بيانات قيمة.
  • allocated هو جزء الذاكرة الذي يحتوي على بيانات قيمة.

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

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


قائمة freeblock واحدة مرتبطة

الساحات


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

يتم تنظيم الساحات في قائمة مرتبطة مضاعفة تسمى usable_arenas . يتم فرز هذه القائمة حسب عدد حمامات السباحة المجانية المتاحة. تجمعات أقل حرية في الساحة ، وأقرب الساحة إلى أعلى القائمة.


قائمة قابلة للاستعمال

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

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

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

ملخص


إليك ما تعلمته من خلال قراءة هذه المادة:

  • ما هي إدارة الذاكرة ولماذا هو مهم.
  • كيف يتم ترتيب تنفيذ مرجع بيثون ، Cpython ، مكتوبة في لغة البرمجة C.
  • ما هي هياكل البيانات والخوارزميات المستخدمة في CPython لإدارة الذاكرة.

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

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

Source: https://habr.com/ru/post/ar441568/


All Articles