يوفّر إطار عمل جدولة جودة الخدمة (QoS) في المركبات المحدّدة بالبرامج تخصيصًا حتميًا لموارد وحدة المعالجة المركزية (CPU) لحِزم الخدمات التي يديرها تطبيق Lifecycle Manager (LM). ومن خلال تجريد سمات جدولة Linux المنخفضة المستوى (السياسة والأولوية واللطف) إلى إعدادات مسبقة منطقية، تتيح المنصة فصلًا واضحًا بين تطوير الخدمات وضبط النظام على مستوى المركبة. ويساعد ذلك في توفير معدل نقل بيانات ضروري للحوسبة لأحمال العمل الحساسة للوقت والمهمة للسلامة، بينما يقيّد النظام المهام التي تعمل في الخلفية لمنع عدم الاستقرار.
الأدوار والمسؤوليات
يتّبع نموذج جدولة SDV نمط المسؤولية المفوضة للمساعدة في ضمان بقاء الخدمات قابلة للنقل مع السماح لمصنّع المعدات الأصلية بضبط النظام.
| الدور | المسؤولية | النتائج الرئيسية |
|---|---|---|
| منصّة المركبات المحدّدة البرامج (Google) | تحدّد مخطط sdv_service_bundles_scheduling.proto، وتنفّذ منطق فرض LM، وتوفّر مكتبة برامج sdv_service_bundles_scheduling. |
تعريفات Protobuf ومكتبات النظام الأساسي |
| المصنّع الأصلي للجهاز (مُدمِج الأنظمة) | تحدّد هذه السمة القيم المحدّدة لكل إعداد مُسبَق، مثل ما تعنيه ELEVATED على أجهزة معيّنة، وتتحكّم في الإعداد على مستوى النظام. |
/product/etc/lifecycle_config.textproto |
| مطوّر الخدمات | يختار اسم الإعداد المُسبَق المنطقي المناسب ويسجّل المسار scheduling_config.textproto في بيان حزمة الخدمة. |
scheduling_config.textproto وsdv_service_bundles_manifest.textproto |
سير العمل الفني
- دمج النظام الأساسي: يحدّد المصنّع الأصلي للجهاز
lifecycle_config.textprotoالخاص بالمركبة. ينشئ هذا الملف ملفات شخصية (إعدادات مُسبقة) للجدولة على مستوى النظام ويربطها بسمات جدولة Linux المحدّدة استنادًا إلى الأجهزة المستهدَفة. - تطوير حِزمة الخدمات: يجمّع المطوّر
scheduling_config.textprotoضِمن حِزمة APEX، ويقترح إعدادًا مسبقًا منطقيًا (مثلELEVATED) ويحدّد أي أسماء سلاسل محادثات داخلية. - دمج حِزم الخدمات: أثناء مرحلة دمج المركبة، يراجع المصنّع الأصلي للجهاز الإعداد المُسبَق الذي اقترحه المطوّر. ويمكن للمصنّع الأصلي للجهاز الاحتفاظ بالملف الشخصي المقترَح أو إلغاء الإعدادات التلقائية، مثل خفض مستوى خدمة
ELEVATEDإلىNORMAL، لتحسين ثبات النظام بشكل عام قبل توقيع حزمة APEX. - حلّ سمات وقت التشغيل: عند بدء تشغيل إحدى الخدمات، يحدّد "مدير الأجهزة" الإعداد المُسبَق المصرّح به من بيان الخدمة ويسترد سمات Linux المقابلة من إعدادات النظام الخاصة بمصنّع المعدات الأصلية.
- المزامنة والتنفيذ عند بدء التشغيل: يطبّق "مدير الترخيص" السمات التي تم تحديدها على عملية الخدمة قبل الإشارة إليها لمواصلة التنفيذ باستخدام بروتوكول الإشارة والمتابعة.
المفاهيم الأساسية
المفاهيم التالية أساسية لإطار عمل تحديد المواعيد في SDV.
إعدادات الجدولة المُسبقة
تُعدّ الإعدادات المُسبقة للجدولة الآلية هي الآلية الأساسية لإدارة جودة الخدمة في SDV. وبدلاً من تحديد مَعلمات الجدولة الأولية في Linux، يشير المطوّرون إلى الإعدادات المُسبقة المحدّدة مسبقًا بالاسم. وفي وقت التشغيل، تربط "إدارة الأجهزة" هذه الأسماء المنطقية بسمات الجدولة المحدّدة في Linux.
الإعدادات المُسبَقة التالية التي تم ضبطها كمثال في lifecycle_config.textproto:
| اسم الإعداد المسبق | سياسة الجدولة | قيمة Nice العادية | حالة الاستخدام النموذجية |
|---|---|---|---|
NORMAL |
SCHED_OTHER |
0 |
الخدمات الأساسية (التدفئة والتهوية وتكييف الهواء والوسائط والإعدادات) |
ELEVATED |
SCHED_OTHER |
-10 |
مكوّنات النظام الأساسية والبنية التحتية |
IDLE |
SCHED_IDLE |
19 |
إحصاءات الخلفية وتسجيل البيانات غير المهمة |
CUSTOM |
محدّد من المستخدم | -20 (الأولي) |
الخدمات التي تتطلّب سياسات أو تقاربًا في الوقت الفعلي |
عند تطبيق إعداد مُسبَق، تستخدم "إدارة الترخيص" طلب النظام setpriority لضبط قيمة nice على مستوى العملية. يؤثر ذلك في حصة وحدة المعالجة المركزية (CPU) النسبية التي تتلقّاها العملية أثناء التنازع بموجب برنامج Completely Fair Scheduler (CFS) التلقائي في نظام التشغيل Linux.
الامتيازات والأمان
لمنع تصعيد الأولوية غير المصرّح به، تستخدم منصة SDV نموذج أمان متدرّجًا يستند إلى نطاقات SELinux وإمكانات Linux.
نطاقات الأمان
untrusted_service_bundle: النطاق التلقائي للإعدادات المسبقة العادية (NORMALوELEVATEDوIDLE). يقيّد النواة العمليات في هذا النطاق، ما يمنعها من تغيير مَعلمات الجدولة الخاصة بها.-
priority_service_bundle: يتم منحها لأي حزمة خدمات تستخدم إعدادًا مُسبقًا تم فيه ضبطis_privileged: trueفيlifecycle_config.textprotoعلى مستوى النظام. ويؤدي الانتقال إلى هذا النطاق إلى منح العملية إمكانيةCAP_SYS_NICE، ما يتيح لها إدارة عملية تخصيص الموارد الخاصة بها.
إمكانية CAP_SYS_NICE
تمنح المنصة إذن الوصول إلى إمكانية CAP_SYS_NICE للعمليات في النطاق priority_service_bundle. يسمح هذا الإذن لأي عملية بتنفيذ ما يلي:
- رفع قيمة
niceالخاصة به إلى ما هو أبعد من التعيين الأوّلي - غيِّر سياسة الجدولة إلى صفوف في الوقت الفعلي، مثل
SCHED_FIFOأوSCHED_RR. - اضبط تقارب وحدة المعالجة المركزية باستخدام
sched_setaffinity. - ضبط مَعلمات الموعد النهائي المتخصّصة في
SCHED_DEADLINE
يؤدي حصر هذه الإمكانية بنطاق مخصّص إلى الحفاظ على توازن الجدولة على مستوى النظام من خلال الحدّ من الانقطاعات في الخدمات المسموح بها بشكلٍ صريح.
دليل الإعداد
يقدّم هذا القسم إرشادات حول الإعداد لكلّ من الشركات المصنّعة للمعدات الأصلية ومطوّري الخدمات.
دليل المصنّع الأصلي للجهاز: الإعدادات المُسبَقة على مستوى النظام
يحدد المصنّع الأصلي للجهاز ملفات تعريف الجدولة في /product/etc/lifecycle_config.textproto. يقدّم النظام الأساسي مثالاً في lifecycle_management/config/lifecycle_config.textproto يُتوقّع من المصنّعين الأصليين للجهاز تعديله استنادًا إلى أجهزة السيارة.
مثال: تحديد إعداد مُسبَق في الوقت الفعلي
يمكن أن تحدّد الشركة المصنّعة للجهاز إعدادًا مُسبقًا CRITICAL للخدمات المتعلّقة بالسلامة والتي يجب ألا يتم إيقافها مؤقتًا من قِبل التطبيقات العادية:
# lifecycle_config.textproto
scheduling_presets {
name: "CRITICAL"
is_privileged: true
thread_scheduling_configuration {
policy: 1 # SCHED_FIFO
priority: 80 # High real-time priority
}
}
دليل المطوّرين: إعداد حِزم الخدمات
ينصح مطوّرو الخدمات باستخدام إعداد مُسبَق وتحديد أسماء سلاسل محادثات منطقية اختياريًا في ملف scheduling_config.textproto. لكي يتمكّن النظام الأساسي من العثور على هذا الملف، يجب تسجيل مساره في sdv_service_bundles_manifest.textproto.
مثال: تسجيل ملف البيان
# sdv_service_bundles_manifest.textproto
service_bundle_entries {
name: "SensorService"
scheduling_config_path: "configs/scheduling_config.textproto"
}
مثال: استخدام إعداد مسبق عادي
بالنسبة إلى معظم الخدمات، يكفي الإشارة إلى اسم مُعدّ مسبقًا في scheduling_config.textproto:
# configs/scheduling_config.textproto
scheduling_preset_name: "ELEVATED"
مثال: تحديد موعد لتنفيذ سلاسل عاملة تم إنشاؤها بواسطة الخدمة
يمكن لمطوّر خدمة إنشاء سلاسل الوحدات العاملة (worker thread) إضافية في الرمز البرمجي للتعامل مع مهام متخصصة، مثل حلقة بيانات جهاز الاستشعار بزمن انتقال منخفض. يمكن للمطوّر تحديد سمات جدولة مسماة لهذه سلاسل المحادثات الداخلية في ملف الإعداد.
استخدِم التطبيق اليدوي فقط في الخدمات المميّزة التي تستخدم هذه البيانات الوصفية لضبط خصائص سلاسل العامل الداخلية:
# configs/scheduling_config.textproto
scheduling_preset_name: "CUSTOM"
# Map of logical thread names to their attributes (propagated as metadata)
thread_scheduling_configuration {
key: "sensor-processing-thread"
value {
policy: 1 # SCHED_FIFO
priority: 50
cpu_affinity_ids: [2, 3] # Pin to specific cores
}
}
سلوك النظام وإجراءات التنفيذ
تستخدم منصة SDV نموذجًا صارمًا للتنفيذ لتفعيل إعدادات الجدولة قبل تشغيل أي رمز خاص بالخدمة.
مزامنة بدء التشغيل
لمنع تشغيل خدمة بأولوية غير صحيحة (حتى أثناء مرحلة الإعداد)، يستخدم كلّ من LM وService Bundle Runner (SBR) بروتوكول مزامنة الإشارة والمتابعة:
- إنشاء العملية: ينشئ LM نسخة من عملية SBR. في هذه المرحلة، تكون عملية SBR الفرعية قيد التشغيل ولكنها تدخل على الفور في حالة محظورة، في انتظار إشارة على
stdin. - تطبيق السمة: عندما يكون الطفل محظورًا، تستخدم "إدارة الوصول" طلب النظام
setpriorityلتطبيق القيمةniceالمطلوبة وتضبط سياسة الجدولة (مثلSCHED_IDLE). - عملية الانتقال إلى وضع الأمان: ينفّذ LM عملية الانتقال إلى نطاق SELinux، وينقل العملية الفرعية إلى النطاق
untrusted_service_bundleأوpriority_service_bundle. - الإشارة: بعد تطبيق جميع المَعلمات بنجاح، يرسل "مدير الترخيص" إشارة مكوّنة من بايت واحد إلى
stdinالخاص بالطفل. - التنفيذ: يتلقّى SBR الإشارة ويبدأ في تحميل مكتبات الخدمة واستدعاء طرق مراحل النشاط.
التأثير في سلسلة التعليمات الرئيسية ودورة الحياة
من خلال المزامنة قبل تحميل مكتبات الخدمة، تحافظ المنصة على الأولوية المطلوبة لسلسلة التنفيذ الرئيسية في جميع عمليات معاودة الاتصال بدورة الحياة:
onCreate: يتم تنفيذ جميع عمليات إدخال التبعية وتخصيص الموارد الأولي بالأولوية الصحيحة.-
onStart: يتحكّم الإعداد المُسبَق في الانتقال إلى الحالة النشطة وأي حلقات عمل أولية. onStopوonDestroy: تنفّذ المنصة عمليات تنظيف بالأولوية نفسها لمنع حرمان أنشطة النظام المهمة من الموارد أثناء إيقاف التشغيل.
مجموعة سلاسل Binder وأولوية التوريث
لا تنفّذ سلاسل المحادثات في مجموعة سلاسل محادثات Binder التي تديرها المنصة العمل بأولوية سلسلة المحادثات التي أنشأت المجموعة. بدلاً من ذلك، بالنسبة إلى المعاملات المتزامنة، يرث مؤشر ترابط الخادم أولوية المتصل. يتحكّم برنامج تشغيل نواة Binder في آلية توريث الأولوية هذه.
الضبط الدقيق على مستوى سلسلة المحادثات
يجب أن تطبّق حِزم الخدمات التي تتطلّب تحكّمًا دقيقًا (مثل حلقات المعالجة في الوقت الفعلي) عمليات الضبط يدويًا على سلاسل العاملين. اتّبِع الخطوات التالية لتطبيق عمليات الضبط على مستوى السلسلة:
- طلب إعداد مُسبَق بامتيازات (حيث يتم ضبط
is_privileged: true). - استخدِم الدالة
get_scheduling_configurationمن مكتبةsdv_service_bundles_schedulingلقراءةthread_scheduling_configuration. - طبِّق السمات على سلاسل العامل باستخدام
sched_setattr.
SELinux وإنفاذ القدرات
تستخدم المنصة SELinux وCAP_SYS_NICE Linux لفرض إعدادات مسبقة للجدولة:
- بالنسبة إلى الخدمات التي تستخدم إعدادات مُسبقة مثل
NORMALأوIDLE، يتم ضبط الجدولة من قِبل "مدير الربط" أثناء بدء التشغيل. ولا تتضمّن هذه الخدمات إمكانيةCAP_SYS_NICEولا يمكنها تغيير أولويتها أو سياستها. - يتم منح الخدمات التي تستخدم إعدادًا مسبقًا ذا امتيازات (
is_privileged: true) إمكانيةCAP_SYS_NICE، ما يتيح لها التحكّم يدويًا في جدولة سلاسل التعليمات البرمجية الداخلية، حسب ما هو مطلوب للمهام في الوقت الفعلي.
التحقّق من صحة المعلومات والأمثلة
يتطلّب التحقّق من سلوك الجدولة مزيجًا من تحليل السجلّ وقياس الأداء على مستوى النظام. توفّر منصة SDV نموذجًا مخصّصًا لتوضيح هذه الأساليب.
مثال على جدولة جودة الخدمة
يقع هذا النموذج في samples/qos_scheduling، ويتضمّن العديد من خدمات اختبار الأداء المصمّمة للعمل بالتوازي والإبلاغ عن مستوى تقدّمها.
-
PerformanceTesterNormal: يتم تشغيلها باستخدام الإعداد المُسبَقNORMAL. -
PerformanceTesterElevated: يتم تشغيلها باستخدام الإعداد المُسبَقELEVATED. -
PerformanceTesterRealtime: تستخدم الإعداد المُسبَقCUSTOMلتطبيقSCHED_FIFOعلى سلاسل العامل الداخلية. PolicyOffender: هي خدمة تشخيص تحاول ضبط أولوية في الوقت الفعلي أثناء استخدام إعداد مسبقNORMAL. يتم استخدام ذلك للتأكّد من أنّ النظام الأساسي يحظر التصعيد غير المصرَّح به بنجاح.
تشغيل حزمة أدوات التحقّق
فعِّل إعداد التنسيق الخاص بجودة الخدمة:
adb shell setprop persist.sdv.orchestrator_config_path /etc/orch/vm_qos_scheduling_orch_config.textprotoأعِد تشغيل الجهاز لبدء الخدمات في نطاقات الجدولة الخاصة بها:
adb rebootفلتر السجلات للاطّلاع على نتائج الأداء المقارن:
adb logcat | grep sdv_sample_qos_commonتسجّل خدمة
PerformanceTesterElevatedعددًا أكبر بكثير من وحدات العمل المكتملة مقارنةً بخدمةPerformanceTesterNormal. يتم تضمين أخطاء الرفضEPERMأو SELinux في سجلّات خدمةPolicyOffender.
التوافق مع الأنظمة القديمة
- لضمان التوافق مع الإصدارات القديمة، يتم تلقائيًا التعامل مع أي حِزمة خدمة قديمة تحدّد
scheduling_config_pathفي ملف البيان ولكنها لا تحدّدscheduling_preset_nameفي ملف الإعداد على أنّها خدمة ذات امتيازات، ما يحافظ على الإمكانات اللازمة (مثلCAP_SYS_NICE) للخدمات القديمة التي تعتمد على الضبط اليدوي لسلسلة التعليمات البرمجية. - من المقرّر إعادة تسمية رسالة الإعدادات الجذرية
DeadlineSchedulingConfigurationفي إصدار مستقبلي. الاسم الحالي قديم ولم يعُد يعكس بدقة أنّ الرسالة تعالج جميع أنواع الجدولة، وليس فقط جدولة المواعيد النهائية.