حالة السباق

حالة التزامن أو خطر التزامن هي حالة في نظام إلكتروني أو برمجي أو غيره ، حيث يعتمد سلوك النظام الأساسي على تسلسل أو توقيت أحداث خارجة عن السيطرة، مما يؤدي إلى نتائج غير متوقعة أو غير متسقة. وتُصبح هذه الحالة خطأً برمجيًا عندما يكون واحد أو أكثر من السلوكيات المحتملة غير مرغوب فيه.
كان مصطلح حالة السباق مستخدمًا بحلول عام 1954، على سبيل المثال في أطروحة الدكتوراه لديفيد أ. هوفمان بعنوان "توليف دوائر التبديل التسلسلي". [ 1 ]
قد تحدث حالات التزامن المتنافس، خاصة في الدوائر المنطقية أو برامج الحاسوب المتزامنة أو الموزعة . ويمكن منع هذه الحالات باستخدام تقنية الاستبعاد المتبادل .
في مجال الإلكترونيات
قد يحدث مثال نموذجي لحالة التزامن المتنافس عندما تقوم بوابة منطقية بدمج إشارات قادمة من نفس المصدر عبر مسارات مختلفة. قد تتغير مدخلات البوابة في أوقات متفاوتة قليلاً استجابةً لتغير إشارة المصدر. وقد يتغير الخرج، لفترة وجيزة، إلى حالة غير مرغوب فيها قبل أن يعود إلى الحالة المصممة. تستطيع بعض الأنظمة تحمل مثل هذه الأعطال ، ولكن إذا كان هذا الخرج يعمل كإشارة ساعة لأنظمة أخرى تحتوي على ذاكرة، على سبيل المثال، فقد ينحرف النظام بسرعة عن سلوكه المصمم (وبالتالي، يتحول العطل المؤقت إلى عطل دائم).
لنأخذ على سبيل المثال بوابة AND ذات مدخلين يتم تغذيتها بالمنطق التالي:إشارة منطقيةعلى مدخل واحد ونفيه المنطقي لا يمكن لأي مدخل آخر، نظرياً، أن يُخرج قيمة حقيقية.لكن إذا طرأت تغييرات على قيمةيستغرق وصول الإشارة إلى المدخل الثاني وقتًا أطول من وصولها إلى المدخل الأول عندماإذا تغيرت القيمة من خطأ إلى صحيح، فستتبع ذلك فترة وجيزة يكون فيها كلا المدخلين صحيحين، وبالتالي سيكون خرج البوابة صحيحًا أيضًا. [ 2 ]
من الأمثلة العملية على حالة التزامن غير المتوقع (السباق) استخدام الدوائر المنطقية للكشف عن مخرجات معينة لعداد. فإذا لم تتغير جميع بتات العداد في وقت واحد تمامًا، ستظهر أنماط وسيطة قد تؤدي إلى تطابقات خاطئة.
الأشكال الحرجة وغير الحرجة
تحدث حالة التنافس الحرجة عندما يحدد ترتيب تغيير المتغيرات الداخلية الحالة النهائية التي ستنتهي إليها آلة الحالة .
تحدث حالة التنافس غير الحرجة عندما لا يحدد ترتيب تغيير المتغيرات الداخلية الحالة النهائية التي ستنتهي إليها آلة الحالة.
الأشكال الثابتة والديناميكية والأساسية
تحدث حالة التزامن الثابتة عندما يتم دمج الإشارة ومكملها.
تحدث حالة التنافس الديناميكي عندما ينتج عنها انتقالات متعددة بينما يُراد انتقال واحد فقط. وتعود هذه الحالة إلى التفاعل بين البوابات. ويمكن التخلص منها باستخدام مستويين فقط من البوابات.
تحدث حالة التزامن الأساسية عندما يمرّ مُدخلٌ بانتقالين في أقل من زمن انتشار التغذية الراجعة الكلي. ويتمّ أحيانًا معالجة هذه الحالة باستخدام عناصر خط التأخير الاستقرائي لزيادة مدة إشارة الإدخال بشكل فعّال.
حلول بديلة
تشجع تقنيات التصميم، مثل خرائط كارنو، المصممين على التعرف على حالات التزامن غير المقصودة والقضاء عليها قبل أن تتسبب في مشاكل. ومن خلال تبسيط التعبيرات المنطقية وتحليل العلاقات بين متغيرات الإدخال، يستطيع المصممون تقليل احتمالية حدوث تغييرات غير مقصودة في الإشارات قد تؤدي إلى حالات التزامن غير المقصودة.
في كثير من الحالات، يمكن إضافة التكرار المنطقي عمدًا إلى الدوائر الرقمية للتخلص من أنواع معينة من التزامن غير المتوقع. ورغم أن التكرار يزيد من عدد البوابات المنطقية، إلا أنه يُسهم في استقرار انتقالات الإشارات ويمنع الأعطال المؤقتة التي تحدث عند تغير الإشارات في أوقات متقاربة.
قد يطبق المهندسون أيضًا أساليب دقيقة للتحكم في التوقيت والمزامنة في الدوائر التسلسلية. على سبيل المثال، يمكن أن يساعد استخدام عناصر موقوتة مثل القلابات في ضمان تغير الإشارات بطريقة يمكن التنبؤ بها، مما يقلل من خطر حدوث حالات التزامن غير المتوقعة في الأنظمة الرقمية المعقدة.
على الرغم من هذه الاحتياطات، قد تدخل بعض العناصر المنطقية في حالات شبه مستقرة . في مثل هذه الحالات، تبقى الدائرة مؤقتًا في حالة غير مستقرة بين الحالات المنطقية، مما قد يؤدي إلى انتشار إشارات غير مؤكدة عبر النظام وخلق تحديات إضافية لمصممي الدوائر.
في البرمجيات
قد تنشأ حالة التزامن في البرمجيات عندما يحتوي برنامج حاسوبي على مسارات برمجية متعددة تُنفَّذ في الوقت نفسه. إذا استغرقت هذه المسارات أوقاتًا مختلفة عن المتوقع، فقد تنتهي بترتيب مختلف، مما قد يتسبب في أخطاء برمجية نتيجةً لسلوك غير متوقع. كما قد يحدث التزامن بين برنامجين، مما يؤدي إلى مشاكل أمنية.
تتسبب حالات التزامن الحرجة في تنفيذ غير صحيح وأخطاء برمجية ، وغالبًا ما تحدث عندما تعتمد العمليات أو الخيوط على حالة مشتركة. تُجرى العمليات على الحالات المشتركة في أقسام حرجة يجب أن تكون حصرية متبادلة . قد يؤدي عدم الالتزام بهذه القاعدة إلى تلف الحالة المشتركة.
يُعدّ تضارب البيانات نوعًا من حالات التزامن. وتُشكّل حالات تضارب البيانات جزءًا مهمًا من نماذج الذاكرة الرسمية المختلفة . وينص نموذج الذاكرة المُعرّف في معايير C11 و C++11 على أن برنامج C أو C++ الذي يحتوي على تضارب بيانات يكون سلوكه غير مُعرّف . [ 3 ] [ 4 ]
قد يصعب إعادة إنتاج حالة التزامن وتصحيحها لأن النتيجة غير حتمية وتعتمد على التوقيت النسبي بين الخيوط المتداخلة. ولذلك، قد تختفي مشاكل من هذا النوع عند التشغيل في وضع التصحيح، أو إضافة تسجيلات إضافية، أو ربط مصحح الأخطاء. يُشار إلى الخطأ الذي يختفي بهذه الطريقة أثناء محاولات التصحيح غالبًا باسم " خطأ هايزن" . لذا، من الأفضل تجنب حالات التزامن من خلال تصميم برمجيات دقيق.
مثال
لنفترض أن خيطين يقوم كل منهما بزيادة قيمة متغير عدد صحيح عام بمقدار 1. من الناحية المثالية، ستحدث سلسلة العمليات التالية:
| الخيط 1 | الموضوع 2 | قيمة عددية صحيحة | |
|---|---|---|---|
| 0 | |||
| قيمة القراءة | ← | 0 | |
| زيادة القيمة | 0 | ||
| أجب على الرد | → | 1 | |
| قيمة القراءة | ← | 1 | |
| زيادة القيمة | 1 | ||
| أجب على الرد | → | 2 |
في الحالة الموضحة أعلاه، القيمة النهائية هي 2، كما هو متوقع. مع ذلك، إذا تم تشغيل الخيطين في وقت واحد دون تأمين أو تزامن (عبر الإشارات )، فقد تكون نتيجة العملية خاطئة. يوضح تسلسل العمليات البديل أدناه هذا السيناريو:
| الخيط 1 | الموضوع 2 | قيمة عددية صحيحة | |
|---|---|---|---|
| 0 | |||
| قيمة القراءة | ← | 0 | |
| قيمة القراءة | ← | 0 | |
| زيادة القيمة | 0 | ||
| زيادة القيمة | 0 | ||
| أجب على الرد | → | 1 | |
| أجب على الرد | → | 1 |
في هذه الحالة، القيمة النهائية هي 1 بدلاً من النتيجة المتوقعة وهي 2. يحدث هذا لأن عمليات الزيادة هنا ليست متنافية. العمليات المتنافية هي تلك التي لا يمكن مقاطعتها أثناء الوصول إلى مورد ما، مثل موقع في الذاكرة.
سباق البيانات
لا يعتبر الجميع تضارب البيانات جزءًا من حالات التزامن. [ 5 ] يختلف التعريف الدقيق لتضارب البيانات باختلاف نموذج التزامن الرسمي المستخدم، ولكنه يشير عادةً إلى حالة قد تحاول فيها عملية ذاكرة في أحد الخيوط الوصول إلى موقع ذاكرة في نفس الوقت الذي تكتب فيه عملية ذاكرة في خيط آخر إلى ذلك الموقع، في سياق يُعد فيه هذا الأمر خطيرًا. وهذا يعني أن تضارب البيانات يختلف عن حالة التزامن، إذ من الممكن حدوث عدم حتمية بسبب التوقيت حتى في برنامج خالٍ من تضارب البيانات، على سبيل المثال، في برنامج تستخدم فيه جميع عمليات الوصول إلى الذاكرة عمليات ذرية فقط .
قد يكون هذا الأمر خطيرًا، لأنه في العديد من المنصات، إذا قام خيطان بالكتابة إلى موقع ذاكرة في الوقت نفسه، فقد ينتهي الأمر بهذا الموقع إلى تخزين قيمة عشوائية وغير مفهومة، تتكون من مزيج من البتات التي تمثل القيم التي حاول كل خيط كتابتها؛ وهذا قد يؤدي إلى تلف الذاكرة إذا كانت القيمة الناتجة قيمة لم يحاول أي من الخيطين كتابتها (ويُطلق على هذا أحيانًا اسم " الكتابة الممزقة "). وبالمثل، إذا قرأ خيط من موقع ما بينما يكتب إليه خيط آخر، فقد تُرجع عملية القراءة قيمة عشوائية وغير مفهومة، تتكون من مزيج من البتات التي تمثل القيمة التي كان الموقع يحتفظ بها قبل الكتابة، والبتات التي تمثل القيمة التي تتم كتابتها.
في العديد من المنصات، تُوفّر عمليات ذاكرة خاصة للوصول المتزامن؛ في هذه الحالات، يكون الوصول المتزامن باستخدام هذه العمليات الخاصة آمنًا عادةً، بينما يكون الوصول المتزامن باستخدام عمليات ذاكرة أخرى خطيرًا. تُسمى هذه العمليات الخاصة (الآمنة للوصول المتزامن) أحيانًا بالعمليات الذرية أو عمليات التزامن ، بينما تُسمى العمليات العادية (غير الآمنة للوصول المتزامن) بعمليات البيانات . ولعل هذا هو سبب تسمية هذه الظاهرة بـ" سباق البيانات "؛ ففي العديد من المنصات، حيث توجد حالة سباق تتضمن عمليات التزامن فقط ، قد يكون هذا السباق غير حتمي ولكنه آمن في الأحوال العادية؛ بينما قد يؤدي سباق البيانات إلى تلف الذاكرة أو سلوك غير مُحدد.
أمثلة على تعريفات تنافس البيانات في نماذج التزامن المحددة
يختلف التعريف الدقيق لظاهرة تضارب البيانات باختلاف نماذج التزامن الرسمية. وهذا أمر مهم لأن السلوك المتزامن غالباً ما يكون غير بديهي، ولذلك يتم اللجوء أحياناً إلى الاستدلال الرسمي.
يُعرّف معيار C ++ ، في المسودة N4296 (2014-11-19)، تضارب البيانات على النحو التالي في القسم 1.10.23 (الصفحة 14) [ 6 ].
يمكن أن يكون هناك فعلان متزامنان إذا
- يتم تنفيذها بواسطة خيوط مختلفة، أو
- إنها غير متسلسلة، ويتم تنفيذ واحدة منها على الأقل بواسطة معالج الإشارات.
يُعتبر تنفيذ البرنامج مُتضمناً لحالة تضارب البيانات إذا احتوى على إجراءين متزامنين محتملين ومتعارضين، أحدهما على الأقل ليس ذرياً، ولم يسبق أحدهما الآخر، باستثناء الحالة الخاصة بمعالجات الإشارات الموضحة أدناه [محذوف]. أي تضارب بيانات من هذا القبيل يؤدي إلى سلوك غير مُحدد.
إن أجزاء هذا التعريف المتعلقة بمعالجات الإشارات خاصة بلغة C++ وليست نموذجية لتعريفات تضارب البيانات .
تقدم الورقة البحثية "الكشف عن تضارب البيانات على أنظمة الذاكرة الضعيفة" [ 7 ] تعريفًا مختلفًا:
تتعارض عمليتان في الذاكرة إذا وصلتا إلى نفس الموقع، وكانت إحداهما على الأقل عملية كتابة . تُشكل عمليتان في الذاكرة، x و y، في تنفيذ متسق تسلسليًا، حالة تنافس〈x,y〉، إذا وفقط إذا تعارضت x و y، ولم تكونا مُرتبتين وفقًا لعلاقة hb1 للتنفيذ. تُعتبر حالة التنافس 〈x,y〉تنافس بيانات إذا وفقط إذا كانت إحدى العمليتين x أو y على الأقل عملية بيانات.
هنا لدينا عمليتان للذاكرة تصلان إلى نفس الموقع، إحداهما عملية كتابة.
تم تعريف علاقة hb1 في موضع آخر من هذه الورقة، وهي مثال على علاقة "يحدث قبل" النموذجية ؛ ببساطة، إذا استطعنا إثبات أننا في حالة يُضمن فيها إتمام عملية ذاكرة X قبل بدء عملية ذاكرة Y، فإننا نقول إن "X يحدث قبل Y". أما إذا لم يتحقق أي من الشرطين "X يحدث قبل Y" أو "Y يحدث قبل X"، فإننا نقول إن X وY "غير مرتبين وفقًا لعلاقة hb1". لذا، يمكن ترجمة عبارة "... وغير مرتبين وفقًا لعلاقة hb1 للتنفيذ" بشكل بديهي إلى "... وX وY متزامنان محتملان".
تعتبر الورقة البحثية خطيرة فقط تلك الحالات التي تكون فيها عملية واحدة على الأقل من عمليات الذاكرة عملية بيانات ؛ وفي أجزاء أخرى من هذه الورقة، تحدد الورقة أيضًا فئة من عمليات التزامن الآمنة للاستخدام المتزامن المحتمل، على عكس عمليات البيانات .
يقدم معيار لغة جافا [ 8 ] تعريفًا مختلفًا:
يُقال إن عمليتي وصول (قراءة أو كتابة) إلى نفس المتغير متعارضتان إذا كانت إحداهما على الأقل عملية كتابة ... عندما يحتوي البرنامج على عمليتي وصول متعارضتين (الفقرة 17.4.1) غير مرتبتين وفقًا لعلاقة "يحدث قبل"، يُقال إنه يحتوي على تضارب في البيانات ... لا يمكن أن يتسبب تضارب البيانات في سلوك غير صحيح مثل إرجاع طول خاطئ لمصفوفة.
يتمثل أحد الفروق الجوهرية بين منهج C++ ومنهج Java في أن تضارب البيانات في C++ يُعد سلوكًا غير مُعرَّف، بينما في Java، يؤثر تضارب البيانات فقط على العمليات بين الخيوط . [ 8 ] هذا يعني أنه في C++، قد تؤدي محاولة تنفيذ برنامج يحتوي على تضارب بيانات (مع الالتزام بالمواصفات) إلى تعطل البرنامج أو إظهار سلوك غير آمن أو غريب، بينما في Java، قد تُنتج محاولة تنفيذ برنامج يحتوي على تضارب بيانات سلوكًا غير مرغوب فيه في التزامن، ولكنه آمن في غير ذلك (بافتراض التزام التنفيذ بالمواصفات).
الاتساق التسلسلي لبيانات خالية من التمييز العنصري
من أهم جوانب تضارب البيانات أنه في بعض السياقات، يضمن البرنامج الخالي من تضارب البيانات تنفيذه بطريقة متسقة تسلسليًا ، مما يُسهّل بشكل كبير فهم سلوكه المتزامن. يُقال إن نماذج الذاكرة الرسمية التي توفر هذا الضمان تُظهر خاصية الاتساق التسلسلي لخلو البيانات من تضارب البيانات (SC for DRF ). وقد حظي هذا النهج بإجماع حديث (مقارنةً على الأرجح بالنهج التي تضمن الاتساق التسلسلي في جميع الحالات، أو النهج التي لا تضمنه على الإطلاق). [ 9 ]
على سبيل المثال، في لغة جافا، يتم تحديد هذا الضمان بشكل مباشر: [ 8 ]
يكون البرنامج متزامنًا بشكل صحيح إذا وفقط إذا كانت جميع عمليات التنفيذ المتسقة تسلسليًا خالية من تضارب البيانات.
إذا تمت مزامنة البرنامج بشكل صحيح، فإن جميع عمليات تنفيذ البرنامج ستظهر متسقة تسلسليًا (§17.4.3).
هذا ضمان قوي للغاية للمبرمجين. لا يحتاج المبرمجون إلى التفكير في إعادة ترتيب العمليات لتحديد وجود تضارب في البيانات في شفرتهم البرمجية. وبالتالي، لا يحتاجون إلى التفكير في إعادة ترتيب العمليات عند تحديد ما إذا كانت شفرتهم متزامنة بشكل صحيح. بمجرد التأكد من تزامن الشفرة بشكل صحيح، لا داعي للقلق من أن تؤثر إعادة ترتيب العمليات على شفرتهم.
يجب مزامنة البرنامج بشكل صحيح لتجنب السلوكيات غير المتوقعة التي قد تظهر عند إعادة ترتيب التعليمات البرمجية. لا يضمن استخدام المزامنة الصحيحة صحة السلوك العام للبرنامج، ولكنه يُسهّل على المبرمج فهم السلوكيات المحتملة للبرنامج؛ إذ يكون سلوك البرنامج المتزامن بشكل صحيح أقل تأثراً بإعادة ترتيب التعليمات البرمجية. أما بدون المزامنة الصحيحة، فقد تظهر سلوكيات غريبة ومربكة وغير متوقعة.
وعلى النقيض من ذلك، فإن مسودة مواصفات لغة C++ لا تتطلب بشكل مباشر وجود خاصية SC لـ DRF، ولكنها تلاحظ فقط وجود نظرية توفرها:
[ملاحظة: يمكن إثبات أن البرامج التي تستخدم بشكل صحيح الأقفال المتبادلة وعمليات memory_order_seq_cst لمنع جميع حالات تضارب البيانات، ولا تستخدم أي عمليات تزامن أخرى، تتصرف كما لو أن العمليات التي تنفذها خيوطها المكونة لها متداخلة ببساطة، حيث تُؤخذ كل عملية حساب قيمة لكائن ما من آخر تأثير جانبي على ذلك الكائن في ذلك التداخل. يُشار إلى هذا عادةً باسم "الاتساق التسلسلي". ومع ذلك، ينطبق هذا فقط على البرامج الخالية من تضارب البيانات، ولا يمكن للبرامج الخالية من تضارب البيانات ملاحظة معظم تحويلات البرامج التي لا تُغير دلالات البرنامج أحادي الخيط. في الواقع، لا تزال معظم تحويلات البرامج أحادية الخيط مسموحة، لأن أي برنامج يتصرف بشكل مختلف نتيجة لذلك يجب أن يُنفذ عملية غير مُعرَّفة. - نهاية الملاحظة]
تجدر الإشارة إلى أن مسودة مواصفات لغة C++ تسمح بإمكانية وجود برامج صحيحة تستخدم عمليات تزامن بترتيب ذاكرة يختلف عن memory_order_seq_cst، وفي هذه الحالة قد ينتج عنها برنامج صحيح، لكن دون ضمان اتساقه التسلسلي. بعبارة أخرى، في لغة C++، بعض البرامج الصحيحة ليست متسقة تسلسليًا. يُعتقد أن هذا النهج يمنح مبرمجي C++ حرية اختيار تنفيذ أسرع للبرنامج على حساب سهولة فهمه وتحليله. [ 9 ]
توجد العديد من النظريات، التي تُقدَّم غالبًا في صورة نماذج ذاكرة، والتي توفر ضمانات اتساق تسلسلي لـ DRF في سياقات مختلفة. وتفرض مقدمات هذه النظريات عادةً قيودًا على كلٍّ من نموذج الذاكرة (وبالتالي على التنفيذ)، وعلى المبرمج أيضًا؛ أي أنه من الشائع وجود برامج لا تستوفي مقدمات النظرية، ولا يمكن ضمان تنفيذها بطريقة متسقة تسلسليًا.
يُوفر نموذج الذاكرة DRF1 [ 10 ] خاصية التناسق (SC) لـ DRF، ويُتيح تحسين نماذج الذاكرة WO (الترتيب الضعيف)، وRCsc ( تناسق التحرير مع العمليات الخاصة المتناسقة تسلسليًا)، وVAX، ونماذج الذاكرة الخالية من تضارب البيانات 0. كما يُوفر نموذج الذاكرة PLpc [ 11 ] خاصية التناسق (SC) لـ DRF، ويُتيح تحسين نماذج الذاكرة TSO ( ترتيب التخزين الكلي )، وPSO، وPC ( تناسق المعالج )، وRCpc (تناسق التحرير مع العمليات الخاصة المتناسقة للمعالج). ويُقدم DRFrlx [ 12 ] مُلخصًا لنظرية التناسق (SC) لـ DRF في وجود الذرات المُرخاة.
أمن الحاسوب
تُسبب العديد من حالات التزامن غير المتوقعة في البرمجيات آثارًا أمنية خطيرة على أجهزة الحاسوب . تسمح هذه الحالات للمهاجم الذي لديه صلاحية الوصول إلى مورد مشترك بالتسبب في خلل في عمل الجهات الأخرى التي تستخدم هذا المورد، مما يؤدي إلى عواقب وخيمة، منها حرمان المستخدم من الخدمة [ 13 ] ورفع مستوى صلاحياته [ 14 ] [ 15 ] .
يتضمن نوع محدد من حالات التزامن التحقق من شرط معين (مثل التحقق من الهوية )، ثم تنفيذ الإجراء بناءً على هذا الشرط، بينما قد تتغير الحالة بين وقت التحقق ووقت الاستخدام . عندما يوجد هذا النوع من الأخطاء في التعليمات البرمجية الحساسة أمنيًا، تنشأ ثغرة أمنية تُسمى خطأ وقت التحقق إلى وقت الاستخدام ( TOCTTOU ).
تُستخدم حالات التزامن المتنافس عمدًا لإنشاء مولدات أرقام عشوائية للأجهزة ووظائف غير قابلة للاستنساخ فعليًا . [ 16 ] يمكن إنشاء وظائف غير قابلة للاستنساخ فعليًا (PUFs) من خلال تصميم طوبولوجيات دوائر ذات مسارات متطابقة إلى عقدة، والاعتماد على اختلافات التصنيع لتحديد المسارات التي ستكتمل أولًا بشكل عشوائي. [ 17 ] من خلال قياس مجموعة نتائج حالات التزامن المتنافس الخاصة بكل دائرة مصنعة، يمكن جمع ملف تعريف لكل دائرة وحفظه سرًا للتحقق من هوية الدائرة لاحقًا.
أنظمة الملفات
قد تتعارض محاولات برنامجين أو أكثر لتعديل نظام الملفات أو الوصول إليه، مما قد يؤدي إلى تلف البيانات أو رفع مستوى الصلاحيات. [ 14 ] يُعدّ قفل الملفات حلاً شائع الاستخدام. أما الحل الأكثر تعقيدًا فيتمثل في تنظيم النظام بحيث يكون لعملية واحدة (تشغل برنامجًا خفيًا أو ما شابه) حق الوصول الحصري إلى الملف، وتقتصر جميع العمليات الأخرى التي تحتاج إلى الوصول إلى البيانات في ذلك الملف على التواصل بين العمليات مع تلك العملية فقط. ويتطلب هذا مزامنة على مستوى العمليات.
يوجد شكل مختلف من حالات التزامن في أنظمة الملفات، حيث قد تؤثر البرامج غير المترابطة على بعضها البعض من خلال استهلاكها المفاجئ للموارد المتاحة، مثل مساحة القرص أو الذاكرة أو دورات المعالج. وقد يصبح البرنامج غير المصمم بعناية لتوقع هذه الحالة والتعامل معها غير قابل للتنبؤ. قد يتم تجاهل هذا الخطر لفترة طويلة في نظام يبدو موثوقًا للغاية. ولكن في النهاية، قد تتراكم بيانات كافية أو تُضاف برامج أخرى كافية لزعزعة استقرار أجزاء كثيرة من النظام بشكل خطير. حدث مثال على ذلك مع مركبة المريخ الجوالة "سبيريت" التي كادت أن تُفقد بعد هبوطها بفترة وجيزة، وذلك بسبب حذف بعض الملفات مما أدى إلى استهلاك مكتبة نظام الملفات لجميع مساحة الذاكرة المتاحة. [ 18 ] يتمثل أحد الحلول في أن يطلب البرنامج ويحجز جميع الموارد التي سيحتاجها قبل بدء أي مهمة؛ فإذا فشل هذا الطلب، يتم تأجيل المهمة، مما يتجنب نقاط الفشل العديدة المحتملة. بدلاً من ذلك، يمكن تجهيز كل نقطة من هذه النقاط بآلية لمعالجة الأخطاء، أو يمكن التحقق من نجاح المهمة بأكملها بعد ذلك، قبل المتابعة. أما النهج الأكثر شيوعًا فهو ببساطة التحقق من توفر موارد كافية في النظام قبل بدء أي مهمة. ومع ذلك، قد لا يكون هذا كافياً لأنه في الأنظمة المعقدة، يمكن أن تكون تصرفات البرامج الأخرى قيد التشغيل غير متوقعة.
التواصل
في مجال الشبكات، لنأخذ مثالاً على ذلك شبكة دردشة موزعة مثل IRC ، حيث يحصل المستخدم الذي يبدأ قناة تلقائيًا على صلاحيات مدير القناة. إذا حاول مستخدمان على خادمين مختلفين، على طرفي نفس الشبكة، بدء قناة تحمل نفس الاسم في نفس الوقت، فسيمنح خادم كل مستخدم صلاحيات مدير القناة له، نظرًا لأن أيًا من الخادمين لم يتلقَّ بعد إشارة من الخادم الآخر تفيد بتخصيصه لتلك القناة. (وقد تم حل هذه المشكلة إلى حد كبير من خلال العديد من تطبيقات خادم IRC).
في حالة التزامن هذه، يشمل مفهوم المورد المشترك حالة الشبكة (القنوات الموجودة، والمستخدمين الذين أنشأوها، وبالتالي صلاحياتهم)، والتي يمكن لكل خادم تغييرها بحرية طالما أنه يُبلغ الخوادم الأخرى على الشبكة بهذه التغييرات لتحديث فهمها لحالة الشبكة. مع ذلك، فإن زمن الاستجابة عبر الشبكة يُتيح حدوث هذا النوع من التزامن. في هذه الحالة، فإن تجنب التزامن عن طريق فرض شكل من أشكال التحكم في الوصول إلى المورد المشترك - على سبيل المثال، تعيين خادم واحد للتحكم في صلاحيات المستخدمين - سيؤدي إلى تحويل الشبكة الموزعة إلى شبكة مركزية (على الأقل بالنسبة لهذا الجزء من تشغيل الشبكة).
يمكن أن تحدث حالات التزامن أيضًا عندما تتم كتابة برنامج كمبيوتر باستخدام مقابس غير مانعة ، وفي هذه الحالة يمكن أن يعتمد أداء البرنامج على سرعة وصلة الشبكة.
الأنظمة الحيوية
قد تكون عيوب البرمجيات في الأنظمة الحيوية كارثية. ومن بين هذه العيوب، كانت حالات التزامن غير المتزامن في جهاز العلاج الإشعاعي Therac-25 ، مما أدى إلى وفاة ثلاثة مرضى على الأقل وإصابة عدد آخر. [ 19 ]
مثال آخر هو نظام إدارة الطاقة الذي توفره شركة جنرال إلكتريك للطاقة وتستخدمه شركة فيرست إنرجي كورب (التي تتخذ من ولاية أوهايو مقرًا لها ، إلى جانب محطات توليد طاقة أخرى). كان هناك خلل برمجي في نظام الإنذار الفرعي؛ فعندما تعطلت ثلاثة خطوط كهرباء متدلية في وقت واحد، منع هذا الخلل إرسال التنبيهات إلى فنيي المراقبة، مما أدى إلى تأخير إدراكهم للمشكلة. أدى هذا الخلل البرمجي في النهاية إلى انقطاع التيار الكهربائي في أمريكا الشمالية عام 2003. [ 20 ] وقد طورت شركة جنرال إلكتريك للطاقة لاحقًا تحديثًا برمجيًا لتصحيح هذا الخطأ الذي لم يكن مكتشفًا سابقًا.
أدوات
توجد العديد من أدوات البرمجيات للمساعدة في اكتشاف حالات التزامن غير المتوقعة في البرمجيات. ويمكن تصنيفها بشكل عام إلى مجموعتين: أدوات التحليل الثابت وأدوات التحليل الديناميكي .
تحليل أمان الخيوط هو أداة تحليل ثابتة للتحليل الثابت داخل الإجراءات القائم على التعليقات التوضيحية، تم تنفيذه في الأصل كفرع من gcc، وأعيد تنفيذه الآن في Clang ، ويدعم PThreads. [ 21 ]
تشمل أدوات التحليل الديناميكي ما يلي:
- Intel Inspector ، أداة فحص وتصحيح الذاكرة والخيوط لزيادة الموثوقية والأمان والدقة لتطبيقات C/C++ و Fortran؛ Intel Advisor ، أداة مساعدة في تحسين متجه SIMD القائم على أخذ العينات وخيوط الذاكرة المشتركة لمطوري ومهندسي برامج C و C++ و C# و Fortran؛
- يستخدم ThreadSanitizer أدوات تحليل ثنائية ( مبنية على Valgrind ) أو مصدرية مبنية على LLVM ، ويدعم PThreads؛ [ 22 ] وHelgrind، وهي أداة Valgrind لاكتشاف أخطاء التزامن في برامج C وC++ وFortran التي تستخدم بدائيات POSIX pthreads للخيوط. [ 23 ]
- تم تصميم Data Race Detector [ 24 ] للعثور على حالات تضارب البيانات في لغة البرمجة Go.
توجد العديد من المعايير المصممة لتقييم فعالية أدوات الكشف عن تضارب البيانات
في مناطق أخرى
تُعدّ حالات التزامن المتنافس مصدر قلق شائع في تصميم التفاعل بين الإنسان والحاسوب وسهولة استخدام البرمجيات . تتطلب واجهات التفاعل بين الإنسان والآلة المصممة بشكل بديهي أن يتلقى المستخدم ردود فعل على أفعاله تتوافق مع توقعاته، ولكن قد تقاطع الإجراءات التي يُنشئها النظام عمل المستخدم الحالي أو سير عمله بطرق غير متوقعة، مثل الرد عن غير قصد على مكالمة واردة على الهاتف الذكي أو رفضها أثناء أداء مهمة أخرى.
في أنظمة إشارات السكك الحديدية البريطانية ، قد تنشأ حالة تضارب في الإشارات عند تطبيق القاعدة 55. تنص هذه القاعدة على أنه إذا توقف قطار على خط سير بسبب إشارة، يتوجه مساعد سائق القاطرة إلى غرفة الإشارات لتذكير عامل الإشارات بوجود القطار. وفي حالة واحدة على الأقل، في وينويك عام 1934، وقع حادث لأن عامل الإشارات استقبل قطارًا آخر قبل وصول مساعد السائق. أما في أنظمة الإشارات الحديثة، فتُزال حالة التضارب هذه بتمكين السائق من الاتصال الفوري بغرفة الإشارات عبر الراديو.
لا تقتصر حالات التنافس على الأنظمة الرقمية فحسب، بل يُظهر علم الأعصاب أن هذه الحالات قد تحدث في أدمغة الثدييات أيضًا. ومن الأمثلة على ذلك التنافس بين المسارات العصبية التي تُنفذ الحركة المخططة والمسارات الأخرى التي قد تُلغي هذه الحركة. [ 26 ] [ 27 ]
انظر أيضاً
مراجع
- ↑ هوفمان، ديفيد أ. " تركيب دوائر التبديل التسلسلي. " (1954).
- ↑ أونغر، إس إتش (يونيو 1995). "المخاطر، والسباقات الحرجة، وعدم الاستقرار" . معاملات IEEE في مجال الحوسبة . 44 (6): 754-768 . doi : 10.1109/12.391185 .
- ↑ "ISO/IEC 9899:2011 - تكنولوجيا المعلومات - لغات البرمجة - C" . Iso.org . تم الاطلاع عليه بتاريخ 30 يناير 2018 .
- ↑ "ISO/IEC 14882:2011" . المنظمة الدولية للمقاييس. 2 سبتمبر 2011. تم الاطلاع عليه في 3 سبتمبر 2011 .
- ↑ ريغير، جون (13 مارس 2011). "الوضع العرقي مقابل سباق البيانات" . مُدمج في الأوساط الأكاديمية .
- ↑ "مسودة عمل، معيار للغة البرمجة C++" (PDF) . 2014-11-19.
- ↑ أدفي، ساريتا وهيل، مارك وميلر، بارتون ونتزر، روبرت. (1991). اكتشاف تضارب البيانات في أنظمة الذاكرة الضعيفة . أخبار هندسة الحاسوب من ACM SIGARCH. 19. 234–243. 10.1109/ISCA.1991.1021616.
- 1 2 3 "الفصل 17. الخيوط والأقفال" . docs.oracle.com .
- 1 2 أدفي، ساريتا ف.؛ بوهم، هانز-ج. (2010). "دلالات المتغيرات المشتركة والتزامن (المعروفة أيضًا باسم نماذج الذاكرة)" (PDF) .
- ↑ أدفي، ساريتا (ديسمبر 1993). تصميم نماذج اتساق الذاكرة للمعالجات المتعددة ذات الذاكرة المشتركة (ملف PDF) (أطروحة دكتوراه). مؤرشف (ملف PDF) من الأصل بتاريخ 9 ديسمبر 2021. تم الاطلاع عليه بتاريخ 9 ديسمبر 2021 .
- ↑ كورش غاراشورلو وساريتا ف. أدفي وأنوب غوبتا وجون ل. هينيسي ومارك د. هيل، البرمجة لنماذج اتساق الذاكرة المختلفة ، مجلة الحوسبة المتوازية والموزعة، 1992، المجلد 15، الصفحات 399-407.
- ↑ سينكلير، ماثيو ديفيد (2017). "الفصل 3: الدعم الفعال وتقييم الذرات المرنة" (ملف PDF) . التماسك والاتساق الفعالان لتسلسلات الذاكرة المتخصصة (أطروحة دكتوراه). جامعة إلينوي في أوربانا-شامبين.
- ↑ "CVE-2015-8461: قد تؤدي حالة التزامن عند معالجة أخطاء المقابس إلى فشل التأكيد في resolver.c" . اتحاد أنظمة الإنترنت . مؤرشف من الأصل في 9 يونيو 2016. تم الاطلاع عليه في 5 يونيو 2017 .
- 1 2 "ثغرة أمنية في الدالتين rmtree() و remove_tree(): CVE-2017-6512" . CPAN . تم الاطلاع عليه في 5 يونيو 2017 .
- ↑ "الأمان: ذاكرة التخزين المؤقت للإحصائيات *كبيرة جدًا* حالة تنافس في حالة التخزين المؤقت عند تعطيل follow_symlink" . lighttpd . تم الاسترجاع في 5 يونيو 2017 .
- ↑ كوليسا، أدريان؛ تودوران، رادو؛ بانيسكو، سيباستيان (2008). "توليد الأرقام العشوائية البرمجية بناءً على شروط التزامن". المؤتمر الدولي العاشر لعام 2008 حول الخوارزميات الرمزية والرقمية للحوسبة العلمية . الصفحات 439-444 . doi : 10.1109/synasc.2008.36 . ISBN 978-0-7695-3523-4. S2CID 1586029 .
- ↑ باور، تود؛ هاملت، جيسون (نوفمبر 2014). "الوظائف المادية غير القابلة للاستنساخ: مدخل تمهيدي" . مجلة IEEE للأمن والخصوصية . 12 (6): 97-101 . doi : 10.1109/MSP.2014.123 . ISSN 1558-4046 .
- ↑ ريفز، جلين إي؛ نيلسون، تريسي (2005). شذوذ فلاش مركبة المريخ الجوالة سبيريت (ملف PDF) . مؤتمر IEEE للفضاء الجوي 2005. IEEE. الصفحات 4186-4199 . doi : 10.1109/aero.2005.1559723 . ISBN 0-7803-8870-4ISSN 1095-323X
- ↑ ليفيسون، نانسي؛ تيرنر، كلارك س. "تحقيق في حوادث ثيراك-25 - الجزء الأول" . Courses.cs.vt.edu. مؤرشف من الأصل بتاريخ 15-12-2017.
- ↑ بولسن، كيفن (2004-04-07). "تتبع ثغرة انقطاع التيار الكهربائي" . سكيورتي فوكس . تم الاسترجاع في 2011-09-19 .
- ↑ "تحليل أمان الخيوط - وثائق Clang 10" . clang.llvm.org .
- ↑ "ThreadSanitizer – Clang 10 documentation" . clang.llvm.org .
- ↑ "هيلغريند: كاشف أخطاء الخيوط" . فالغريند .
- ^ "كاشف سباق البيانات" . جولانج .
- ↑ "مجموعة معايير سباق البيانات" . 25 يوليو 2019 - عبر GitHub.
- ↑ "كيف تتسابق الأدمغة لإلغاء الحركات الخاطئة" . نيوروسكبتيك . مجلة ديسكفر. 3 أغسطس 2013. مؤرشف من الأصل في 6 أغسطس 2013. تم الاطلاع عليه في 7 أغسطس 2013 .
- ↑ شميدت، روبرت؛ ليفينثال، دانيال ك؛ ماليت، نيكولاس؛ تشين، فوجون؛ بيرك، جوشوا د (2013). "إلغاء الأفعال ينطوي على سباق بين مسارات العقد القاعدية" . مجلة نيتشر لعلم الأعصاب . 16 (8): 1118-1124 . doi : 10.1038/nn.3456 . PMC 3733500. PMID 23852117 .
روابط خارجية
- كرم، جي إم؛ بوهر، آر جيه إيه (أغسطس 1990). "محللات المجاعة والسباق الحرج للغة آدا". معاملات IEEE في هندسة البرمجيات . 16 (8): 829-843 . doi : 10.1109/32.57622 .
- فوهرر، آر إم؛ لين، بي؛ ناوك، إس إم (مارس 1995). "خوارزميات لتخصيص الحالة الأمثل لآلات الحالة غير المتزامنة". وقائع المؤتمر السادس عشر للبحوث المتقدمة في VLSI، 1995. الصفحات 59-75. doi : 10.1109 / ARVLSI.1995.515611 . ISBN 978-0-8186-7047-3. S2CID 4435912 . تمت أرشفة الملف بصيغة PDF بتاريخ 10 يونيو 2021 على موقع Wayback Machine .
- ورقة بحثية بعنوان " إطار عمل جديد لحل مشكلة تخصيص الحالة للمواصفات القائمة على الأحداث " من تأليف لوتشيانو لافانيو، تشو دبليو مون، روبرت ك. برايتون ، وألبرتو سانجيوفاني-فينسينتيلي
- ويلر، ديفيد أ. (7 أكتوبر 2004). "المبرمج الآمن: تجنب حالات التزامن - يمكن استغلال التنازع على الموارد ضدك" . IBM developerWorks . مؤرشف من الأصل (PDF) في 1 فبراير 2009.رابط بديل
- الفصل " تجنب حالات التزامن" مؤرشف بتاريخ 2014-03-09 في Wayback Machine " (دليل البرمجة الآمنة لأنظمة Linux و Unix)
- حالات التزامن، والأمان، وعدم قابلية التغيير في لغة جافا ، مع نموذج لشفرة المصدر ومقارنة بشفرة لغة سي، من إنتاج شركة Chiral Software
- كاربوف، أندريه (6 أبريل 2009). "مقابلة مع ديمتري فيوكوف - مؤلف برنامج Relacy Race Detector (RRD)" .
- وصف دعم مايكروسوفت
- حالة السباق مقابل سباق البيانات
- ثغرات أمنية في الحاسوب
- التزامن (علوم الحاسوب)
- مشاكل الحوسبة الموزعة
- البوابات المنطقية
- المنطق في علوم الحاسوب
- أخطاء برمجية
- التوقيت في الدوائر الإلكترونية
- مصطلحات الحاسوب
