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

TockOS,一种新安全软件架构的RTOS介绍

在这里插入图片描述

文章目录

    • 1. TockOS介绍
      • 详细总结
    • 2. TockOS开源项目的目录结构
    • 3. 胶囊(Capsules)
      • 胶囊的本质
      • 胶囊的特点
      • 胶囊的应用场景
    • 4. 胶囊的实现
      • 模块化设计
      • 安全隔离
      • 事件驱动
      • 可复用性

1. TockOS介绍

Tock 是一款面向 Cortex-M 和 RISC-V 微控制器的安全嵌入式操作系统,依赖硬件内存保护单元(MPU)保障安全。其内核与扩展(胶囊)用 Rust 编写,能运行多种语言的多个独立不可信进程,进程数量受微控制器闪存和内存限制,默认采用抢占式循环调度算法。Tock 采用微内核架构,内核提供 command、subscribe、allow、yield 四个主要系统调用,通过 MPU 保护自身和其他进程免受恶意进程代码侵害,同时借助 Rust 的类型安全特性确保内核和胶囊代码的安全性。
在这里插入图片描述

在这里插入图片描述

详细总结

  1. Tock概述:Tock是用于Cortex-M和RISC-V微控制器的安全嵌入式操作系统,要求硬件配备内存保护单元(MPU),内核和胶囊使用Rust编写。
  2. 进程相关
    • 编写语言与数量限制:支持用任意语言编写多个独立的不可信进程,进程数量受微控制器闪存和随机存取存储器(RAM)的限制。
    • 调度算法:默认采用抢占式循环调度算法,也可配置使用其他调度算法。
  3. 系统架构
    • 代码分类:代码分为核心内核、胶囊和进程三类。核心内核因需操作特定内存地址外设等功能,可使用“unsafe” Rust代码;胶囊不能使用unsafe特性,以保证代码安全。进程可由任意语言编写。
    • 系统调用:内核提供四个主要系统调用,具体如下:
系统调用功能特点参数
command进程向内核发起调用非阻塞,长时间操作会立即返回并在完成时发出回调驱动ID
subscribe在进程中注册用于接收内核上调用的回调非阻塞驱动ID
allow允许内核访问进程内存非阻塞驱动ID
yield暂停进程直到回调被调用阻塞
  1. 安全机制:借助硬件MPU,若进程试图访问非法内存,会触发异常,内核捕获异常并终止该进程,以此保护内核和其他进程。同时,Rust的类型安全特性防止内存错误使用,保障内核和胶囊代码安全。

2. TockOS开源项目的目录结构

TockOS的开源项目的目录结构如下图:

Hardware
Board_Support
Chip_Support
Architecture_Support
Capsules
Kernel_Space
User_Space
Legend
Physical Hardware
Board Implementations
Common Board Code
nRF52
STM32
SAM4L
Cortex-M Support
RISC-V Support
MPU Implementation
Core Capsules
Extra Capsules
System Capsules
Kernel Core
Scheduler
Process Management
System Call Interface
Hardware Abstraction Layer
User Applications
User Space
Kernel Space
Hardware Interface
Driver Layer

3. 胶囊(Capsules)

Tock 是一个为物联网(IoT)设备设计的开源、多任务、安全的嵌入式操作系统。在 Tock OS 里,“胶囊(Capsules)”是其核心抽象概念之一,下面为你介绍其本质。

胶囊的本质

胶囊本质上是一种模块化的软件组件,是Tock OS用于实现设备驱动和系统服务的关键机制。它以面向对象的方式来封装设备的功能和状态,能把不同的硬件设备和系统服务进行抽象,从而让它们能在 Tock 内核中以独立、安全且可复用的形式存在。

胶囊的特点

  1. 模块化设计:胶囊具备模块化特性,每个胶囊都负责特定的功能,像传感器驱动、通信协议栈或者文件系统服务等。如此一来,开发者可以按需添加或者移除胶囊,以此实现系统功能的定制。
  2. 安全隔离:Tock OS 借助内存保护和能力机制保证各个胶囊间的安全隔离。每个胶囊只能访问其被授权的资源,这样就能防止恶意或者有缺陷的胶囊对系统其他部分造成影响。
  3. 事件驱动:胶囊采用事件驱动的编程模型。胶囊会对来自硬件或者其他胶囊的事件做出响应,然后执行相应的操作。这种模型有助于降低系统的复杂性,提高系统的响应能力。
  4. 可复用性:胶囊是可复用的软件组件。开发者可以在不同的项目中复用已有的胶囊,或者基于现有的胶囊开发新的功能。

胶囊的应用场景

  • 设备驱动:为各类硬件设备(如传感器、执行器等)实现驱动程序。
  • 系统服务:实现诸如网络协议栈、文件系统、电源管理等系统服务。
  • 应用程序支持:为应用程序提供必要的接口和服务,确保应用程序能够安全、高效地运行。

4. 胶囊的实现

以下将结合 Tock OS 源代码来解释胶囊的实现,聊聊胶囊的各个特点以及对应的源代码。在 Tock OS 里,胶囊通常是 Rust 语言编写的结构体和相关的特征(trait)实现。

模块化设计

模块化设计体现为每个胶囊负责特定功能,且独立于其他胶囊。以 virtual_alarm 胶囊为例,它实现了一个虚拟闹钟服务。

// 定义一个虚拟闹钟的结构体
pub struct VirtualMuxAlarm<'a, A: Alarm> {alarm: &'a A,// 其他状态字段next_alarm: Option<Ticks>,callbacks: VecDeque<(Ticks, Callback)>,
}// 为 VirtualMuxAlarm 实现相关的方法和特征
impl<'a, A: Alarm> VirtualMuxAlarm<'a, A> {// 初始化虚拟闹钟pub fn new(alarm: &'a A) -> VirtualMuxAlarm<'a, A> {VirtualMuxAlarm {alarm: alarm,next_alarm: None,callbacks: VecDeque::new(),}}// 设置闹钟pub fn set_alarm(&mut self, when: Ticks, callback: Callback) {// 实现设置闹钟的逻辑// ...}
}

在上述代码中,VirtualMuxAlarm 结构体封装了虚拟闹钟的功能和状态。它依赖于一个实现了 Alarm 特征的底层闹钟设备,但本身是一个独立的模块,可被其他模块复用。

安全隔离

Tock OS 通过内存保护和能力机制确保胶囊间的安全隔离。在 Rust 中,这主要通过所有权和借用规则来实现。例如,在 virtual_alarm 胶囊中,VirtualMuxAlarm 结构体持有对底层闹钟设备的不可变引用:

pub struct VirtualMuxAlarm<'a, A: Alarm> {alarm: &'a A,// ...
}

这里的生命周期参数 'a 确保了 VirtualMuxAlarm 不会持有底层闹钟设备的引用超过其生命周期,避免了悬空引用和内存安全问题。同时,胶囊只能访问其被授权的资源,通过 Rust 的私有性规则(pub 和非 pub 成员)来限制对内部状态的访问。

事件驱动

胶囊采用事件驱动的编程模型。以 button 胶囊为例,它会对按钮按下和释放事件做出响应:

// 定义按钮事件的回调特征
pub trait ButtonClient {fn pressed(&self, btn_num: usize);fn released(&self, btn_num: usize);
}// 定义按钮胶囊结构体
pub struct Button<'a, C: ButtonClient> {client: &'a C,// 其他状态字段btn_state: [bool; NUM_BUTTONS],
}// 实现按钮胶囊的方法
impl<'a, C: ButtonClient> Button<'a, C> {// 处理按钮事件pub fn handle_interrupt(&mut self) {for i in 0..NUM_BUTTONS {let new_state = self.read_button_state(i);if new_state != self.btn_state[i] {if new_state {self.client.pressed(i);} else {self.client.released(i);}self.btn_state[i] = new_state;}}}// 读取按钮状态fn read_button_state(&self, btn_num: usize) -> bool {// 实现读取按钮状态的逻辑// ...}
}

在这个例子中,Button 胶囊会在检测到按钮状态变化时调用 ButtonClient 特征的 pressedreleased 方法,从而实现事件驱动的编程模型。

可复用性

胶囊的可复用性体现在多个方面。例如,virtual_alarm 胶囊可以在不同的项目中复用,只要提供一个实现了 Alarm 特征的底层闹钟设备即可:

// 在某个项目中使用 VirtualMuxAlarm
let hardware_alarm = get_hardware_alarm();
let virtual_alarm = VirtualMuxAlarm::new(&hardware_alarm);// 设置闹钟
virtual_alarm.set_alarm(Ticks::from_ms(1000), Callback::new(...));

通过这种方式,开发者可以在不同的项目中复用 VirtualMuxAlarm 胶囊,而无需重新实现闹钟功能。

相关文章:

TockOS,一种新安全软件架构的RTOS介绍

文章目录 1. TockOS介绍详细总结 2. TockOS开源项目的目录结构3. 胶囊&#xff08;Capsules&#xff09;胶囊的本质胶囊的特点胶囊的应用场景 4. 胶囊的实现模块化设计安全隔离事件驱动可复用性 1. TockOS介绍 Tock 是一款面向 Cortex-M 和 RISC-V 微控制器的安全嵌入式操作系…...

AGI大模型(12):向量检索之关键字搜索

1 检索的方式有那些 列举两种: 关键字搜索:通过用户输入的关键字来查找文本数据。语义搜索:不仅考虑关键词的匹配,还考虑词汇之间的语义关系,以提供更准确的搜索结果。2 关键字搜索 先看一个最基础的实现 安装模块 pip install redis 不会redis的去看我的redis专题 首…...

数据库MySQL学习——day1(创建表与数据类型)

文章目录 1. 创建表&#xff08;CREATE TABLE&#xff09;1.1. 创建表的基本语法&#xff1a;1.2. 示例&#xff1a;创建学生信息表 2. 数据类型2.1. 常用的数据类型&#xff1a; 3. 表约束3.1. 常见约束类型&#xff1a;3.2. 示例&#xff1a;添加约束条件3.3. 修改表添加约束…...

基于Transformer与随机森林的多变量时间序列预测

哈喽&#xff0c;我不是小upper&#xff0c;今天和大家聊聊基于Transformer与随机森林的多变量时间序列预测。 不懂Transformer的小伙伴可以看我上篇文章:一文带你彻底搞懂&#xff01;Transformer &#xff01;&#xff01;https://blog.csdn.net/qq_70350287/article/detail…...

【程序员 NLP 入门】词嵌入 - 上下文中的窗口大小是什么意思? (★小白必会版★)

&#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 希望用我的经验&#xff0c;让“程序猿”的AI学习之路走的更容易些&#xff0c;若我的经验能为你前行的道路增添一丝轻松&#xff0c;我将倍感荣幸&#xff01;共勉~ 【程序员 NLP 入门】词…...

MATLAB Coder 应用:转换 MATLAB 代码至 C/C++ | 实践步骤与问题解决

注&#xff1a;本文为 “ MATLAB 代码至 C/C 应用” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 MATLAB 代码转换为 C/C 代码的详细指南 随心 390 zhihu 发布于 2020-07-12 12:39 在实际项目中&#xff0c;我们常常遇到需要将 MATLAB 代码转换为 C/C …...

BLE 6.0 六大核心特性全解析

写在前面: 2025年1月15日,Bluetooth SIG发布了备受期待的 Bluetooth Core Specification 6.0。相比5.x系列,6.0在测距精度、能耗优化、扫描过滤、音频体验和协议灵活性等方面实现了重大突破。本文将以浅显易懂的语言、丰富的图示和真实案例,带你全面深入了解BLE 6.0的六大核…...

网络应用程序体系结构

本文来源 &#xff1a; 《计算机网络 自顶向下方法》 应用程序体系结构&#xff08;application architecture&#xff09;由应用程序研发者设计&#xff0c;规定了如何在各种端系统上组织该应用程序。 现代网络应用程序中使用的两种主流体系结构&#xff1a; (1)客户-服务器…...

Filename too long 错误

Filename too long 错误表明文件名超出了文件系统或版本控制系统允许的最大长度。 可能的原因 文件系统限制 不同的文件系统对文件名长度有不同的限制。例如&#xff0c;FAT32 文件名最长为 255 个字符&#xff0c;而 NTFS 虽然支持较长的文件名&#xff0c;但在某些情况下也…...

Linux学习——UDP

编程的整体框架 bind&#xff1a;绑定服务器&#xff1a;TCP地址和端口号 receivefrom()&#xff1a;阻塞等待客户端数据 sendto():指定服务器的IP地址和端口号&#xff0c;要发送的数据 无连接尽力传输&#xff0c;UDP:是不可靠传输 实时的音视频传输&#x…...

C++:继承

目录 一&#xff1a;继承的概念 1.1 继承的定义 1.2 继承方式 1.3 可见性区别 公有方式 私有方式 保护方式 1.4 一般规则 二、继承中的隐藏规则 三、基类和派生类间的转换 四、派生类的默认成员函数 实现一个不能被继承的类 继承与友元 五、继承与静态成员 六、多…...

RSGISLib:一款功能强大的GIS与RS数据处理Python工具包

今天为大家介绍的软件是RSGISLib&#xff1a;一款功能丰富的遥感与GIS数据的python库。下面&#xff0c;我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 RSGISLib官网网址为&#xff1a;http://rsgislib.org/&#xff0c;它提供了一个丰富的工具集&…...

Git管理

1.创建git仓库 git init 2.让文件添加到暂存区 git add. 3.给暂存区文件添加说明&#xff0c;并提交到本地仓库 git commit -m 说明 4.查看历史记录 git log /git log --oneline 查看状态&#xff1a;git status 5. 引用旧版 git reset --hard commitid 6.创建分支 …...

Java中内部类

1.静态类与非静态类是内部类的区分&#xff0c;外部类不可以被static修饰。 2.类的加载过程&#xff1a;类只有被使用才会被类加载器加载&#xff0c;加载后类的信息放在元空间&#xff08;方法区&#xff09;中。类的使用包括初始化对象、静态方法的调用。 3.静态内部类与普…...

[U-Net-Dual]DEU-Net

论文题目:DEU-Net: Dual-Encoder U-Net for Automated Skin Lesion Segmentation 中文题目:DEU-Net:用于自动皮肤病变分割的双编码器U-Net 0摘要 皮肤病的计算机辅助诊断(CAD)在很大程度上依赖于皮肤病变的自动分割,尽管由于病变在形状、大小、颜色和纹理上的多样性以及…...

【数据结构】第五弹——Stack 和 Queue

文章目录 一. 栈(Stack)1.1 概念1.2 栈的使用1.3 栈的模拟实现1.3.1 顺序表结构1.3.2 进栈 压栈1.3.3 删除栈顶元素1.3.4 获取栈顶元素1.3.5 自定义异常 1.4 栈的应用场景1.改变元素序列2. 将递归转化为循环3. 四道习题 1.5 概念分区 二. 队列(Queue)2.1 概念2.2 队列的使用2.3…...

LSTM如何解决梯度消失问题

LSTM如何解决梯度消失问题 一、传统RNN的梯度消失困境 在标准RNN中&#xff0c;隐藏状态更新公式为&#xff1a; h t tanh ⁡ ( W h h h t − 1 W x h x t b h ) h_t \tanh(W_{hh}h_{t-1} W_{xh}x_t b_h) ht​tanh(Whh​ht−1​Wxh​xt​bh​) 梯度计算通过链式法则展…...

什么是管理思维?

管理思维是指在管理活动中形成的系统性、战略性和创造性的思考方式&#xff0c;帮助个人或团队更高效地达成目标。它不仅适用于企业管理&#xff0c;也适用于个人成长、项目执行和复杂问题解决。以下是关于管理思维的核心内容&#xff1a; 一、管理思维的核心特征 1. 系统性思…...

缓存与内存;缺页中断;缓存映射:组相联

文章目录 内存&#xff08;RAM&#xff09;与缓存&#xff08;Cache&#xff09;Memory Management Unit缺页中断 多级缓存缓存替换策略缓存的映射方式 内存&#xff08;RAM&#xff09;与缓存&#xff08;Cache&#xff09; 缓存&#xff1a; CPU 内部或非常靠近的高速存储&a…...

12.5/Q1,GBD高分文章解读

文章题目&#xff1a;Global, regional, and national burdens of early onset pancreatic cancer in adolescents and adults aged 15-49 years from 1990 to 2019 based on the Global Burden of Disease Study 2019: a cross-sectional stud DOI&#xff1a;10.1097/JS9.000…...

路由交换网络专题 | 第六章 | OSPF | BGP | BGP属性 | 防环机制

目录 拓扑图 &#xff08;1&#xff09;AS 400 内部使用 OSPF 路由协议&#xff0c;使 PC2 访问 PC3 的路径优先选择 AR2-AR4-AR3。 &#xff08;2&#xff09;AS 400 内部使用 RIP 路由协议&#xff0c;使 PC2 访问 PC3 的路径优先选择 AR2-AR4-AR3。 &#xff08;3&#…...

ubuntu 安装 redis server

ubuntu 安装 redis server sudo apt update sudo apt install redis-server The following NEW packages will be installed:libhiredis0.14 libjemalloc2 liblua5.1-0 lua-bitop lua-cjson redis-server redis-toolssudo systemctl start redis-server sudo systemctl ena…...

基于 Spring Boot实现的图书管理系统

Spring Boot图书管理系统详细分析文档 1. 项目概述 本文档对基于Spring Boot实现的图书管理系统进行详细分析。该项目是一个典型的Web应用程序&#xff0c;采用了Spring Boot框架&#xff0c;结合MyBatis作为ORM工具&#xff0c;实现了图书信息的管理功能&#xff0c;包括图书…...

gradle可用的下载地址(免费)

这几天接手一个老项目&#xff0c;想找gradle老版本的&#xff0c;但一搜&#xff0c;虽然在CSDN上搜索出来一堆&#xff0c;但都是收费&#xff0c;有些甚至要几十积分(吃相有点难看了)。 我找了一个能访问的地址&#xff0c;特地分享出来&#xff0c;有需要的自取&#xff01…...

发送百度地图的定位

在vuephp写的聊天软件项目中&#xff0c;增加一个发送百度地图的定位功能 在 Vue PHP 的聊天软件中增加发送百度地图定位功能&#xff0c;需要从前端定位获取、地图API集成、后端存储到消息展示全流程实现。以下是详细步骤&#xff1a; 一、前端实现&#xff08;Vue/Uni-app…...

滑动窗口学习

2090. 半径为 k 的子数组平均值 题目 问题分析 给定一个数组 nums 和一个整数 k&#xff0c;需要构建一个新的数组 avgs&#xff0c;其中 avgs[i] 表示以 nums[i] 为中心且半径为 k 的子数组的平均值。如果在 i 前或后不足 k 个元素&#xff0c;则 avgs[i] 的值为 -1。 思路…...

python数据分析(二):Python Pandas索引技术详解

Python Pandas索引技术详解&#xff1a;从基础到多层索引 1. 引言 Pandas是Python数据分析的核心库&#xff0c;而索引技术是Pandas高效数据操作的关键。良好的索引使用可以显著提高数据查询和操作的效率。本文将系统介绍Pandas中的各种索引技术&#xff0c;包括基础索引、位…...

(15)VTK C++开发示例 --- 生成随机数的首选方法

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 vtkMinimalStandardRandomSequence 是 VTK&#xff08;Visualization Toolkit&#xff09;库中的一个类&#xff0c;…...

华为S系列交换机CPU占用率高问题排查与解决方案

问题概述 在华为S系列交换机(V100&V200版本)运行过程中&#xff0c;CPU占用率过高是一个常见问题&#xff0c;可能导致设备性能下降甚至业务中断。根据华为官方维护宝典&#xff0c;导致CPU占用率高的主要原因可分为四大类&#xff1a;网络攻击、网络震荡、网络环路和硬件…...

为啥低速MCU单板辐射测试会有200M-1Ghz的辐射信号

低速MCU&#xff08;如8位或16位单片机&#xff09;单板在辐射测试中出现 200MHz~1GHz的高频辐射信号&#xff0c;看似不合理&#xff0c;但实际上是由多种因素共同导致的。以下是详细原因分析及解决方案&#xff1a; 1.根本原因分析: (1) 时钟谐波与开关噪声 低速MCU的时钟谐…...

docker本地虚拟机配置

docker 下载安装 yum install -y docker 如果报错 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache 修改docker 仓…...

【随机过程】柯尔莫哥洛夫微分方程总结

柯尔莫哥洛夫微分方程&#xff1a;用“水流扩散”理解概率演化 1. 核心思想 柯尔莫哥洛夫微分方程&#xff08;Kolmogorov Equations&#xff09;是描述**连续时间马尔可夫过程&#xff08;CTMC&#xff09;**中概率分布随时间演化的工具。 前向方程&#xff08;Fokker-Planc…...

AI领域:MCP 与 A2A 协议的关系

一、为何会出现MCP和A2A 协议是非常重要的东西&#xff0c;只有大家都遵循统一的协议&#xff0c;整体生态才好发展&#xff0c;正如有了HTML&#xff0c;互联网才快速发展&#xff0c;有了OpenAPI&#xff0c; API才会快速发展。 Agent目前是发展最快的领域&#xff0c;从最初…...

重学React(一):描述UI

背景&#xff1a;React现在已经更新到19了&#xff0c;文档地址也做了全面的更新&#xff0c;上一次系统性的学习还是在16-17的大版本更新。所以&#xff0c;现在就开始重新学习吧&#xff5e; 学习内容&#xff1a; React官网教程&#xff1a;https://zh-hans.react.dev/lea…...

代理模式(Proxy Pattern)详解:以延迟加载图片为例

在日常开发中&#xff0c;是否遇到过以下问题&#xff1a; “程序启动时图片太多&#xff0c;加载太慢&#xff01;” “用户还没看到图片就已经开始加载了&#xff0c;性能浪费&#xff01;” 此时&#xff0c;代理模式&#xff08;Proxy Pattern&#xff09;便派上了用场。本…...

Power BI企业运营分析——数据大屏搭建思路

Power BI企业运营分析——数据大屏搭建思路 欢迎来到Powerbi小课堂&#xff0c;在竞争激烈的市场环境中&#xff0c;企业运营分析平台成为提升竞争力的核心工具。 整合多源数据&#xff0c;实时监控关键指标&#xff0c;精准分析业务&#xff0c;快速识别问题机遇。其可视化看…...

HCIP-H12-821 核心知识梳理 (5)

Portal 认证场景中 AC 与 Portal 服务器通信使用的 Portal 协议基于 TCP&#xff1b;HTTP/HTTPS 可作为接入与认证协议&#xff1b;缺省情况下&#xff0c;接入设备处理 Portal 协议报文及向 Portal 服务器主动发送报文的目的端口号均为 50100 VRRP 协议心跳报文缺省发送间隔为…...

从M个元素中查找最小的N个元素时,使用大顶堆的效率比使用小顶堆更高,为什么?

我们有一个长度为 M 的数组&#xff0c;现在我们想从中找出 最小的 N 个元素。例如&#xff1a; int a[10] {12, 3, 5, 7, 19, 0, 8, 2, 4, 10};从中找出 最小的 4 个元素。 正确方法&#xff1a;使用大小为 N 的「大顶堆」 原因分析&#xff1a; 我们想保留最小的 4 个元素…...

【AI工具】2025年主流自动化技术(供参考)

背景 前面完成了AutoIT的自动化操作的尝试&#xff0c;有惊喜有惊吓&#xff0c;就是能进行自动化控制&#xff0c;但是有点“笨”&#xff0c;于是就想找找同类好用的技术&#xff0c;有了这篇自动化技术比较分析的文档&#xff0c;资料参考了AI总结的内容。 autoit的使用&am…...

1.微服务拆分与通信模式

目录 一、微服务拆分原则与策略 业务驱动拆分方法论 • DDD&#xff08;领域驱动设计&#xff09;中的限界上下文划分 • 业务功能正交性评估&#xff08;高内聚、低耦合&#xff09; 技术架构拆分策略 • 数据层拆分&#xff08;垂直分库 vs 水平分表&#xff09; • 服务粒…...

【Java面试笔记:基础】4.强引用、软引用、弱引用、幻象引用有什么区别?

1. 引用类型及其特点 强引用(Strong Reference): 定义:最常见的引用类型,通过new关键字直接创建。回收条件:只要强引用存在,对象不会被GC回收。示例:Object obj = new Object(); // 强引用特点: 强引用是导致内存泄漏的常见原因(如未及时置为null)。手动断开引用:…...

使用Python+OpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片

使用PythonOpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片 import os import cv2 import time# 存放视频文件的多层嵌套文件夹路径 videoPath D:\\videos\\ # 保存抽帧的图片的文件夹路径 savePath D:\\images\\if not os.path.exists(savePath):os.mkdir(savePath) vide…...

基于STM32的室内环境监测系统

目录 一、前言 二、项目功能说明 三、主要元器件 四、接线说明 五、原理图与PCB 六、手机APP 七、完整资料 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; 咸鱼商品链接&#xff1a; 基于STM32的室内环境监测系统商品链接 二、项目功能说明 基础功…...

乐迪电玩发卡查分与控制面板模块逻辑解析

本篇为《美乐迪电玩全套系统搭建》系列的第四篇&#xff0c;聚焦后台功能模块中的发卡与查分系统。针对运营侧常见需求&#xff08;如玩家状态查验、补卡操作、积分调整等&#xff09;&#xff0c;本篇将完整剖析其 PHP 端实现逻辑、数据结构及权限管理机制。 一、模块结构与入…...

Spring 事务实现原理,Spring 的 ACID是如何实现的?如果让你用 JDBC 实现事务怎么实现?

Spring 事务实现原理 Spring 的事务管理基于 AOP&#xff08;面向切面编程&#xff09; 和 代理模式&#xff0c;通过以下核心组件实现&#xff1a; 事务管理器&#xff08;PlatformTransactionManager&#xff09; Spring 提供了统一的事务抽象接口&#xff08;如 DataSource…...

网络原理 - 4(TCP - 1)

目录 TCP 协议 TCP 协议段格式 可靠传输 几个 TCP 协议中的机制 1. 确认应答 2. 超时重传 完&#xff01; TCP 协议 TCP 全称为 “传输控制协议”&#xff08;Transmission Control Protocol&#xff09;&#xff0c;要对数据的传输进行一个详细的控制。 TCP 协议段格…...

SVT-AV1编码器中的模块

一 模块列表 1 svt_input_cmd_creator 2 svt_input_buffer_header_creator 3 svt_input_y8b_creator 4 svt_output_buffer_header_creator 5 svt_output_recon_buffer_header_creator 6 svt_aom_resource_coordination_result_creator 7 svt_aom_picture_analysis_result_creat…...

金融数据分析(Python)个人学习笔记(12):网络爬虫

一、导入模块和函数 from bs4 import BeautifulSoup from urllib.request import urlopen import re from urllib.error import HTTPError from time import timebs4&#xff1a;用于解析HTML和XML文档的Python库。 BeautifulSoup&#xff1a;方便地从网页内容中提取和处理数据…...

子网划分的学习

定长子网划分&#xff08;Fixed-length Subnetting&#xff09; 也叫做固定长度子网划分&#xff0c;是指在一个IP网络中&#xff0c;把网络划分成若干个大小相等的子网&#xff0c;每个子网的子网掩码长度是一样的。 一、定长子网划分的背景 在早期的IP地址分配中&#xff0…...

Spark2 之 memorypool

cpp/core/memory/ArrowMemoryPool.cc cpp/core/memory/MemoryAllocator.cc VeloxMemoryManager cpp/velox/memory/VeloxMemoryManager.cc VeloxMemoryManager::VeloxMemoryManager(const std::string& kind, std::unique_ptr<AllocationListe...