सीग्रुप एब्स्ट्रैक्शन लेयर

एंड्रॉइड 10 और उच्चतर कार्य प्रोफाइल के साथ एक नियंत्रण समूह (सीग्रुप) अमूर्त परत का उपयोग करते हैं, जिसका उपयोग डेवलपर्स थ्रेड या प्रक्रिया पर लागू करने के लिए प्रतिबंधों के एक सेट (या सेट) का वर्णन करने के लिए कर सकते हैं। सिस्टम तब एक या अधिक उपयुक्त cgroups का चयन करने के लिए कार्य प्रोफ़ाइल की निर्धारित क्रियाओं का अनुसरण करता है, जिसके माध्यम से प्रतिबंध लागू होते हैं, और अंतर्निहित cgroup सुविधा सेट में परिवर्तन उच्च सॉफ़्टवेयर परतों को प्रभावित किए बिना किया जा सकता है।

सीग्रुप्स के बारे में

सीग्रुप विशेष व्यवहार वाले पदानुक्रमित समूहों में कार्यों के समूह (जिसमें प्रक्रियाएं, धागे और उनके सभी भविष्य के बच्चे शामिल हैं) को एकत्रित और विभाजित करने के लिए एक तंत्र प्रदान करते हैं। लिनक्स कर्नेल cgroups v1 और cgroups v2 के समर्थन के साथ, एंड्रॉइड सीपीयू और मेमोरी उपयोग और आवंटन जैसे सिस्टम संसाधनों को नियंत्रित करने और खाते के लिए cgroups का उपयोग करता है।

Android 9 और उससे कम

Android 9 और उसके बाद के संस्करण में, init.rc आरंभीकरण स्क्रिप्ट में उपलब्ध cgroups, उनके बढ़ते बिंदुओं और संस्करणों का सेट शामिल था। हालांकि इन्हें बदला जा सकता है, एंड्रॉइड फ्रेमवर्क को उम्मीद है कि स्क्रिप्ट के आधार पर एक विशिष्ट संस्करण और उपसमूह पदानुक्रम के साथ विशिष्ट स्थानों पर cgroups का एक विशिष्ट सेट मौजूद होगा। इसने उपयोग करने के लिए अगला cgroup संस्करण चुनने की क्षमता, या नई सुविधाओं का उपयोग करने के लिए cgroup पदानुक्रम को बदलने की क्षमता को सीमित कर दिया।

एंड्रॉइड 10 और उच्चतर

Android 10 और उच्चतर कार्य प्रोफ़ाइल वाले cgroups का उपयोग करते हैं:

  • Cgroup सेटअप - डेवलपर्स cgroups के सेट को परिभाषित करने के लिए cgroups.json फ़ाइल में cgroups सेटअप का वर्णन करते हैं, और उनके बढ़ते स्थान और विशेषताएँ। सभी cgroups को इनिशियलाइज़ेशन प्रक्रिया के प्रारंभिक-init चरण के दौरान माउंट किया जाता है।
  • कार्य प्रोफाइल - ये एक अमूर्तता प्रदान करते हैं जो इसके कार्यान्वयन के विवरण से आवश्यक कार्यक्षमता को अलग करता है। एंड्रॉइड फ्रेमवर्क टास्क प्रोफाइल को task_profiles.json फाइल में वर्णित प्रक्रिया या थ्रेड पर SetTaskProfiles और SetProcessProfiles एपीआई का उपयोग करके लागू करता है। (ये एपीआई एंड्रॉइड 11 और उच्चतर के लिए अद्वितीय हैं।)

पश्चगामी संगतता प्रदान करने के लिए, विरासती कार्य set_cpuset_policy , set_sched_policy , और get_sched_policy समान API और कार्यक्षमता प्रदान करते हैं, लेकिन उनके कार्यान्वयन को कार्य प्रोफ़ाइल का उपयोग करने के लिए संशोधित किया गया है। नए उपयोग के मामलों के लिए AOSP लीगेसी set_sched_policy फ़ंक्शन के बजाय नए कार्य प्रोफ़ाइल API का उपयोग करने की अनुशंसा करता है।

Cgroups विवरण फ़ाइल

Cgroups को <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ के अंतर्गत स्थित cgroups.json फ़ाइल में वर्णित किया गया है। प्रत्येक नियंत्रक को उपखंड में वर्णित किया गया है और इसमें न्यूनतम निम्न होना चाहिए:

  • नियंत्रक फ़ील्ड द्वारा परिभाषित नाम।
  • पथ फ़ील्ड द्वारा परिभाषित माउंटिंग पथ।
  • मोड , यूआईडी (यूजर आईडी), और जीआईडी ​​(ग्रुप आईडी) इस पथ के तहत फाइलों के लिए स्वामी और एक्सेस मोड का वर्णन करता है (सभी वैकल्पिक)।
  • वैकल्पिक विशेषता, सिस्टम को एक cgroup नियंत्रक के कारण होने वाली माउंटिंग त्रुटि को अनदेखा करने देने के लिए सही पर सेट करें जो कर्नेल माउंट किए जाने का समर्थन नहीं करता है।

उदाहरण cgroups.json फ़ाइल

नीचे दिया गया उदाहरण cgroup v1 ( Cgroups ) और cgroup v2 ( 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"
     }
   ]
 }
}

इस उदाहरण फ़ाइल में दो खंड हैं, Cgroups (cgroup v1 नियंत्रकों का वर्णन करना) और Cgroups2 (cgroup v2 नियंत्रकों का वर्णन करना)। cgroups v2 पदानुक्रम में सभी नियंत्रक एक ही स्थान पर माउंट किए जाते हैं। इसलिए, पदानुक्रम की जड़ के लिए स्थान और विशेषताओं का वर्णन करने के लिए Cgroups2 अनुभाग का अपना पथ , मोड , UID और GID विशेषताएँ हैं। Cgroups2 के अंतर्गत नियंत्रकों के लिए पथ विशेषता उस रूट पथ के सापेक्ष है। एंड्रॉइड 12 और उच्चतर में आप पथ और मोड के साथ निर्दिष्ट cgroup नियंत्रक को "Optional" के रूप में true पर सेट करके परिभाषित कर सकते हैं।

cgroups.json फ़ाइल को प्रारंभिक-init चरण के दौरान init प्रक्रिया के भाग के रूप में पार्स किया जाता है, और cgroups को निर्दिष्ट स्थानों पर माउंट किया जाता है। बाद में cgroup माउंटिंग स्थान प्राप्त करने के लिए, CgroupGetControllerPath API फ़ंक्शन का उपयोग करें।

कार्य प्रोफ़ाइल फ़ाइल

task_profiles.json फ़ाइल <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ के अंतर्गत स्थित है। किसी प्रक्रिया या थ्रेड पर लागू होने वाली क्रियाओं के विशिष्ट सेट का वर्णन करने के लिए इसका उपयोग करें। क्रियाओं का एक सेट एक प्रोफ़ाइल नाम से जुड़ा होता है, जिसका उपयोग SetTaskProfiles और SetProcessProfiles कॉल में प्रोफ़ाइल क्रियाओं को आमंत्रित करने के लिए किया जाता है।

उदाहरण task_profiles.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 फ़ाइल से cgroup नियंत्रक को उसके नाम से संदर्भित करता है।
  • फ़ाइल फ़ील्ड - इस नियंत्रक के अंतर्गत एक विशिष्ट फ़ाइल का नाम देता है।

विशेषताएँ कार्य प्रोफ़ाइल परिभाषाओं में संदर्भ हैं। कार्य प्रोफ़ाइल के बाहर, उनका उपयोग केवल तभी करें जब फ़्रेमवर्क को उन फ़ाइलों तक सीधे पहुंच की आवश्यकता हो, और कार्य प्रोफ़ाइल का उपयोग करके एक्सेस को अमूर्त नहीं किया जा सकता है। अन्य सभी मामलों में, कार्य प्रोफ़ाइल का उपयोग करें; वे आवश्यक व्यवहार और इसके कार्यान्वयन विवरण के बीच बेहतर डिकूपिंग प्रदान करते हैं।

प्रोफ़ाइल अनुभाग में निम्न के साथ कार्य प्रोफ़ाइल परिभाषाएँ हैं:

  • नाम फ़ील्ड - प्रोफ़ाइल नाम को परिभाषित करता है।
  • क्रिया अनुभाग - प्रोफ़ाइल लागू होने पर किए गए कार्यों के एक सेट को सूचीबद्ध करता है। प्रत्येक क्रिया में निम्नलिखित हैं:

    • क्रिया निर्दिष्ट करने वाला नाम फ़ील्ड
    • कार्रवाई के लिए मापदंडों के एक सेट को निर्दिष्ट करने वाला पैराम अनुभाग

समर्थित कार्रवाइयां नीचे दी गई तालिका में सूचीबद्ध हैं।

कार्य पैरामीटर विवरण
SetTimerSlack Slack ns . में टाइमर सुस्त
SetAttribute Name विशेषता अनुभाग से एक विशेषता का संदर्भ देने वाला नाम
Value नामित विशेषता द्वारा दर्शाई गई फ़ाइल में लिखा जाने वाला मान
WriteFile FilePath फ़ाइल के लिए पथ
Value फ़ाइल में लिखा जाने वाला मान
JoinCgroup Controller cgroups.json से cgroup नियंत्रक का नाम
Path cgroup नियंत्रक के पदानुक्रम में एक उप-समूह पथ

Android 12 और उच्चतर में एक AggregateProfiles अनुभाग है जिसमें कुल प्रोफ़ाइल शामिल हैं, जिनमें से प्रत्येक एक या अधिक प्रोफ़ाइल के सेट के लिए एक उपनाम है। समग्र प्रोफ़ाइल परिभाषाओं में निम्नलिखित शामिल हैं:

  • नाम फ़ील्ड - समग्र प्रोफ़ाइल का नाम निर्दिष्ट करता है।
  • प्रोफाइल फील्ड - समग्र प्रोफाइल में शामिल प्रोफाइल के नामों को सूचीबद्ध करता है।

जब एक समग्र प्रोफ़ाइल लागू की जाती है, तो सभी युक्त प्रोफ़ाइल भी स्वचालित रूप से लागू हो जाती हैं। जब तक कोई पुनरावर्तन न हो (एक प्रोफ़ाइल जिसमें स्वयं शामिल हो) समग्र प्रोफ़ाइल में व्यक्तिगत प्रोफ़ाइल या अन्य समग्र प्रोफ़ाइल दोनों शामिल हो सकते हैं।

टास्क_प्रोफाइल इनिट भाषा कमांड

एंड्रॉइड इनिट लैंग्वेज में task_profiles कमांड एंड्रॉइड 12 और उच्चतर के लिए एक विशिष्ट प्रक्रिया के लिए टास्क प्रोफाइल सक्रियण की सुविधा के लिए उपलब्ध है। यह writepid कमांड (एंड्रॉइड 12 में पदावनत) की जगह लेता है जिसका उपयोग cgroups के बीच एक प्रक्रिया को माइग्रेट करने के लिए किया गया था। 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 पर लिख दिया जाता है।

Android 12 और उच्चतर में cgroup पदानुक्रमों में कार्यों को माइग्रेट करने के लिए हमेशा task_profiles कमांड का उपयोग करें। यह एक या अधिक मापदंडों को स्वीकार करता है, जो कि task_profiles.json फ़ाइल में निर्दिष्ट प्रोफाइल के नामों का प्रतिनिधित्व करता है।

प्रति एपीआई-स्तरीय कार्य प्रोफाइल

Android 12 और उच्चतर में, आप डिफ़ॉल्ट cgroups.json और task_profiles.json फ़ाइलों में परिभाषाओं को संशोधित या ओवरराइड कर सकते हैं, या तो अपने परिवर्तन को Android API स्तर पर आधारित कर सकते हैं, या इसे विक्रेता विभाजन से बना सकते हैं।

API स्तर के आधार पर परिभाषाओं को ओवरराइड करने के लिए, डिवाइस पर निम्न फ़ाइलें मौजूद होनी चाहिए:

  • pro/system/etc/task_profiles/cgroups_<API level>.json

    एपीआई स्तर के लिए विशिष्ट cgroups के लिए इसका उपयोग करें।

  • /system/etc/task_profiles/task_profiles_<API level>.json

    एपीआई स्तर के लिए विशिष्ट प्रोफाइल के लिए इसका इस्तेमाल करें।

विक्रेता विभाजन से परिभाषाओं को ओवरराइड करने के लिए, निम्न फ़ाइलें डिवाइस पर मौजूद होनी चाहिए:

  • /vendor/etc/cgroups.json
  • /vendor/etc/task_profiles.json

यदि इन फ़ाइलों में एक विशेषता या प्रोफ़ाइल परिभाषा उसी नाम का उपयोग करती है जो डिफ़ॉल्ट फ़ाइल में है, तो फ़ाइल (एपीआई-स्तर या विक्रेता-स्तर) परिभाषा पिछली परिभाषा को ओवरराइड करती है। यह भी ध्यान दें कि विक्रेता-स्तरीय परिभाषाएँ API-स्तर की परिभाषाओं को ओवरराइड करती हैं। यदि नई परिभाषा में एक नया नाम है, तो विशेषताओं या प्रोफाइल के सेट को नई परिभाषा के साथ संशोधित किया जाता है।

Android सिस्टम इस क्रम में cgroup और task_profile फ़ाइलों को लोड करता है:

  1. डिफ़ॉल्ट cgroups.json और task_profiles.json फ़ाइलें।
  2. एपीआई स्तर-विशिष्ट फ़ाइलें, यदि मौजूद हैं।
  3. विक्रेता विभाजन फ़ाइलें, यदि मौजूद हैं।

मौजूदा एपीआई में बदलाव

Android 10 और उच्चतर API में परिवर्तन किए बिना set_cpuset_policy , set_sched_policy , और get_sched_policy फ़ंक्शन रखता है। हालाँकि, Android 10 इन कार्यों को libprocessgroup में ले जाता है, जिसमें अब सभी cgroup-संबंधित कार्यक्षमता शामिल हैं।

यद्यपि cutils/sched_policy.h शीर्षलेख अभी भी मौजूद है, मौजूदा कोड को तोड़ने से बचने के लिए सुनिश्चित करें कि नए कोड में इसके बजाय एक नया processgroup/sched_policy.h शीर्षलेख शामिल है।

मॉड्यूल जो इनमें से किसी भी फ़ंक्शन का उपयोग करते हैं, उन्हें अपने मेकफ़ाइल में libprocessgroup लाइब्रेरी पर निर्भरता जोड़नी चाहिए। यदि कोई मॉड्यूल किसी अन्य libcutils कार्यक्षमता का उपयोग नहीं करता है, तो मेकफ़ाइल से libcutils लाइब्रेरी निर्भरता को छोड़ दें।

टास्क प्रोफाइल एपीआई

processgroup/processgroup.h में निजी एपीआई को नीचे दी गई तालिका में परिभाषित किया गया है:

प्रकार एपीआई और परिभाषा
bool SetTaskProfiles(int tid, const std::vector & profiles) SetTaskProfiles(int tid, const std::vector & profiles)

प्रोफाइल में निर्दिष्ट कार्य profiles को उसके tid पैरामीटर का उपयोग करके थ्रेड आईडी (tid) द्वारा निर्दिष्ट थ्रेड पर लागू करता है।

bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector & profiles) 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 द्वारा निर्दिष्ट cgroup नियंत्रक मौजूद है या नहीं; यदि true , तो path चर को उस cgroup के मूल में सेट करता है

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()

यह लौटाता है कि सिस्टम प्रति-एप्लिकेशन मेमोरी cgroups का उपयोग करने के लिए कॉन्फ़िगर किया गया है या नहीं।