سؤال

  1. هل يمكن لوحدة المعالجة المركزية اثنان أن يحملوا أقفال تدور "مختلفة" في وقت واحد في نفس الوقت؟

  2. لذلك ... هل هذا يعني: وحدة المعالجة المركزية (Uniprocessor) لا يمكن أن تحمل اثنين من الدوران "المختلفين" في نفس الوقت؟

  3. لذلك ... هل هذا يعني: لا يمكن أن يكون عدد الدوران على وحدة المعالجة المركزية واحدة> 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 يضمن أن التبادل يحدث ذريًا لجميع المعالجات على ناقل الذاكرة نفسه. لذلك يجب أن يغلق ناقل الذاكرة ، أو على الأقل يجبر الملكية الوحيدة لخط ذاكرة التخزين المؤقت المحددة.

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