كتابة مخصص للذاكرة
مقتطف لتخصيص الذاكرة في ج
مخصصات الذاكرة 101 - اكتب تخصيص ذاكرة بسيطة
void * malloc ( size_t size );
void free ( void * ptr );
Block * merge_blocks ( Block * block );
// the above three will be implemented first later calloc and realloc حدد بنية البيانات : ستحتاج إلى بنية بيانات لتتبع حجم وحالة تخصيص كل كتلة. يمكن أن يكون هذا هيكلًا بسيطًا مع الحجم والعلم الذي يشير إلى ما إذا كانت الكتلة مجانية أم لا.
تهيئة الكومة : عندما يبدأ البرنامج ، ستحتاج إلى تخصيص جزء كبير من الذاكرة ليكون بمثابة كومة. يمكن القيام بذلك باستخدام استدعاء نظام mmap() .
تنفيذ malloc() : يجب أن تجد هذه الوظيفة كتلة مجانية كبيرة بما يكفي لتلبية الطلب. إذا لم يكن هناك مثل هذا الكتلة ، فيجب أن تزيد من حجم الكومة. بمجرد العثور على كتلة مناسبة ، يجب تمييزها كما تم تخصيصها وإعادة عنوانها.
تنفيذ free() : يجب أن تأخذ هذه الوظيفة مؤشرًا إلى كتلة من الذاكرة ، وتمييزها على أنها مجانية ، وربما تقلل من حجم الكومة إذا كانت الكتلة المحررة في النهاية.
تنفيذ realloc() : يجب أن تقوم هذه الوظيفة بتغيير حجم الكتلة المخصصة. قد يتضمن ذلك العثور على كتلة جديدة ونسخ البيانات القديمة.
معالجة تجزئة : بمرور الوقت ، يمكن أن تصبح الكومة مجزأة بكتل مجانية منتشرة طوال الوقت. قد ترغب في تنفيذ استراتيجية لتحمل الكومة ، مثل الكتل المجاورة المجاورة.
في سياق مخصص كومة ، تشير "الكتل" إلى قطع الذاكرة داخل الكومة. إليك سبب حاجتك لهم وكيف تعمل:
لماذا الكتل؟ : عندما تدير الذاكرة ، من المفيد تقسيمها إلى أجزاء يمكن التحكم فيها ، أو "الكتل". يمكن تخصيص كل كتلة وتعاملها بشكل مستقل. يسمح هذا باستخدام ذاكرة فعال ، حيث يمكنك تخصيص الذاكرة تمامًا كما تحتاج ، لا أكثر ولا أقل.
بنية الكتلة : تحتوي كل كتلة عادةً على بيانات تعريف حول الكتلة (مثل حجمها وما إذا كانت مجانية أو مخصصة) والبيانات الفعلية المخزنة في الكتلة. يتم استخدام البيانات الوصفية من قبل المخصص لإدارة الذاكرة.
التخصيص : عند الاتصال malloc() ، يبحث المخصص عن كتلة مجانية كبيرة بما يكفي للاحتفاظ بالمبلغ المطلوب من البيانات. إذا وجدت واحدة ، فإنه يمثل حظرًا كما تم تخصيصه ويعيد مؤشرًا إلى جزء البيانات من الكتلة.
Tearlocation : عند الاتصال بـ free() ، يمثل المخصص الكتلة مجانًا ، مما يجعله متاحًا للتخصيصات المستقبلية. إذا كانت الكتلة المحررة في نهاية الكومة ، فقد يقلل المخصص أيضًا من حجم الكومة لتحرير الذاكرة.
التجزئة : بمرور الوقت ، حيث يتم تخصيص الكتل وإسقاطها ، يمكن أن تصبح الكومة مجزأة. هذا يعني أن الذاكرة الحرة مقسمة إلى كتل صغيرة غير ضارة. قد يجعل هذا من الصعب العثور على كتلة كبيرة بما يكفي لمكالمة malloc() ، حتى لو كانت هناك ذاكرة مجانية كافية. للتعامل مع هذا ، غالبًا ما يتضمن المخصصون منطقًا لتحمل الكومة ، مثل الكتل المجاورة المجاورة.