操作系统实战——QEMU模拟器搭建【rCore 操作系统】
操作系统大作业——QEMU模拟器搭建rCore操作系统
按照本篇步骤走,帮你少走很多弯路!博主在自己做的过程中踩了很多坑,过程还是很痛苦的,走了很多弯路,现在都已经在文章中把坑填平了,把弯路修直了。
创作不易,还请 点赞👍、收藏⭐,也欢迎 分享📤
任务描述
使用QEMU模拟器搭建rCore操作系统的实验环境,了解rCore的基本架构和启动流程。在此基础上,编写一个会产生异常的应用程序,并简要解释操作系统的处理结果。要求给出详细的配置过程、程序代码和运行时的截图。
任务分解
- 搭建 rCore 实验环境:
- 安装必要的工具(QEMU、Rust 工具链等)。
- 克隆 rCore 仓库并配置环境。
- 使用 QEMU 运行 rCore。
- 了解 rCore 架构和启动流程:
- 简要分析 rCore 的基本架构。
- 描述 rCore 的启动流程。
- 编写产生异常的应用程序:
- 创建一个用户态程序,触发异常(如非法内存访问)。
- 集成到 rCore 并运行。
- 分析操作系统处理结果:
- 解释异常处理机制。
- 描述运行结果和预期输出。
- 提供运行说明和截图指导:
- 给出运行命令和预期终端输出。
- 说明如何截图。
步骤 1:搭建 rCore 实验环境
1.1 环境要求
- 操作系统:推荐 Ubuntu 22.04 或更高版本(其他 Linux 发行版或 WSL2 也可)。
- 硬件:4GB 以上内存,10GB 以上磁盘空间。
- 工具:
- QEMU(推荐版本 5.0 或以上)。
- Rust 工具链(支持 RISC-V 目标)。
- Git、Make、GCC 等基本开发工具。
1.2 安装依赖
- 配置镜像源
由于下载源的服务器在国外,国内网络环境下载会非常慢,甚至会失败,所以需要先配置一下国内的镜像源。
由于写在一起会很多,这里单独写在了另一篇文章中:
详细配置教程链接🔗Ubuntu中配置【Rust 镜像源】
- 在 Ubuntu 上执行命令安装必要的工具
# 更新包索引并安装基本工具
sudo apt update
sudo apt install -y git build-essential curl wget libssl-dev pkg-config# 安装 QEMU
sudo apt install -y qemu-system-riscv64# 验证 QEMU 版本,需要确保版本为7.0.0以上,否则之后会因为版本过低无法运行rCore,需要升级到7.0.0以上
qemu-system-riscv64 --version# 安装 Rust 工具链
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env# 添加 RISC-V 目标支持
rustup target add riscv64gc-unknown-none-elf# 安装 rust-src(用于 rCore 编译)
rustup component add rust-src --toolchain nightly# 安装 cargo-binutils(用于生成二进制文件)
cargo install cargo-binutils
rustup component add llvm-tools-preview
1.3 克隆 rCore 仓库
- 安装配置 git
方式一:
这里需要使用到版本控制工具 git ,请确保你的实验机器(Ubuntu虚拟机)中已经安装了git,并且已经配置完成(能与GitHub正常建立连接)。
注:博主自己在做实验的时候,使用https协议克隆仓库会失败,只能使用ssh协议克隆才能成功,所以建议读者也直接使用ssh协议进行克隆,而且这也是GitHub官方推荐的克隆方式。
由于写在一起会很多,这里单独写在了另一篇文章中,这里也附上Ubuntu中使用SSH协议克隆的教程链接🔗:使用SSH协议克隆详细步骤
方式二:
如果读者之前没有接触过git,或者不是很熟悉,不想在这里折腾的话,你可以直接用自己的本地主机(你自己的电脑,而非虚拟机)先登录GitHub找到rCore的仓库(项目地址:https://github.com/rcore-os/rCore-Tutorial-v3),将压缩包下载下来(如下图所示),然后再从本地主机上传到你的虚拟机上,然后再进行解压缩,也能得到rCore的项目代码。
- 克隆 rCore 仓库
rCore 是一个基于 Rust 语言的教学操作系统,支持 RISC-V 架构。我们这里使用 rCore-Tutorial-v3:
# 克隆 rCore-Tutorial-v3 仓库
git clone git@github.com:rcore-os/rCore-Tutorial-v3.git
cd rCore-Tutorial-v3
1.4 配置和编译 rCore
rCore 使用 Rust 编写,编译需要指定目标架构为 RISC-V。
# 进入内核目录
cd os# 编译内核
make build# 运行 QEMU 模拟 rCore
make run
预期输出:
-
编译完成后,
make run
会启动 QEMU,模拟 RISC-V 64 位架构。 -
终端将显示 rCore 启动日志,例如:
[kernel] Booting rCore... Lilliputian [kernel] Hello, world! ...
-
你将看到 rCore 的 shell 提示符,说明环境搭建成功。
1.5 验证环境
运行 make run
后,确认 rCore 正常启动并进入用户 shell。尝试运行一些基本命令(如启动之后列出的程序 hello_world
、cat
)以验证环境正常。
步骤 2:了解 rCore 架构和启动流程
2.1 rCore 基本架构
rCore 是一个基于 Rust 语言的微内核操作系统,专为教学设计,支持 RISC-V 架构。它的主要模块包括:
- 内核(Kernel):
- 负责初始化硬件、管理内存、调度进程和线程、处理中断和异常。
- 提供系统调用接口,供用户态程序使用。
- 文件系统(File System):
- 实现简单的文件系统,支持基本的文件读写操作。
- 基于 FAT32 格式,挂载到虚拟磁盘上。
- 进程管理(Process Management):
- 支持多进程和线程,基于优先级调度。
- 使用上下文切换实现并发执行。
- 内存管理(Memory Management):
- 实现虚拟内存、页面映射和动态内存分配。
- 支持页面置换算法(例如 FIFO)。
- 异常和中断(Exception and Interrupt):
- 处理硬件中断(如定时器中断)和软件异常(如非法指令、内存访问错误)。
- 使用异常处理机制恢复或终止进程。
- 用户态库(User Libraries):
- 提供标准 C 库(libc)的子集,支持基本的 I/O、字符串处理和内存操作。
- 包含简单的 shell 和测试程序。
2.2 rCore 启动流程
rCore 的启动流程如下:
- 硬件初始化:
- QEMU 加载 rCore 内核镜像到内存。
- 初始化 CPU 寄存器、栈指针和全局指针。
- 内核初始化:
- 设置中断控制器和定时器。
- 初始化内存管理单元(MMU),启用虚拟内存。
- 加载文件系统和设备驱动。
- 进程初始化:
- 创建第一个用户进程(init 进程)。
- 加载用户 shell 和测试程序。
- 进入用户态:
- 切换到用户模式,运行 shell。
- 用户可以通过 shell 执行命令或运行程序。
启动日志分析:
- 运行
make run
时,观察日志中的关键步骤,例如:[kernel] Initialize interrupt controller
[kernel] Setup virtual memory
[kernel] Mount filesystem
[kernel] Start init process
[user] Welcome to rCore shell
步骤 3:编写产生异常的应用程序
(仅供参考)编写一个简单的用户态 C 程序,尝试访问非法内存地址,触发段错误(Segmentation Fault),并观察 rCore 的处理结果。
3.1 创建用户程序
在 rCore-Tutorial-v3/user/src/bin
目录下创建文件 segfault.c
:
#include <stdio.h>int main() {// 尝试写入非法内存地址int *ptr = (int *)0xdeadbeef;*ptr = 42; // 触发段错误printf("This line should not be reached.\n");return 0;
}
3.2 编译运行C语言异常程序
- 下载RISC-V 交叉编译器(
riscv64-linux-gnu-gcc
),以手动编译C语言程序
sudo apt install riscv64-linux-gnu-gcc
验证安装:
riscv64-linux-gnu-gcc --version
- 编译
在 user/src/bin/ 下编译 segfault.c:
cd ~/rCore-Tutorial-v3/user/src/bin
riscv64-linux-gnu-gcc -static -march=rv64g -mabi=lp64d -o segfault segfault.c
说明:
- static:生成静态链接的可执行文件,避免依赖动态库。
- march=rv64g:针对 RISC-V 64 位架构。
- mabi=lp64d:使用 LP64D ABI(long, pointer 为 64 位,double 为 64 位)。
-
转换为二进制格式:
使用
riscv64-linux-gnu-objcopy
将 ELF 文件转为二进制:riscv64-linux-gnu-objcopy -O binary segfault segfault.bin
-
移动到目标目录
将 segfault 和 segfault.bin 移动到 编译输出目录:
mv segfault ~/rCore-Tutorial-v3/user/target/riscv64gc-unknown-none-elf/release/ mv segfault.bin ~/rCore-Tutorial-v3/user/target/riscv64gc-unknown-none-elf/release/
-
更新文件系统
返回 os 目录,重新打包文件系统:
cd ~/rCore-Tutorial-v3/os make clean make build
-
运行并测试 运行 rCore:
make run
预期输出:
-
触发异常。
-
rCore 检测到非法内存访问,终止程序并返回 shell。
-
输出类似于:
[kernel] Exception: Store/AMO access fault at 0xdeadbeef [kernel] Process terminated
步骤 4:分析操作系统处理结果
4.1 异常处理机制
rCore 的异常处理流程如下:
- 异常检测:
- CPU 检测到非法内存访问(
0xdeadbeef
不在合法地址空间)。 - 触发异常,保存当前程序计数器(PC)和异常原因到寄存器。
- CPU 检测到非法内存访问(
- 中断处理:
- 内核的中断控制器捕获异常,调用异常处理程序。
- 根据异常类型(Store/AMO access fault),决定处理策略。
- 进程终止:
- 对于不可恢复的段错误,内核终止进程。
- 释放进程的资源(如内存、文件描述符)。
- 返回到 shell,打印错误信息。
- 日志记录:
- 内核记录异常的详细信息(如地址
0xdeadbeef
和异常类型)。
- 内核记录异常的详细信息(如地址
4.2 运行结果解释
- 程序行为:
segfault
程序尝试写入非法地址,触发硬件异常。 - 内核反应:rCore 正确识别异常,终止进程以保护系统稳定性。
- 用户体验:用户收到错误提示,系统恢复到 shell 状态,未受进一步影响。
- 健壮性:rCore 的异常处理机制确保单一程序的错误不会导致系统崩溃,体现了微内核设计的安全性。
步骤 5:运行说明和截图指导
5.1 运行命令
以下是关键命令的汇总:
# 安装依赖
sudo apt install -y qemu-system-riscv64 git build-essential curl
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add riscv64gc-unknown-none-elf
rustup component add rust-src --toolchain nightly
cargo install cargo-binutils
rustup component add llvm-tools-preview# 克隆和编译 rCore
git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
cd rCore-Tutorial-v3
git checkout Book
cd os
make build
make run# 运行 segfault 程序
# 在 rCore shell 中输入:
segfault
5.2 预期终端输出
-
启动 rCore:
[kernel] Booting rCore... [kernel] Initialize interrupt controller [kernel] Setup virtual memory [kernel] Mount filesystem [kernel] Start init process [user] Welcome to rCore shell
-
运行 segfault:
segfault Attempting to access invalid memory... [kernel] Exception: Store/AMO access fault at 0xdeadbeef [kernel] Process terminated
5.3 截图指导
在运行 make run
和 segfault
时,截取以下终端输出:
- rCore 启动日志:显示从
[kernel] Booting rCore...
到[user] Welcome to rCore shell
的完整日志。 - segfault 运行结果:显示
segfault
命令的输入和异常终止的输出。 - QEMU 窗口(可选):如果 QEMU 打开图形界面,截图显示 rCore shell 界面。
截图工具:
- Ubuntu:使用
gnome-screenshot
或scrot
。 - 命令:
scrot screenshot.png
- 确保截图清晰,包含完整的终端窗口或 QEMU 界面。
保存和提交:
- 将截图保存为 PNG 或 JPEG 格式,命名为
rcore_boot.png
和segfault_output.png
。 - 提交时附上截图和代码文件
segfault.c
。
注意事项
-
常见问题:
- QEMU 未安装或版本过旧:确保使用
qemu-system-riscv64
且版本 ≥ 5.0。 - Rust 工具链配置错误:运行
rustc --version
和cargo --version
确认安装成功。 - 编译失败:检查
make build
的错误日志,可能缺少依赖或目标架构未设置。 - 异常未触发:确保
segfault.c
中的地址0xdeadbeef
未被意外映射到合法内存。
- QEMU 未安装或版本过旧:确保使用
-
调试:
-
使用
make debug
启动 QEMU 并连接 GDB,检查异常时的寄存器状态。 -
示例 GDB 命令:
target remote :1234 info registers backtrace
-
-
性能优化:
- 如果 QEMU 运行缓慢,增加
-smp 4
参数以使用多核。 - 示例:
make QEMU_ARGS="-smp 4" run
- 如果 QEMU 运行缓慢,增加
总结
通过以上步骤,已成功:
- 搭建了 rCore 的 QEMU 实验环境。
- 了解了 rCore 的架构和启动流程。
- 编写并运行了一个触发段错误的程序。
- 分析了 rCore 的异常处理机制。
- 获得了运行结果的截图指导。
相关文章:
操作系统实战——QEMU模拟器搭建【rCore 操作系统】
操作系统大作业——QEMU模拟器搭建rCore操作系统 按照本篇步骤走,帮你少走很多弯路!博主在自己做的过程中踩了很多坑,过程还是很痛苦的,走了很多弯路,现在都已经在文章中把坑填平了,把弯路修直了。 创作不易…...
web:InfiniteScroll 无限滚动
InfiniteScroll 无限滚动 分页加载 <div class"data-box" v-infinite-scroll"loadMore"> <li v-fori in dataList></li> </div>form: {current: 1,size: 10,}loadMore(){console.log(this.dataList.length, this.total ,8888)if…...
【Redis 进阶】哨兵模式
思维导图: 一、哨兵模式概述 (一)传统主从复制模式的局限性 在传统的Redis主从复制架构中,若主节点发生故障,运维人员需手动执行故障转移操作,将一个从节点提升为新主节点,并逐一通知所有客户…...
告别卡顿,图片查看界的“速度与激情”
嘿,小伙伴们!今天电脑天空给大家介绍一款超好用的图片查看神器——ImageGlass!这可不是普通的图片查看软件哦,它简直就是图片界的“全能王”。首先,它能打开的图片格式多到让你眼花缭乱,什么PNG、JPEG、GIF…...
02_线性模型(回归分类模型)
用于分类的线性模型 线性模型也广泛应用于分类问题,可以利用下面的公式进行预测: $ \widehat y w[0]*x[0]w[1]*x[1]…w[p]*x[p]b > 0$ 公式看起来与线性回归的公式非常相似,但没有返回特征的加权求和,而是为预测设置了阈值…...
力扣2094题解
记录: 2025.5.12 题目: 思路: 暴力遍历。 解题步骤: 1.统计数字出现次数:使用数组cnt来记录输入数组中每个数字的出现次数。 2.生成三位偶数:通过循环从100开始,每次递增2,生成…...
人物角色设定机制
模块一:角色塑造进阶技巧 将角色设定(Character Headcanon)提升至更高层次 当您通过Character Headcanon Generator生成基础设定后,可运用以下专业技巧深化角色塑造: 情感核心图谱分析法 解构角色情感驱动机制及其情境表现: 主…...
Python动态渲染页面抓取之Selenium使用指南
目录 一、Selenium技术架构解析 二、环境搭建与基础配置 1. 组件安装 2. 驱动配置 3. 基础操作模板 三、动态内容抓取核心策略 1. 智能等待机制 2. 交互行为模拟 3. 反爬应对方案 四、实战案例:电商评论抓取 五、性能优化与异常处理 2. 异常捕获 六、进…...
智能手表 MCU 任务调度图
智能手表 MCU 任务调度图 处理器平台:ARM Cortex-M33 系统架构:事件驱动 多任务 RTOS RTOS:FreeRTOS(或同类实时内核) 一、任务调度概览 任务名称优先级周期性功能描述App_MainTask中否主循环调度器,系统…...
【C++】cout的格式输出
目录 一、cout的格式输出1、控制宽度和填充2、控制数值格式3、控制整数格式4、控制对齐方式 个人主页<—请点击 C专栏<—请点击 一、cout的格式输出 printf函数在输出数据的时候,可以指定格式来输出,比如:指定宽度、指定小数点后的位…...
私域流量新阵地:掌握Telegram私域运营全方法
在流量获取成本不断上升的今天,越来越多企业和品牌开始将目光转向“私域流量”——一条可以长期沉淀用户、反复转化的可持续增长之路。而在全球化趋势下,Telegram作为一款以高自由度、强隐私性著称的即时通讯平台,正在成为私域运营的新阵地。…...
Python Day23 学习
继续SHAP图绘制的学习 1. SHAP特征重要性条形图 特征重要性条形图(Feature Importance Bar Plot)是 SHAP 提供的一种全局解释工具,用于展示模型中各个特征对预测结果的重要性。以下是详细解释: 图的含义 - 横轴:表示…...
《ATPL地面培训教材13:飞行原理》——第12章:飞行力学基础
翻译:Leweslyh;工具:Cursor & Cluade 3.7;过程稿 第12章:飞行力学基础 目录 引言直线水平稳定飞行尾翼和升降舵直线稳定爬升爬升角重量、高度和温度的影响带动力下降紧急下降滑翔滑翔下降率转弯非对称推力飞行最…...
数据中台整体建设方案规划设计方案,数据中台建设汇报方案(PPT)
中台建设背景 在数字化转型浪潮下,企业需通过客户需求精准化、营销策略智能化、管理体系数字化三大核心方向构建竞争优势。本项目以渠道数据整合为基础,围绕客户精准化运营、营销智能化决策、管理数字化赋能三大目标,打造支撑一线业务场景的数…...
嵌入式软件--stm32 DAY 6 USART串口通讯(下)
1.寄存器轮询_收发字符串 通过寄存器轮询方式实现了收发单个字节之后,我们趁热打铁,争上游,进阶到字符串。字符串就是多个字符。很明显可以循环收发单个字节实现。 然后就是接收字符串。如果接受单个字符的函数放在while里,它也可…...
Flask如何读取配置信息
目录 一、使用 app.config 读取配置 二、设置配置的几种方式 1. 直接设置 2. 从 Python 文件加载 3. 从环境变量加载 4. 从字典加载 5. 从 .env 文件加载(推荐开发环境用) 三、读取配置值 四、最佳实践建议 在 Flask 中读取配置信息有几种常见方…...
AWS EC2源代码安装valkey命令行客户端
sudo yum -y install openssl-devel gcc wget https://github.com/valkey-io/valkey/archive/refs/tags/8.1.1.tar.gz tar xvzf 8.1.1.tar.gz cd valkey-8.1.1/ make distclean make valkey-cli BUILD_TLSyes参考 Connecting to nodes...
项目全栈实战-基于智能体、工作流、API模块化Docker集成的创业分析平台
目录 思维导图 前置知识 Docker是什么? Docker的核心概念: Docker在本项目中的作用 1. 环境隔离与一致性 2. 简化部署流程 3. 资源管理与扩展性 4. 服务整合与通信 5. 版本控制和回滚 6. 开发与生产环境一致性 总结 前端 1.小程序 2.web …...
如何快速入门大模型?
学习大模型的流程是什么 ? 提示词工程:只需掌握提问技巧即可使用大模型,通过优化提问方式获得更精准的模型输出套壳应用开发:在大模型生态上开发业务层产品(如AI主播、AI小助手等),只需调用API…...
《Flutter社交应用暗黑奥秘:模式适配与色彩的艺术》
暗黑模式已从一种新奇的功能演变为用户体验中不可或缺的一环。对于Flutter开发者而言,如何在社交应用中完美实现暗黑模式适配与色彩对比度优化,是一场充满挑战与惊喜的技术探索之旅。 暗黑模式,绝非仅仅是将界面颜色反转这么简单。从用户体验…...
【秣厉科技】LabVIEW工具包——OpenCV 教程(21):CUDA 加速方案
文章目录 前言一、方案总述二、改造步骤三、编程范例四、应用移植总结 前言 需要下载安装OpenCV工具包的朋友,请前往 此处 ;系统要求:Windows系统,LabVIEW>2018,兼容32位和64位。 一、方案总述 为了保持轻量化与普…...
flutter使用命令生成BinarySize分析图
flutter build ios --analyze-size 生成的文件,使用dev tools 可以分析具体的包大小...
高并发场景下的BI架构设计:衡石分布式查询引擎与缓存分级策略
在电商大促、金融交易时段或IoT实时监控场景中,企业BI系统常面临瞬时万级并发查询的冲击——运营团队需要实时追踪GMV波动,风控部门需秒级响应欺诈检测,产线监控需毫秒级反馈设备状态。传统单体架构的BI系统在此类场景下极易崩溃,…...
web 自动化之 selenium 下拉鼠标键盘文件上传
文章目录 一、下拉框操作二、键盘操作三、鼠标操作四、日期控件五、滚动条操作六、文件上传七、定位windows窗口及窗口的元素总结:页面及元素常用操作 一、下拉框操作 from selenium.webdriver.support.select import Select import time from selenium.webdriver.…...
Qt Creator 配置 Android 编译环境
Qt Creator 配置 Android 编译环境 环境配置流程下载JDK修改Qt Creator默认android配置文件修改sdk_definitions.json配置修改的内容 Qt Creator配置异常处理删除提示占用编译报错 环境 Qt Creator 版本 qtcreator-16.0.1Win10 嗯, Qt这个开发环境有点难折腾,搞了我三天… 配…...
主流编程语言中ORM工具全解析
在不同编程语言中,ORM(Object-Relational Mapping,对象关系映射)工具的设计目标都是简化数据库操作。 以下是主流语言中最常用的 ORM 工具,按语言分类介绍其特点、适用场景和典型案例。 一、Python 生态 Python 社区…...
详解RabbitMQ工作模式之发布确认模式
目录 发布确认模式 概述 消息丢失问题 发布确认的三种模式 实现步骤 应用场景 代码案例 引入依赖 常量类 单条确认 运行代码 批量确认 运行代码 异步确认 运行代码 对比批量确认和异步确认模式 发布确认模式 概述 发布确认模式用于确保消息已…...
Power BI 实操案例,将度量值转化为切片器(动态切换分析指标)
Power BI 实操案例,将度量值转化为切片器(动态切换分析指标) 想要在Power BI中让度量值也能像维度一样灵活筛选?没问题,这里就为你揭秘如何将度量值转化为切片器(动态切换分析指标)的实用方法&…...
利用散点图探索宇航员特征与太空任务之间的关系
利用散点图探索宇航员特征与太空任务之间的关系 import matplotlib.pyplot as plt import numpy as np import pandas as pdfrom flexitext import flexitext from matplotlib.patches import FancyArrowPatchplt.rcParams.update({"font.family": "Corbel&quo…...
人工智能的哲学与社会影响
人工智能(AI)的快速发展对人类社会的方方面面产生了深远的影响。在这部分中,我们将探讨AI对人与机器关系的影响、AI对就业和经济的潜在影响,以及人类与AI共存的可能性和道德议题。同时,我们还将针对大众对AI的一些常见…...
MySQL 中 UPDATE 结合 SELECT 和 UPDATE CASE WHEN 的示例
概述 以下是 MySQL 中 UPDATE 结合 SELECT 和 UPDATE CASE WHEN 的示例: 一、UPDATE 结合 SELECT(跨表更新) 场景:根据 orders 表中的订单总金额,更新 users 表中用户的 total_spent 字段。 -- 创建测试表 CREATE T…...
FPGA前瞻篇-计数器设计与实现实例
这是本篇文章的设计目标如下所示: 这个 Counter 模块是一个LED 闪烁计数器,设计目标是: 当输入时钟 clk 为 50 MHz 时,每 0.5 秒翻转一次 LED 灯状态。 随后我们开始补充理论知识。 计数是一种最简单基本的运算,计数器…...
运行Spark程序-在Idea中(二)
(四)使用Maven创建新项目 核心的操作步骤如下: 1.启动idea,选择新建项目。 2.将Scala添加到全局库中。 3.设置maven依赖项。修改pom.xml文件,添加如下: 4.下载依赖。添加完成之后,刷新Maven,它…...
Mosaic数据增强技术
Mosaic 数据增强技术是一种在计算机视觉领域广泛应用的数据增强方法。下面是Mosaic 数据增强技术原理的详细介绍 一、原理 Mosaic 数据增强是将多张图像(通常是 4 张)按照一定的规则拼接在一起,形成一张新的图像。在拼接过程中,会…...
Kafka、RabbitMQ 和 RocketMQ区别及上手难度
Kafka、RabbitMQ 和 RocketMQ 是三种流行的消息中间件,它们在设计理念、使用场景和上手难度上有显著差异。以下是它们的核心区别和上手难度分析: 1. 核心区别 特性KafkaRabbitMQRocketMQ设计目标高吞吐、分布式日志流处理通用的消息队列,强调…...
.NET 8 + Angular WebSocket 高并发性能优化
.NET 8 Angular WebSocket 高并发性能优化。 .NET 8 WebSocket 高并发性能优化 WebSocket 是一种全双工通信协议,允许客户端和服务端之间保持持久连接。在高并发场景下,优化 WebSocket 的性能至关重要。以下是针对 .NET 8 中 WebSocket 高并发性能优化…...
SimScape物理建模实例1--单质量-弹簧-阻尼系统
实例1模型下载: 【免费】simscape单质量弹簧阻尼模型资源-CSDN文库 如下图所示单质量弹簧阻尼系统,弹簧具有初始压缩量,假设为1m, 质量块除了受到自身重力作用以外,受到弹簧拉力,以及阻尼器阻尼力,根据牛顿…...
5.5.1 WPF中的动画2-基于路径的动画
何为动画?一般只会动。但所谓会动,还不仅包括位置移动,还包括角度旋转,颜色变化,透明度增减。动画本质上是一个时间段内某个属性值(位置、颜色等)的变化。因为属性有很多数据类型,它们变化也需要多种动画类比如: BooleanAnimationBase\ ByteAnimationBase\DoubleAnima…...
JVM对象分配与程序崩溃排查
一、new 对象在 JVM 中的过程 在 JVM 中通过 new 关键字创建对象时,会经历以下步骤: 内存分配 对象的内存分配在 堆(Heap) 中,优先在 新生代(Young Generation) 的 Eden 区 分配。分配方式取决…...
基于RT-Thread驱动EEPROM_AD24C02
基于RT-Thread驱动EEPROM_AD24C02 前言一、硬件设计二、软件设计三、测试1、eeprom_test()测试2、基础操作字节实验3、多字节读写 前言 存储容量2048位,内部组织256x8(2K),即256个字节的存储单元ÿ…...
VUE中通过DOM导出PDF
最终效果 前端导出PDF的核心在于样式的绘制上,这里其实直接使用CSS进行绘制和布局就行,只不过需要计算好每页DIV盒子的大小,防止一页放不下造成样式错乱。 项目依赖 项目是Vue3 TS npm i html2canvas1.4.1 npm i jspdf3.0.1工具类(htmlToPdf…...
sql语句面经手撕(定制整理版)
一张表 店铺id 商品id 销售数量 问:查询总销售数量最多的店铺 SELECT shop_id,SUM(quantity) AS total_quantity FROM sales GROUP BY shop_id ORDER BY total_quantity DESC LIMIT 1; 学生总分名最高的 SELECT student_id,SUM(score) AS total_score FROM score…...
pdf 不是扫描件,但却无法搜索关键词【问题尝试解决未果记录】
一、不是扫描件但不能搜索的原因 1. 情况一:文字被转成了“图形文字” 有些PDF文件虽然看起来像是文字,其实是图片或者矢量图格式,不能直接搜索。 2. 情况二:PDF被加密 有些PDF设置了“内容复制/提取”权限受限,即使…...
android14优化ntp时间同步
简介 网络时间协议NTP(Network Time Protocol)是TCP/IP协议族里面的一个应用层协议,用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。 当机器的ntp时间同步出现问题时,可以从ntp配置方面进行优化&…...
【Ansible】之inventory主机清单
前言 本篇博客主要解释Ansible主机清单的相关配置知识 一、inventory 主机清单 Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。 如果是名称类似的主机,可以使用列表的方式表示各个主机…...
QT5.14安装以及新建基础项目
进入qt中文网站:Qt | 软件开发全周期的各阶段工具 额,考虑新手可能还是找不到,我就分享一下我下载的的吧 通过网盘分享的文件:qt-opensource-windows-x86-5.14.2.exe 链接:https://pan.baidu.com/s/1yQTRp-b_ISje5B3UWb7Apw?pw…...
Git 用法总结
换到新项目组后,没有好好使用git 。有点疲劳了。 不过还是建议能提尽提。少提 多提。与己方便。与人方便 1,拉取最新分支后。先不要直接改代码,可以根据修改需求。创建本地分支 git checkout -b feature/wlan 。 然后你改代码。改了后。合…...
付费专栏·Python潮流周刊电子书合集(epub、pdf、markdown)下载
付费专栏 Python 潮流周刊目前年费 148,全年约 50 期。 这里分享的是前 60 期的精美电子书,包含有多种不同版本(epub、pdf 和 markdown),免费下载(下载方式见文末)。 展示 pdf 版本的部分精美…...
o.redisson.client.handler.CommandsQueue : Exception occured. Channel
1, 版本 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>2.15.2</version> </dependency>2,问题 2025-05-12 10:46:47.436 ERROR 27780 --- [sson-netty-5-…...
养生:拥抱健康生活的全方位指南
养生是一种综合性的健康管理方式,旨在通过多种方法颐养生命、增强体质、预防疾病,以实现延年益寿的目标1。以下为你详细介绍养生的各个方面: 心态养生:塑造健康心灵的基石 保持积极心态:积极的心态能提升生活质量&am…...