يتوافق Android 17 والإصدارات الأحدث مع برنامج PMGD، وهو برنامج خفي لحماية ذاكرة العمليات، يحافظ على سلامة النظام وتجربة المستخدم من خلال إدارة استخدام الذاكرة بشكل استباقي على أساس كل عملية. يحسِّن هذا البرنامج الخفي استقرار الجهاز بشكل عام من خلال فرض حدود قصوى للذاكرة بشكل سلس على عمليات مستهدَفة معيّنة، ما يضمن عدم تدهور الأداء على مستوى النظام بالكامل بسبب تسرّبات الذاكرة أو الارتفاعات المفاجئة في استخدامها.
بينما لا تعمل برامج إيقاف العمليات التقليدية التي تستخدم ذاكرة منخفضة إلا عندما يكون النظام بأكمله تحت ضغط، يتّبع برنامج PMGD نهجًا دقيقًا. يحقّق البرنامج الخفي ذلك
من خلال مراقبة قيم ذاكرة مجموعة التحكّم (Control Group) الإصدار الثاني للعمليات المستهدَفة.
عندما تتجاوز عملية مستهدَفة حدود الذاكرة التي تم ضبطها، يعالج برنامج pmgd انتهاكات الحدود من خلال تسجيل وحدات ذاكرة Statsd قبل إنهاء العملية.
آلية العمل
يستخدم البرنامج الخفي inotify للاستماع إلى أحداث ضغط الذاكرة (على وجه التحديد النشاط الذي يستخدم ذاكرة كبيرة باستخدام memory.events). عندما تؤدي عملية تتم مراقبتها إلى إطلاق حدث ذاكرة، ينفّذ برنامج pmgd الإجراءات التالية:
- التحقّق من الذاكرة المجهولة: يتم تقييم الذاكرة المجهولة للعملية. إذا تجاوزت
anon_limit_in_mbالتي تم ضبطها، يوقف برنامجpmgdالعملية على الفور. - فترة الانتظار لاستعادة الذاكرة: إذا كانت الذاكرة المجهولة أقل من الحدّ المحدّد للذاكرة المجهولة، ينتظر برنامج
pmgdفترة السماح لاستعادة الذاكرة في النظام (reclaim_wait_time_secs). - تقييم الذاكرة بعد استعادتها: إذا ظلّت
memory.currentللعملية المستهدَفة أكبر منmemory.highأو تساويها بعد فترة السماح، أو إذا تجاوزت الذاكرة المجهولةanon_limit_in_mb، يوقف برنامجpmgdالعملية على الفور.
يتم تنفيذ ذلك بشكل مستمر إلى أن يتم إيقاف العملية أو إلى أن يؤدي استرداد الذاكرة في العملية إلى خفض استخدامها إلى ما دون حدود الذاكرة المحدّدة.
ميزات سلامة النظام
- الحدّ من معدّل إعادة التشغيل: لمنع حلقات إعادة التشغيل أو الأعطال المستمرة،
pmgdيتتبّع عمليات إيقاف العمليات في/data/misc/pmgd/history.json. يقتصر البرنامج الخفي على عملية إيقاف واحدة فقط لكل عملية يبدأها برنامجpmgdلكل عملية إعادة تشغيل للجهاز.
إعداد SELinux
إنّ قدرة برنامج PMGD على مراقبة العمليات محدودة بموجب سياسة SELinux. إذا ضبطت برنامج PMGD لمراقبة عملية لا يسمح لها بالوصول إلى النطاق بموجب السياسة، مثل عملية نظام خاصة بمورّد، لا يمكن لبرنامج PMGD مراقبتها، وقد تظهر لك عمليات رفض SELinux في logcat.
للسماح لبرنامج PMGD بمراقبة العمليات في نطاقات إضافية، عليك توسيع أذونات برنامج PMGD من خلال تعديل سياسة SELinux الخاصة بجهازك لبرنامج PMGD.
في ما يلي مثال على ملف device/<vendor>/<device>/sepolicy/pmgd.te
يضيف إمكانية الوصول إلى نطاق جديد:
# Allow pmgd to access vendor_system_apps
r_dir_file(pmgd, vendor_system_apps)
لمزيد من المعلومات عن كتابة سياسة خاصة بالجهاز، يُرجى الاطّلاع على مقالة تنفيذ SELinux.
الإعدادات المحدّدة من المورّد
يتم ضبط إعدادات برنامج PMGD من قِبل المورّد، ويتم ذلك من خلال ملف JSON مطلوب /vendor/etc/pmgd/config.json. يعرض هذا الملف العمليات التي يجب تتبُّعها،
وملف تعريف حدّ الذاكرة الذي تم ضبطه (باستخدام
ملفات تعريف مهام مجموعة التحكّم)،
والحدّ الأقصى للذاكرة المجهولة بالميغابايت.
حقول إعدادات المورّد
إنّ إعدادات JSON المقدَّمة هي قائمة بالعمليات وحدودها، ويتم تحديدها من خلال الحقول التالية:
| الحقل | النوع | مطلوب | الوصف | تلقائي |
|---|---|---|---|---|
target_cmd |
سلسلة | نعم | اسم أمر العملية المستهدَفة التي يجب مراقبتها، على سبيل المثال، system_server |
لا ينطبق |
uid |
عدد صحيح | لا | رقم تعريف المستخدم (UID) للعملية إذا تم حذف هذا الحقل، يطبّق pmgd القاعدة على مستوى العالم على أي عملية تطابق target_cmd. |
لا ينطبق |
reclaim_wait_time_secs |
عدد صحيح | لا | فترة السماح بالثواني التي يجب انتظارها لاستعادة النظام للذاكرة قبل إعادة تقييم حدّ الذاكرة | 5 |
mem_limit_profile |
سلسلة | نعم | اسم ملف تعريف مهام مجموعة التحكّم الذي يضبط `memory.high`. يُستخدم هذا الملف لضبط حدّ ذاكرة العملية. | لا ينطبق |
anon_limit_in_mb |
عدد صحيح | نعم | الحدّ الأقصى للذاكرة المجهولة بالميغابايت إذا تجاوز استخدام الذاكرة المجهولة
هذه القيمة، يوقف برنامج pmgd العملية على الفور. |
لا ينطبق |
additional_task_profiles |
قائمة سلاسل | لا | قائمة بأي ملفات تعريف مهام إضافية يطبّقها pmgd على
العملية عند بدء المراقبة |
قائمة فارغة |
في ما يلي مثال على إعداد ملف تعريف مهام مجموعة التحكّم في vendor/etc/task_profiles.json:
{
"Attributes": [
...
{
"Name": "MemHigh",
"Controller": "memory",
"File": "memory.high"
}
],
"Profiles": [
{
"Name": "SystemServerMemoryHighLimit",
"Actions": [
{
"Name": "SetAttribute",
"Params":
{
"Name": "MemHigh",
"Value": "1080M"
}
}
]
}
]
}
في ما يلي مثال على إعدادات برنامج PMGD في vendor/etc/pmgd/config.json:
{
"targets": [
{
"target_cmd": "system_server",
"uid": 1000,
"reclaim_wait_time_secs": 5,
"mem_limit_profile": "SystemServerMemoryHighLimit",
"anon_limit_in_mb": 300
}
]
}