يستخدم الإصدار 10 من Android والإصدارات الأحدث مجموعة تحكّم (cgroup) لطبقة التجريد مع ملفات تعريف المهام، والتي يمكن للمطوّرين استخدامها لوصف مجموعة (أو مجموعات) من القيود لتطبيقها على سلسلة محادثات أو عملية. سيقوم النظام بعد ذلك يتبع الإجراءات المحددة للملفات الشخصية للمهام لتحديد واحد أو أكثر المناسبة، والتي يتم من خلالها تطبيق القيود، والتغييرات في يمكن إنشاء مجموعة ميزات مجموعة مشتركة بدون التأثير في البرامج الأعلى والطبقات.
لمحة عن مجموعات المشتركين
توفر مجموعات Cgroups آلية لتجميع مجموعات المهام وتقسيمها (التي تتكون من العمليات وسلاسل المحادثات وجميع عناصرها الثانوية المستقبلية) في مجموعات هرمية ذو سلوك متخصص. يستخدم Android مجموعات التحكّم في البيانات للتحكّم في موارد النظام مثل وحدة المعالجة المركزية (CPU) واستخدام الذاكرة وتخصيصها، مع دعم الإصدار 1 من نواة Linux والإصدار 2 من cgroups.
الإصدار 9 من نظام Android والإصدارات الأقدم
في الإصدار 9 من Android والإصدارات الأقدم، كان نص إعداد init.rc
يتضمّن مجموعة
من مجموعات التحكم في العمليات المتاحة ونقاط تركيبها وإصداراتها. بينما يمكن أن تكون هذه
التغيير، توقع إطار عمل Android وجود مجموعة محددة من مجموعات العملاء
محددة ذات إصدار محدد وتسلسل هرمي معين للمجموعة الفرعية، استنادًا إلى
البرنامج النصي. وقد أدى ذلك إلى تقييد القدرة على اختيار إصدار مجموعة المشاركة التالي لاستخدامه، أو
تغيير التسلسل الهرمي للمجموعات النموذجية لاستخدام الميزات الجديدة.
الإصدار 10 من نظام Android والإصدارات الأحدث
يستخدم نظام التشغيل Android 10 والإصدارات الأحدث مجموعات cgroup مع ملفات تعريف المهام:
- إعداد المجموعة الفرعية: يصف المطوّرون إعداد مجموعات cgroup في
cgroups.json
ملف لتحديد مجموعات cgroup ومواقع تثبيتها وصفاتها. يتم تركيب جميع مجموعات cgroups خلال مرحلة الإعداد المبكر لعملية الإعداد . - ملفّات تعريف المهام: توفر هذه تجريدًا يفصل بين القيم المطلوبة
الوظائف من تفاصيل تنفيذها. إطار عمل Android
تطبيق الملفات الشخصية للمهام كما هو موضّح في ملف
task_profiles.json
على أو سلسلة محادثات باستخدام واجهات برمجة التطبيقاتSetTaskProfiles
وSetProcessProfiles
. (واجهات برمجة التطبيقات هذه فريدة لنظام التشغيل Android 11 والإصدارات الأحدث).
لتوفير التوافق مع الأنظمة القديمة، تعمل الدوال القديمة set_cpuset_policy
،
set_sched_policy
وget_sched_policy
على نفس مستوى واجهة برمجة التطبيقات والوظائف،
ولكن تم تعديل تنفيذها لاستخدام الملفات الشخصية للمهام. بالنسبة إلى حالات الاستخدام
الجديدة، ينصح فريق AOSP باستخدام واجهات برمجة التطبيقات الجديدة لملفات الأداء المهام بدلاً من الدالة
set_sched_policy
القديمة.
ملف وصف Cgroups
يتم توضيح المجموعات في cgroups.json
يقع ضمن <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
.
يتم توضيح كل وحدة تحكُّم في قسم فرعي ويجب أن تستوفي المتطلبات التالية على الأقل:
- الاسم، الذي يحدّده حقل وحدة التحكّم.
- مسار التثبيت، الذي يحدّده حقل المسار.
- الوضع وUID (رقم تعريف المستخدم) وGID (رقم تعريف المجموعة) الذي يصف المالك أوضاع الوصول للملفات ضمن هذا المسار (جميعها اختيارية).
- اختيارية: اضبط القيمة على true للسماح للنظام بتجاهل عملية التثبيت. نتج عن وحدة التحكم في مجموعة المختارات التي لا تدعمها النواة في التثبيت.
مثال على ملف cgroups.json
يعرض المثال أدناه أوصافًا للإصدار 1 من cgroup (Cgroups
) والإصدار 2 من cgroup (الإصدار 2).
(Cgroups2
) وحدات التحكّم مع مساراتها الخاصة.
{
"Cgroups": [
{
"Controller": "cpu",
"Path": "/dev/cpuctl",
"Mode": "0755",
"UID": "system",
"GID": "system"
},
{
"Controller": "memory",
"Path": "/dev/memcg",
"Mode": "0700",
"Optional": true
}
],
"Cgroups2": {
"Path": "/sys/fs/cgroup",
"Mode": "0755",
"UID": "system",
"GID": "system",
"Controllers": [
{
"Controller": "freezer",
"Path": ".",
"Mode": "0755",
"UID": "system",
"GID": "system"
}
]
}
}
يحتوي نموذج الملف هذا على قسمَين: مجموعات Google (التي تصف الإصدار 1 من مجموعة cgroup)
وCgroups2 (وصف وحدات التحكم الإصدار 2 من cgroup). الكل
يتم تثبيت وحدات التحكم في العرض الهرمي للإصدار 2 من مجموعات cgroups في نفس الموقع.
لذلك، يحتوي قسم Cgroups2 على مسار والوضع وUID
سمات GID لوصف الموقع والسمات لجذر
التسلسل الهرمي. سمة المسار لوحدات التحكّم ضمن Cgroups2 هي
بالنسبة إلى هذا المسار الجذر. في نظام التشغيل Android 12 والإصدارات الأحدث، يمكنك تحديد مجموعة مشتركة.
وحدة التحكّم التي تم تحديدها مع المسار والوضع كـ "Optional"
عبر ضبطه على true
يتم تحليل ملف cgroups.json
كجزء من عملية الإعداد، خلال عملية البدء المبكر
ويتم تثبيت المجموعات في المواقع المحددة. للحصول عليه لاحقًا
مواقع تثبيت مجموعة المختارات، استخدِم دالة واجهة برمجة التطبيقات CgroupGetControllerPath
.
ملف الملفات الشخصية للمهام
task_profiles.json
يقع الملف ضمن <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
.
استخدمه لوصف مجموعة معينة من الإجراءات التي سيتم تطبيقها على عملية أو
. ترتبط مجموعة من الإجراءات باسم ملف شخصي، والذي يُستخدم في
مكالمتا SetTaskProfiles
وSetProcessProfiles
لاستدعاء إجراءات الملف الشخصي.
مثال على ملف task_files.json
{
"Attributes": [
{
"Name": "MemSoftLimit",
"Controller": "memory",
"File": "memory.soft_limit_in_bytes"
},
{
"Name": "MemSwappiness",
"Controller": "memory",
"File": "memory.swappiness"
}
],
"Profiles": [
{
"Name": "MaxPerformance",
"Actions" : [
{
"Name" : "JoinCgroup",
"Params" :
{
"Controller": "schedtune",
"Path": "top-app"
}
}
]
},
{
"Name": "TimerSlackHigh",
"Actions" : [
{
"Name" : "SetTimerSlack",
"Params" :
{
"Slack": "40000000"
}
}
]
},
{
"Name": "LowMemoryUsage",
"Actions" : [
{
"Name" : "SetAttribute",
"Params" :
{
"Name" : "MemSoftLimit",
"Value" : "16MB"
}
},
{
"Name" : "SetAttribute",
"Params" :
{
"Name" : "MemSwappiness",
"Value" : "150"
}
}
]
}
]
"AggregateProfiles": [
{
"Name": "SCHED_SP_DEFAULT",
"Profiles": [ "TimerSlackHigh", "MaxPerformance" ]
},
{
"Name": "SCHED_SP_BACKGROUND",
"Profiles": [ "LowMemoryUsage" ]
}
}
يمكنك تخصيص أسماء لملفات cgroup معيّنة كإدخالات في قائمة السمات. يحتوي كل إدخال على ما يلي:
- يحدد حقل الاسم اسم السمة.
- يشير حقل وحدة التحكّم إلى وحدة تحكّم ضمن مجموعة من
cgroups.json
الملف الخاص باسمه. - يحدِّد حقل الملف ملفًا معيَّنًا ضمن وحدة التحكُّم هذه.
السمات هي إحالات في تعريفات الملف الشخصي للمهمة. خارج المهمة ملفات شخصية، عليك استخدامها فقط عندما يتطلب إطار العمل الوصول المباشر إلى تلك الملفات وملفات الوصول، ولا يمكن تجريدها باستخدام ملفات تعريف المهام. في جميع الحالات الأخرى، واستخدام الملفات الشخصية للمهام؛ فهي توفر فصلاً أفضل بين السلوك المطلوب تفاصيل تنفيذها.
يحتوي قسم الملفات الشخصية على تعريفات الملفات الشخصية للمهام وفقًا لما يلي:
- يحدّد حقل الاسم اسم الملف الشخصي.
يسرد قسم الإجراءات مجموعة من الإجراءات التي يتم تنفيذها عندما يكون الملف الشخصي المنهجية. ولكل إجراء ما يلي:
- يحدِّد حقل الاسم الإجراء.
- يحدّد القسم Params مجموعة من المَعلمات للإجراء.
يتم عرض الإجراءات المتاحة في الجدول:
الإجراء | المَعلمة | الوصف |
---|---|---|
SetTimerSlack |
Slack |
استراحة الموقّت بوحدة ns |
SetAttribute |
Name |
اسم يشير إلى سمة من قسم السمات |
Value |
قيمة ستتم كتابتها إلى الملف الذي تمثله السمة المُسماة | |
WriteFile | FilePath | مسار الملف |
Value | قيمة لتتم كتابتها إلى الملف | |
JoinCgroup |
Controller |
اسم وحدة تحكّم cgroup من cgroups.json |
Path |
مسار مجموعة فرعية في التسلسل الهرمي لوحدة التحكم في المجموعة |
يتضمّن الإصدار 12 من Android والإصدارات الأحدث قسم AggregateProfiles الذي يحتوي على ملفات تجارية مجمّعة، وكل منها هو اسم بديل لمجموعة من ملف تجاري واحد أو أكثر. تتألف تعريفات الملفات التجارية المجمّعة من ما يلي:
- يحدد حقل الاسم اسم الملف الشخصي المجمّع.
- الملفات الشخصية يسرد أسماء الملفات الشخصية المضمنة في تجميع البيانات الشخصية.
وعند تطبيق ملف شخصي مجمَّع، يتم أيضًا تطبيق جميع الملفات الشخصية التي تحتوي على تطبيق البيانات تلقائيًا. يمكن أن تحتوي الملفات الشخصية المجمّعة على ملفات شخصية فردية أو ملفات تعريف مجمَّعة أخرى، ما دام لا يوجد تكرارات (ملف تعريف نفسها).
task_profiles init language command
يتوفّر الأمر task_profiles
في لغة Android Init
لنظام التشغيل Android 12 والإصدارات الأحدث لتسهيل
تفعيل ملف الأداء المخصّص لعملية معيّنة. يحل محل writepid
(تم إيقافه في نظام التشغيل Android 12) الذي تم استخدامه لنقل بيانات
العملية بين مجموعات المعلومات. يوفّر الأمر task_profiles
المرونة
تغيير عمليات التنفيذ الأساسية بدون أي تأثير على الطبقات العليا. في جلسة المعمل،
في المثال أدناه، يؤدي هذان الأمران نفس العملية بشكل فعال:
writepid /dev/cpuctl/top-app/tasks
تم إيقاف العمل بها في Android 12، وتم استخدامها لكتابة PID. للمهمة الحالية في ملف
/dev/cpuctl/top-app/tasks
.task_profiles MaxPerformance
ضم العملية الحالية في مجموعة أفضل تطبيق ضمن "cpu" وحدة تحكّم (
cpuctl
)، وينتج عن ذلك كتابة PID للعمليةdev/cpuctl/top-app/tasks
استخدام الأمر task_profiles
دائمًا لنقل المهام في التدرّجات الهرمية لمجموعة المجموعات في
الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث تقبل معلمة أو أكثر، تمثل
أسماء الملفات الشخصية المحددة في ملف task_profiles.json
.
الملفات الشخصية للمهام على مستوى واجهة برمجة التطبيقات
في نظام التشغيل Android 12 والإصدارات الأحدث، يمكنك تعديل
التعريفات في ملفي cgroups.json
وtask_profiles.json
التلقائيين، إما
بناءً على التغيير الذي أجريته على مستوى واجهة برمجة تطبيقات Android، أو إجرائه من المورِّد
قسم القرص.
لإلغاء التعريفات استنادًا إلى مستوى واجهة برمجة التطبيقات، يجب أن تكون الملفات التالية: حاليًا على الجهاز:
/system/etc/task_profiles/cgroups_<API level>.json
استخدِم هذا الخيار للمجموعات الخاصة بمستوى واجهة برمجة التطبيقات.
/system/etc/task_profiles/task_profiles_<API level>.json
استخدِم هذا الخيار للملفات الشخصية الخاصة بمستوى واجهة برمجة التطبيقات.
لإلغاء التعريفات من قسم المورّد، يجب أن تكون الملفات التالية على الجهاز:
/vendor/etc/cgroups.json
/vendor/etc/task_profiles.json
إذا كانت السمة أو تعريف الملف الشخصي في هذه الملفات يستخدمان الاسم نفسه المُدرَج في الملف التلقائي، يلغي تعريف الملف (على مستوى واجهة برمجة التطبيقات أو مستوى المورّد) التعريف السابق. يُرجى العلم أيضًا أنّه يتم إلغاء التعريفات على مستوى المورّد. التعريفات على مستوى واجهة برمجة التطبيقات إذا كان للتعريف الجديد اسم جديد، فإن مجموعة الجديدة أو الملفات الشخصية باستخدام التعريف الجديد.
يُحمِّل نظام Android ملفَي cgroup
وtask_profile
بالترتيب التالي:
- الملفات التلقائية بتنسيق
cgroups.json
وtask_profiles.json
- الملفات الخاصة بمستوى واجهة برمجة التطبيقات، إن توفّرت
- ملفات التقسيم الخاصة بالمورّدين، إن توفّرت
التغييرات على واجهة برمجة التطبيقات الحالية
يحافظ نظام التشغيل Android 10 والإصدارات الأحدث على الدوالّ set_cpuset_policy
set_sched_policy
وget_sched_policy
بدون تغييرات على واجهة برمجة التطبيقات.
ومع ذلك، ينقل Android 10 هذه الدوال إلى
libprocessgroup
، الذي يحتوي الآن على جميع الوظائف المتعلقة بمجموعات Google Cloud
على الرغم من أنّ عنوان cutils/sched_policy.h
لا يزال متوفرًا، يُرجى تجنُّب
الرمز الحالي، تأكَّد من أنّ الرمز الجديد يتضمّن processgroup/sched_policy.h
جديدًا
بدلاً من ذلك.
يجب أن تضيف الوحدات التي تستخدم أيًا من هذه الدوال تبعية إلى
مكتبة واحدة (libprocessgroup
) في ملف العرض. إذا كانت إحدى الوحدات لا تستخدم أي وظائف
libcutils
أخرى، أزِل الاعتماد على مكتبة libcutils
من ملف makefile.
واجهات برمجة التطبيقات للملفات الشخصية للمهام
تم تحديد واجهات برمجة التطبيقات الخاصة في processgroup/processgroup.h
في الجدول:
النوع | واجهة برمجة التطبيقات والتعريف |
---|---|
bool |
SetTaskProfiles(int tid, const std::vector
تطبيق الملفات الشخصية للمهام المحددة في profiles على سلسلة المحادثات المحددة بواسطة
رقم تعريف سلسلة محادثات (tid) باستخدام مَعلمة tid . |
bool |
SetProcessProfiles(uid_t uid, pid_t pid, const std::vector
تطبيق الملفات الشخصية للمهام المحددة في profiles على العملية المحددة
من خلال المستخدم وتعالج أرقام التعريف باستخدام المَعلمتَين uid وpid |
bool |
CgroupGetControllerPath(const std::string& cgroup_name, std::string* path)
تعرض ما إذا كانت هناك وحدة تحكّم في المجموعة المحدَّدة من خلال cgroup_name .
إذا كانت true ، تضبط المتغيّر path على جذر هذه المجموعة. |
bool |
CgroupGetAttributePath(const std::string& attr_name, std::string* path)
تعرض ما إذا كانت هناك سمة للملف الشخصي تحدّدها attr_name أم لا؛ إذا
true ، تحدد المتغير path على مسار الملف المرتبط
سمة الملف الشخصي هذه. |
bool |
CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path)
تعرض ما إذا كانت هناك سمة للملف الشخصي تحدّدها attr_name أم لا؛ إذا
true ، تحدد المتغير path على مسار الملف المرتبط
بسمة الملف الشخصي هذه، وعلى سلسلة المحادثات المحددة بواسطة رقم تعريف سلسلة المحادثات باستخدام
المعلمة tid . |
bool |
UsePerAppMemcg()
لعرض ما إذا كان النظام قد تم إعداده لاستخدام مجموعات الذاكرة لكل تطبيق. |