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

11 开源鸿蒙OpenHarmony轻量系统源码分析

开源鸿蒙轻量系统源码分析

作者将狼才鲸
日期2024-03-28

一、前言

  • 之前单独的LiteOS是通过Makefile编译的,当前的开源鸿蒙LiteOS-M和LiteOS-A是通过gn和ninja编译的。

  • Gitee官方只介绍了LiteOS-M的gn + ninja编译的流程,针对M3使用Keil编译的流程可能要参考社区代码

    • harmonyos_next / stm32f103_simulator_keil
    • OpenHarmony / kernel_liteos_m
    • 使用Keil编译ARM Cortex-M3时,只需要kernel_liteos_m仓库和Keil工程仓库,不需要全量的OpenHarmony代码
  • 由此可知,开源鸿蒙轻量系统只是简单的由LiteOS-M内核 + 一些芯片厂商的驱动组成

  • LiteOS-M 编码规范

    • OpenHarmony轻内核编码规范
    • OpenHarmony C语言编程规范
  • 开发板移植流程

    • 轻量系统STM32F407芯片移植案例
      • 确定主频、选定默认打印输出的串口、printf标准输入输出重定向到默认串口、指定内存范围给内核、提供定时器给内核
    • 移植芯片内核架构的流程
    • LiteOS-M内核BUILD.gn编写指南

二、源码分析

  • 源码下载:OpenHarmony / kernel_liteos_m
    • 代码总量只有8M,代码量和uC/OS这类操作系统类似,因为代码量不多,因此一个人也是能分析完的;uC/OS虽然是开源、个人免费,但是商用是要收费的,所以ARM Cortex-M之类的芯片使用LiteOS-M或者RT-Thread这类操作系统还是蛮划算的,需要技术支持的话也可以找相关公司进行付费咨询。
    • 代码结构如下:
jim@DESKTOP-SVP3BEM MINGW64 /d/1_git/openHarmony/kernel/liteos_m (master)
$ tree .
.
|-- BUILD.gn	/* 老版本的LiteOS使用Makefile编译,新版本还可以用gn + ninja */
|-- Kconfig
|-- Makefile
|-- arch		/* 硬件相关的代码,按内核IP公司 - IP系列进行区分 */
|   |-- BUILD.gn
|   |-- Kconfig
|   |-- arm
|   |   |-- BUILD.gn
|   |   |-- Kconfig
|   |   |-- arm9
|   |   |   .......
|   |   |-- common	/* 相同芯片内核IP公司通用的函数和接口 */
|   |   |   |-- BUILD.gn
|   |   |   |-- los_common_interrupt.c
|   |   |   `-- los_common_interrupt.h
|   |   |-- cortex-m3	/* M3只支持Keil编译,之后的版本如M4、Cortex-A则是在Linux + gcc下编译 */
|   |   |   `-- keil	/* 操作系统底层相关的支持,也是操作系统移植的重点 */
|   |   |       |-- los_arch_atomic.h
|   |   |       |-- los_arch_context.h
|   |   |       |-- los_arch_interrupt.h
|   |   |       |-- los_arch_timer.h
|   |   |       |-- los_atomic.S
|   |   |       |-- los_context.c
|   |   |       |-- los_dispatch.S
|   |   |       |-- los_exc.S
|   |   |       |-- los_interrupt.c
|   |   |       |-- los_startup.s	/* 芯片上电后执行的第二行代码,芯片上电后的第一行代码一般都融合进了编译器中,由芯片原厂实现,写代码时看不到 */
|   |   |       `-- los_timer.c		/* 需要给操作系统的定时器接口,用于时间片轮转 */
|   |   |-- cortex-m33
|   |   |   ......
|   |   |-- cortex-m4
|   |   |   .......
|   |   |-- cortex-m55
|   |   |   .......
|   |   |-- cortex-m7
|   |   |   .......
|   |-- csky
|   |   .......
|   |-- include		/* 所有芯片对操作系统暴露出的统一接口 */
|   |   |-- los_arch.h
|   |   |-- los_atomic.h
|   |   |-- los_context.h
|   |   |-- los_interrupt.h
|   |   |-- los_mpu.h
|   |   `-- los_timer.h
|   |-- risc-v
|   |   ......
|   `-- xtensa
|       ......
|	/* arch结构和Linux源码类似,一组类似的模块会暴露出统一的接口放在.h中,而.c的实现会分散到各处的不同模块,这和普通裸机代码中.c和.h在一起的结构不一样 */
|-- bundle.json
|-- components	/* 支持的插件,可选 */
|   |-- BUILD.gn
|   |-- backtrace
|   |   |-- BUILD.gn
|   |   |-- los_backtrace.c
|   |   `-- los_backtrace.h
|   |-- cppsupport	/* 是否支持C++ */
|   |   |-- BUILD.gn
|   |   |-- los_cppsupport.c
|   |   `-- los_cppsupport.h
|   |-- cpup
|   |   |-- BUILD.gn
|   |   |-- los_cpup.c
|   |   `-- los_cpup.h
|   |-- debugtools
|   |   |-- BUILD.gn
|   |   |-- los_debugtools.h
|   |   |-- los_hwidump.c
|   |   |-- los_schedtrace.c
|   |   `-- los_stackdump.c
|   |-- dynlink
|   |   |-- BUILD.gn
|   |   |-- los_dynlink.c
|   |   |-- los_dynlink.h
|   |   `-- script
|   |       `-- so_parse
|   |-- exchook
|   |   |-- BUILD.gn
|   |   |-- los_exc_info.c
|   |   |-- los_exc_info.h
|   |   |-- los_exchook.c
|   |   `-- los_exchook.h
|   |-- fs	/* 操作系统的四大模块之一:文件系统 */
|   |   |-- BUILD.gn
|   |   |-- Kconfig
|   |   |-- fatfs	/* FAT32最常用,可以用于U盘、Flash、网盘等 */
|   |   |   |-- BUILD.gn
|   |   |   |-- Kconfig
|   |   |   |-- fatfs.c
|   |   |   |-- fatfs.h
|   |   |   `-- fatfs_conf.h
|   |   |-- littlefs
|   |   |   ......
|   |   `-- vfs
|   |       ......
|   |-- iar_tls
|   |   |-- los_iar_tls.c
|   |   `-- los_iar_tls.h
|   |-- lmk
|   |   |-- BUILD.gn
|   |   |-- los_lmk.c
|   |   `-- los_lmk.h
|   |-- lms
|   |   |-- BUILD.gn
|   |   |-- Kconfig
|   |   |-- lms_libc.c
|   |   |-- los_lms.c
|   |   |-- los_lms.h
|   |   `-- los_lms_pri.h
|   |-- net		/* 操作系统的第五大功能:通信/网络通信 */
|   |   |-- BUILD.gn
|   |   |-- lwip-2.1	/* 像网络、U盘之类的大型通信类驱动代码会很多,有时甚至会比操作系统本身的代码量还多 */
|   |   |   |-- BUILD.gn
|   |   |   |-- enhancement
|   |   |   |   `-- src
|   |   |   |       |-- fixme.c
|   |   |   |       `-- lwip_ifaddrs.c
|   |   |   |-- lwip_porting.gni
|   |   |   `-- porting
|   |   |       |-- include
|   |   |       |   |-- arch
|   |   |       |   |   |-- cc.h
|   |   |       |   |   |-- perf.h
|   |   |       |   |   `-- sys_arch.h
|   |   |       |   |-- lwip
|   |   |       |   |   |-- api_shell.h
|   |   |       |   |   |-- dhcp.h
|   |   |       |   |   |-- inet.h
|   |   |       |   |   |-- lwipopts.h
|   |   |       |   |   |-- netdb.h
|   |   |       |   |   |-- netif.h
|   |   |       |   |   |-- netifapi.h
|   |   |       |   |   `-- sockets.h
|   |   |       |   `-- lwipopts.h
|   |   |       `-- src
|   |   |           |-- api_shell.c
|   |   |           |-- driverif.c
|   |   |           |-- lwip_init.c
|   |   |           |-- netdb_porting.c
|   |   |           |-- sockets_porting.c
|   |   |           `-- sys_arch.c
|   |   `-- test
|   |       ......
|   |-- power	/* 低功耗模块 */
|   |   |-- BUILD.gn
|   |   |-- los_pm.c
|   |   `-- los_pm.h
|   |-- security	/* 权限管理模块 */
|   |   |-- BUILD.gn
|   |   |-- box
|   |   |   |-- BUILD.gn
|   |   |   |-- los_box.c
|   |   |   `-- los_box.h
|   |   |-- syscall
|   |   |   |-- BUILD.gn
|   |   |   |-- los_syscall.c
|   |   |   |-- los_syscall.h
|   |   |   |-- pthread_syscall.c
|   |   |   `-- syscall_lookup.h
|   |   `-- userlib
|   |       `-- BUILD.gn
|   |-- shell	/* 命令行 */
|   |   |-- BUILD.gn
|   |   |-- Kconfig
|   |   |-- include
|   |   |   |-- shcmd.h
|   |   |   |-- shcmdparse.h
|   |   |   |-- shell.h
|   |   |   |-- shmsg.h
|   |   |   `-- show.h
|   |   `-- src
|   |       |-- base
|   |       |   |-- shcmd.c
|   |       |   |-- shcmdparse.c
|   |       |   |-- shmsg.c
|   |       |   `-- show.c
|   |       `-- cmds
|   |           |-- date_shell.c
|   |           |-- fullpath.c
|   |           |-- mempt_shellcmd.c
|   |           |-- shell_shellcmd.c
|   |           |-- task_shellcmd.c
|   |           `-- vfs_shellcmd.c
|   |-- signal
|   |   |-- BUILD.gn
|   |   |-- Kconfig
|   |   |-- los_signal.c
|   |   `-- los_signal.h
|   `-- trace	/* 调试程序用 */
|       ......
|-- config.gni
|-- config_iccarm.gni
|-- drivers		/* 操作系统四大模块之二:设备管理 */
|   `-- Kconfig
|	/* 具体的外设驱动由芯片原厂在上层文件夹的device和vendor文件夹中提供 */
|-- figures		/* 几张介绍本操作系统内核结构的图片 */
|   ......
|-- kal
|   |-- BUILD.gn
|   |-- Kconfig
|   |-- cmsis	/* ARM格式的中间件统一接口 */
|   |   |-- BUILD.gn
|   |   |-- Kconfig
|   |   |-- cmsis_liteos2.c
|   |   |-- cmsis_os.h
|   |   |-- cmsis_os2.h
|   |   |-- hos_cmsis_adp.h
|   |   `-- kal.h
|   |-- libc	/* C语言标准库,其实现一般都是在编译器中,由芯片原厂完成,所以这里只有头文件 */
|   |   |-- BUILD.gn
|   |   |-- Kconfig
|   |   |-- iccarm
|   |   |   `-- BUILD.gn
|   |   |-- musl
|   |   |   `-- BUILD.gn
|   |   `-- newlib
|   |       |-- BUILD.gn
|   |       `-- porting
|   |           |-- include
|   |           |   |-- arpa
|   |           |   |   `-- inet.h
|   |           |   |-- byteswap.h
|   |           |   |-- dirent.h
|   |           |   |-- endian.h
|   |           |   |-- ifaddrs.h
|   |           |   |-- limits.h
|   |           |   |-- malloc.h
|   |           |   |-- mqueue.h
|   |           |   |-- net
|   |           |   |   |-- ethernet.h
|   |           |   |   |-- if.h
|   |           |   |   `-- if_arp.h
|   |           |   |-- netdb.h
|   |           |   |-- netinet
|   |           |   |   |-- if_ether.h
|   |           |   |   |-- in.h
|   |           |   |   |-- ip.h
|   |           |   |   `-- tcp.h
|   |           |   |-- poll.h
|   |           |   |-- semaphore.h
|   |           |   |-- sys
|   |           |   |   |-- _pthreadtypes.h
|   |           |   |   |-- fcntl.h
|   |           |   |   |-- features.h
|   |           |   |   |-- ioctl.h
|   |           |   |   |-- mount.h
|   |           |   |   |-- prctl.h
|   |           |   |   |-- sched.h
|   |           |   |   |-- select.h
|   |           |   |   |-- socket.h
|   |           |   |   |-- statfs.h
|   |           |   |   |-- uio.h
|   |           |   |   `-- un.h
|   |           |   `-- time.h
|   |           `-- src
|   |               |-- hook_adapt.c
|   |               `-- network
|   |                   |-- htonl.c
|   |                   |-- htons.c
|   |                   |-- ntohl.c
|   |                   `-- ntohs.c
|   |-- libsec
|   |   `-- BUILD.gn
|   `-- posix	/* 操作系统给应用暴露出来的通用接口 */
|       |-- BUILD.gn
|       |-- Kconfig
|       |-- include
|       |   |-- libc.h
|       |   |-- pipe_impl.h
|       |   |-- poll_impl.h
|       |   `-- rtc_time_hook.h
|       `-- src
|           |-- errno.c
|           |-- libc.c
|           |-- libc_config.h
|           |-- malloc.c	/* 操作系统的四大模块之三:内存管理 */
|           |-- map_error.c
|           |-- map_error.h
|           |-- mqueue.c
|           |-- mqueue_impl.h
|           |-- pipe.c
|           |-- poll.c
|           |-- pthread.c
|           |-- pthread_attr.c
|           |-- pthread_cond.c
|           |-- pthread_mutex.c
|           |-- semaphore.c
|           |-- signal.c
|           |-- time.c
|           `-- time_internal.h
|-- kernel	/* 操作系统的四大模块之四:进程管理 */
|   |-- BUILD.gn
|   |-- include
|   |   |-- los_config.h
|   |   |-- los_event.h
|   |   |-- los_membox.h
|   |   |-- los_memory.h
|   |   |-- los_mux.h
|   |   |-- los_queue.h
|   |   |-- los_sched.h
|   |   |-- los_sem.h
|   |   |-- los_sortlink.h
|   |   |-- los_swtmr.h
|   |   |-- los_task.h
|   |   `-- los_tick.h
|   `-- src
|       |-- los_event.c
|       |-- los_init.c
|       |-- los_mux.c
|       |-- los_queue.c
|       |-- los_sched.c
|       |-- los_sem.c
|       |-- los_sortlink.c
|       |-- los_swtmr.c
|       |-- los_task.c
|       |-- los_tick.c
|       `-- mm
|           |-- los_membox.c
|           `-- los_memory.c
|-- liteos.gni
|-- testsuites	/* 移植系统后进行自测用的,不用关心 */
|   ......
|-- tools
|   `-- mem_analysis.py
`-- utils|-- BUILD.gn|-- internal|   |-- los_hook_types.h|   `-- los_hook_types_parse.h|-- los_compiler.h|-- los_debug.c|-- los_debug.h	/* 串口调试输出的级别 */|-- los_error.c|-- los_error.h	/* 所有模块都会用的,要返回的错误码 */|-- los_hook.c|-- los_hook.h|-- los_list.h	/* 链表,队列、模块缓存的基础 */`-- los_reg.h198 directories, 1571 files
  • 基础的操作系统内核代码里没有太多可借鉴的软件结构,它们都是针对某一项功能而实现一项功能,通用的东西较少,接下来我会从操作系统移植的角度稍微分析一下。

相关文章:

11 开源鸿蒙OpenHarmony轻量系统源码分析

开源鸿蒙轻量系统源码分析 作者将狼才鲸日期2024-03-28 一、前言 之前单独的LiteOS是通过Makefile编译的,当前的开源鸿蒙LiteOS-M和LiteOS-A是通过gn和ninja编译的。 Gitee官方只介绍了LiteOS-M的gn ninja编译的流程,针对M3使用Keil编译的流程可能要参…...

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 专题:一个自制代码…...

Appium设备交互API

设备交互API指的是操作设备系统中的一些固有功能,而非被测程序的功能,例如模拟来电,模拟发送短信,设置网络,切换横竖屏,APP操作,打开通知栏,录屏等。 模拟来电 make_gsm_call(phon…...

Qlib-Server部署

Qlib-Server部署 介绍 构建Qlib服务器,用户可以选择: 一键部署Qlib服务器逐步部署Qlib服务器一键部署 Qlib服务器支持一键部署,用户可以选择以下两种方法之一进行一键部署: 使用docker-compose部署在Azure中部署使用docker-compose进行一键部署 按照以下步骤使用docker…...

CMC学习系列 (4):β段CMC可以作为一种中风治疗的生物标志物和治疗靶点

CMC学习系列:β段CMC可以作为一种中风治疗的生物标志物和治疗靶点 0. 引言1. 主要贡献2. 方法2.1 相干源动态成像2.2 源统计分析 3. 结果3.1 训练前后比较3.2 源代码分析3.3 皮质重叠的分组分析 4. 讨论5. 总结欢迎来稿 论文地址:https://www.sciencedirect.com/sci…...

jmeter中参数加密

加密接口常用的方式有: MD5,SHA,HmacSHA RSA AES,DES,Base64 压测中有些参数需要进行加密,加密方式已接口文档为主。 MD5加密 比如MD5加密的接口文档: 请求URL:http://101.34.221…...

YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)

一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…...

verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言 多比特一般为数据,其在跨时钟域传输的过程中有多种处理方式,比如DMUX,异步FIFO,双口RAM,握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器,该方…...

服务器停止解析域名,但仍然可以访问到

1.centos7 如何刷新dns缓存 在CentOS 7上,DNS缓存由nscd(Name Service Cache Daemon)管理,如果系统上安装了nscd,可以通过清除nscd缓存来刷新DNS缓存。 要刷新DNS缓存,请执行以下命令: sudo …...

Centos系统与Ubuntu系统防火墙区别,以及firewalld、ufw和iptables三者之前的区别。

现在大多数Centos系统上的防火墙是firewalld,Ubuntu系统上是ufw,而iptables是最底层的防火墙工具。iptables是Linux系统中最早的防火墙工具,并且被许多不同的Linux发行版使用,包括CentOS和Ubuntu。然而,CentOS 7及更高…...

ES6 学习(三)-- es特性

文章目录 1. Symbol1.1 使用Symbol 作为对象属性名1.2 使用Symbol 作为常量 2. Iterator 迭代器2.1 for...of循环2.2 原生默认具备Interator 接口的对象2.3 给对象添加Iterator 迭代器2.4 ... 解构赋值 3. Set 结构3.1 初识 Set3.2 Set 实例属性和方法3.3 遍历3.4 相关面试题 4…...

使用ChatGPT的场景之gpt写研究报告,如何ChatGPT写研究报告

推荐写研究报告使用智能站: dayfire.cn/ 1. 确定研究主题 明确主题:在开始之前,你需要有一个清晰的研究主题。这将帮助AI更好地理解你的需求…...

librdkafka的简单使用

文章目录 摘要kafka是什么安装环境librdkafka的简单使用生产者消费者 摘要 本文是Getting Started with Apache Kafka and C/C的中文版, kafka的hello world程序。 本文完整代码见仓库,这里只列出producer/consumer的代码 kafka是什么 本节来源&#…...

【iOS ARKit】播放3D音频

3D音频 在前面系列中,我们了解如何定位追踪用户(实际是定位用户的移动设备)的位置与方向,然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了,则通过VIO 和 IMU更新用户的位置与方向信息&…...

ES学习日记(四)-------插件head安装和一些配套插件下载

前言 接上节,第三方插件选择了时间久,功能丰富,长得丑的head,head 插件在ES 5版本以前开箱即用非常简单,ES 5版本以后需要运行在node环境下,所以我们要先准备一下环境 一.安装Git 不装了,明儿再说,看会儿手机准备下班!!!!!!!!!...

flask+uwsgi+云服务器 部署服务端

参考:使用uwsgi部署flask 报错 “找不到Python应用程序,请检查启动日志以查找错误” 或者: no python application found, check your startup logs for errors debug 过程:查到Python uWSGI 安装配置 里面说,先写测…...

linux学习之路 -- 普通用户添加进sudoer列表

在Linux系统里,很多的操作普通用户是不能执行的,所以我们需要对普通用户进行提权操作,可我们会发现,一开始没有配置的话,是无法的提权操作的,下面我将介绍普通用户该如何配置sudoer列表。 首先以root 的身…...

【分类评估指标,精确率,召回率,】from sklearn.metrics import classification_report

from: https://zhuanlan.zhihu.com/p/368196647 多分类 from sklearn.metrics import classification_report y_true [0, 1, 2, 2, 2] y_pred [0, 0, 2, 2, 1] target_names [class 0, class 1, class 2] # print(classification_report(y_true, y_pred, targe…...

element-ui autocomplete 组件源码分享

紧接着 input 组件的源码,分享带输入建议的 autocomplete 组件,在 element-ui 官方文档上,没有这个组件的 api 目录,它的 api 是和 input 组件的 api 在一起的,看完源码之后发现,源码当中 autocomplete 组件…...

视觉SLAM理论与实践的学习链接汇总

仅供学习,在此感谢所有乐于分享知识的大佬们~ 一、 ORB_SLAM理论 视觉SLAM 前端 后端 回环 建图 1、 前端视觉里程计 1.1 特征点法 一文带你搞懂相机内参外参(Intrinsics & Extrinsics)-知乎 VSLAM 笔记——我们如何通过图像来计算位姿的变化&#xff…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【JVM】- 内存结构

引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

C++ 基础特性深度解析

目录 引言 一、命名空间(namespace) C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用(reference)​ C 中的引用​ 与 C 语言的对比​ 四、inline(内联函数…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

Kafka入门-生产者

生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...