Android 10 ve sonraki sürümlerde kontrol grubu kullanılır (cgroup) geliştiricilerin bir kümeyi açıklamak için kullanabileceği görev profilleri içeren soyutlama katmanı bir iş parçacığına veya işleme uygulanacak kısıtlama (ya da grup) içerir. Bu durumda sistem, bir veya daha fazla seçim yapmak için görev profillerinin belirtilen eylemlerini uygular kısıtlamaların nasıl uygulandığını ve temel alınan cgroup özelliği kümesi, daha yüksek düzeydeki yazılımları etkilemeden katman olarak görünür.
cgroups hakkında
Cgroups, görev kümelerini toplamak ve bölümlendirmek için bir mekanizma sağlar (süreçler, iş parçacıkları ve gelecekteki tüm alt öğelerinden oluşur.) hiyerarşik gruplar halinde olabilir. Android, kullanıcı etkileşimini kontrol etmek ve CPU ve bellek kullanımı ile tahsisi gibi sistem kaynakları Linux çekirdeği cgroups v1 ve cgroups v2.
Android 9 ve önceki sürümler
Android 9 ve önceki sürümlerde init.rc
başlatma komut dosyası,
bağlantı noktalarını ve sürümlerini içerir. Bunlar projenin
Android çerçevesine göre belirli bir grup Cgroup'un
konuma dayalı olarak, belirli bir sürüme ve alt grup hiyerarşisine
komut dosyası. Bu durum, kullanılacak bir sonraki grup sürümünü seçme imkanını sınırlıyor.
yeni özellikleri kullanmak için Cgroup Hiyerarşisini değiştirebilirsiniz.
Android 10 ve sonraki sürümler
Android 10 ve sonraki sürümlerde görev profillerine sahip cgroups kullanılır:
- Grup kurulumu. Geliştiriciler, cgroups kurulumunu
cgroups.json
bölümünde açıklarlar. dosyası oluşturun. Tüm cgroups, başlatmanın erken başlatma aşamasında eklenir bahsedeceğim. - Görev profilleri. Bunlar, kullanıcı deneyimiyle ilgili gerekli
ayrıntılarına inceleyebilirsiniz. Android çerçevesi
task_profiles.json
dosyasında açıklandığı gibi görev profillerini işleme veya iş parçacığı (SetTaskProfiles
veSetProcessProfiles
API'leri) kullanır. (Bu API'ler Android 11 ve sonraki sürümlere özeldir.)
Eski sürüm, geriye dönük uyumluluk sağlamak için set_cpuset_policy
,
set_sched_policy
ve get_sched_policy
aynı API'yi ve işlevleri sunar.
ancak bunların uygulaması görev profillerini kullanacak şekilde değiştirildi. Yeni kullanım için
AOSP'nin, eski sürüm yerine yeni görev profili API'lerini kullanmasını önerdiği durumlar
set_sched_policy
işlevi.
Cgroups açıklama dosyası
C-grupları cgroups.json
bölümünde açıklanmıştır
dosyası <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
altında bulunur.
Her denetleyici bir alt bölümde açıklanmıştır ve en az aşağıdaki özelliklere sahip olmalıdır:
- Controller (Denetleyici) alanı tarafından tanımlanan ad.
- Yol alanı ile tanımlanan ekleme yolu.
- Mod, UID (user-ID) ve GID (grup kimliği) erişim modlarını kullanabilirsiniz (tümü isteğe bağlıdır).
- İsteğe bağlı özellik: Sistemin ekleme işlemini yoksayması için true olarak ayarlayın. hatası.
Örnek cgroups.json dosyası
Aşağıdaki örnekte cgrubu v1 (Cgroups
) ve cgroup v2 ile ilgili açıklamalar gösterilmektedir
(Cgroups2
) denetleyiciler ve ilgili yollar.
{
"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"
}
]
}
}
Bu örnek dosya Cgroups olmak üzere iki bölüm içerir (cgroup v1'i açıklayan
denetleyiciler) ve Cgroups2 (cgroup v2 denetleyicilerini açıklar). Tümü
cgroups v2 hiyerarşisindeki denetleyiciler aynı konuma montedir.
Dolayısıyla, Cgroups2 bölümünün kendi Yol, Mod, UID ve
GID özellikleri, dosyanın kök dizininin konumunu ve özelliklerini
hiyerarşik olarak düzenlenmiştir. Cgroups2 altındaki Denetleyiciler için Yol özelliği
eklemeniz gerekir. Android 12 ve sonraki sürümlerde cgroup tanımlayabilirsiniz
yol ve mod olarak "Optional"
olarak belirtilen kumanda
bunu true
olarak ayarlayabilirsiniz.
cgroups.json
dosyası, erken başlatma sırasında başlatma işleminin bir parçası olarak ayrıştırılır.
aşamasında ve cgroup'lar belirtilen konumlara monte edilir. Daha sonra edinmek için
CgroupGetControllerPath
API işlevini kullanın.
Görev profilleri dosyası
task_profiles.json
dosyası <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
altında yer alır.
Bir sürece uygulanacak belirli bir işlem kümesini tanımlamak için
ileti dizisi. Bir işlem grubu, şurada kullanılan bir profil adıyla ilişkilendirilir:
Profil işlemlerini çağırmak için SetTaskProfiles
ve SetProcessProfiles
çağrıları.
Örnek görevi_profile.json dosyası
{
"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" ]
}
}
Belirli grup dosyalarına adlar Özellikler listenizde giriş olarak atayın. Her giriş şunları içerir:
- Ad alanı, Özelliğin adını belirtir.
- Controller (Denetleyici) alanı,
cgroups.json
içindeki bir cgroup denetleyicisine referans verir. adına göre ekleyebilirsiniz. - Dosya alanı, bu denetleyicinin altındaki belirli bir dosyanın adını taşır.
Özellikler, görev profili tanımlarındaki referanslardır. Görevin dışında kullanıyorsanız bunları yalnızca çerçeve, ilgili profillere doğrudan erişim gerektirdiğinde kullanın ve erişim soyutlanamaz. Diğer tüm durumlarda görev profillerini kullanabilir, gerekli davranış ile gereken davranış arasındaki ayrıntılarını inceleyeceğiz.
Profiller bölümü, aşağıdakilerle birlikte görev profili tanımlarını içerir:
- Ad alanı, profil adını tanımlar.
İşlemler bölümünde, profil aşağıdaki işlemler olduğunda gerçekleştirilen bir dizi işlem listelenir: geçerlidir. Her işlem aşağıdakilere sahiptir:
- Ad alanı, işlemi belirtir.
- Params bölümü, işlem için bir parametre grubu belirtir.
Desteklenen işlemler tabloda listelenmiştir:
İşlem | Parametre | Açıklama |
---|---|---|
SetTimerSlack |
Slack |
ns cinsinden zamanlayıcı boşluğu |
SetAttribute |
Name |
Özellikler bölümündeki bir özelliğe referans veren ad |
Value |
Adlandırılmış özelliğin temsil ettiği dosyaya yazılacak değer | |
WriteFile | FilePath | dosyanın yolu |
Value | dosyaya yazılacak bir değer | |
JoinCgroup |
Controller |
cgroups.json kapsamındaki grup denetleyicisinin adı |
Path |
Cgroup denetleyicisinin hiyerarşisindeki bir alt grup yolu |
Android 12 ve sonraki sürümlerde AggregateProfiles bulunur. bölüm, her biri bir dizi kümenin takma adı olan toplu profilleri içerir. bir veya daha fazla profil. Toplu profil tanımları şunlardan oluşur:
- Ad alanı, toplu profilin adını belirtir.
- Profiles (Profiller) alanında, profildeki profillerinizin adları listelenir. bir görünümünü sunar.
Birleştirilmiş profil uygulandığında, içeren tüm profiller de otomatik olarak uygulanır. Birleştirilmiş profiller her iki bağımsız profili de içerebilir yinelemelerin olmadığı müddetçe ( içerir).
görev_profilleri başlangıç dil komutu
Android Init Dili'nde bir task_profiles
komutu
Android 12 ve sonraki sürümlerde kullanılabilir.
belirli bir işlem için görev profili etkinleştirmesi. writepid
, yerini alır
komutunda (Android 12'de desteği sonlandırılmıştır) bir web sitesini
bir süreçtir. task_profiles
komutu,
üst katmanlar üzerinde etkisi olmadan temel uygulamaları değiştirmek.
aşağıdaki örnekte gösterildiği gibi, şu iki komut aynı işlemi etkili bir şekilde gerçekleştirir:
writepid /dev/cpuctl/top-app/tasks
Android 12'de desteği sonlandırıldı. PID'yi yazmak için bu kimlik kullanılıyordu.
/dev/cpuctl/top-app/tasks
dosyasına yükleyin.task_profiles MaxPerformance
Mevcut işlemi "cpu"nun altındaki üst uygulama grubuna ekler denetleyici (
cpuctl
) alır. Bu da işlemin PID'sinindev/cpuctl/top-app/tasks
.
Şuradaki görevleri taşımak için her zaman task_profiles
komutunu kullanın:
Android 12 ve sonraki sürümler. Şu parametreyi temsil eden bir veya daha fazla parametreyi kabul eder:
task_profiles.json
dosyasında belirtilen profillerin adları.
API düzeyindeki görev profilleri başına
Android 12 ve sonraki sürümlerde değişiklik yapabilir veya mevcut öğeleri geçersiz kılabilirsiniz.
varsayılan cgroups.json
ve task_profiles.json
dosyalarındaki tanımlar veya
yaptığınız değişikliği Android API düzeyinde veya satıcıdan
bölüm.
API düzeyine dayalı olarak tanımları geçersiz kılmak için aşağıdaki dosyalar cihazda mevcut:
/system/etc/task_profiles/cgroups_<API level>.json
Bunu, API düzeyine özel cgroups için kullanın.
/system/etc/task_profiles/task_profiles_<API level>.json
Bir API düzeyine özel profiller için bunu kullanın.
Tedarikçi firma bölümündeki tanımları geçersiz kılmak için aşağıdaki dosyalar Cihazda mevcut olması gerekir:
/vendor/etc/cgroups.json
/vendor/etc/task_profiles.json
Bu dosyalardaki bir özellik veya profil tanımı varsayılan dosyadaysa dosya (API düzeyinde veya tedarikçi firma düzeyinde) tanımı geçersiz kılar görebilirsiniz. Tedarikçi düzeyindeki tanımların geçersiz kılındığını da unutmayın. API düzeyindeki tanımlar. Yeni tanımın yeni bir adı varsa özelliklerinin veya profillerin yeni tanıma göre değiştirilmesi.
Android sistemi, cgroup
ve task_profile
dosyalarını şu sırayla yükler:
- Varsayılan
cgroups.json
vetask_profiles.json
dosyası olarak da kaydedebilir. - Varsa API düzeyine özel dosyalar.
- Varsa tedarikçi bölümü dosyaları.
Mevcut API'de yapılan değişiklikler
Android 10 ve sonraki sürümlerde set_cpuset_policy
,
API'de değişiklik yapılmadan set_sched_policy
ve get_sched_policy
.
Ancak Android 10'da bu işlevler
libprocessgroup
(artık toplulukla ilgili tüm işlevleri içeriyor).
Bozmamak için cutils/sched_policy.h
üstbilgisi hâlâ mevcut olsa da
Mevcut kod, yeni kodun yeni bir processgroup/sched_policy.h
içerdiğinden emin olun.
başlığını kullanın.
Bu işlevlerden herhangi birini kullanan modüller
libprocessgroup
kitaplığını oluşturma dosyasına ekleyebilir. Bir modül başka bir
libcutils
işlevi, libcutils
işlevini bırakın
kitaplığına bağımlılığınızı artırır.
Görev profilleri API'leri
processgroup/processgroup.h
içindeki gizli API'ler tabloda tanımlanmıştır:
Tür | API ve tanım |
---|---|
bool |
SetTaskProfiles(int tid, const std::vector .
profiles öğesinde belirtilen görev profillerini,
tid parametresini kullanarak ileti dizisi kimliğini (git) haline getirin. |
bool |
SetProcessProfiles(uid_t uid, pid_t pid, const std::vector .
profiles öğesinde belirtilen görev profillerini, belirtilen işleme uygular
uid ve pid parametrelerini kullanan kullanıcı ve işlem kimliklerine göre |
bool |
CgroupGetControllerPath(const std::string& cgroup_name, std::string* path) .
cgroup_name tarafından belirtilen bir grup denetleyicisi olup olmadığını döndürür;
true ise path değişkenini bu cgrubun köküne ayarlar |
bool |
CgroupGetAttributePath(const std::string& attr_name, std::string* path) .
attr_name tarafından belirtilen bir profil özelliğinin mevcut olup olmadığını döndürür; eğer
true , path değişkenini
bu profil özelliğini kullanabilirsiniz. |
bool |
CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path) .
attr_name tarafından belirtilen bir profil özelliğinin mevcut olup olmadığını döndürür; eğer
true , path değişkenini
özelliğini kullanarak ileti dizisi kimliği tarafından belirtilen ileti dizisine
tid parametresini kullanın. |
bool |
UsePerAppMemcg() .
Sistemin uygulama başına bellek cgroup'larını kullanacak şekilde yapılandırılıp yapılandırılmadığını döndürür. |