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

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

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

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

on bootstart service1start service2start service3

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

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

在这个示例中,service1 到 service5 会并行启动,因为它们都在 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

在这个示例中,service1 和 service2 会在系统启动时并行执行,而 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.tpcf.cn/pingmian/48579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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缓存引发的问题这篇文章主要是记录当时排查这个问题的过程。今天这篇文主要回…

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

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