سؤال

كنت أتساءل دائمًا ما هم عليه: في كل مرة أسمع عنهم ، صور لأجهزة شبيهة بملابس الموازنة المستقبلية ترقص (المتداول؟) من خلال ذهني ...

ما هم؟

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

المحلول

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

علاوة على ذلك ، لا تتوفر كائنات kernel في كل حالة من حالة النواة ، كما هو الحال في معالج المقاطعة أو عند عدم توفر الترحيل وما إلى ذلك.

لا تسبب spinlocks الاستباق ولكن انتظر في حلقة ("تدور") حتى يطلق القلب الآخر القفل. هذا يمنع الخيط من فقدانه الكم وتستمر بمجرد إطلاق القفل. تسمح الآلية البسيطة لـ Spinlocks للنواة باستخدامها في أي حالة تقريبًا.

لهذا السبب على جهاز واحد أساسي واحد ، يعد Spinlock ببساطة "مقاطعات تعطيل" أو "رفع IRQL" مما يمنع جدولة مؤشرات الترابط تمامًا.

تسمح Spinlocks في نهاية المطاف Kernels بتجنب "Big kernel Lock" (قفل تم الحصول عليه عندما يدخل Core kernel ويطلقه في المخرج) وله قفل محبب على أوليتات kernel ، مما تسبب في معالجة متعددة أفضل على الأجهزة متعددة النواة وبالتالي أداء أفضل.

تحرير: جاء سؤال: "هل هذا يعني أنني يجب أن أستخدم Spinlocks كلما كان ذلك ممكنًا؟" وسأحاول الإجابة عليه:

كما ذكرت ، فإن spinlocks مفيدة فقط في الأماكن التي يكون فيها وقت الانتظار المتوقع أقصر من الكمية (اقرأ: milliseconds) والإعداد لا معنى له (مثل كائنات kernel غير متوفرة).

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

إليك سؤال في معالجة ذلك: spinlocks ، ما مدى فائدة هم؟

نصائح أخرى

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

إنها حلقة بيرتي التي تستمر في الاستمرار حتى يتم استيفاء حالة معينة:

while(cantGoOn) {};
 while(something != TRUE ){};
 // it happend
 move_on();

إنه نوع من القفل مشغول الانتظار

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

انظر على سبيل المثال spinlocks في kernel linux.

Spinlocks هي تلك التي ينتظر فيها الخيط حتى يتوفر القفل. سيتم استخدام هذا عادة لتجنب النفقات العامة للحصول على كائنات kernel عندما يكون هناك نطاق للحصول على كائن kernel خلال فترة زمنية صغيرة.

السابق:

While(SpinCount-- && Kernel Object is not free)
{}

try acquiring Kernel object

قد ترغب في استخدام Spinlock عندما تعتقد أنه من الأرخص إدخال حلقة انتظار مشغولة وتجميع مورد بدلاً من الحظر عند قفل المورد.

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

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

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

إنها حلقة تدور حولها حتى يتم الوفاء بالشرط.

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

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

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