سؤال

بعد قراءة الاختبار والإعداد دخول ويكيبيديا, ، ما زلت أتساءل "ما الذي يمكن استخدامه للاختبار والإعداد؟"

أدرك أنه يمكنك استخدامه لتنفيذ Mutex (كما هو موضح في ويكيبيديا)، ولكن ما هي الاستخدامات الأخرى التي يتمتع بها؟

هل كانت مفيدة؟

المحلول

يمكنك استخدامه في أي وقت تريد فيه كتابة البيانات إلى الذاكرة بعد القيام ببعض الأعمال والتأكد من عدم قيام مؤشر ترابط آخر بالكتابة فوق الوجهة منذ أن بدأت.الكثير من خوارزميات القفل/الخالية من كائن المزامنة (mutex). خذ هذا النموذج.

نصائح أخرى

وخير مثال على ذلك هو "الزيادة".

قل تنفيذ خيطين a = a + 1.يقول a يبدأ بالقيمة 100.إذا كان كلا الخيطين يعملان في نفس الوقت (متعدد النواة)، فسيتم تحميل كلاهما a مثل 100, ، زيادة إلى 101, ، وقم بتخزين ذلك مرة أخرى a.خطأ!

مع الاختبار والضبط، أنت تقول "Set a ل 101, ، ولكن فقط إذا كانت لها القيمة حاليًا 100"." في هذه الحالة، سوف يجتاز أحد الخيوط هذا الاختبار ولكن الآخر سيفشل.في حالة الفشل، يمكن للخيط إعادة محاولة العبارة بأكملها، مع التحميل هذه المرة a مثل 101.نجاح.

يعد هذا بشكل عام أسرع من استخدام كائن المزامنة للأسباب التالية:

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

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

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

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

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

في الأساس، يتم استخدامه خصيصًا لكائنات المزامنة، نظرًا للأهمية الهائلة للذرية.هذا كل شيء.

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

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

أما بالنسبة للاستخدامات العملية، فآخر مرة رأيتها كانت في تطبيقات قوائم الانتظار المتزامنة (قوائم الانتظار التي قد يتم دفعها/فضحها بواسطة سلاسل رسائل متعددة دون الحاجة إلى إشارات أو كائنات مزامنة).

لماذا تستخدم TestAndSet بدلاً من كائن المزامنة (mutex)؟لأنه يتطلب عمومًا حملًا أقل من كائن المزامنة (mutex).عندما يتطلب كائن المزامنة تدخل نظام التشغيل، يمكن تنفيذ TestAndSet كتعليمات ذرية واحدة على وحدة المعالجة المركزية.عند التشغيل في بيئات متوازية تحتوي على مئات من سلاسل العمليات، يمكن أن يتسبب كائن المزامنة (mutex) واحد في قسم مهم من التعليمات البرمجية في حدوث اختناقات خطيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top