Reactivecocoa: Atomic: SPINLOCK ليس آمنًا في iOS

تم إنشاؤها على ١٥ ديسمبر ٢٠١٥  ·  20تعليقات  ·  مصدر: ReactiveCocoa/ReactiveCocoa

https://twitter.com/steipete/status/676851647042203648

سأمتنع عن الإدلاء بأي تعليقات (سأقول فقط ... إذا كان هذا غير قانوني على نظام iOS ، فلماذا يكون واجهة برمجة تطبيقات عامة ؟؟؟)

يبدو أن كائنات المزامنة pthread أصبحت أسرع الآن . يجب علينا إنشاء معيار للمقارنة ، ومحاولة تحويل Atomic إلى هذا (أيضًا RACCompoundDisposable و RACSerialDisposable ؟)

help wanted

التعليق الأكثر فائدة

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

2016-06-29 17 58 39

رمز المعيار لـ SDK9
رمز المعيار لـ SDK10

ال 20 كومينتر

لست متأكدًا حتى مما تعنيه كلمة "غير قانوني".

nope

أشعر بالفضول فقط ، لأنني لم أكن موجودًا منذ البداية ، ولكن لماذا تم استخدام OSSpinLock Atomic للنوع

هل تم استخدام NSLock ثم تبين أنه بطيء جدًا ، ثم تم اختبار pthread_mutex_t ووجد أنه بطيء جدًا أيضًا؟ للأسف ، ليس لدى git سجل قبل "نقل المصادر ..."

Spinlocks ليست شيئًا أعتقد أنه أستخدمه في سياق غير متعلق بـ kernel ، وليس سياق برنامج تشغيل الجهاز ، وهذا هو السبب في أنني أسأل. إذا كان هناك أي شيء ، فسأقول أن الخطأ هنا هو أن OSSpinLock مستخدم على الإطلاق. : stuck_out_tongue:

لإضافة نقطة مضادة لتعليقي أعلاه ، هذه ليست صفقة كبيرة كما قد يجعلها العنوان: https://twitter.com/Catfish_Man/status/676854531615883265

حتى في ظل تجويع وحدة المعالجة المركزية ، يكون هذا القسم الحرج صغيرًا جدًا ، ومن المحتمل أن يكون جيدًا في المواقف الحقيقية.
-Catfish_Man على تويتر

بالنسبة للتعليق أعلاه من kastiglione :

لست متأكدًا حتى مما تعنيه كلمة "غير قانوني".

ليس لدي إجابة ، لكنني أعتقد أن شيئًا ما في وحدة المعالجة المركزية ARM لا يسمح بدائية السبينلوك بالاستمتاع بالعديد من الفوائد / الضمانات / الافتراضات كما هو الحال في وحدات المعالجة المركزية Intel. (لكن ليس كلهم ​​على الأرجح ، بحسب https://twitter.com/Catfish_Man/status/676851988596809728)

على أي حال ، من المحتمل أنه لا يوجد "شيء يمكن رؤيته هنا" في الممارسة العملية ، وبدلاً من ذلك يجب إجراء بعض التحقيقات لاستبدالها بأسلوب بدائي وقياس أكثر أمانًا لأي تراجع في الأداء ، كما يقترح

أعتقد أننا يجب أن نستبدل استخداماتنا OSSpinLock ، لكنني أعتقد أن منطقنا / منطقتي لاستخدامها كان صحيحًا نظرًا للوثائق المتاحة لنا.

نعم ، وشكرًا للتاريخ ذي الصلة. لست متأكدًا من سبب عدم قيام GitHub بإجراء git log --follow عند طلب السجل لملف معين.

على أية حال ، سأعيد التأكيد على أنه "ربما يكون الأمر على ما يرام". من المحتمل أن يكون استخدام كائن المزامنة "الأسرع الآن" مهمة مباشرة ، ولكنه أقل أهمية من دون معرفة كيف قمت بتوصيفها / اختبارها لتبدأ بها. هل لديك أي اقتراحات / مؤشرات هناك؟

بالنسبة لطريقة المضي قدمًا إذا / عندما يصبح الأداء مصدر قلق ، فإن قوائم الانتظار الخالية من القفل تستحق التحقيق. (هذه مقالة جيدة للقراء الذين ليسوا على دراية بالمفهوم: http://www.linuxjournal.com/content/lock-free-multi-producer-multi-consumer-queue-ring-buffer؟page=0،0). لقد أنشأت شيئًا مشابهًا لمكتبة صوتية داخلية منذ فترة ، وقد أتمكن من تكييفها للاستخدام العام مثل هذا.

من المحتمل أن يكون استخدام كائن المزامنة "الأسرع الآن" مهمة مباشرة ، ولكنه أقل أهمية من دون معرفة كيف قمت بتوصيفها / اختبارها لتبدأ بها. هل لديك أي اقتراحات / مؤشرات هناك؟

كنت أقوم بتشغيل GitHub Desktop في أداة تخصيص الوقت والتخصيصات للأدوات ، وأركز على مجموعات RAC الثقيلة. سيتعين عليك التحدث إلى joshaber أو mdiep لهذا الآن. :غمزة:

حسنا من الجيد أن أعرف. أتخيل أن الأشياء ذات الجانب Swift ستتطلب قاعدة رمز كبيرة / عميقة مماثلة للاختبار بها. لقد طورت بعضًا من بلدي خلال الأشهر القليلة الماضية 1 ولكني لا أعرف ما إذا كنت أقوم بدفع RAC "بقوة كافية" للحصول على عينات كافية منه. تميل الكثير من الأشياء الأخرى إلى الظهور في مخططات الآلات مع تطبيقات مثل تطبيقاتي. :ابتسامة:

1 قابس! http://capoapp.com ، حيث أن http://capoapp.com/neptune هو أحدث مكون مصمم بالكامل باستخدام RAC4.

لقد كتبت منشور مدونة اليوم يتطرق إلى مزيد من التفاصيل حول سبب كون spinlocks "غير قانوني" على نظام التشغيل iOS: http://engineering.postmates.com/Spinlocks-Consiced-Harmful-On-iOS/

لقد قطعت Atomic منذ فترة وجيزة وقمت بترحيلها إلى pthread_mutex_lock. بكل المقاييس ، إنه أفضل قفل موجود - لا يوجد إرسال ديناميكي مثل NSLock ، قفل فوري إذا لم يتم التعامل معه مثل spinlock ، لا يضيع الطاقة على عكس قفل الدوران.

لا تتردد في نسخ ولصق المصدر من الريبو الخاص بي أو فعل ما تريد به.

https://github.com/Adlai-Holler/Atomic
https://github.com/Adlai-Holler/Atomic/blob/master/Atomic/Atomic.swift

kballard هذا تفسير رائع ، شكرًا!

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

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

ملحوظة: dispatch_semaphore لا يتبرع بالأولوية ، وهو أمر محتمل آخر.

kballardjspahrsummers لدي التنفيذ باستخدام CAS الذرية. إذا كان هناك أي اهتمام ، فأنا سعيد بتقديم PR.

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

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

2016-06-29 17 58 39

رمز المعيار لـ SDK9
رمز المعيار لـ SDK10

أرقامك تبدو مشبوهة للغاية بالنسبة لي. كم مرة أجريت الاختبارات؟

للمقارنة ، قمت بتشغيل معياري الخاص ( المصدر ) على OS X 10.11.5 باستخدام أداة قياس الاختراق التي كتبتها منذ فترة. قمت بتشغيل المعيار بالكامل 10 مرات ، وأسقطت الرقمين السفليين والأعلى من كل اختبار (للتخلص من القيم المتطرفة) ، وأنتجت بقية الأرقام النطاقات التالية:

عدم المزامنة: 22-41ns
سبينلوك: 24ns
إشارة: 29ns
NSLock: 45-71ns
كائن المزامنة (mutex): 40-64ns
متزامن: 75-122ns
قائمة الانتظار: 505-554 نانو ثانية

من هذا يمكنك أن ترى أن spinlock هي الأرخص إلى حد بعيد ، تليها إشارة ، ثم كائن المزامنة ، ثم NSLock خلف كائن المزامنة بقليل (نظرًا لأنه أساسًا كائن مزامن + objc_msgSend) ، ثم تكون المزامنة تقريبًا ضعف تكلفة ، وفي النهاية ينتهي الأمر بقوائم الانتظار إلى حد كبير باهظة الثمن ، أكثر بكثير مما توقعت.

kballard كما ترون ،

أسباب

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

Lewion picture Lewion  ·  4تعليقات

akashivskyy picture akashivskyy  ·  5تعليقات

toddbluhm picture toddbluhm  ·  5تعليقات

gabro picture gabro  ·  5تعليقات

mdiep picture mdiep  ·  5تعليقات