在 Android 上,"cached processes" 是否仍安排在 CPU 上?

On Android, are "cached processes" still scheduled on the CPU?

Androidprocess lifecycle documentation 详细说明了应用程序进程可能处于的各种状态,以及它与 UI 对用户的可见性的关系。

例如,当用户从一个Activity切换到另一个并且第一个Activity不再可见时,包含第一个Activity的进程将进入"cached"状态。

该文档还详细介绍了系统如何根据进程所处的状态决定驱逐进程。

但是,从 CPU 调度的角度来看,我找不到任何关于不同进程生命周期状态意味着什么的文档。

具体来说,缓存进程是否不再安排在 CPU 上?或者他们仍然可以执行代码吗? IE。系统是否真的冻结了缓存的进程,或者它们实际上执行代码但对用户不可见并且更有可能被杀死?

This is a related question,但重点是内存使用和可回收性,而不是 CPU 调度。

Specifically, are cached processes no longer scheduled on the CPU?

我通常不会想到在 CPU 上安排进程。我认为线程是在 CPU 上安排的。也许我们只是使用不同的术语。

缓存进程的线程与任何其他进程的线程没有区别。理想情况下,缓存的进程只有被阻塞等待某些东西的线程(例如,来自核心 OS 进程的 IPC,告诉应用程序进程启动另一个 activity 以响应用户从主屏幕)。但是,没有什么可以阻止应用程序泄漏某些继续 运行 的线程,无论该进程保持缓存多长时间。

例如,您可以创建一个包含单个 activity 的应用,如下所示:

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()
  }
}

在这里,我 fork 了一个僵尸线程,然后 finish() activity。一旦 activity 被销毁,进程就会很快进入缓存状态。然而,僵尸线程继续记录到 LogCat.

它如何 long 记录到 LogCat 因 OS 版本和制造商调整而异。因此,例如,在我刚刚将其扔到的 Pixel 2 上,它已经记录了 10 分钟,坦率地说,这比我在 Android 8.1 上预期的要长。

This would mean that it was the duty of every app in existence to implement pausing correctly when backgrounded.

是的,在一定程度上。 OS 可以随时终止您的进程,缓存进程是在需要系统 RAM 时终止的主要候选者。因此,泄漏的线程 通常 不会活那么久,因为缓存进程 通常 不会活那么久。我的僵尸一直摇摇晃晃的部分原因是这个设备没有经常使用,所以我没有很多进程来来去去,最大限度地减少了系统 RAM 的压力。

现在,如果你不介意的话,我需要杀一个僵尸...