جمع القمامة (حاسوب)

من ويكيبيديا، الموسوعة الحرة
(بالتحويل من جمع القمامة)
اذهب إلى: تصفح، ‏ ابحث

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

نبذة تاريخية[عدل]

يعود اختراع جامع النفايات للعالم الأميريكي جون مكارثي عام 1959 من أجل حل مشاكل تنظيم الذاكرة اليدوي (manual memory management) التي كان يواجهها أثناء استخدام لغة ليسب.

الفكرة[عدل]

الفكرة التي يقوم عليها عمل أي برنامج جامع للنفايات هي :

  1. تحديد الأجزاء من البرامج التي لن يتم استخدامها في المستقبل
  2. استعادة الموارد التي كانت تستخدمها هذه الأجزاء (المساحة التخزينية وغيرها).

الكثير من لغات البرمجة تتطلب وجود ال Garbage collection

هناك لغات تحتوي على Garbage collection في تكوينها الأصلي مثل سي شارب وجافا.

و لغات أخرى لا تحتوي على Garbage collection في تكوينها الأصلي ولكن تعمل عمل تطبيق لل Garbage collection خارجي منفصل عنها مثل سي وسي++.

مبادئ[عدل]

قالب:More references

المبادئ الأساسية لجمع النفايات هي:

  • البحث عن مكونات البيانات في التطبيق التي لا يمكن الوصول إليها في المستقبل.
  • استصلاح الموارد المستخدمة من قبل هذه مكونات.

العديد من لغات البرمجة تتطلب جمع القمامة، إما جزءا من مواصفات اللغة (على سبيل المثال، جافا، سى #، اللغة دى,[1] إنتقل وأكثر لغة البرمجة) أو بشكل فعال للتنفيذ العملي (على سبيل المثال، واللغات الرسمية مثل التفاضل والتكامل لامدا)؛ ويقال إن هذه لتكون القمامة اللغات التي تم جمعها . وقد صممت لغات أخرى للاستخدام مع إدارة الذاكرة اليدوية، ولكن لديها القمامة التي تم جمعها تطبيقات المتاحة (على سبيل المثال، سى، سى ++) بعض اللغات، مثل أدا، موديولا -3، و سى ++ / CLI تسمح للكل بجمع القمامة وإدارة الذاكرة اليدوية إلى التعايش في نفس التطبيق باستخدام أكوام منفصلة للكائنات التي تم جمعها وإدارتها يدويا. آخرون، مثل دى، هي القمامة التي تم جمعها ولكن تسمح للمستخدم لحذف مكونات البيانات وجمع القمامة أيضا والتعطيل تماما يدويا عند الحاجة للسرعة.

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

ايجابيات[عدل]

Garbage collection frees the programmer from manually dealing with memory deallocation. As a result, certain categories of bugs are eliminated or substantially reduced:

  • Dangling pointer bugs, which occur when a piece of memory is freed while there are still pointers to it, and one of those pointers is dereferenced. By then the memory may have been reassigned to another use, with unpredictable results.
  • Double free bugs, which occur when the program tries to free a region of memory that has already been freed, and perhaps already been allocated again.
  • Certain kinds of memory leaks, in which a program fails to free memory occupied by objects that have become unreachable, which can lead to memory exhaustion. (Garbage collection typically does not deal with the unbounded accumulation of data that is reachable, but that will actually not be used by the program.)
  • Efficient implementations of persistent data structures

Some of the bugs addressed by garbage collection can have security implications.

سلبيات[عدل]

Typically, garbage collection has certain disadvantages:

  • Garbage collection consumes computing resources in deciding which memory to free, even though the programmer may have already known this information. The penalty for the convenience of not annotating object lifetime manually in the source code is overhead, which can lead to decreased or uneven performance. Interaction with memory hierarchy effects can make this overhead intolerable in circumstances that are hard to predict or to detect in routine testing.
  • The moment when the garbage is actually collected can be unpredictable, resulting in stalls scattered throughout a session. Unpredictable stalls can be unacceptable in real-time environments, in transaction processing, or in interactive programs. Incremental, concurrent, and real-time garbage collectors address these problems, with varying trade-offs.
  • Non-deterministic GC is incompatible with RAII based management of non-GCed resources. As a result, the need for explicit manual resource management (release/close) for non-GCed resources becomes transitive to composition. That is: in a non-deterministic GC system, if a resource or a resource-like object requires manual resource management (release/close), and this object is used as 'part of' another object, then the composed object will also become a resource-like object that itself requires manual resource management (release/close).

الفوائد[عدل]

أزال ال Garbage collection عبئ التعامل المباشر مع الذاكرة من على كاهل المبرمج ; وبالتالي فقد ساعد في التخلص من المشاكل التي تنتج من التعامل المباشر مع الذاكرة مثل :

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

Tracing garbage collectors[عدل]

من أكثر أنواع ال garbage collectors شيوعا حيث تعتمد فكرتهم على تحديد الكائنات التي يمكن الوصول إليها عن طريق المؤشرات (pointers) ومن ثم اعتبار الكائنات الباقية (غير المشار إليها) كائنات غير مستخدمة ومن ثم إزالتها من الذاكرة.

يمكن اعتبار الكائن مشار إليه (reachable) عن طريق أمرين :

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

خوارزميات العمل[عدل]

  • التحديد والمسح (Mark and sweep) :

تعتمد هذه الفكرة على تخصيص بت واحد لكل كائن في الذاكرة يسمى (in use flag) يشير هذا البت إلى إذا كان هذا الكائن مشار إليه أم لا

قيمة هذا البت دائما صفر إلى أن يبدأ ال garbage collector عمله

يبدأ ال collector بفحص الكائنات المعروف أنه مشار إليها مسبقا ويقوم بجعل قيمة ال (in use flag) بواحد

و عن طريق هذه الكائنات يمكن الوصول للكائنات الأخرى التي تشير إليها وجعل قيمة ال (in use flag) بواحد أيضا

و عند الانتهاء من فحص جميع الكائنات في الذاكرة يمكن حذف الكائنات ذات ال (in use flag) قيمته صفر حيث أنه تم التأكد من أنها غير مشار إليها فعلا

عيوب هذه الخوارزمية أنها تعتمد على فحص كل جزء في الذاكرة مما قد يسبب بطئ الحاسب

  • التحديد ثلاثي الألوان :

في هذه الفكرة يتم اعتبار الكائنات في الذاكرة نقاط يشير بعضها لبعض ويتم (نظريا) تقسيم هذه النقاط إلى مجموعة من الآلوان (نقاط بيضاء، نقاط سوداء، نقاط رمادية)

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

في البداية يتم اعتبار جميع النقاط بيضاء ماعدا النقاط المعروف أنها مشار إليها مسبقا يكون لونها رمادي

يبدأ ال collector بالمتغيرات المشار إليها اصلا (الرمادية) يقوم بنقلها إلى المجموعة السوداء عن طريق فحص كل الكائنات التي تشير إليها ونقلها إلى المجموعة الرمادية (حيث أنها أصبحت مشار إليها) الآن أصبح كل النقاط المشار عن طريقة هذه النقطة إذن يمكن نقلها للمجموعة السوداء

يتم إعادة هذه العملية حتى يتم الانتهاء من كل المجموعة الرمادية فيتبقى المجموعة السوداء (جميعها مشار إليها) والمجموعه البيضاء (لا يوجد أحد يشير إليها) إذن يمكن حذفها الآن

ملاحظة : لا يمكن أن يوجد كائن من المجموعة السوداء يشير مباشرة إلى كائن في المجموعة البيضاء

يعتبر التحديد ثلاثي الألوان أكثر سرعة من طريقة التحديد والمسح

وصلات خارجية ومصادر[عدل]

Computer.svg هذه بذرة مقالة عن تعريف بالمصطلحات الحاسوبية من عتاد وبرمجيات وملحقات أخرى بحاجة للتوسيع. شارك في تحريرها.
  1. ^ "Overview - D Programming Language". dlang.org. Digital Mars. اطلع عليه بتاريخ 2014-07-29. "D memory allocation is fully garbage collected."