هل حواجز الذاكرة ضرورية للمرجع الذري حساب البيانات غير القابلة للتغيير المشتركة؟

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

سؤال

لديّ بعض هياكل البيانات غير القابلة للتغيير التي أود إدارتها باستخدام تعدادات المرجعية ، ومشاركتها عبر مؤشرات الترابط على نظام SMP.

إليك ما يبدو عليه رمز الإصدار:

void avocado_release(struct avocado *p)
{
    if (atomic_dec(p->refcount) == 0) {
        free(p->pit);
        free(p->juicy_innards);
        free(p);
    }
}

يفعل atomic_dec هل تحتاج إلى حاجز الذاكرة فيه؟ إذا كان الأمر كذلك ، أي نوع من حاجز الذاكرة؟

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

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

المحلول

في x86 ، سوف يتحول إلى تعليمات تجميع مسبقة القفل ، مثل LOCK XADD.
كونه تعليمات واحدة ، فهي غير قابلة للانقطاع. بصفتها "Feauture" المضافة ، ينتج عن بادئة القفل حاجزًا كاملًا للذاكرة:

"... العمليات المقفلة تسلسل جميع عمليات الحمل والتخزين المتميزة (أي انتظرها لإكمالها)." ... "العمليات المقفلة ذرية فيما يتعلق بجميع عمليات الذاكرة الأخرى وجميع الأحداث المرئية خارجيًا. فقط تعليمات الجلب وجدول الصفحة يمكن الوصول إلى الإرشادات المقفلة فقط. " - دليل مطور برامج Intel® 64 و IA-32, ، الفصل 8.1.2.

في الواقع يتم تنفيذ حاجز الذاكرة باعتباره دمية LOCK OR أو LOCK AND معا الشبكة و جافا جيت على x86/x64.
لذلك لديك سياج كامل على x86 كمكافأة إضافية ، سواء أعجبك ذلك أم لا. قون

على PPC ، الأمر مختلف. و LL/SC زوج - lwarx & stwcx - يمكن استخدام الطرح في الداخل لتحميل معامل الذاكرة في السجل ، أو طرحه ، ثم إما كتابته مرة أخرى إذا لم يكن هناك متجر آخر للموقع المستهدف ، أو أعد إعادة محاولة الحلقة بأكملها إذا كان هناك. يمكن مقاطعة LL/SC.
كما أنه لا يعني السياج الكامل التلقائي.
هذا لا يتنازل عن ذرة العداد بأي شكل من الأشكال.
هذا يعني فقط أنه في حالة X86 ، تصادف أن تحصل على سياج أيضًا ، "مجانًا".
على PPC ، يمكن للمرء إدراج سياج كامل عن طريق انبعاث أ (lw)sync تعليمات.

الكل في الكل ، لا تعد حواجز الذاكرة الصريحة ضرورية للعداد الذري للعمل بشكل صحيح.

نصائح أخرى

من المهم التمييز بين الوصول الذري (الذي يضمن أن يتم تنفيذ القراءة/التعديل/الكتابة للقيمة كوحدة ذرية واحدة) وإعادة ترتيب الذاكرة.

حواجز الذاكرة تمنع إعادة ترتيب القراءات والكتابة وإعادة ترتيبها تعامد تمامًا للذرة. على سبيل المثال ، على PowerPC إذا قمت بتطبيق الزيادة الذرية الأكثر كفاءة ممكنة ، فلن تمنع إعادة ترتيب. إذا كنت ترغب في منع إعادة ترتيب ، فأنت بحاجة إلى تعليمات LWSYNC أو SYNC ، أو حاجز ذاكرة عالي المستوى (C ++ 11؟).

تدعي أنه "لا توجد إمكانية لإعادة ترتيب الأشياء بطريقة إشكالية" تبدو ساذجة كبيانات عامة لأن التحسينات المترجمة يمكن أن تكون مفاجئة للغاية ولأن وحدة المعالجة المركزية (PowerPC/ARM/Alpha/MIPs على وجه الخصوص) تعيد ترتيب العمليات بقوة.

ذاكرة التخزين المؤقت المتماسكة لا توفر لك أيضًا. يرى http://preshing.com/ لمعرفة كيف يعمل إعادة ترتيب الذاكرة حقًا.

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

هل تنوي تنفيذ خاصتك atomic_dec أم أنك تتساءل فقط ما إذا كانت وظيفة من خلال النظام ستتصرف كما تريد؟

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

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