Gre*_*ius 35 multithreading android scheduler dalvik cgroups
我正在努力获得更好的理解,因此我可以在创建Android应用程序/服务时确定潜在互操作性问题的可靠性影响范围.我想弄清楚如何确定进程优先级.服务和活动之间的优先级差异以及调度程序是否以不同方式处理其优先级.基本上我正在努力深入了解一个活动或服务被来自不同应用程序(甚至是Linux内核)的流氓进程所匮乏的可能性.
有没有人有你可以推荐的任何好的链接...我的搜索还没有发现太多.
谢谢!
编辑:我关心的是处理器时间切片/调度,而不是内存资源(内存资源在android文档中有详细描述.)再次感谢!
use*_*305 46
以下列表按重要性顺序显示了不同类型的进程(第一个进程最重要,最后被终止):
注意: Android根据流程中当前活动的组件的重要性,将流程排在最高级别.例如,如果进程托管服务和可见活动,则该进程被排序为可见进程,而不是服务进程.
这里引用了进程和线程
编辑:
了解应用优先级和进程状态
杀死进程以回收资源的顺序取决于托管应用程序的优先级.应用程序的优先级等于其最高优先级组件.
如果两个应用程序具有相同的优先级,则优先级最低的进程将首先被终止.进程优先级也受进程间依赖性的影响; 如果应用程序依赖于第二个应用程序提供的服务或内容提供程序,则辅助应用程序将至少具有与其支持的应用程序一样高的优先级.
所有Android应用程序将保持运行并在内存中,直到系统需要其他应用程序的资源.
正确构建应用程序以确保其优先级适合其正在进行的工作非常重要.如果不这样做,您的应用程序可能会在重要事件中被杀死.以下列表详细说明了图中所示的每个应用程序状态,解释了状态是由包含它的应用程序组件决定的:
活动进程活动(前台)进程是托管具有当前与用户交互的组件的应用程序的进程.这些是Android试图通过回收资源来保持响应的过程.这些过程通常很少,只会作为最后手段杀死它们.
主动流程包括:
1.处于"活跃"状态的活动; 也就是说,它们位于前台并响应用户事件.您将在本章后面更详细地探索活动状态.
2.当前正在执行onReceive事件处理程序的活动,服务或广播接收器.
3.正在执行onStart,onCreate或onDestroy事件处理程序的服务.
可见进程可见但非活动进程是托管"可见"活动的进程.顾名思义,可见活动是可见的,但它们不在前台或响应用户事件.当活动仅被部分遮挡时(通过非全屏或透明活动),会发生这种情况.通常很少有可见的进程,它们只会在极端情况下被杀死以允许活动进程继续.
已启动服务进程托管已启动服务的进程.服务支持在没有可见界面的情况下继续进行的持续处理 由于服务不直接与用户交互,因此它们的优先级略低于可见活动.它们仍然被认为是前台进程,除非活动或可见进程需要资源,否则它们不会被杀死.
后台进程托管不可见且没有任何已启动服务的活动的进程被视为后台进程.通常会有大量的后台进程,Android将使用最后看到的第一个被杀死的模式来杀死,以获取前台进程的资源.
空进程为了提高整体系统性能,Android通常会在应用程序生命周期结束后将应用程序保留在内存中.Android维护此缓存以改善应用程序重新启动时的启动时间.根据需要,这些过程被彻底杀死.
有关详细信息,请查看此处(我在此博客上找到)Android中的内存管理
编辑:
I think Android is basic Linux so, whatever scheduler works for Linux is same in Android.
Run Code Online (Sandbox Code Playgroud)
Android调度程序和Linux调度程序之间的区别
调度程序 - 5个文件 - Android内核还包含对CPU进程调度程序和计时算法的轻微更改.我们不知道这些变化的历史,并且基于粗略的检查,影响并不明显.
流程抢占:
如前所述,Linux操作系统是先发制人的.当进程进入TASK_RUNNING状态时,内核会检查其优先级是否高于当前正在执行的进程的优先级.如果是,则调用调度程序来选择要运行的新进程(可能是刚刚运行的进程).此外,当进程的时间片达到零时,它将被抢占,并调用调度程序来选择新进程.
行动中的调度政策
考虑具有两个可运行任务的系统:文本编辑器和视频编码器.文本编辑器受I/O约束,因为它几乎花费所有时间等待用户按键(无论用户输入的速度有多快,都不是那么快).尽管如此,当它确实收到按键时,用户希望编辑器立即响应.相反,视频编码器受处理器限制.除了从磁盘读取原始数据流并稍后写入生成的视频之外,编码器还花费所有时间将视频编解码器应用于原始数据.它在运行时没有任何强大的时间限制 - 如果它现在开始运行或半秒,用户无法分辨.当然,越快越好.
在该系统中,调度器为文本编辑器提供比视频编码器更高的优先级和更大的时间片,因为文本编辑器是交互式的.文本编辑器有很多时间片可用.此外,由于文本编辑器具有更高的优先级,因此能够在需要时抢占视频编码器.这可确保文本编辑器能够立即响应用户按键.这会损害视频编码器,但由于文本编辑器只是间歇性地运行,因此视频编码器可以独占剩余时间.这可以优化两个应用程序的性能.
hac*_*bod 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.
是的,您的流程可能会被饿死.
Android使用Linux 2.6进行资源的低级管理.Linux 2.6碰巧使用多级反馈队列作为其调度算法.这有利于I/O绑定进程和短CPU突发进程(适用于响应/交互的电话).但这意味着CPU密集型流程和低优先级流程可能会变得匮乏.我不确定Linux 2.6是否会定期增加等待进程的优先级,以便最终获得服务,从而避免饥饿.
但实际上,您不必担心这一点,因为您将成为活动活动,或者您将成为一项服务,两者都具有相对较高的优先级,如前面的答案所示.
归档时间: |
|
查看次数: |
24646 次 |
最近记录: |