خوارزمية تشيني (Cheney’s Algorithm)

<![CDATA[

مقدمة إلى جمع البيانات المهملة

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

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

مبدأ عمل خوارزمية تشيني

خوارزمية تشيني هي نوع من خوارزميات جمع البيانات المهملة “إيقاف ونسخ”، والتي تعمل عن طريق تقسيم الذاكرة إلى قسمين متساويين: قسم “من” (from-space) وقسم “إلى” (to-space). في بداية عملية جمع البيانات المهملة، يكون قسم “من” هو الذاكرة النشطة التي يستخدمها البرنامج، بينما يكون قسم “إلى” فارغًا. تقوم الخوارزمية بنسخ جميع الكائنات “الحية” (أي الكائنات التي لا يزال البرنامج يشير إليها) من قسم “من” إلى قسم “إلى”. بمجرد اكتمال النسخ، يصبح قسم “إلى” هو الذاكرة النشطة، ويتم قلب الأدوار بين القسمين، ليصبح قسم “من” فارغًا ومتاحًا لعملية جمع البيانات المهملة التالية.

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

خطوات خوارزمية تشيني بالتفصيل

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

مثال توضيحي

لتوضيح كيفية عمل خوارزمية تشيني، لنفترض أن لدينا هيكل بيانات بسيط يتكون من ثلاثة كائنات: A و B و C. يشير الكائن A إلى الكائن B، ويشير الكائن B إلى الكائن C. في البداية، توجد جميع هذه الكائنات في قسم “من”.

تبدأ الخوارزمية بنسخ الكائن A (الجذر) إلى قسم “إلى”. ثم يتم تحديث المؤشر الموجود في الجذر ليشير إلى النسخة الجديدة من الكائن A في قسم “إلى”. بعد ذلك، يتم مسح الكائن A الذي تم نسخه حديثًا، ويتم العثور على المؤشر الذي يشير إلى الكائن B في قسم “من”. يتم نسخ الكائن B أيضًا إلى قسم “إلى”، ويتم تحديث المؤشر الموجود في الكائن A ليشير إلى النسخة الجديدة من الكائن B في قسم “إلى”. يتم تكرار هذه العملية للكائن C، حتى يتم نسخ جميع الكائنات الحية إلى قسم “إلى”.

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

مزايا وعيوب خوارزمية تشيني

تتميز خوارزمية تشيني بعدة مزايا، بما في ذلك:

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

ومع ذلك، فإن لخوارزمية تشيني أيضًا بعض العيوب، بما في ذلك:

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

تحسينات على خوارزمية تشيني

على مر السنين، تم تطوير العديد من التحسينات على خوارزمية تشيني للتغلب على بعض عيوبها. تتضمن بعض هذه التحسينات ما يلي:

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

تطبيقات خوارزمية تشيني

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

  • لغات البرمجة: تستخدم العديد من لغات البرمجة، مثل Java و C#، خوارزمية تشيني أو أحد مشتقاتها لجمع البيانات المهملة تلقائيًا.
  • آلات جافا الافتراضية (JVM): تستخدم JVM خوارزميات جمع البيانات المهملة المعتمدة على خوارزمية تشيني لإدارة الذاكرة بكفاءة.
  • أنظمة التشغيل: تستخدم بعض أنظمة التشغيل خوارزمية تشيني لإدارة الذاكرة في النواة.

خاتمة

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

المراجع

]]>