Linux的线程调度策略中有FIFO和RT的实时调度方法,但是在Android中做了限制,普通用户不能修改线程的调度算法为FIFO和RT,必须ROOT用户才能更改。但问题是程序是以普通用户启动和运行的,因此没有办法在程序里面设置FIFO调度。只能使用chrt命令手动修改。

要实现在程序中自动设置FIFO,必须弄清楚Android里面做了什么限制?在内核kernel/kernel/sched.c中我们发现了sched_setscheduler的系统调用,其调用了static 函数__sched_setscheduler来实现功能。在此函数中有这么几行:

/*
* Allow unprivileged RT tasks to decrease priority:
*/
if (user && !capable(CAP_SYS_NICE)) {

capable(CAP_SYS_NICE)似乎是权限控制!CAP_SYS_NICE的说明文档如下:

CAP_SYS_NICE
* Raise process nice value (nice(2), setpriority(2)) and
change the nice value for arbitrary processes;
* set real-time scheduling policies for calling process, and
set scheduling policies and priorities for arbitrary
processes (sched_setscheduler(2), sched_setparam(2),
shed_setattr(2));
* set CPU affinity for arbitrary processes
(sched_setaffinity(2));
* set I/O scheduling class and priority for arbitrary
processes (ioprio_set(2));
* apply migrate_pages(2) to arbitrary processes and allow
processes to be migrated to arbitrary nodes;
* apply move_pages(2) to arbitrary processes;
* use the MPOL_MF_MOVE_ALL flag with mbind(2) and
move_pages(2).

http://man7.org/linux/man-pages/man7/capabilities.7.html

至此,问题找到,正是CAP_SYS_NICE禁止了普通用户设置线程的FIFO调度策略,我们把这一部分代码屏蔽后,重新编译内核。sched_setscheduler(SCHED_FIFO)即可正常工作了。当然,被屏蔽的代码中也包含了其它逻辑上的验证,我们可以根据自己的需要酌情修改。

更多相关文章

  1. Android:销毁所有的Activity退出应用程序几种方式
  2. android项目打包成apk应用程序后部署到虚拟机上测试
  3. Android应用程序获得root权限
  4. 第三部分:Android 应用程序接口指南---第四节:动画和图形---第五章
  5. Android 驱动之旅: 第三章 硬件抽象层(HAL)增加接口模块访问硬件

随机推荐

  1. 利用Android多进程机制来分割组件
  2. Android 设备上实现串口的移植
  3. android代码混淆个人总结及踩坑
  4. Java: Swing中引入Android的NinePatch技
  5. Android NDK开发篇(六):Java与原生代码通
  6. Android R.java类的手动生成
  7. Android——AIDL基础实现demo以及原理探
  8. android图形系统详解五:Android绘制模式
  9. android 程序开发的插件化 模块化方法
  10. Android studio开发-第一个入门例子(十分