之前在Android进程调度中介绍过Android使用的调度策略。Android对调度策略和优先级的管理是很谨慎的,一般情况下不需要应用和服务调整自己的优先级。但是,一些有系统开发能力的厂商有时会对优先级进行修改。如果没有经过充分考虑,可能会对系统运行产生不良影响,尤其是修改实时调度策略。
Linux kernel RT priority
目前,Linux对实时调度的优先级管理是比较宽泛的,可以在0~99间调整优先级。但是,这样也同样带来了优先级管理问题。社区大神就有抱怨这个问题(Controlling realtime priorities in kernel threads),提交了补丁来取消实时调度优先级调整的大部分能力。先看一下当前内核中对SCHED_FIFO优先级的管理。
Subsystem | Priority | Description |
---|---|---|
Arm bL switcher | 1 | The Arm big.LITTLE switcher thread |
crypto | 50 | Crypto engine worker thread |
ACPI | 1 | ACPI processor aggregator driver |
drbd | 2 | Distributed, replicated block device request handling |
PSCI checker | 99 | PSCI firmware hotplug/suspend functionality checker |
msm | 16 | MSM GPU driver |
DRM | 1 | Direct rendering request scheduler |
ivtv | 99 | Conexant cx23416/cx23415 MPEG encoder/decoder driver |
mmc | 1 | MultiMediaCard drivers |
cros_ec_spi | 50 | ChromeOS embedded controller SPI driver |
powercap | 50 | "Powercap" idle-injection driver |
powerclamp | 50 | Intel powerclamp thermal management subsystem |
sc16is7xx | 50 | NXP SC16IS7xx serial port driver |
watchdog | 99 | Watchdog timer driver subsystem |
irq | 50 | Threaded interrupt handling |
locktorture | 99 | Locking torture-testing module |
rcuperf | 1 | Read-copy-update performance tester |
rcutorture | 1 | Read-copy-update torture tester |
sched/psi | 1 | Pressure-stall information data gathering |
从上表可以看出,Kernel中实时调度的优先级主要集中在三个位置:高优先级(99)、正常优先级(50)、低优先级(1)。所以,其实并不需要太多优先级的阶级,过多只会带来混乱。
Android RT priority
Android对于实时调度优先级的设置是经过深思熟虑的,要保证实时性又不能干扰内核运行。其中,Sensor设置了很高的优先级,因为其对实时性十分敏感。其他的实时调度线程都维持在低优先级上,同样由于音频对时间敏感,而赋予了相对高的优先级,但还是维持在低优先级上。下表列出Android系统(9.0)中实时调度优先级的配置,
Subsystem | Priority | Description |
---|---|---|
SensorManager EventQueue | 98 | SensorManager EventQueue thread |
SensorManager | 10 | SensorManager looper |
FastMixer/FastCapture | 3 | AudioFlinger fast mixer and fast capture |
AudioApp | 2 | AudioFlinger playback or record threads |
Audio HAL | 3/2 | Flow AudioFlinger |
AAudioService | 2 | Aaudio threads |
SurfaceFlinger | 2 | SurfaceFlinger Main, DispSync and Event threads. |
CameraService | 1 | When "camera.fifo.disable" isn't 1. |
SurfaceFlinger handleMessage | 1 | SCHED_FIFO when the display is turned on, SCHED_OTHER when turned off. |
UI and RenderThreads | 1 | ActivityManagerService use SCHED_FIFO for UI and RenderThreads if "sys.use_fifo_ui" isn't 0. |
上面的两个表格总结了Linux kernel和Android系统中实时调度策略优先级的配置,系统开发人员可以做为参考。当开发人员需要修改或配置自己的实时调度策略是,需要充分理解当前优先级的状态,以及使用实时调度策略的目的,从而选择一个合适的优先级。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。