1

之前在Android进程调度中介绍过Android使用的调度策略。Android对调度策略和优先级的管理是很谨慎的,一般情况下不需要应用和服务调整自己的优先级。但是,一些有系统开发能力的厂商有时会对优先级进行修改。如果没有经过充分考虑,可能会对系统运行产生不良影响,尤其是修改实时调度策略。

Linux kernel RT priority

目前,Linux对实时调度的优先级管理是比较宽泛的,可以在0~99间调整优先级。但是,这样也同样带来了优先级管理问题。社区大神就有抱怨这个问题(Controlling realtime priorities in kernel threads),提交了补丁来取消实时调度优先级调整的大部分能力。先看一下当前内核中对SCHED_FIFO优先级的管理。

SubsystemPriorityDescription
Arm bL switcher1The Arm big.LITTLE switcher thread
crypto50Crypto engine worker thread
ACPI1ACPI processor aggregator driver
drbd2Distributed, replicated block device request handling
PSCI checker99PSCI firmware hotplug/suspend functionality checker
msm16MSM GPU driver
DRM1Direct rendering request scheduler
ivtv99Conexant cx23416/cx23415 MPEG encoder/decoder driver
mmc1MultiMediaCard drivers
cros_ec_spi50ChromeOS embedded controller SPI driver
powercap50"Powercap" idle-injection driver
powerclamp50Intel powerclamp thermal management subsystem
sc16is7xx50NXP SC16IS7xx serial port driver
watchdog99Watchdog timer driver subsystem
irq50Threaded interrupt handling
locktorture99Locking torture-testing module
rcuperf1Read-copy-update performance tester
rcutorture1Read-copy-update torture tester
sched/psi1Pressure-stall information data gathering

从上表可以看出,Kernel中实时调度的优先级主要集中在三个位置:高优先级(99)、正常优先级(50)、低优先级(1)。所以,其实并不需要太多优先级的阶级,过多只会带来混乱。

Android RT priority

Android对于实时调度优先级的设置是经过深思熟虑的,要保证实时性又不能干扰内核运行。其中,Sensor设置了很高的优先级,因为其对实时性十分敏感。其他的实时调度线程都维持在低优先级上,同样由于音频对时间敏感,而赋予了相对高的优先级,但还是维持在低优先级上。下表列出Android系统(9.0)中实时调度优先级的配置,

SubsystemPriorityDescription
SensorManager EventQueue98SensorManager EventQueue thread
SensorManager10SensorManager looper
FastMixer/FastCapture3AudioFlinger fast mixer and fast capture
AudioApp2AudioFlinger playback or record threads
Audio HAL3/2Flow AudioFlinger
AAudioService2Aaudio threads
SurfaceFlinger2SurfaceFlinger Main, DispSync and Event threads.
CameraService1When "camera.fifo.disable" isn't 1.
SurfaceFlinger handleMessage1SCHED_FIFO when the display is turned on, SCHED_OTHER when turned off.
UI and RenderThreads1ActivityManagerService use SCHED_FIFO for UI and RenderThreads if "sys.use_fifo_ui" isn't 0.

上面的两个表格总结了Linux kernel和Android系统中实时调度策略优先级的配置,系统开发人员可以做为参考。当开发人员需要修改或配置自己的实时调度策略是,需要充分理解当前优先级的状态,以及使用实时调度策略的目的,从而选择一个合适的优先级。


戈壁老王
143 声望61 粉丝

做为一个不称职的老年码农,一直疏忽整理笔记,开博记录一下,用来丰富老年生活,