当前位置: 首页 > news >正文

Android Framework学习三:zygote剖析

文章目录

  • Zygote工作内容
    • 起始点
    • 初始化步骤
    • 启动 ZygoteInit
    • ZygoteInit.main () 函数内部操作
  • Zygote如何启动SystemServer
    • 参与的类和文件
    • 流程步骤
      • 进程创建完成后的处理
  • Framework学习之系列文章

在 Android 系统中,Zygote 是一个非常关键的进程,有 “App 孵化器” 之称 ,主要有以下特点和作用:
进程地位与创建
它是 Android 系统上所有应用进程的父进程 ,由 Linux 系统用户空间的第一个进程 ——init 进程,通过 fork 的方式创建。在一些双架构系统中,可能会创建 64 位和 32 位两个 Zygote 进程 ,现代部分设备(如 Pixel 7 及后续机型 )存在 64 位 Zygote 进程 ,还有专门针对 WebView 的 WebView Zygote 。

Zygote工作内容

这是一张描述 Android 系统中 Zygote 进程启动流程的流程图
在这里插入图片描述

起始点

zygote 进程启动:Zygote 是 Android 系统中一个重要的进程,是所有 Java 应用程序进程的孵化器 ,它的启动是整个流程的开端。
随后进入app_main.cpp中的main()函数,这是 Zygote 进程在 C++ 层面启动的入口函数。

初始化步骤

在这里插入图片描述

  1. 初始化 AndroidRuntime:在app_main.cpp的main()函数中,首先进行AndroidRuntime的初始化。AndroidRuntime类用于管理 Android 运行时环境相关的操作。
  2. 设置 zygote 启动模式:通过strcmp(arg, “–zygote”)来判断并设置当前为 Zygote 启动模式。这一步确定了进程是以 Zygote 模式启动,后续的操作都基于此模式进行。
  3. 给 start 函数的参数 args 赋值:通过args.add(String8(“start-system-server”)) 给start函数的参数args添加一个值 ,这个值用于指示后续启动过程中需要启动系统服务器(System Server)。

启动 ZygoteInit

在这里插入图片描述

AndroidRuntime::start函数:
在这里插入图片描述

  1. runtime.start () 启动 ZygoteInit:调用runtime.start()函数来启动ZygoteInit。这是 Zygote 进程启动过程中的关键步骤,它会进一步调用一系列函数来完成虚拟机和 JNI 相关的初始化。

  2. startVm () 创建虚拟机:runtime.start()内部首先调用startVm()函数,用于创建 Java 虚拟机(JVM)。这是为后续运行 Java 代码做准备,是 Zygote 进程能够执行 Java 程序的基础。
    在这里插入图片描述
    在这里插入图片描述

  3. startReg () 注册 JNI 方法:接着调用startReg()函数,用于注册 JNI(Java Native Interface)方法。JNI 允许 Java 代码和本地 C/C++ 代码进行交互,注册这些方法后,Java 层就可以调用本地方法,本地方法也可以回调 Java 方法, 比如BitMap的创建最终调用的JNI方法。
    如gRegJNI保存有要注册的JNI方法:
    在这里插入图片描述
    在startReg中把gRegJNI中JNI注册:
    在这里插入图片描述

  4. 使用 JNI 调用 ZygoteInit 的 main 函数,进入 java 世界:通过env->CallStaticVoidMethod()使用 JNI 调用ZygoteInit类的main函数,至此,程序流程从 C++ 层进入到 Java 层。
    在这里插入图片描述

ZygoteInit.main () 函数内部操作

  1. preload () 预加载信息:在ZygoteInit.main()函数中,首先调用preload()函数,预加载一些类、资源等信息。预加载可以提高后续应用程序启动的速度,因为一些常用的类和资源已经提前加载到内存中。
    在这里插入图片描述
    在这里插入图片描述

  2. new ZygoteServer () 创建 zygote 的 socket 服务:创建ZygoteServer对象,该对象用于创建 Zygote 的 socket 服务。Zygote 通过这个 socket 服务来监听客户端请求,后续应用程序进程的创建请求就是通过这个 socket 来传递的。

  3. r = forkSystemServer () fork 创建 systemserver 进程:通过forkSystemServer()函数使用fork系统调用创建SystemServer进程。SystemServer进程是 Android 系统中非常重要的一个进程,它负责启动和管理系统中的各种服务,如 ActivityManagerService、PackageManagerService 等。

  4. r.run () 执行 systemserver 的 main 方法:在创建SystemServer进程后,调用r.run()来执行SystemServer进程的main方法,启动系统服务相关的逻辑。

  5. zygoteServer.runSelectLoop():最后调用zygoteServer.runSelectLoop(),Zygote 进入循环监听状态,等待客户端(通常是应用程序启动请求)的连接,一旦有请求到来,就会通过fork机制创建新的应用程序进程。

Zygote如何启动SystemServer

这是一张展示 Android 系统中 Zygote 进程创建 SystemServer 进程相关流程的时序图
在这里插入图片描述

参与的类和文件

  • ZygoteInit:Java 类,在 Zygote 进程启动过程中起重要作用,负责协调 Java 层相关初始化工作。
  • Zygote:Java 类,与 Zygote 进程功能紧密相关,包含一些关键的进程创建等逻辑。
  • com_android_internal_os_Zygote:JNI 相关的 C++ 代码,用于实现 Java 层与本地代码的交互,这里主要涉及 Zygote 相关功能的本地实现。
  • AndroidRuntime.cpp:C++ 文件,主要处理 Android 运行时环境相关操作,是连接 Java 层和底层系统的重要桥梁。
  • App_main.cpp:C++ 文件,是 Zygote 进程在 C++ 层面启动的入口文件,包含main函数等关键启动逻辑。
  • RuntimeInit:Java 类,负责运行时初始化相关工作。

流程步骤

  1. 在 ZygoteInit 的 main 函数中发起创建 SystemServer 进程
    ZygoteInit的main函数首先调用forkSystemServer方法,这个方法定义在Zygote类中。
  2. Zygote 类的 forkSystemServer 方法
    Zygote类的forkSystemServer方法调用com_android_internal_os_Zygote类的nativeForkSystemServer本地方法,通过 JNI 进入到本地 C++ 代码层。
  3. 进入本地 C++ 代码的 ForkCommon
    nativeForkSystemServer方法调用ForkCommon中的fork()函数来创建进程。fork()是操作系统提供的系统调用,用于创建一个新进程,新进程是当前进程(Zygote 进程)的副本。
  4. 当fork()调用成功后,会在子进程(即将成为 SystemServer 进程)和父进程(Zygote 进程)中分别返回,子进程继续后续 SystemServer 进程的初始化,父进程则继续 Zygote 进程的其他工作。

进程创建完成后的处理

  1. 在 Zygote 进程这边,当收到 “进程创建完” 的通知后,调用handleSystemServerProcess方法,继续后续 Zygote 相关的处理逻辑。
  2. 对于新创建的 SystemServer 进程,会进行一系列初始化操作:
  • 首先调用nativeZygoteInit方法,这个方法在AndroidRuntime.cpp中实现,主要进行一些本地层面的初始化。
  • 接着调用onZygoteInit方法,在App_main.cpp中实现,用于构建进程对应的 binder。Binder 是 Android 系统中进程间通信(IPC)的重要机制,通过构建 binder,SystemServer 进程可以与其他进程进行通信。
  • 最后调用applicationInit方法,在RuntimeInit类中实现,构建一个反射调用main函数的runnable,为 SystemServer 进程后续执行其main函数逻辑做准备。
    在这里插入图片描述

Framework学习之系列文章

Android Framework学习一:系统框架、启动过程
Android Framework学习二:Activity创建及View绘制流程
Android Framework学习三:zygote剖析

作者:帅得不敢出门

相关文章:

Android Framework学习三:zygote剖析

文章目录 Zygote工作内容起始点初始化步骤启动 ZygoteInitZygoteInit.main () 函数内部操作 Zygote如何启动SystemServer参与的类和文件流程步骤进程创建完成后的处理 Framework学习之系列文章 在 Android 系统中,Zygote 是一个非常关键的进程,有 “App …...

LLM-Based Agent及其框架学习的学习(三)

文章目录 摘要Abstract1. 引言2. 推理与规划2.1 推理2.2 规划2.2.1 计划指定2.2.2 计划反思 3. 迁移与泛化3.1 未知任务的泛化3.2 情景学习3.3 持续学习 4. 学习Crewai和LangGraph4.1 Crewai4.2 LangGraph 参考总结 摘要 本文系统阐述了基于大语言模型的智能体在认知架构中的核…...

修复笔记:获取 torch._dynamo 的详细日志信息

一、问题描述 在运行项目时,遇到与 torch._dynamo 相关的报错,并且希望获取更详细的日志信息以便于进一步诊断问题。 二、相关环境变量设置 通过设置环境变量,可以获得更详细的日志信息: set TORCH_LOGSdynamo set TORCHDYNAM…...

阿里云服务器全栈技术指导手册(2025版)

阿里云服务器全栈技术指导手册(2025版) 一、基础配置与核心架构设计 1. 精准实例选型策略 • 通用计算场景:选择ECS通用型(如ecs.g7)实例,搭载第三代Intel Xeon处理器,适合Web应用、中小型数…...

llfc项目笔记客户端TCP

一、整体架构流程图(简洁版) 复制代码 【客户端启动】 |--- 初始化TcpMgr(单例)|--- 连接信号初始化:连接成功、断开、错误、发数据| 【用户操作:登录成功】|--- 触发发起跳转:发起连接(sig_connect_tcp)| 【TcpMgr收到连接请求】|--- 连接到服务器(connectToHost)…...

基于python的task--时间片轮询

目录 前言 utf-8 chinese GB2312 utf-8 排除task.c chinese GB2312 排除task.c 运行结果 前言 建议是把能正常工作的单个功能函数放到一起(就和放while函数里的程序一样),程序会按顺序自动配置。 不同的格式已经对应给出。 utf-8 impo…...

《前端秘籍:SCSS阴影效果全兼容指南》

在前端开发的旅程中,为网页元素添上阴影效果,就像为一幅画作点缀光影,能让页面瞬间生动起来,赋予元素层次感与立体感。可当我们满心欢喜地在SCSS中写下阴影代码,满心期待着在各种浏览器中都呈现出完美效果时&#xff0…...

强化学习机器人模拟器——RobotApp:一个交互式强化学习模拟器

RobotApp 是一个基于 Python 和 Tkinter 的交互式强化学习(Reinforcement Learning, RL)模拟器,集成了 GridWorld 环境和 QAgent 智能体,支持 Q-learning、SARSA 和 SARSA(λ) 算法。本博客将详细解析 robot_app.py 的功能、架构和使用方法,展示其如何通过直观的 GUI 界面…...

2025-04-26-利用奇异值重构矩阵-美团

2025-04-26-利用奇异值重构矩阵-美团 题目内容 在一家致力于图像处理的科技公司,你被分配到一个新项目,目标是开发一种图像压缩算法,以减少存储空间并加速传输。团队决定使用奇异值分解( S V D SVD SVD)对图像进行降…...

《解锁SCSS算术运算:构建灵动样式的奥秘》

SCSS作为CSS预处理器,算术运算功能犹如一颗璀璨明珠,赋予我们动态计算样式属性值的强大能力,让网页样式不再是一成不变的刻板呈现,而是能够根据各种条件和需求灵动变化。 在SCSS的世界里,算术运算绝非孤立的存在&…...

STM32Cube-FreeRTOS任务管理工具函数-笔记

STM32Cube-FreeRTOS任务管理工具函数-笔记 一、获取任务句柄的函数1. 创建任务并获取句柄2. 获取当前任务句柄3. 获取空闲任务句柄4. 根据任务名称获取句柄 二、单个任务操作相关函数1. 程序在运行时可以获取或改变一个任务的优先级3. 获取任务信息4. 获取任务信息5. 获取任务名…...

【第三十四周】多模态大模型调研

多模态大模型调研 摘要Abstract引言多模态技术的主要方向视觉-语言大模型(Vision-Language Large Models, VLLMs)语音-语言大模型(Speech-Language Large Models, SLLMs)音乐 - 语言大模型(Music-Language Large Model…...

【2025最新】Baichuan-M1-instruct部署教程

首先机器至少要A100、4090、3090 这里选AutoDL的4090D,运行至少要20G显存。这里镜像选基础镜像11.8【更新!!!!!!!!!24G带不动!显存不够】 有时候…...

Unity与Unreal Engine(UE)的深度解析及高级用法

以下是Unity与Unreal Engine(UE)的深度解析及高级用法对比,结合技术特性、行业应用与未来发展进行综合阐述: 一、核心差异与适用场景对比 1. 技术架构与编程模式 Unity 语言与脚本:主要使用C#,语法简洁且易于学习,适合快速原型开发和中小型项目。支持可视化脚本工具(如…...

网络:TCP三次握手、四次挥手

目录 深刻理解三次握手 深刻理解四次挥手 深刻理解三次握手 三次握手时,如果最后一个ACK包,服务器没有收到,此时: 客户端:认为已经建立链接 服务器:认为没有建立链接,还在超时等待。 而此时…...

spdlog自定义formatter

用了之后发现,spdlog的默认日志记录格式为: [2014-10-31 23:46:59.678] [my_loggername] [info] Some message 但是这个格式不是我想要的,怎么办,这个也简单,上面的内容也就是几个标签的组合而已,spdlog自定…...

Spring AI 实战:第四章、Spring AI多模态之看图说话

引言:从"码农"到"多媒体魔术师" “曾经,我们的代码核心擅长处理文本,就像餐厅里只会做炒饭的厨师。现在有了Spring AI多模态支持,我们突然拥有满汉全席的烹饪技巧!” 作为一名常年与String打交道的开发者,当第一次看到Spring AI可以同时处理图片、音…...

ES6入门---第二单元 模块五:模块化

js不支持模块化 注意: 需要放到服务器环境 1、如何定义模块? export 东西 例:1.js文件中 console.log(1模块加载了);//显示是否加载了 export const a 12; export const b 5; export let c 101; const a12; const b5; const c101;ex…...

Python 函数装饰器和闭包(变量作用域规则)

本章内容: Python 如何计算装饰器句法 Python 如何判断变量是不是局部的 闭包存在的原因和工作原理 nonlocal 能解决什么问题 掌握这些基础知识后,我们可以进一步探讨装饰器: 实现行为良好的装饰器 标准库中有用的装饰器 实现一个参数化装饰器…...

什么是constexpr?

什么是constexpr? 简单来说,constexpr就是告诉编译器:“我这个变量或函数的值可以在编译时算出来,请帮我提前算好,运行时直接用结果,不用再算了。” • **传统const**只表示变量不可修改,但不…...

如何在 PowerEdge 服务器上设置 NIC 分组

以下文章提供了有关 Windows、VMware 和 Linux 中的 NIC 分组的信息。 什么是网络适配器分组?设置 NIC 分组 Windows设置 NIC 分组 VMware设置 NIC 分组 Linux 什么是网络适配器分组(绑定)? 网络适配器分组是一个术语&#xff0…...

ES6入门---第三单元 模块四:Set和WeakSet

set数据结构: 类似数组,但是里面不能有重复值,如果有,只显示一个 set用法: let setArr new Set([a,b]); setArr.add(a); 往setArr里面添加一项 let setArr new Set().add(a).add(b).add(c); setArr.delete(b); 删除一项 setArr.ha…...

架构进阶:75页架构规划方法课件 【附全文阅读】

本文概述了一个关于架构规划方法的目录及其目的,重点介绍了基于联邦企业架构(FEAF)的架构建模方法,并提及了不同层面的架构建模方法以及培训的目的。以下是对该内容的简洁总结: **架构规划方法目录及其目的** 本文旨在…...

前端面经-VUE3篇(三)--vue Router(二)导航守卫、路由元信息、路由懒加载、动态路由

一、导航守卫 vue Router 中的 导航守卫(Navigation Guards) 是一个非常重要的功能,用于在路由切换过程中,拦截、控制、检查或延迟页面跳转。 你可以理解为: 🔐 “进门前的保安”,控制哪些页面…...

RTX-3090 Qwen3-8B Dify RAG环境搭建

RTX-3090 Qwen3-8B Dify RAG环境搭建 一、环境配置二、操作步骤1、创建容器2、下载`Qwen3-8B`和embedding模型3、安装`transformers`4、安装`vllm`5、安装`flash-attention`6、启动兼容OpenAI API的服务1、方案一:启动`vllm`服务【不支持多任务】2、方案二:Flask和PyTorch实现的…...

Circular Plot系列(三):【视频教程】复现NCS图表之高大上的单细胞UMAP环形图

高端复杂的UMAP复现: 这又是一个高大上且炫酷的单细胞UMAP图,展示的信息很多,有大类细胞和亚群,以及marker基因和cell count信息,还可以增加其他的分组信息等等。没错,看这个图就是circlize一层层画的。我们…...

MCP智能体多Agent协作系统设计(Multi-Agent Cooperation)

目录 🚀 MCP智能体多Agent协作系统设计(Multi-Agent Cooperation) 🌟 为什么需要多Agent协作? 🧠 多Agent协作系统架构设计 🛠️ 1. 构建基础智能体基类(Agent Base)…...

栈Stack

一 栈:先进后出 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 Stack<Integer> sta…...

HTML01:HTML基本结构

HTML基本结构 <html> <head><meta charset"UTF-8"><title>我的第一个网页</title> </head> <body>我的第一个网页 </body> </html><body、</body等成对的标签&#xff0c;分别叫开发标签和闭合标签单独…...

QT聊天项目DAY07

1.Win配置和使用GRPC 1.1 克隆GRPC库 克隆GRPC git clone -b v1.34.0 https://gitee.com/mirrors/grpc-framework.git 查看Git有没有安装 没有安装 1.1.1 安装Git https://git-scm.com/ 一路next 添加Git的路径到系统环境变量下 我这次没用管理员权限&#xff0c;并且也没…...

2025年PMP 学习三

4.2制定项目管理计划 4. 项目管理计划 - 内容&#xff08;输出&#xff09; 项目目标的制定原因&#xff1a; 3个基准&#xff08;范围基准、进度基准、成本基准&#xff09; 子管理计划&#xff1a;范围、需求、进度、成本、质量、资源、沟通、风险、采购等管理计划&#xf…...

软考-软件设计师中级备考 10、文件管理、设备管理

一、 文件管理 1、文件目录 文件控制块&#xff08;FCB&#xff09;&#xff1a;是操作系统为管理文件而设置的数据结构&#xff0c;包含了文件的基本信息&#xff08;如文件名、文件大小、文件类型等&#xff09;、存取控制信息&#xff08;如文件所有者的权限、其他用户的权…...

Linux环境下的进程创建-fork函数的使用, 进程退出exit和_exit的区别,以及进程等待waitpid和status数据的提取方法

目录 一、进程创建 1.fork函数 1&#xff09;进程调用fork函数是如何创建子进程的 2&#xff09;代码示范 2.写时拷贝 二、进程退出 1.退出码 1&#xff09;什么是退出码&#xff1f; 2&#xff09;为什么要有退出码&#xff1f; 3&#xff09;退出码是怎么做到的&#xff1f; …...

【数据结构与算法】常见排序算法详解(C++实现)

目录 一、排序的基本概念 二、插入排序 2.1 直接插入排序 2.2 折半插入排序 2.3 希尔排序 三、交换排序 3.1 冒泡排序 3.2 快速排序 四、选择排序 4.1 简单选择排序 4.2 堆排序 五、归并排序 六、基数排序 七、计数排序 结语 一、排序的基本概念 排序 就是重新…...

STM32GPIO输入实战-按键key模板及移植

STM32GPIO输入实战-按键key模板及移植 一&#xff0c;按键模板展示二&#xff0c;按键模板逻辑1&#xff0c;准备工作&#xff1a;头文件与全局变量2&#xff0c;读取硬件状态&#xff1a;key_read_raw()3,核心处理&#xff1a;key_process_simple() 的四行代码 三&#xff0c;…...

LeetCode 1128.等价多米诺骨牌对的数量:计数

【LetMeFly】1128.等价多米诺骨牌对的数量&#xff1a;计数 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-equivalent-domino-pairs/ 给你一组多米诺骨牌 dominoes 。 形式上&#xff0c;dominoes[i] [a, b] 与 dominoes[j] [c, d] 等价 当且仅当 (a …...

Spring MVC设计与实现

DispatcherServlet的初始化与请求处理流程 初始化阶段 Servlet 生命周期触发&#xff1a;当 Web 容器&#xff08;如 Tomcat&#xff09;启动时&#xff0c;根据注解/配置&#xff0c;DispatcherServlet 的 init() 方法被调用。 初始化 WebApplicationContext 根 WebApplicat…...

日语学习-日语知识点小记-进阶-JLPT-N1阶段(1):语法单词

日语学习-日语知识点小记-进阶-JLPT-N1阶段&#xff08;1&#xff09;&#xff1a;语法单词 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰&#xff08;3&#xff09;高级语法N1语法和难点一、N1语法学习内容&#xff08;高级语法&#xff…...

stm32week14

stm32学习 十.GPIO 2.基本结构 基本结构&#xff1a; F1与其它的的最大区别是上下拉电阻的位置 施密特触发器是一种整形电路&#xff0c;可以将非标准方波&#xff0c;整形成方波 图中MOS管的输出规则&#xff1a; 3.8中工作模式 ①输入浮空&#xff1a; 上下拉电阻均不工…...

WPF中Binding

绑定ViewModel中的数据 添加数据上下文 方法一&#xff1a;在XAML中添加 <Window.DataContext><local:MainWindowViewModel /> </Window.DataContext>方法二&#xff1a;在界面层的cs文件中添加 this.DataContext new MainWindowViewModel();绑定 publ…...

Google Agent space时代,浅谈Agent2Agent (A2A) 协议和挑战!

如果说去年Google Cloud大会大家还在数“AI”这个词被提了多少次&#xff0c;那么今年&#xff0c;绝对是“Agent”的主场&#xff01;开发者主题演讲几乎被它“刷屏”&#xff0c;展区的许多 Demo 也都号称是 Agent 应用。 但我得诚实地说&#xff0c;大会现场关于 Agents 的 …...

爬虫的应用

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本数据的预处理是至关重要的基础环节。它如同工匠雕琢璞玉前的打磨工作&#xff0c;直接影响后续模型分析与挖掘的效果。本文将基于 Python&#xff0c;以电商平台的差评和优质评价文本数据为例&#xff0c;详细展…...

力扣面试150题--相同的树

Day 41 题目描述 做法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right…...

Java后端开发day40--异常File

&#xff08;以下内容全部来自上述课程&#xff09; 异常 异常&#xff1a;异常就是代表程序出现的问题 1. 异常的分类 1.1 Error 代表的是系统级别的错误&#xff08;属于严重问题&#xff09; 系统一旦出现问题&#xff0c;sun公司会把这些错误封装成Error对象。 Error…...

集成算法学习

集成算法通过组合多个弱学习器提升模型性能&#xff0c;以下是核心内容详解&#xff1a; 一、核心思想 - 组合优势&#xff1a;结合多个简单模型&#xff08;如决策树&#xff09;&#xff0c;通过“少数服从多数”或“加权平均”等策略&#xff0c;降低方差、偏差或过拟合风险…...

工业认知智能:从数据分析到知识创造

工业认知智能:从数据分析到知识创造 引言 当前制造业面临的知识管理困境令人震惊:68%的工艺知识存储于老员工头脑中,30%的企业因知识传承断层导致质量事故。麦肯锡研究显示,应用认知智能技术的企业,其工艺创新速度提升3-5倍。本文将系统阐述工业认知智能的"感知-理…...

8.1 Python+Docker+企业微信集成实战:自动化报告生成与CI/CD部署全攻略

Python+Docker+企业微信集成实战:自动化报告生成与CI/CD部署全攻略 关键词:PDF报告生成, Word文档自动化, 企业微信集成, Docker容器化, CI/CD流水线 1. 多格式报告生成实战 通过扩展报告输出格式,满足不同用户的文档需求。我们使用Python生态的成熟库实现PDF/Word生成,并…...

25.5.4数据结构|哈夫曼树 学习笔记

知识点前言 一、搞清楚概念 ●权&#xff1a;___________ ●带权路径长度&#xff1a;__________ WPL所有的叶子结点的权值*路径长度之和 ●前缀编码&#xff1a;____________ 二、构造哈夫曼树 n个带权值的结点&#xff0c;构造哈夫曼树算法&#xff1a; 1、转化成n棵树组成的…...

统计学中的p值是什么?怎么使用?

李升伟 整理 在统计学中&#xff0c;p值&#xff08;p-value&#xff09;是帮助研究者判断假设检验结果是否具有统计显著性的重要指标。以下是关于p值的详细解释和使用方法&#xff1a; 1. p值的定义 p值表示在原假设&#xff08;H0&#xff09;为真的情况下&#xff0c;观察…...

22:一维码与二维码区别

一维码&#xff08;条形码&#xff09; 一维条码即指条码条和空的排列规则&#xff0c;常用的一维码的码制包括&#xff1a;EAN码、39码、交叉25码、UPC码、128码、93码&#xff0c;ISBN码&#xff0c;及Codabar&#xff08;库德巴码&#xff09;等。 条码是由一组规则排列的条…...