Android process lifecycle documentation详细介绍了应用程序进程可能处于的各种状态以及它与UI对用户的可见性之间的关系。
例如,当用户从一个活动切换到另一个活动并且第一个活动不再可见时,包含第一个活动的进程将进入“已缓存”状态。
文档还提供了有关系统如何根据进程所处的状态决定退出该进程的详细信息。
但是,从CPU调度的角度来看,我找不到任何有关不同进程生命周期状态含义的文档。
特别是,是否不再在CPU上调度高速缓存的进程?还是他们仍然可以执行代码?即系统是真的冻结了缓存的进程,还是真正执行了代码但对用户不可见并且更有可能被杀死?
This is a related question,但重点是内存使用和可移动性,而不是CPU调度。
答案 0 :(得分:1)
特别是,不再在CPU上调度高速缓存的进程了吗?
我通常不认为进程是在CPU上调度的。我认为线程是在CPU上调度的。也许我们只是在用不同的术语。
一个已缓存进程的线程与任何其他进程的线程没有什么不同。理想情况下,缓存的进程仅具有被阻塞的线程等待某事(例如,来自核心OS进程的IPC,告诉应用程序进程响应于用户按下主屏幕上的图标来启动另一个活动)。但是,没有什么可以阻止应用程序泄漏一些继续运行的线程的,无论该进程保留了多长时间。
例如,您可以使用单个活动创建一个应用,如下所示:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Executors
.newSingleThreadScheduledExecutor()
.scheduleAtFixedRate({ Log.e("BadWolves", "Zombie!") }, 5, 5, TimeUnit.SECONDS)
finish()
}
}
在这里,我分叉了一个僵尸线程,然后finish()
活动。一旦活动被破坏,进程就会相当快地进入缓存状态。但是,僵尸线程继续记录到LogCat。
long 记录到LogCat的时间因操作系统版本和制造商的调整而异。因此,例如,在我刚刚扔过的Pixel 2上,它已经记录了10分钟,坦率地说,这比我在Android 8.1上的预期时间还要长。
这意味着存在的每个应用程序都有责任在后台正确实施暂停。
是的,在一定程度上。操作系统可以随时终止您的进程,而缓存的进程是需要系统RAM时要终止的主要候选对象。因此,泄漏的线程通常不会长寿,因为缓存的进程通常不会长寿。我的僵尸一直徘徊不前的部分原因是该设备没有被大量使用,所以我没有太多的进程来去去,从而将对系统RAM的压力降至最低。
现在,如果您能原谅我,我需要杀死一个僵尸...