gpt4 book ai didi

android - 在 Android 上, "cached processes"是否仍在 CPU 上调度?

转载 作者:行者123 更新时间:2023-11-29 01:01:02 28 4
gpt4 key购买 nike

Android process lifecycle documentation详细说明应用程序进程可能处于的各种状态,以及它如何与用户界面对用户的可见性相关。

例如,当用户从一个Activity切换到另一个Activity,第一个Activity不再可见时,包含第一个Activity的进程将进入“缓存”状态。

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

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

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

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

最佳答案

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

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

缓存进程的线程与任何其他进程的线程没有区别。理想情况下,缓存的进程只有被阻塞等待某事的线程(例如,来自核心操作系统进程的 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。

它记录到 LogCat 的时间因操作系统版本和制造商调整而异。因此,例如,在我刚刚将其扔到的 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.

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

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

关于android - 在 Android 上, "cached processes"是否仍在 CPU 上调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51116782/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com