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

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

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

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

एंड्रॉइड 9 और उससे नीचे का संस्करण

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

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

एंड्रॉइड 10 और उच्चतर कार्य प्रोफाइल के साथ सीग्रुप का उपयोग करें:

  • सीग्रुप सेटअप - डेवलपर्स सीग्रुप्स के सेट और उनके बढ़ते स्थानों और विशेषताओं को परिभाषित करने के लिए अपनी cgroups.json फ़ाइल में सीग्रुप्स सेटअप का वर्णन करते हैं। सभी सीग्रुप आरंभीकरण प्रक्रिया के प्रारंभिक-इनिट चरण के दौरान माउंट किए जाते हैं।
  • कार्य प्रोफ़ाइल - ये एक अमूर्तता प्रदान करते हैं जो इसके कार्यान्वयन के विवरण से आवश्यक कार्यक्षमता को अलग करती है। एंड्रॉइड फ्रेमवर्क, task_profiles.json फ़ाइल में वर्णित टास्क प्रोफाइल को SetTaskProfiles और SetProcessProfiles API का उपयोग करके एक प्रक्रिया या थ्रेड पर लागू करता है। (ये एपीआई एंड्रॉइड 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 अनुभाग का अपना पथ , मोड , यूआईडी और जीआईडी ​​विशेषताएँ हैं। Cgroups2 के अंतर्गत नियंत्रकों के लिए पथ विशेषता उस रूट पथ से संबंधित है। एंड्रॉइड 12 और उच्चतर में आप पथ और मोड के साथ निर्दिष्ट एक सीग्रुप नियंत्रक को true पर सेट करके "Optional" के रूप में परिभाषित कर सकते हैं।

प्रारंभिक-इनिट चरण के दौरान, cgroups.json फ़ाइल को 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" ]
     }
}

अपनी विशेषता सूची में प्रविष्टियों के रूप में विशिष्ट सीग्रुप फ़ाइलों को नाम निर्दिष्ट करें। प्रत्येक प्रविष्टि में निम्नलिखित शामिल हैं:

  • नाम फ़ील्ड - विशेषता का नाम निर्दिष्ट करता है।
  • नियंत्रक फ़ील्ड - cgroups.json फ़ाइल से एक cgroup नियंत्रक को उसके नाम से संदर्भित करता है।
  • फ़ाइल फ़ील्ड - इस नियंत्रक के अंतर्गत एक विशिष्ट फ़ाइल को नाम देता है।

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

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

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

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

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

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

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

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

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

Task_profiles init भाषा कमांड

किसी विशिष्ट प्रक्रिया के लिए कार्य प्रोफ़ाइल सक्रियण की सुविधा के लिए Android Init भाषा में एक task_profiles कमांड Android 12 और उच्चतर के लिए उपलब्ध है। यह writepid कमांड (एंड्रॉइड 12 में अप्रचलित) को प्रतिस्थापित करता है जिसका उपयोग सीग्रुप के बीच एक प्रक्रिया को स्थानांतरित करने के लिए किया गया था। task_profiles कमांड ऊपरी परतों पर कोई प्रभाव डाले बिना अंतर्निहित कार्यान्वयन को बदलने के लिए लचीलापन प्रदान करता है। नीचे दिए गए उदाहरण में, ये दोनों कमांड प्रभावी रूप से एक ही ऑपरेशन करते हैं:

  • writepid /dev/cpuctl/top-app/tasks

    Android 12 में अप्रचलित - वर्तमान कार्य की PID को /dev/cpuctl/top-app/tasks फ़ाइल में लिखने के लिए उपयोग किया गया था।

  • task_profiles MaxPerformance

    वर्तमान प्रक्रिया को "सीपीयू" नियंत्रक ( cpuctl ) के तहत शीर्ष-ऐप समूह में जोड़ता है, जिसके परिणामस्वरूप प्रक्रिया की पीआईडी ​​​​को dev/cpuctl/top-app/tasks में लिखा जाता है।

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

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

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

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

  • pro/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

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

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

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

मौजूदा एपीआई में परिवर्तन

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

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

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

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

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)

uid और pid ​​मापदंडों का उपयोग करके profiles में निर्दिष्ट कार्य प्रोफाइल को उसके उपयोगकर्ता और प्रक्रिया आईडी द्वारा निर्दिष्ट प्रक्रिया पर लागू करता है

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 का उपयोग करने के लिए कॉन्फ़िगर किया गया है।