Android init.rc如何并行执行任务

Android开机优化系列文档-CSDN博客

  • Android 14 开机时间优化措施汇总-CSDN博客
  • Android 14 开机时间优化措施-CSDN博客
  • 根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客
  • Android系统上常见的性能优化工具-CSDN博客
  • Android上如何使用perfetto分析systrace-CSDN博客
  • Android系统设置kernel log level的方法-CSDN博客
  • Android14系统应用统一裁剪方案_android 开机 服务 裁剪-CSDN博客
  • Android系统上Bootchart的使用_android bootchart-CSDN博客
  • Android init.rc如何并行执行任务-CSDN博客
  • Android init常用调试工具-CSDN博客
  • 如何识别Android init 中的缓慢操作-CSDN博客
  • Android init 中的wait_for_property指令-CSDN博客
  • Android init.rc各阶段的定义和功能-CSDN博客
  • Android init.rc的启动流程-CSDN博客

Android init.rc如何并行执行任务

在 Android 系统中,init.rc 是一个重要的启动脚本,用于定义系统启动时需要执行的服务、操作和初始化任务,也是用来配置系统启动时的各种服务、属性和动作的脚本文件。虽然 init.rc 文件本身是一个序列化的配置文件,init.rc 文件中的命令通常按顺序执行,但 Android 的 init 进程和 init.rc 文件中的机制允许一定程度的并行执行任务,通过特定的机制,Android 也支持并行执行 init.rc 中的命令。下面将详细介绍在 init.rc 文件中如何实现任务并行执行,包括核心机制、示例和相关代码实现。

1. init.rc 文件的基本结构

init.rc 文件中,我们可以定义服务、属性、动作等内容。以下是一个简单的 init.rc 文件示例:

# 定义服务
service servicename /system/bin/servicenameclass mainuser systemgroup systemoneshot# 定义属性
on boot# 设置属性值setprop sys.boot_completed 1

2. init.rc 的并行执行机制

2.1 service命令并行执行

init.rc 文件中定义的 service 命令可以并行地启动不同的服务。每个 service 命令定义一个独立的服务,并且这些服务是可以并行启动的。init 进程会在启动这些服务时创建多个线程,这些线程是独立的,因此服务可以并行运行。

service service1 /system/bin/service1class mainuser systemgroup systemoneshotservice service2 /system/bin/service2class mainuser systemgroup systemoneshot

在上述示例中,service1service2 是两个不同的服务, 会被 init 进程并行启动,因为 init 进程会并行地处理 service 命令中定义的服务, 每个 service 定义都可以在不同的线程中执行。

2.2 使用 on 块中的 start 和stop命令

init.rc 文件中,使用 startstop 命令可以控制服务的启动和停止。可以将多个服务的启动操作放在同一个 on 块中,init 进程会并行处理这些 start 命令,从而实现间接的并行处理。

on bootstart service1start service2start service3

在这个例子中,虽然 start 命令在 on boot 块中是顺序写的,在这种配置下,start service1start service2 会被顺序执行,但每个服务的启动过程是独立的,init 进程会并行启动 service1service2service3,实现实际效果上的并行执行。

2.3 init 进程的并行执行-多线程处理

init 进程本身具备并发处理的能力。init 进程通过多线程机制来并行处理服务启动。init 进程会按照 init.rc 文件中定义的顺序读取配置文件,但可以同时启动多个服务。init 进程会对每个服务创建单独的线程来启动服务,每个 service 启动命令实际上会创建一个新的线程来执行服务的启动命令,从而实现并行执行。

// src/init/service.cpp
void ServiceManager::startService(const std::string& name, const std::string& path, const std::vector<std::string>& args) {// 创建一个新的线程来启动服务std::thread([=] {startServiceInternal(name, path, args);}).detach();
}

3. 进程级别的并行处理

init 进程的并行处理不仅仅依赖于 init.rc 文件中的配置,还与 Android 的启动机制有关。以下是一些与并行处理相关的高级概念:

3.1 init 进程的多线程处理

init 进程内部使用多线程机制来处理不同的服务和任务。每个 service 启动命令会在一个新的线程中执行,从而实现并行处理。

// init.cpp
void ServiceManager::startService(const std::string& name, const std::string& path, const std::vector<std::string>& args) {// 创建线程启动服务std::thread([=] {startServiceInternal(name, path, args);}).detach();
}
3.2 init 进程的事件驱动模型

init 进程采用事件驱动模型来处理任务,事件驱动模型允许 init 进程在等待事件的同时处理多个任务或事件,从而支持并发操作。虽然 init.rc 文件中的指令是按顺序写的,但 init 进程会在处理这些指令时根据事件的到来来决定任务的执行顺序。

// src/init/init.cpp
void Init::main() {while (true) {// 处理各种事件handleEvents();}
}

4. init.rc 中并行执行的示例

以下是一些示例,展示如何在 init.rc 文件中配置并行执行任务的机制。

4.1 并行启动服务

init.rc 文件中可以定义多个 service,这些服务会在启动时并行执行。

# 定义服务1
service service1 /system/bin/service1class mainuser systemgroup systemoneshot# 定义服务2
service service2 /system/bin/service2class mainuser systemgroup systemoneshot# 定义服务3
service service3 /system/bin/service3class mainuser systemgroup systemoneshot# 启动服务4
service service4 /system/bin/service4class mainuser systemgroup systemoneshot# 启动服务5
service service5 /system/bin/service5class mainuser systemgroup systemoneshot    # 启动服务
on bootstart service1start service2start service3start service4start service5

在这个示例中,service1service5 会并行启动,因为它们都在 on boot 块中进行配置,而 init 进程会并行地处理这些服务。

4.2 使用 on块中的 start 命令并行执行

on boot 块中启动多个服务,虽然 start 命令是按顺序写的,但 init 进程会并行启动这些服务。

on bootstart service1start service2start service3start service4start service5
4.3 在不同的 on块中并行执行

在不同的 on 块中定义的命令可以并行执行。例如:

on bootstart service1on property:ro.hardware=examplestart service2

在这个例子中,service1 会在系统启动时启动,而 service2 会在 ro.hardware=example 属性设置时启动。虽然这两个服务的启动是基于不同的事件,但它们可以并行地进行。

5. 与 init 进程相关的源代码分析

以下是与 init 进程处理并行任务相关的源代码文件和实现细节:

  • service.cpp 文件中包含了启动服务的代码。服务的启动是通过多线程机制来并行处理的。

    • ServiceManager::startService

  • init.cpp 文件中包含了 init 进程的主循环和事件处理逻辑。

    • Init::main

  • init.rc 文件的定义和配置。

    • init.rc

6. 并行执行的高级配置示例

以下是一个高级示例,展示如何在 init.rc 文件中通过不同的配置来实现并行执行:

# 启动服务1
service service1 /system/bin/service1class mainuser systemgroup systemoneshot# 启动服务2
service service2 /system/bin/service2class mainuser systemgroup systemoneshot# 启动服务3
service service3 /system/bin/service3class mainuser systemgroup systemoneshot# 启动服务1和服务2
on bootstart service1start service2# 启动服务3
on property:ro.hardware=examplestart service3

在这个示例中,service1service2 会在系统启动时并行执行,而 service3 会在 ro.hardware=example 属性设置时并行执行。

6. 总结与参考

init.rc 文件中,并行执行任务主要依赖于 service 命令的多线程处理和 init 进程的事件驱动模型。虽然 init.rc 文件中的命令是按顺序书写的,但实际执行时 init 进程通过创建线程、管理服务状态和处理事件来实现并行执行任务。

参考资料

  • Android init.rc 文件详细说明

  • Android init 进程源代码

  • Android init 进程的并行处理

通过这些资源,可以深入了解 init.rc 文件中的并行执行机制和相关的实现细节。

高级配置的参考示例

以下是一些更高级的 init.rc 文件配置示例,用于展示如何实现复杂的并行执行:

# 启动服务1
service service1 /system/bin/service1class mainuser systemgroup systemoneshot# 启动服务2
service service2 /system/bin/service2class mainuser systemgroup systemoneshot# 启动服务3
service service3 /system/bin/service3class mainuser systemgroup systemoneshot# 启动服务1和服务2,并在服务2启动后启动服务3
on bootstart service1start service2on property:ro.hardware=examplestart service3

这个示例展示了在不同的 on 块中使用 start 命令来实现任务的并行执行,同时也演示了如何在特定条件下启动服务。

进阶并行处理的技巧

除了 init.rc 文件中的标准配置外,还可以使用以下技巧来优化并行处理:

  • 利用 on块中的条件来延迟或触发任务的执行。

  • service 定义中使用 background选项,使服务在后台运行而不是前台。

# 定义后台服务
service service4 /system/bin/service4class mainuser

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-网络并发模型

3. 网络并发模型 3.1 网络并发模型概述 什么是网络并发 在实际工作中&#xff0c;一个服务端程序往往要应对多个客户端同时发起访问的情况。如果让服务端程序能够更好的同时满足更多客户端网络请求的情形&#xff0c;这就是并发网络模型。 循环网络模型问题 循环网络模型只能…

逻辑回归损失函数

文章目录 1.基础简析交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;对数似然损失函数&#xff08;Log-Likelihood Loss&#xff09; 2.关键步骤3.案例 1.基础简析 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类问题的统计模型&#x…

C++进阶 继承

目录 继承的概念及定义 继承概念 继承定义 定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 析构函数 总结 继承与友元 继承与静态成员 浅谈复杂…

Scott Brinker:消除噪音越来越难?这是一个越来越有效的营销渠道

合作伙伴成为更有效的渠道 对于普通读者来说&#xff0c;我看好生态系统并不奇怪。我一直主张&#xff0c;平台生态系统可以解决不断变化、高度多样化的市场格局中的许多挑战。这也是我在HubSpot和公司的技术合作伙伴生态系统所关注的。 在本月早些时候的文章中&#xff0c;我…

SpringMVC源码深度解析(中)

接上一遍博客《SpringMVC源码深度解析(上)》继续聊。最后聊到了SpringMVC的九大组建的初始化&#xff0c;以 HandlerMapping为例&#xff0c;SpringMVC提供了三个实现了&#xff0c;分别是&#xff1a;BeanNameUrlHandlerMapping、RequestMappingHandlerMapping、RouterFunctio…

AI一站式科研写作利器:PaperPal

文章目录 在线编辑Word 插件 在线编辑 PaperPal是一款面向科研人员的写作工具&#xff0c;支持在线编辑以及Word插件。下面以在线编辑为例&#xff0c;详述PaperPal的润色功能。 进入网页后&#xff0c;点击【新建在线文档】&#xff0c;即可开启润色功能&#xff0c;界面如下…

《昇思25天学习打卡营第24天|基于 MindSpore 实现 BERT 对话情绪识别》

1. BERT 模型概述 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一个预训练的语言表示模型&#xff0c;可以应用于多种自然语言处理任务&#xff0c;包括对话情绪识别。BERT 通过双向 Transformer 编码器&#xff0c;能同时考虑句子…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 图像物体的边界(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

红尘阡陌:相遇与分离的交织,在这纷繁复杂的尘世间,阡陌纵横,每一条道路都承载着无数的故事,有相遇的欣喜,亦有分离的哀伤

红尘阡陌:相遇与分离的交织,在这纷繁复杂的尘世间,阡陌纵横,每一条道路都承载着无数的故事,有相遇的欣喜,亦有分离的哀伤。相遇,宛如璀璨星辰划过夜空,瞬间点亮了生命的黑暗;分离,却似深秋的寒风,无情地吹落了曾经繁茂的枝叶。 有些人的出现,如同春日里的暖阳,猝…

ultralytics-yolov8

yolov8 安装环境 装pytorch conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.6 -c pytorch -c conda-forge安装用到的包 requirements.txt ultralytics tqdm scikit-learn pyaml shapely pyclipper scikit-image imgaug lmdb tqdm rapidfuz…

word 设置目录中英文字母大写改为小写

选中目录右击“字体”&#xff0c;设置“小型大写字母”。

【Vue3】工程创建及目录说明

【Vue3】工程创建及目录说明 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

【LeetCode】从中序与后序遍历序列构造二叉树

目录 一、题目二、解法完整代码 一、题目 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], …

谷粒商城实战笔记-40-前端基础-Vue-计算属性、监听器、过滤器

文章目录 一&#xff0c;计算属性1&#xff0c;用途2&#xff0c;用法2.1 定义View2.2 声明计算属性 3&#xff0c;注意事项 二&#xff0c;监听器1. 使用 watch 监听属性的变化 三&#xff0c;过滤器1&#xff0c;定义局部过滤器2&#xff0c;定义全局过滤器3&#xff0c;使用…

Perl 基础语法

Perl 基础语法 Perl 是一种高级、解释型、动态编程语言&#xff0c;广泛用于CGI脚本、系统管理、网络编程、以及其他领域。Perl 以其强大的文本处理能力和简洁的语法而闻名。本文将详细介绍 Perl 的基础语法&#xff0c;帮助读者快速入门。 1. Perl 变量和数据类型 1.1 变量…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信

目录 引言 5.4 直接C2通信 5.4.1 概述 5.4.2 A2X直接C2通信服务的授权策略 5.4.3 USS使用A2X直接C2通信服务的C2授权程序 5.4.4 直接C2通信建立程序 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别…

C 语言实例 - 使用引用循环替换数值

a、b、c 三个变量&#xff0c;通过引用按顺序循环替换他们的值。 #include<stdio.h>void cyclicSwap(int *a,int *b,int *c);int main() {int a, b, c;printf("输入 a, b 和 c 的值: ");scanf("%d %d %d",&a,&b,&c);printf("交换前…

bs4模块使用(一)

1. 安装BS4 pip install beautifulsoup4 pip install lxml2. 对象种类 bs4将html文档解析成一个树形结构&#xff0c;每个节点都是python对象&#xff0c;大概可分为下面四种&#xff1a; 2.1 Tag 后面再详细介绍&#xff0c;先介绍最重要的两个属性 name soup Beautiful…

【mybatis 一级缓存】

前言 mybatis 默认开启一级缓存&#xff0c;为什么我们很少遇到缓存带来的问题呢&#xff1b;我工作6年也只遇到过一次&#xff0c;最近才遇到的&#xff0c;并且我还记录了&#xff1a;不懂myabits缓存引发的问题这篇文章主要是记录当时排查这个问题的过程。今天这篇文主要回…

数据结构——队列(链式结构)

一、队列链式结构定义 队列的链式存储结构是一种用链表实现的队列,它不像顺序存储结构那样需要预先分配固定大小的空间。链式存储结构的队列由节点组成,每个节点包括数据和指向下一个节点的指针。队列的链式存储结构可以动态地分配内存,更灵活地处理数据。在链式存储结构中…