التوازي والمزامنة
-
29-09-2019 - |
سؤال
تخيل أنك تستخدم التوازي في نظام متعدد النواة.
أليس من الممكن تمامًا تنفيذ نفس التعليمات في وقت واحد؟
خذ الرمز التالي:
int i = 0;
if( blockingCondition )
{
lock( objLock )
{
i++;
}
}
في رأسي ، يبدو أنه من الممكن للغاية على نظام به نوى متعددة ومتوازية ، يمكن فحص شرط الانتقام في نفس اللحظة بالتحديد ، مما يؤدي إلى محاولة القفل في نفس اللحظة ، وهكذا ... هل هذا هو ... حقيقي؟
إذا كان الأمر كذلك ، كيف يمكنك ضمان التزامن عبر المعالجات؟
أيضا ، هل يعالج .NET TPL هذا النوع من التزامن؟ ماذا عن اللغات الأخرى؟
تعديليرجى ملاحظة أن هذا هو ليس حول المواضيع ، ولكن المهام والعملية المتوازية.
تحرير 2حسنًا ، شكرًا على المعلومات. فهل صحيح أن نظام التشغيل سيضمن أن الكتابة إلى الذاكرة متسلسلة ، مما يضمن التزامن متعدد النواة عبر القراءات المتطايرة؟
المحلول
قفل كما وصفته هنا هو "مراقب"قفل النمط على objlock. كما لاحظت ، من الممكن تمامًا ، ضمن نظام متعدد النواة ، لمكالمات" القفل "اثنين يبدأ الوقت ذاته. ومع ذلك ، فإن أي بيئة تطبيق عالية المستوى تستخدم الشاشات ستترجم الشاشة إلى إشارة الطلبات (أو ، اعتمادًا على نظام التشغيل وتفاصيل اللغة الخاصة بك ، طلبات Mutex) في رمز البايت المترجم.
يتم تنفيذ الإشارات الرمزية في نظام التشغيل و/أو مستوى الأجهزة ، وترتبط بها لغات المستوى الأعلى. على مستوى نظام التشغيل ، فإنهم "مضمونون" ليكونوا ذريين. وهذا يعني أن أي برنامج يكتسب رسالة إشارة إلى أن يكون الوحيد الذي يقوم بذلك في تلك المرحلة الزمنية. إذا حاول برنامجان ، أو خيوطان داخل البرنامج الحصول على القفل في نفس الوقت ، فسيذهب أحدهما أولاً (وينجح) ، والآخر سيذهب في المرتبة الثانية (ويفشل).
في هذه المرحلة ، توقف "كيف تضمن المزامنة" عن أن تكون مشكلة لمبرمج التطبيق للقلق ، ويبدأ في أن تكون مشكلة لمصمم نظام التشغيل ومصمم الأجهزة.
إن زيادة ذلك هو ، كمبرمجة للتطبيق ، يمكنك أن تفترض بأمان أن "Lock (objlock)" ستكون مكالمة ذرية بغض النظر عن عدد وحدات المعالجة المركزية التي توصلت إليها في نظامك.
نصائح أخرى
لفهم سبب عمل هذا ، ضع في اعتبارك:
قفل القفل (أي زيادة إشارة القفل على الكائن) هو عملية تحجب إذا كان الكائن مغلقًا بالفعل.
خطوتين من
lock
, ، أ) التحقق من الإشارة إلى القفل مجاني ، ب) ويتم تنفيذ الكائن بالفعل ،'الوقت ذاته' - أي أنها متجانسة أو الذري العملية فيما يتعلق بالعلاقة بين وحدة المعالجة المركزية والذاكرة.
لذلك ، يمكنك أن ترى ذلك ، إذا أدخل 2 مؤشر ترابط الخاص بك if
-block ، سيحصل أحد الخيوطين على القفل ، وسيحظر الآخر حتى ينتهي الأول من if
.
إن اهتمامك هو بالضبط سبب حاجة إلى آلية خاصة مثل lock
ولا يمكن ببساطة استخدام العلم المنطقي.
إن حل مشكلتك "المتزامنة" في الخوارزمية lock
(الذي يدعو Monitor.Enter()
) الاستخدامات. إنه يتضمن حواجز الذاكرة ومعرفة ميكانيكا الذاكرة المنخفضة للغاية للتأكد من أنه لا يمكن لأي مؤشرات ترابط 2 الحصول على القفل في نفس الوقت.
ملاحظة: أنا أتحدث عن .NET فقط ، وليس جافا.