Android进程调度

时间:2011-10-28 15:00:41

标签: android multithreading scheduler dalvik cgroups

我正在努力获得更好的理解,因此我可以在创建Android应用程序/服务时确定潜在互操作性问题的可靠性影响范围。我想弄清楚如何确定进程优先级。服务和活动之间的优先级差异以及调度程序是否以不同方式处理其优先级。基本上我试图深入了解一个活动或服务被不同应用程序(甚至是Linux内核)的流氓进程所匮乏的可能性。

有没有人有你推荐的任何好的链接...我的搜索还没有多少出现。

谢谢!

编辑:我关心的是处理器时间切片/调度,而不是内存资源(内存资源在android文档中有详细描述。)再次感谢!

3 个答案:

答案 0 :(得分:46)

答案 1 :(得分:35)

Android在这方面与普通的Linux系统有点不同。 Android使用两种方式来影响调度:进程/线程“漂亮”级别和cgroups。

流程“好”级别会影响Linux的正常“公平”调度策略;具有较高niceness的线程将比具有较低niceness的线程更少运行。如果您有一个处于“默认”优先级的线程(如Process.THREAD_PRIORITY_DEFAULT中所定义),则运行速度会明显高于后台优先级(或Process.THREAD_PRIORITY_BACKGROUND)。

理论上,这可以确保前台/ UI线程不会受到后台工作的显着影响......但是,在实践中,这还不够。考虑一下你是否有10个想要运行的后台线程,但是有一个前台线程驱动了UI。这仍然会对前台线程的行为产生明显影响。

为了解决这个问题,Android还以一种简单的方式使用Linux cgroup来创建更严格的前台与后台调度。前台/默认cgroup允许线程调度正常。然而,后台cgroup仅对该cgroup中所有线程可用的总CPU时间的一小部分应用限制。因此,如果该百分比为5%并且您有10个后台线程都想要运行和一个前台线程,则10个后台线程一起只能占用前台可用CPU周期的最多5%。 (当然,如果没有前台线程要运行,后台线程可以使用所有可用的CPU周期。)

当您使用其公共API设置线程优先级时,Android会隐式地在默认和后台cgroup之间移动线程。因此,如果将线程的优先级设置为Process.THREAD_PRIORITY_BACKGROUND或更高,您还将把线程放入后台cgroup。将其设置为Process.THREAD_PRIORITY_DEFAULT,它将位于默认的cgroup中。

因此,通过遵循将后台工作线程放入后台优先级的常规惯例,您可以确保它们不会中断前台UI线程。

此外,Android还会将进程中的所有线程移动到后台cgroup,以获取它知道对用户不重要的进程。无论各个线程是否已请求前台调度优先级,任何后台进程或服务进程都将其线程放入后台cgroup。

答案 2 :(得分:8)

是的,可能让您的流程陷入饥饿状态。

Android uses Linux 2.6用于资源的低级管理。 Linux 2.6碰巧使用multi-level feedback queues作为其调度算法。这有利于I / O绑定进程和短CPU突发进程(适用于响应/交互的电话)。但这意味着CPU密集型流程和低优先级流程可能会变得匮乏。我不确定Linux 2.6是否会定期增加等待进程的优先级,以便最终获得服务,从而避免饥饿。

但实际上,您不必担心这个问题,因为您将成为活动活动,或者您将成为一项服务,这两项服务都具有相对较高的优先级,如前面的答案所示。