تسلسل الرموز
في علوم الحاسوب ، تُعدّ رموز التسلسل مفهومًا في التحكم بالتزامن، نشأ من التطوير المستمر لنظام DragonFly BSD . ووفقًا لماثيو ديلون ، فهي تُشبه إلى حد كبير لغات البرمجة التسلسلية (SPLs )، إلا أن الرمز يعمل عبر وحدات معالجة مركزية متعددة ، بينما تعمل لغات البرمجة التسلسلية ضمن نطاق وحدة معالجة مركزية واحدة فقط.
تتيح عملية تسلسل الرموز للمبرمجين كتابة تعليمات برمجية آمنة للمعالجات المتعددة دون الحاجة إلى أن يكونوا هم أو الأنظمة الفرعية ذات المستوى الأدنى على دراية بكل كيان قد يحمل نفس الرمز.
مقارنة مع الاستبعاد المتبادل (mutex)
تُعدّ الرموز وآليات الاستبعاد المتبادل (mutex) بمثابة أقفال . على عكس الاستبعاد المتبادل، لا تمنع الرموز الخيوط الأخرى من الوصول إلى المورد أثناء حظرها أو سكونها. يمكن إيقاف خيط يشارك الموارد مع خيوط أخرى وإعادة تشغيله لأسباب متنوعة.
- تقسيم الوقت: يحاول جدولة مساحة المستخدم (US) ضمان حصول جميع الخيوط على فرصة عادلة للتشغيل، لذلك يقوم بتشغيل كل خيط لفترة وجيزة من الوقت (شريحة زمنية) ثم ينتقل إلى خيط آخر.
- التنفيذ المتزامن: في أجهزة الكمبيوتر متعددة المعالجات، يمكن تشغيل سلسلة عمليات في نفس الوقت تمامًا مع سلسلة عمليات أخرى على وحدة معالجة مركزية مختلفة.
- الاستباق: قد يقوم أحد الخيوط باستباق خيط ذي أولوية أقل، مثل مقاطعة الأجهزة أو خيوط النواة خفيفة الوزن .
- الحجب الطوعي: قد يتوقف الخيط مؤقتًا إذا كان عليه انتظار شيء ما، أو لم يكن لديه عمل يقوم به، أو استدعى دالة تتسبب في الحجب. حتى استدعاء الحصول على قفل يمكن أن يتسبب في الحجب.
يلخص الجدول التالي خصائص الرموز المميزة والأقفال المتبادلة.
| تسلسل الرموز | التزامن المتبادل | |
|---|---|---|
| تقسيم الوقت | أعمال | أعمال |
| التنفيذ المتزامن | أعمال | أعمال |
| الاستباق | أعمال | أعمال |
| الحجب الطوعي | فشل | أعمال |
| يتجنب الوصول إلى طريق مسدود | نعم | لا |
| يتجنب انعكاس الأولوية | نعم | لا |
قد يكون تجنب مشكلات مثل حالة الجمود وانعكاس الأولوية أمرًا بالغ الصعوبة، ويتطلب تنسيقًا على مستويات عديدة من نواة النظام. ولأن استخدام الرموز المميزة لا يؤدي إلى حالة الجمود، ولا يشترط أن تكون الرموز المميزة المكتسبة ذرية عند حظر العمليات اللاحقة، فإنه يسمح بكتابة شيفرة أبسط بكثير من استخدام الأقفال المتبادلة.
إذا نظرت إلى نظام FreeBSD-5، ستلاحظ أنه يمرر الأقفال المحجوزة عبر مكدس الإجراءات الفرعية بشكل متكرر، وذلك للسماح لمستوى إجرائي عميق بتحرير القفل مؤقتًا من أجل التبديل أو الحظر أو معالجة حالة الجمود. ونتيجةً لذلك، يُعاني نظام FreeBSD-5 من تلوث برمجي كبير (حيث يجب تزويد بعض الإجراءات بمعلومات عن الأقفال المحجوزة من قبل إجراءات أخرى غير ذات صلة لكي تعمل بشكل صحيح).
— ماثيو ديلون
مثال
توضح الشفرة الزائفة والشروحات التالية كيفية عمل عملية تسلسل الرموز.
| الخيط أ | الخيط ب | فعل |
|---|---|---|
lwkt_gettoken(T1); iter = list1.head; | ... lwkt_gettoken(T1); // كتل // في انتظار الرمز المميز T1 | يحصل A على الرمز المميز T1 ويستخدمه للحصول على وصول متزامن إلى القائمة list1، والتي يتم مشاركتها بين كلا الخيطين. |
lwkt_gettoken(T2); // كتل | // في انتظار الرمز المميز T1 | استدعاء A للدالة lwkt_gettoken(T2) هو دالة حظر، لذا يدخل A في حالة سكون مؤقت ويفقد رموزه مؤقتًا. سيتم إيقاظه عندما يرى المجدول أن كلاً من T1 و T2 متاحان. |
// في انتظار T1 و T2 | list1.head = list1.head.next; lwkt_releasetoken(T1); | يستحوذ B على T1 ويعدل القائمة list1. لاحظ أن "iter" الخاص بـ A لا يزال يشير إلى رأس القائمة القديم. |
// الحصول على الإصدار الجديد من رأس الصفحة: iter = list1.head; // إنشاء قائمة جديدة: بينما (التكرار != فارغ) { list2.tail = iter; iter = iter.next; } lwkt_releasetoken(T1); lwkt_releasetoken(T2); | يلاحظ المجدول توفر كل من T1 و T2، فيُفعّل الخيط A. وبما أن A مُبرمج بشكل صحيح، فإنه يُحدّث مُكرِّره برأس القائمة list1 الجديد، ويُجري عليه بعض العمليات غير المُعطِّلة. تجدر الإشارة إلى أنه كان من الأفضل أن يطلب A كلا الرمزين في البداية. |
الفن السابق في نواة داروين
تستخدم نواة داروين الخاصة بنظام التشغيل Mac OS X تقنية مماثلة (تسمى القمع ) لتسلسل الوصول إلى جزء BSD من النواة.
انظر أيضاً
مراجع
- سلسلة رسائل بريدية يشرح فيها ماثيو ديلون الرموز بتفصيل كبير. مؤرشفة بتاريخ 30 يونيو 2024 على موقع Wayback Machine.
- هندسة داروين المترابطة
- التحكم في التزامن
