وصف حالات السباق والمأزق

ملخص

.NET في Visual Basic أو Visual Basic 2005 يوفر القدرة على استخدام مؤشرات الترابط في تطبيقات Visual Basic لأول مرة. تقديم مؤشرات ترابط قضايا التصحيح مثل deadlocks وحاﻻت السباق. يتناول هذا المقال هاتين المسألتين.

مزيد من المعلومات

حالات السباق

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

تفاصيل والمثال

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

كيف يمكن أن أمر سطر واحد تتسبب حالة سباق؟ فحص المثال التالي لمعرفة كيفية حدوث حالة تعارض. هناك مؤشرات الترابط بين، وكلاهما يتم تحديث متغير مشترك يسمى الإجمالي (الذي يتم تمثيله ك dword ptr ds: [031B49DCh] في التعليمات البرمجية التجميع).

التعليمات البرمجية ل Visual Basic:
   'Thread 1   Total = Total + val1

   'Thread 2   Total = Total - val2

تجميع التعليمات البرمجية (بأرقام الأسطر) من التحويل البرمجي للتعليمات البرمجية ل Visual Basic السابقة:
 'Thread 1 1.   mov         eax,dword ptr ds:[031B49DCh] 
2. add eax,edi
3. jno 00000033
4. xor ecx,ecx
5. call 7611097F
6. mov dword ptr ds:[031B49DCh],eax

 'Thread 2 1.   mov         eax,dword ptr ds:[031B49DCh] 
2. sub eax,edi
3. jno 00000033
4. xor ecx,ecx
5. call 76110BE7
6. mov dword ptr ds:[031B49DCh],eax

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

كان إجمالي 100 و val1 هو 50 val2 هو 15. يحصل على فرصة لتنفيذ مؤشر ترابط 1 لكن فقط إكمال الخطوات من 1 إلى 3. وهذا يعني أن مؤشر ترابط 1 قراءة المتغير وإتمام الإضافة. ينتظر مؤشر الترابط 1 الآن فقط كتابة قيمة جديدة 150. بعد إيقاف مؤشر الترابط 1، مؤشر ترابط 2 يحصل على التنفيذ الكامل. وهذا يعني أنه قد مكتوب القيمة التي حسبت (85) الخروج لمجموعة المتغير. وأخيراً، مؤشر ترابط 1 تستعيد عنصر التحكم وانتهاء التنفيذ. كان يكتب ما قيمته (150). لذلك، عند الانتهاء من مؤشر ترابط 1 قيمة إجمالي الآن 150 بدلاً من 85.


يمكنك أن ترى كيف يمكن أن يكون هذا مشكلة رئيسية. إذا كان برنامج البنك، سيكون العميل الأموال في الحساب التي يجب أن لا تكون موجودة.


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


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

الأعراض

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


حالات التوقف التام

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

تفاصيل والمثال

التعليمة البرمجية التالية على كائنين ليفتفال ورايتفال:

'Thread 1SyncLock LeftVal
SyncLock RightVal
'Perform operations on LeftVal and RightVal that require read and write.
End SyncLock
End SyncLock

'Thread 2SyncLock RightVal
SyncLock LeftVal
'Perform operations on RightVal and LeftVal that require read and write.
End SyncLock
End SyncLock

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


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


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

الأعراض

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

ما هو مؤشر ترابط؟

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

المراجع

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

معلومات 316422 : خريطة طريق لمؤشر الترابط في Visual Basic.NET
لمزيد من المعلومات، راجع موقع MSDN على ويب:
خصائص

رقم الموضوع: 317723 - آخر مراجعة: 19‏/01‏/2017 - المراجعة: 1

تعليقات