مؤشر الخطر

تُعدّ مؤشرات المخاطر ، في بيئة الحوسبة متعددة الخيوط ، أحد أساليب حلّ المشكلات التي تُطرحها إدارة الذاكرة الديناميكية للعُقد في بنية بيانات غير مُؤمّنة . وتظهر هذه المشكلات عادةً في البيئات التي لا تحتوي على نظام جمع البيانات المهملة التلقائي . [ 1 ] ورغم أنها نوع من أنواع المؤشرات ، إلا أنها ليست مؤشرات ذكية .

أي بنية بيانات غير مقفلة تستخدم عملية المقارنة والتبديل يجب أن تعالج مشكلة ABA . على سبيل المثال، في مكدس غير مقفل ممثل بقائمة مرتبطة متطفلة، قد يحاول أحد الخيوط إزالة عنصر من مقدمة المكدس ( A→→ ). يتذكر قيمة العنصر الثاني من الأعلى ، ثم ينفذ عملية المقارنة والتبديل . لسوء الحظ، في منتصف هذه العملية، قد يكون خيط آخر قد نفذ عمليتي إزالة ثم أعاد العنصر إلى الأعلى، مما أدى إلى المكدس ( B→ ). تنجح عملية المقارنة والتبديل في تبديل العنصر مع العنصر الأول، والنتيجة هي أن المكدس يحتوي الآن على بيانات غير صالحة (مؤشر إلى العنصر الذي تم تحريره ).CBhead.compareAndSwap(B,A)AACheadBB

علاوة على ذلك، أي خوارزمية خالية من الأقفال تحتوي على رمز من الشكل

Node current = x.head (); // افترض أن عملية التحميل من " x.head () " ذرية Node next = current.next ( ); // افترض أن عملية التحميل هذه ذرية أيضًا

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

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

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

أندريه ألكسندرسكو وماجد مايكل، هياكل البيانات الخالية من القفل مع مؤشرات المخاطر [ 2 ]

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

في عام 2002، قدم ماجد مايكل من شركة IBM طلبًا للحصول على براءة اختراع أمريكية لتقنية مؤشر الخطر، [ 3 ] ولكن تم التخلي عن الطلب في عام 2010.

تشمل البدائل لمؤشرات المخاطر عد المراجع . [ 1 ]

أُضيفت مؤشرات المخاطر إلى C++26، وهي std::hazard_pointerعبارة عن مؤشر أحادي الكتابة ومتعدد القراءة، يمكن أن يمتلكه خيط واحد على الأكثر في أي وقت، في ملف الرأس <hazard_pointer>، وذلك لدعم تعدد الخيوط في مكتبة C++ القياسية . لكي يكون الصنف قابلاً للحماية من المخاطر، يجب أن يرث صنفًا يُسمى std::hazard_ptr_obj_base<T, Del>(حيث يكون مُعامل القالبDel افتراضيًا std::default_delete<T>). [ 4 ]

انظر أيضاً

مراجع

  1. 1 2 3 أنتوني ويليامز. التزامن في لغة C++: تعدد الخيوط العملي. مانينغ: شيلتر آيلاند، 2012. انظر تحديدًا الفصل 7.2، "أمثلة على هياكل البيانات الخالية من الأقفال".
  2. 1 2 أندريه ألكسندرسكو وماجد مايكل (2004). "هياكل بيانات خالية من الأقفال مع مؤشرات المخاطر" . دكتور دوبز . مؤرشف من الأصل في 19 يوليو 2019. تم الاسترجاع في 1 أبريل 2014 .(مقال موجه للغة C++)
  3. ↑ طلب براءة اختراع أمريكي رقم 20040107227، ماجد م. مايكل، "طريقة للتنفيذ الفعال لهياكل البيانات الديناميكية الخالية من الأقفال مع استعادة آمنة للذاكرة". تم تقديمه في 3 ديسمبر 2002. 
  4. "رأس المكتبة القياسية <hazard_pointer>" . cppreference.com . cppreference . تم الاطلاع عليه في 7 نوفمبر 2025 .
  • ماجد مايكل (2004). "مؤشرات المخاطر: استعادة آمنة للذاكرة للكائنات غير المقفلة" (ملف PDF) . معاملات IEEE للأنظمة المتوازية والموزعة . 15 (8): 491-504 . CiteSeerX 10.1.1.130.8984 . doi : 10.1109/TPDS.2004.8 . S2CID 8373852. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 4 نوفمبر 2017.