Android进程调度

2024-05-09

我试图更好地理解,以便在创建 Android 应用程序/服务时确定潜在的互操作性问题对可靠性的影响。我想弄清楚进程优先级是如何确定的。服务和活动之间优先级的差异以及调度程序是否以不同方式对待它们的优先级。基本上,我试图深入了解某个活动或服务被来自不同应用程序(甚至 Linux 内核)的恶意进程所饿死的可能性有多大。

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

Thanks!

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


以下列表按重要性顺序列出了不同类型的进程(第一个进程最重要,最后被终止):

  1. 前台进程
  2. 看得见的过程
  3. 服务流程
  4. 后台进程
  5. 空进程

Note:Android 根据进程中当前活动组件的重要性对进程进行最高级别的排名。例如,如果某个进程托管服务和可见活动,则该进程将被列为可见进程,而不是服务进程。

这是从这里引用的进程和线程 http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html

EDIT:

了解应用程序优先级和进程状态

终止进程以回收资源的顺序由托管应用程序的优先级决定。应用程序的优先级等于其最高优先级的组件。

如果两个应用程序具有相同的优先级,则优先级较低的进程将首先被终止。进程优先级还受到进程间依赖关系的影响;如果应用程序依赖于第二个应用程序提供的服务或内容提供商,则第二个应用程序将至少具有与其支持的应用程序一样高的优先级。

所有 Android 应用程序都将保持运行并保留在内存中,直到系统需要其资源来供其他应用程序使用。

正确构建应用程序以确保其优先级适合其正在执行的工作非常重要。如果不这样做,您的应用程序可能会在执行重要操作时被终止。 下面的列表详细介绍了图 1 中所示的每个应用程序状态,解释了状态是如何由组成它的应用程序组件确定的:

活动进程活动(前台)进程是那些托管应用程序的进程,其组件当前正在与用户交互。这些是 Android 尝试通过回收资源来保持响应的进程。这些进程一般很少,只有在万不得已的情况下才会被杀死。

活跃的进程包括:

1.活动处于“活跃”状态;也就是说,它们位于前台并响应用户事件。您将在本章后面更详细地探讨活动状态。

2.当前正在执行 onReceive 事件处理程序的活动、服务或广播接收器。

3. 正在执行 onStart、onCreate 或 onDestroy 事件处理程序的服务。

看得见的流程可见但不活动的进程是那些托管“可见”活动的进程。顾名思义,可见 Activity 是可见的,但它们不在前台或响应用户事件。当 Activity 仅部分被遮挡(被非全屏或透明 Activity)时,就会发生这种情况。通常可见进程很少,只有在极端情况下才会被杀死,以允许活动进程继续运行。

启动服务流程托管已启动服务的进程。服务支持正在进行的处理,这些处理应该在没有可见界面的情况下继续进行。由于服务不直接与用户交互,因此它们的优先级略低于可见活动。它们仍然被认为是前台进程,并且不会被杀死,除非活动或可见进程需要资源。

后台进程托管不可见且没有任何已启动服务的 Activity 的进程被视为后台进程。通常会有大量的后台进程,Android 会使用最后看到的最先杀死的模式来杀死这些进程,以便为前台进程获取资源。

空进程为了提高整体系统性能,Android 通常会在应用程序生命周期结束后将其保留在内存中。 Android 维护此缓存是为了缩短应用程序重新启动时的启动时间。这些进程通常会根据需要终止。

欲了解更多信息,请看这里(我在这个博客上找到)Android 中的内存管理 http://mobworld.wordpress.com/2010/07/05/memory-management-in-android/

EDIT:

I think Android is basic Linux so, whatever scheduler works for Linux is same in Android. 

Android调度器和Linux调度器的区别

调度程序 — 5 个文件 — Android 内核还包含对 CPU 进程调度程序和计时算法的细微更改。我们不知道这些变化的历史,根据粗略的检查,其影响并不明显。

进程抢占:

如前所述,Linux 操作系统是抢占式的。当进程进入TASK_RUNNING状态时,内核检查其优先级是否高于当前正在执行的进程的优先级。如果是,则调用调度程序来选择要运行的新进程(可能是刚刚变得可运行的进程)。此外,当进程的时间片达到零时,它会被抢占,并调用调度程序来选择新进程。

实际的调度策略

考虑一个具有两个可运行任务的系统:文本编辑器和视频编码器。文本编辑器是 I/O 密集型的,因为它几乎所有的时间都在等待用户按键(无论用户输入的速度有多快,它都没有那么快)。尽管如此,当它确实收到按键时,用户希望编辑器立即响应。相反,视频编码器受处理器限制。除了从磁盘读取原始数据流并随后写入生成的视频之外,编码器还花费所有时间将视频编解码器应用于原始数据。它对运行时间没有任何严格的时间限制——用户无法判断它是现在开始运行还是半秒后开始运行。当然,越早完成越好。

在该系统中,调度程序为文本编辑器提供比视频编码器更高的优先级和更大的时间片,因为文本编辑器是交互式的。文本编辑器有大量可用的时间片。此外,由于文本编辑器具有更高的优先级,因此它能够在需要时抢占视频编码器。这确保文本编辑器能够立即响应用户按键。这对视频编码器是不利的,但由于文本编辑器只是间歇性地运行,视频编码器可以独占剩余时间。这优化了两个应用程序的性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android进程调度 的相关文章

  • 如何访问对话框中的 EditText 字段?

    如何访问对话框中的 EditText 字段 将 EditText 小部件放入对话框中
  • 在 docker 容器内创建 android 模拟器时出现“sh: 1: file: not found”

    我正在尝试在 docker 容器内创建一个 android 模拟器 但遇到了一些问题 SDK 更新和 AVD 创建成功 我尝试创建模拟器 出现以下错误 emulator avd test 22 no skin no audio no win
  • 如何调试使用maven构建的android应用程序

    我目前正在尝试从 Eclipse 调试我的设备上的 Android 应用程序 设备已添加 我可以在控制台和 Eclipse 中看到它 控制台 Windows adb devices List of devices attached 0019
  • 旧 Android SDK 版本上的 java.lang.NoClassDefFoundError

    我在 Google Play 上发布了我的应用程序的一个版本 今天早上醒来时发现了一些不满意的客户 该应用程序的最新版本集成了对蓝牙低功耗 BTLE 心率监测器的支持 该应用程序在 Android 4 3 和 4 4 上运行良好 但在 4
  • 如何在android上模拟PC的Esc键

    我正在写一个可以在android上玩flash的应用程序 但是我无法模拟ESC键 因为很多flash游戏需要ESC键才能返回主菜单 没有这个键我制作的应用程序将毫无用处 谁能告诉我如何模拟这个 我可以只发送一个密钥代码吗 但我也不知道键码
  • 如何在 Android 中启用/禁用日志级别?

    例如 我有很多日志语句需要调试 Log v TAG Message here Log w TAG WARNING HERE 在设备电话上部署此应用程序时 我想关闭详细日志记录 我可以在其中启用 禁用日志记录 The Android 文档对日
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • Android 时间选择器在分钟滚动时自动更改小时

    例如 当我在 TimePicker 上滚动分钟时 在将分钟滚动到 59 后 小时会自动滚动到 7 因此新时间将为 07 59 同样的方式 如果我有 07 59 并且我将分钟滚动到 00 小时将自动滚动到 8 所以时间将是 08 00 此逻辑
  • 对超类方法的调用应该是第一个语句吗?

    语音识别的结果可以在onActivityResult int requestCode int resultCode Intent data 方法 如图这个例子 http developer android com resources sam
  • WebView 未绘制,WARN/webcore(5336):第一次布局后无法获取 viewWidth

    我的应用程序有一个视图 可以使用以下代码以编程方式添加到活动中 RelativeLayout LayoutParams layoutParams new RelativeLayout LayoutParams 480 75 Relative
  • 按歌曲获取封面图片

    是否可以按歌曲而不是按专辑获取封面图片 因为我有一张自编的歌曲专辑 而且它们都有不同的封面图片 但是当我想查询它们时 我总是得到相同的图片 String ARG STRING MediaStore Audio Media ALBUM ID
  • 如何使用特定选项卡启动活动?

    我已经浏览了许多示例 问题和教程 但我从未见过使用特定选项卡启动活动 启动新意图 我知道可以使用 setCurrentTab切换到选项卡 但这只能从父活动选项卡内部完成 从另一个活动启动一个活动中包含的特定选项卡怎么样 是否可以 如果是这样
  • 更改适配器数据时,RecyclerView 滚动到顶部位置

    我正在对某个帖子进行喜欢和不喜欢RecyclerView 我在更改视图后调用api 但问题是RecyclerView当我通知它更新时 总是滚动到顶部 这是我的适配器代码 likeAnim setOnLikeListener object O
  • 在 Android KitKat 中接收彩信

    所以这个视频Android 4 4 短信 API http www youtube com watch v mdq0R2WQssQ DevBytes 解释了 KitKat 中 SMS API 的最新变化 他们还提供了示例项目的链接 http
  • 如何在android上使用xamarin表单执行脚本

    我正在尝试在 Android Mono 上使用 Xamarin Forms 运行 C 脚本 当我运行脚本时 我收到错误 System IO FileNotFoundException 找不到文件 mscorlib dll 这是我试图执行的代
  • Parallel.ForEach - 优雅取消

    关于等待任务完成和线程同步的主题 我目前有一个迭代 我已将其包含在 Parallel ForEach 中 在下面的示例中 我在评论中提出了一些关于如何最好地处理循环的优雅终止的问题 NET 4 0 private void myFuncti
  • 如何在flutter上关注android tv应用程序中的列表视图项目

    我想在 flutter 中构建一个 android 电视应用程序 几乎所有事情都已完成 但一个问题是我无法集中注意力 例如一些弹出效果或边框更改任何告诉用户您现在正在使用此项目的内容 我们在列表视图中迭代的项目 我想要在应用程序中看到的图像
  • OpenMP 超线程导致性能不佳:如何将线程绑定到核心

    我正在开发大型密集矩阵乘法代码 当我分析代码时 它有时会达到我的四核系统的峰值失败率的 75 而其他时候则达到约 36 代码执行之间的效率不会改变 它要么从 75 开始 并继续保持该效率 要么从 36 开始 并继续保持该效率 我已将问题追溯
  • 使 autocompletetextview 看起来像 edittext

    我正在使用 AutoCompleteTextView Roboto 自动完成文本视图 https github com johnkil Android RobotoTextView blob master robototextview sr
  • 在 Android 中将列表传递给另一个 Activity

    我已经创建了一个列表 并希望将该列表传递给另一个活动 但当我创建意图时 我在 putExtra 语句上收到错误 只是想知道是否有任何简单的方法来传递字符串列表而不是单个字符串 Thanks private List

随机推荐

  • Python - 如何将列表保存为图像?

    我生成一个常规列表 是否可以将此列表保存为 JPEG 图像或 PNG 或其他格式 以便我可以打开图像并查看它 我目前正在尝试使用 python 成像库 PIL 来解决这个问题 这是可能的解决方案之一 使用以下方法创建一个空图像对象 Imag
  • 阻止斯坦福核心 NLP 服务器输出它收到的文本

    我正在运行一个斯坦福核心自然语言处理 http stanfordnlp github io CoreNLP server java mx4g cp edu stanford nlp pipeline StanfordCoreNLPServe
  • 从 Jenkinsfile 中获取有关其他分支的信息

    Jenkins Blue Ocean 与链接的 Bitbucket Server 实例在同一本地网络上运行 Jenkins 中的多分支项目能够为本地 Bitbucket 服务器上链接的 Bitbucket 存储库的每个分支创建一个分支 但在
  • 如何将 default.html 的字符编码设置为 UTF-8?

    我花了几个小时来验证我的网站HTML 4 01 严格事实上我已经成功了 但仍然有一个警告我无法摆脱 警告是 字符编码不匹配 中指定的字符编码 HTTP 标头 iso 8859 1 是 与中的值不同 元素 utf 8 我将使用该值 来自 HT
  • javafx中的stackpane和root有什么区别?

    我正在练习javafx做饼图 以下是开发饼图的代码 如果我这样做Group并与StackPane 我发现输出没有区别 我已经评论了组部分 只是徘徊两者之间的区别 import javafx application Application i
  • Rails 模型测试 - 模拟与工厂

    Rails 测试模拟对象与使用工厂对象的最佳实践是什么 应该嘲笑only当模型可能转到外部源时使用 或者 您是否仅在测试实际模型并使用模拟来处理其他所有内容时才使用工厂 例如 如果我们有一个包含客户和订单的销售系统 那么当我们测试客户模型时
  • 对 Java 协议缓冲区对象进行一些小更改

    我想在 Java 协议缓冲区对象树的深处进行一个小更改 我可以使用 getBuilder 方法来创建一个新对象 该新对象是旧对象的克隆并进行一些更改 当深入完成此操作时 代码会变得丑陋 Quux Builder quuxBuilder fo
  • MATLAB 图中轴标签与轴之间的距离

    我正在使用 MATLAB 绘制一些数据 我想调整轴标签与轴本身之间的距离 但是 只需向标签的 位置 属性添加一点即可使标签移出图窗窗口 是否有 保证金 属性或类似的东西 在上图中 我想增加数字和标签 Time s 之间的距离 同时自动扩展数
  • 如何在 typeorm 中使用 LEFT JOIN LATERAL?

    我想在 TypeOrm 中使用以下查询 但找不到将其转换为 TypeOrm 的方法 任何帮助表示赞赏 SELECT FROM blocked times bt LEFT JOIN LATERAL SELECT FROM bookings b
  • 从React Redux中的package.json获取版本号(create-react-app)

    OP 编辑 如果其他人遇到此问题 该应用程序是使用创建的创建反应应用程序 https github com facebookincubator create react app 这限制导入到 src 文件夹内 但是如果你将react scr
  • Swift 从照片库中获取视频的 NSData

    我使用 UIImagePickerController 从我的库中选择视频 我需要提取视频文件的 NSData 我使用以下操作从我的库中选择视频 但我的数据似乎为零 但是我的 AVPlayer 播放生成的 NSURL 中的视频 所以我知道问
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 使用 XSLT 从文本文件中删除第一行

    我正在使用一个生成文本文件的系统 Maximo 我需要删除文件的第一行 做到这一点的方法应该是使用 XSLT 任何想法 是的 您可以在 XSLT 中完成您想要的事情 如果您可以选择的话 在 XSLT 2 0 中这样做可能会更容易 Micha
  • JS中如何过滤多个字符串? [复制]

    这个问题在这里已经有答案了 我希望能够过滤数组中的多个字符串 类型 例如我想过滤类型meat并输入fruit在下面的数据结构中 我想要实现的是过滤数据对象 const data type meat food hamburger type f
  • 无需时间即可生成随机字符串?

    我知道如何使用 Runes 和播种 rand Init 在 go 中生成随机字符串time UnixNano 我的问题是 是否可以 使用 stdlib 在不使用当前时间戳 安全 的情况下播种 rand 此外 我问 因为仅仅依靠时间来为敏感操
  • JavaScript 右移负数

    这是片段 var i 101 console log 101 i toString 2 console log 101 gt gt 1 i gt gt 1 toString 2 var l 101 console log 101 l toS
  • 垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组

    我最初将其记录为原项目中的一个问题 https github com nodejs help issues 3590 它立即转移到帮助主题 没有很好的解释 所以现在我想在这里提问 如果我们在 NodeJS v14 v16 v17 中运行以下
  • 如何动态创建 Luigi 任务

    我正在为 Luigi Tasks 构建一个包装器 但遇到了一个障碍Register http luigi readthedocs io en stable modules luigi task register html Register该
  • JQuery UI - 无法更改模态对话框中日期选择器中的月份/年份

    Using 日期选择器里面一个模态对话框 不工作更改月份 年份Firefox 19 0 2 中的下拉列表请参阅 http jsfiddle net 469zV 2 http jsfiddle net 469zV 2 HTML div tit
  • Android进程调度

    我试图更好地理解 以便在创建 Android 应用程序 服务时确定潜在的互操作性问题对可靠性的影响 我想弄清楚进程优先级是如何确定的 服务和活动之间优先级的差异以及调度程序是否以不同方式对待它们的优先级 基本上 我试图深入了解某个活动或服务