اثنين من الدوران على نفس المعالج؟
-
26-09-2019 - |
سؤال
هل يمكن لوحدة المعالجة المركزية اثنان أن يحملوا أقفال تدور "مختلفة" في وقت واحد في نفس الوقت؟
لذلك ... هل هذا يعني: وحدة المعالجة المركزية (Uniprocessor) لا يمكن أن تحمل اثنين من الدوران "المختلفين" في نفس الوقت؟
لذلك ... هل هذا يعني: لا يمكن أن يكون عدد الدوران على وحدة المعالجة المركزية واحدة> 1.
ملاحظة: "مختلف" مما يعني أن الدوران المرتبط بموارد الذاكرة المختلفة.
هل يعرف أي شخص كيف تعمل Spinlocks داخليًا؟ ... أعني ، هل يتجمدون الحافلة أثناء عمليات الاختبار؟ لدي غوغل ولكن لا إجابة مطلقة.
المحلول
قفل الدوران هو أكثر أو أقل فقط int مشتركة ، والتي تتم مزامنة الكتابة. لا يوجد علم خاص للمعالج. حتى تتمكن من الحصول على أكثر من قفل تدور واحد. (لا يجب عليك ...)
لمنع نظام المعالج الأحادي من القفل ، يقوم Windows برفع IRQL إلى DISPATCH_LEVEL
. يمكن أن يكون المعالج فقط "موضوع" واحد يعمل في DISPATCH_LEVEL
, ، لذا فإن قفل العديد من الانقطاعات الدورانية في نفس الوقت ، هو آمن في هذه الأنظمة.
يجب أن يكون التنفيذ هكذا: (ليس 100 ٪ صحيح ، ويمكن أن يتباعد بسبب التفاصيل)
LONG lock = 0;
KeAcquireSpinlock( ... )
{
// raise irql. etc.
while( InterlockedExchange( &lock, 1 ) != 0 )
/* do nothing*/;
}
KeReleaseSpinLock( ... )
{
InterlockedExchange( &lock, 0 );
// lower irql ... etc.
}
InterlockedExchange
يضمن أن التبادل يحدث ذريًا لجميع المعالجات على ناقل الذاكرة نفسه. لذلك يجب أن يغلق ناقل الذاكرة ، أو على الأقل يجبر الملكية الوحيدة لخط ذاكرة التخزين المؤقت المحددة.