English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

ضيف
1 / ?

كيف يتشكل التشابك

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

نمط التشابك: النظام A و B يتشاركان حالة عالمية بدون snapshot أو واجهة

ثلاثة أسس تتكلس فيها هذه المشكلة:

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

حلقة أحداث Redis. AOF fsync (الكتابة على القرص)، والنسخ المتماثل (الكتابة عبر الشبكة)، وتنفيذ الأوامر (وحدة المعالجة المركزية) تشترك في حلقة الأحداث أحادية الخيط. كل منها: صحيح بمفرده. يؤدي fsync البطيء إلى تعطيل تنفيذ الأوامر. يتفاقم تأخر النسخ المتماثل تحت حمل الكتابة. نقطة الربط: سياق تنفيذ واحد مشترك بين عمليات لها ملفات تعريف تأخير مختلفة.

LevelDB VersionSet. مسار الكتابة (تفريغ memtable) والضغط الخلفي يشتركان في قفل VersionSet. يحتفظ عمل الضغط بالقفل لعشرات المللي ثانية. يتعطل مسار الكتابة. كلا العمليتين: ضروريتان. الربط: هيكلي، وليس توقيتيًا.

التمييز الحرج

يحتوي Intertangle على ربط هيكلي، وليس مشكلة توقيت. حالة السباق: وصول خيطين إلى حالة مشتركة بدون تزامن. الحل: إضافة كائن مزامنة (mutex).

Intertangle: نظامان فرعيان يشتركان في الحالة حسب التصميم. إضافة كائن مزامنة لا تصلح الربط؛ بل تسلسل الوصول. النظامان الفرعيان لا يزالان يشتركان في الحالة. يضيق الاختناق.

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

هيكلي مقابل توقيتي

السؤال التشخيصي الرئيسي لـ Intertangle: هل ستؤدي إضافة كائن مزامنة إلى إصلاحه، أم ستجعله أسوأ؟

حالة سباق: إضافة كائن مزامنة (mutex) يصلحها. الترتيب الصحيح للوصول يزيل الفساد.

Intertangle: إضافة كائن مزامنة (mutex) يسلسل الوصول لكنه يحافظ على الترابط الهيكلي. لا تزال الأنظمة الفرعية تشترك في الحالة. تحت الحمل، لا تزال تعيق بعضها. يضيق عنق الزجاجة.

صف كيف يمكن لنظامين فرعيين أن يصبحا متشابكين. ما الذي يجعل هذا مشكلة هيكلية وليست مجرد حالة سباق؟

كيفية العثور على Intertangle

ثلاث إشارات للكشف:

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

2. قفل واحد يحمي عمليات غير مرتبطة. قفل واحد يحمي عملية تدفق الصوت AND فك تشفير الفيديو AND جلب قائمة التشغيل: ثلاثة أنظمة فرعية لها ملفات تأخير مختلفة، وكلها تنتظر بعضها البعض. الرائحة: عمليات غير مرتبطة تحت نفس اسم القفل.

3. انخفاض الأداء عند إضافة الحمل. يزداد زمن الاستجابة للعملية A عند تشغيل العملية B بشكل متزامن، على الرغم من أن A و B تبدوان مستقلتين. إنهما ليستا مستقلتين: إنهما تشتركان في الحالة.

إصلاح لقطة المرحلة

نمط لقطة المرحلة:

# قبل: الأنظمة الفرعية تقرأ وتكتب الحالة المشتركة مباشرة
class GameWorld:
position = {}  # حالة مشتركة قابلة للتعديل
velocity = {}  # حالة مشتركة قابلة للتعديل

def physics_tick(world):
for entity in world.entities:
world.position[entity] += world.velocity[entity]  # يكتب في الحالة المشتركة أثناء الحلقة
# AFTER: لقطة مجمدة قبل المرحلة؛ الكتابات تذهب إلى مخزن next_state
def physics_tick(world):
snapshot = world.freeze()  # عرض غير قابل للتعديل
next_state = {}
for entity in snapshot.entities:
next_state[entity] = snapshot.position[entity] + snapshot.velocity[entity]
world.merge(next_state)  # دمج ذري عند حدود المرحلة

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

طبّق الإصلاح

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

سمِّ فئة العيب. اشرح لماذا لم يكن إضافة كائن المزامنة هو الإصلاح. صف الإصلاح الهيكلي.