هل تستحق "benaphores" التنفيذ على أنظمة التشغيل الحديثة؟

StackOverflow https://stackoverflow.com/questions/1635416

سؤال

قرأت في أيامي كمبرمج BeOS هذا المقال بواسطة Benoit Schillings، يصف كيفية إنشاء "benaphore":طريقة لاستخدام المتغير الذري لفرض قسم مهم يتجنب الحاجة إلى الحصول على/تحرير كائن المزامنة (mutex) في الحالة الشائعة (عدم التنافس).

اعتقدت أن هذا كان ذكيًا إلى حد ما، ويبدو أنه يمكنك القيام بنفس الحيلة على أي منصة تدعم الزيادة/النقصان الذري.

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

هل يعرف أحد ما إذا كانت واجهات برمجة التطبيقات الحديثة للقفل (على سبيل المثال.pthread_mutex_lock()/pthread_mutex_unlock()) هل تستخدم هذه الخدعة داخليًا؟وإذا لم يكن كذلك، لماذا لا؟

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

المحلول

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

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

نصائح أخرى

جافا AbstractQueuedSynchronizer (وأخوته AbstractQueuedLongSynchronizer) يعمل بالمثل، أو على الأقل استطاع تنفيذها بالمثل.تشكل هذه الأنواع الأساس للعديد من العناصر الأولية المتزامنة في مكتبة Java، مثل ReentrantLock و FutureTask.

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

AbstractQueuedSynchronizer كما يسهل الانتظار على الأقفال والإخطار شروط بالمحافظة طوابير CLH, ، وهي عبارة عن قوائم مرتبطة خالية من القفل تمثل سطرًا من المواضيع المنتظرة إما للحصول على القفل أو لتلقي إشعار عبر شرط ما.ينقل هذا الإشعار واحدًا أو كل الخيوط التي تنتظر الشرط إلى رأس قائمة الانتظار لأولئك الذين ينتظرون الحصول على القفل ذي الصلة.

معظم يمكن تنفيذ هذه الآلية من حيث عدد صحيح ذري يمثل الحالة بالإضافة إلى مؤشرين ذريين لكل قائمة انتظار.الجدولة الفعلية للخيوط التي ستتنافس على فحص وتغيير متغير الحالة (عبر، على سبيل المثال، AbstractQueuedSynchronizer#tryAcquire(int)) خارج نطاق هذه المكتبة ويقع على عاتق برنامج جدولة النظام المضيف.

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