طبقة التجريد Cgroup

يستخدم الإصدار 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 قيمة ستتم كتابتها إلى الملف الذي تمثله السمة المُسماة
WriteFileFilePathمسار الملف
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 بالترتيب التالي:

  1. الملفات التلقائية بتنسيق cgroups.json وtask_profiles.json
  2. الملفات الخاصة بمستوى واجهة برمجة التطبيقات، إن توفّرت
  3. ملفات التقسيم الخاصة بالمورّدين، إن توفّرت

التغييرات على واجهة برمجة التطبيقات الحالية

يحافظ نظام التشغيل 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)
تطبيق الملفات الشخصية للمهام المحددة في profiles على سلسلة المحادثات المحددة بواسطة رقم تعريف سلسلة محادثات (tid) باستخدام مَعلمة tid.
bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector& profiles)
تطبيق الملفات الشخصية للمهام المحددة في 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()
لعرض ما إذا كان النظام قد تم إعداده لاستخدام مجموعات الذاكرة لكل تطبيق.