【Linux内核系列】:进程板块与文件板块的综合
🔥 本文专栏:Linux
🌸作者主页:努力努力再努力wz
💪 今日博客励志语录:
人生中成功只是一时的,失败却是人生的主旋律,但是如何面对失败却把人分成了不同的样子,有的人会被失败击垮,有的人会爬起来继续向前,所以你会选择成为什么样的人呢?
那么在此前的一系列的文章,我主要围绕展开讲解了Linux的进程板块与文件系统板块,学习完了这两个板块的知识点之后,那么这两个板块的内容其实并不是独立隔离开的而是有联系的,那么有了文件系统板块的知识点之后,其实我们进程板块的很多知识点就可以在进一步的完善,那么本篇文章的核心就是关联其我们进程板块与我们的文件板块,那么废话不多说,就进入正文的学习
★★★ 本文前置知识:
文件系统收尾
文件系统
缓冲区
进程的替换
进程地址空间
引入:内存管理
想必进程的创建想必大家一定非常熟悉,那么在进程创建之前,我们需要将该进程对应的可执行文件给加载到内存中,那么我们知道内存和外部设备磁盘一样,是一个物理结构,那么必然也要经过操作系统的管理,那么操作系统管理一个事物的方式是首先得为该事物建立一个逻辑映射来描述该事物,比如磁盘,那么操作系统便用一个一维的线性数组来描述磁盘这个物理结构,那么其中该一维的线性数组的每一个元素便是扇区,同理操作系统要描述内存,必然也得为内存建立一个逻辑结构
那么我们知道CPU在运行进程的代码的时候,那么会从内存中获取该进程的相关数据,而CPU要获取该进程的相关数据,必然得告诉内存目标数据在内存中的物理位置,从而内存能够定位到该数据然后交给CPU,而CPU与内存之间通过地址线相连,那么以32为机器为例,那么CPU与内存的地址线就是32根,那么每一根地址线的高低电频信号用来表示二进制的0和1,那么内存就能够获取到这32根地址线组合得到一个二进制序列,那么该二进制序列便是地址,那么32根地址线总共就能够表示出2的32次方个不停的地址,也就是从0000 0000到FFFF FFFF连续的大小为4GB的地址空间,那么该地址空间就可以用一个一维的数组来表示,其中该数组的每一个元素就是一个逻辑地址,那么每一个进程都有各自的独立的一份虚拟地址空间,那么该虚拟地址空间就是内存的一个逻辑映射
那么这些地址是逻辑上的地址,就如同我们磁盘上一维线性数组中的逻辑块的LAB地址一样,那么他们就需要经过转化映射得到实际的物理内存地址,所以便有了页表这个数据结构,那么其中页表就记录的是虚拟地址到内存的物理地址的一个映射,那么CPU拿着虚拟地址经过其MMU也就是CPU的内存管理单元,然后MMU通过页表就能实现虚拟地址到物理地址的一个转化,从而交给内存定位到目标数据
而对于物理内存来说,我们操作系统将连续的物理内存空间其中按照4KB的数据为一个集合来划分,其中这每一个集合就是一个页框,那么为了管理整个物理内存就转换为了管理这划分的一个一个的页框,那么管理的方式就是我们最为熟悉的先描述,再组织了,也就是说操作系统会为每一个页框定义一个page结构体,那么该结构体存储了该页框的各种属性,其中最关键的便是一个整形的flag作为标志位,那么该整形flag变量的每一个二进制位都有特定的含义,那么其中就包括了该页框是否被使用等,那么其中page结构体还包括一个变量count也就是引用计数,记录该页框被多少进程所共享,那么在进程的视角下,物理内存是4GB,而页框的大小是4KB,那么也就是说总共大概会有1048576个页框
struct page {unsigned long flags; // 标志位(如PG_locked、PG_dirty)atomic_t _count; // 引用计数(共享次数)atomic_t _mapcount; // 页表映射计数struct address_space *mapping; // 关联的地址空间(文件映射时使用)pgoff_t index; // 页框在文件或内存中的偏移struct list_head lru; // LRU链表(用于页面置换算法)// 其他字段(如内核slab分配器相关)};
那么为了管理这么多的页框,那么操作系统的内核中会维护一个全局的变量mem_map本质上也就是一个struct page数组,那么该数组的每一个元素就对应一个page实例,那么我们可以通过内存的逻辑地址也就是地址空间的虚拟地址来根据其页表来映射转换得到内存的物理地址,而虚拟地址的二进制序列是由页目录索引、页表索引、页内偏移所构成。
以虚拟地址 0x08048000
为例: 0x08048000
→ 分解为:页目录索引(0x20)、页表索引(0x48)、页内偏移(0x000)。
然后MMU通过页目录索引以及页表索引在页表中逐级查找得到页框号PFN再结合页内偏移最后在将两者转化得到物理内存地址
而物理地址的前12位便是该物理地址所对应的页框的page结构体在mem_map的一个偏移量也就是PFN,那么我们就可以根据偏移量来定位到其对应的page结构体,这样就完成了一个虚拟地址到物理地址再到对应的page结构体的一个映射
虚拟地址空间 (进程视角)
│
└── 页表 (Page Table)
│
└── 物理地址 (硬件层)
│
└── 物理页框 (4KB)
│
└── struct page (元数据)
│
└── mem_map[PFN] (全局管理)
而我们发现如果是对于EXT4文件系统来说,那么该文件系统下的逻辑块的大小是4KB,而页框的大小也为4kb,那么必然我们的内存与磁盘的逻辑块就能够达成一个1:1的映射关系,那么至于映射规则以及过程是什么的,那么又是说来话长,本文肯定是讲不完的,所以便不再阐述了,读者感兴趣可以下去自己了解
完善进程的创建的全过程
那么我们现在我们要结合我们之前所学的进程板块与文件板块来完善进程创建的一个完整的过程的话,那么这个过程的起点就应该从系统调用说起,
我们知道了我们在Linux上创建的各种进程,本质上都是我们命令行解释器也就是shell外壳程序的子进程,那么shell外壳程序会调用fork系统调用接口来创建一个子进程,那么此时就会复制拷贝一份父进程的task_struct结构体然后修改其中部分属性比如PID以及PPID等得到子进程自己独立的一份task_struct结构体,至于数据层面上,那么子进程是共享父进程的物理内存页面的,但是为了进程的独立性,操作系统会采取了写时拷贝机制,也就是一旦进程对共享的数据进行写入操作的时候,那么便会触发写时拷贝机制,那么此时操作系统会为写入的数据在内存中为其开辟一份副本从而做到父子进程的数据的独立,那么fork调用结束后,下一个环节便是进程的替换,那么此时会调用exec族函数,那么它会获取到替换的目标进程的对应的可执行文件的文件名以及路径,那么没错,现在这部分过程就开始与文件板块串联起来了,获取文件名以及路径是目的是要从该文件所处的目录文件中的目录项中获取对应的文件名和其inode编号的映射关系从而获取该可执行文件的inode编号,那么有了该文件的inode编号之后,那么便可以转化为磁盘中的物理内存地址从而进行定位,而inode块中有其关联的保存文件内容的数据块的索引,那么意味着此时我们便能同时定位到该可执行文件的inode块以及对应的数据块,从而将其加载到内存中,然后接着又切换到我们的进程板块
一旦该进程对应的可执行文件加载到内存中之后,那么那么进程的替换不会为替换的新的进程创建一个task_struct结构体,而是修改该进程的页表也就是映射关系,从而将该子进程的上下文替换为目标进程的上下文,那么子进程运行结束退出后接着父进程会利用waitpid接口获取子进程的退出情况也就是退出码,那么这就是结合了文件板块之后,我们完善我们对于进程的创建的全过程的一个理解
完善用户缓冲区写入
那么我们有了文件系统以及进程的概念之后,我们便能够理解以及完善用户缓冲区写入的一个全过程
那么我们知道当我们调用c语言提供的fwrite库函数向目标文件做写入时,那么写入的数据不会直接到内核中而是先保存在c语言提供的一个用户层面上的缓冲区,然后再根据特定的刷新策略比如行缓冲或者全缓冲调用write接口刷新到内核中去
而我们向目标文件写入的数据前提肯定是该目标文件被打开了,那么既然该文件被打开,那么必然要调用fopen函数或者open接口,那么open系统接口会获取该打开的目标文件的文件名以及所处路径,然后会根据该路径解析得到该目标文件所处的目录,然后扫描其目录项得到映射关系从而获取该文件的inode编号从而定位到磁盘中的相应位置将该文件的inode块以及其关联的数据块加载到内存当中,并且为其创建一个内核层面上的file结构体,以及定义一个inode结构体保存inode块的数据,那么file结构体内部就有inode结构体的间接引用,而进程内部会有一个指针数组记录其打开的文件,那么每一个元素指向一个该进程打开的文件的file结构体,那么创建完file结构体之后,就会从数组开始线性扫描该指针数组寻找空余位置然后指向该file结构体并返回该数组位置的下标
那么此时有了数组下标之后,我们便能获取该文件的file结构体,那么其中file结构体中有一个address space字段,其中保存了一个指向基数树的数据结构的指针,那么我们该打开的文件一定保存在特定位置的内存的页框中,所以得通过基数树来寻找定位到其page结构体然后写入到页缓存中去,最后再由操作系统刷新到磁盘中去,这也就是为什么要有用户缓冲区的意义,因为每次写入页缓冲,那么其在基数树的定位都需要时间开销
结语
那么这就是本篇文章的全部内容,那么大家在学习Linux的各个板块的时候,比如进程与文件系统,它们之间不是独立没有联系的,而是可以结合这两个板块的知识,去完善我们很多过程,加深这两个板块之间的理解,这就是本文想要传达的,那么我的下一篇文章是动静态库,那么我会持续更新,希望你能多多关注,如果本文有帮组到你的话,还请多多三连加关注哦,你的支持就是我创作的最大动力!
相关文章:
【Linux内核系列】:进程板块与文件板块的综合
🔥 本文专栏:Linux 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 人生中成功只是一时的,失败却是人生的主旋律,但是如何面对失败却把人分成了不同的样子,有的人会被…...
深入理解嵌入式开发中的三个重要工具:零长度数组、container_of 和 typeof
在嵌入式开发中,内核开发者经常需要处理复杂的数据结构和动态内存分配。零长度数组、container_of 宏和 typeof 是内核开发中三个非常重要的工具,它们在结构体管理、内存操作和类型处理中发挥着关键作用。本文将详细探讨这三个工具的功能、应用场景及其在内核开发中的重要性。…...
第27周JavaSpringboot git初识
Git 课程笔记 一、Git 的介绍 1. Git 的诞生背景 Git 是 Linux 内核的作者 Linus Torvalds 为了更好地管理 Linux 内核开发而创建的版本控制系统。在 Linux 内核开发初期,由于开发者众多,协作成本很高,后来使用了 BitKeeper 工具来辅助协作…...
实战2. 利用Pytorch解决 CIFAR 数据集中的图像分类为 10 类的问题——提高精度
实战2. 利用Pytorch解决 CIFAR 数据集中的图像分类为 10 类的问题——提高精度 前期准备加载数据建立模型模型训练质量指标 让我们回到图像分类问题 CIFAR。 你的主要任务:实现整个模型训练流程,并在测试样本上获得良好的准确度指标值。 任务积分&#…...
CentOS高性能数据处理优化指南
在CentOS系统中,为实现高性能数据处理,需要从多个层面进行优化,包括系统配置、内核参数、硬件资源管理及软件优化等。 一、硬件优化 选择合适硬件是优化性能的基础,大规模数据处理任务建议使用多核CPU、大容量内存、SSD存储以及…...
深度剖析:Pytest Fixtures如何重塑自动化测试的可读性与高效性
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 在编写单元测试时,是否发现自己写了很多相同/相似代码呢? 像…...
AIP-181 稳定级别
编号181原文链接AIP-181: Stability levels状态批准创建日期2019-02-18更新日期2019-02-18 虽然不同组织(谷歌或其他组织)拥有不同的产品生命周期,AIP使用以下术语指代API组件 稳定性 。 注意 这些稳定级别大致对应于Google Cloud中的产品发…...
比较 (leetcode 452. 用最少数量的箭引爆气球 leetcode 435. 无重叠区间 leetcode 56. 合并区间
leetcode系列 文章目录 一、射箭引爆气球二、无重叠区间三、合并区间总结 提示:小白个人理解,如有错误敬请谅解! 对于此类题目,都先按左区间排序,之后根据重叠还是不重叠来进行操作 一、射箭引爆气球 找到最大的重叠…...
什么是有限元力学?分而治之,将复杂问题转化为可计算的数学模型
有限元力学是应用有限元方法(Finite Element Method, FEM)解决力学问题的学科,属于计算力学的重要分支。它通过将复杂的连续体结构离散化为有限个简单单元的组合,结合数学和物理原理,近似求解力学行为(如应…...
python项目一键加密,极度简洁
在要加密的项目内运行python -m pip install py2safe 安装后cd到项目的根目录,运行py2safe 它会递归加密所有文件夹,不需要参数,拿过来就用,基于pyarmor开发,基本破解不了,太方便辣 这是readme文件,不仅提到了用法,还贴心的加入了口腔溃疡的治疗办法,真是太贴心了 # py2saf…...
STM32 ADC原理与驱动详解:从存储器映射到多通道采集(下) | 零基础入门STM32第六十六步
主题内容教学目的/扩展视频ADC读电位器和光敏重点课程电路原理,跳线设置,ADC功能分析,驱动程序,读出AD数据,读内部温度传感器数据。会设置参数,能读出AD值即可。 师从洋桃电子,杜洋老师 本文深入…...
JxBrowser 8.5.0 版本发布啦!
• 为 Compose Desktop 提供了硬件加速渲染支持 • 支持自定义 Chromium 二进制文件的品牌标识 • 多项质量改进 了解更多 获取 30 天免费试用...
LIN接口
LIN接口 前言LIN接口简介帧格式同步间隔段 (Break Field)同步段 (Sync Byte Field)受保护ID段 (Protected Identifier Field)数据段 (Data Field)校验和段 (Checksum Field) 帧在总线上的传输波形帧类型无条件帧事件触发帧偶发帧诊断帧保留帧 错误类型 IP 设计结构框图接口设计…...
【蓝桥杯每日一题】3.16
🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x 目录 3.9 高精度算法 一、高精度加法 题目链接: 题目描述: 解题思路: 解题代码: 二、高精度减法 题目链接: 题目描述&…...
prometheus-helm的使用
1、部署Prometheus监控平台 1、下载安装Prometheus (当前集群版本1.26.3) git clone https://github.com/prometheus-operator/kube-prometheus.git -b release-0.12 安装: cd kube-prometheus/ 创建命名空间和crd: kubectl …...
时间序列分析的军火库:AutoTS、Darts、Kats、PaddleTS、tfts 和 FancyTS解析
引言:时间序列分析的现代挑战 时间序列分析在多个领域中扮演着关键角色,包括工程、金融、气象、工业预测等。随着开源工具的快速发展,开发者可以通过多种库快速实现时间序列预测与分析。本文将对 AutoTS、Darts、Kats、PaddleTS、tfts 和 FancyTS 六大主流库进行详细解析,…...
TLSR8355F128芯片特色解析
TLSR8355F128 是泰凌微推出的一款高性能、低功耗的无线物联网芯片,具有以下特色: 丰富的协议支持:支持 2.4GHz 私有协议。这使得该芯片能够广泛应用于各种特殊的物联网场景,实现不同设备之间的互联互通。强大的处理能力ÿ…...
基于分类算法的学习失败预警(上)
文章目录 前言1.数据预处理1.1数据探索1.2数值化处理1.3空值填充1.4添加标签1.5特征筛选1.6数据集类别平衡1.7划分数据集1.8训练集类平衡1.9标准化 2.模型选择2.1建立模型2.2模型调参2.2.1遍历调参2.2.2网格搜索 结语 前言 本次案例通过对现有数据分析,采用如下图所…...
首页性能优化
首页性能提升是前端优化中的核心任务之一,因为首页是用户访问的第一入口,其加载速度和交互体验直接影响用户的留存率和转化率。 1. 性能瓶颈分析 在优化之前,首先需要通过工具分析首页的性能瓶颈。常用的工具包括: Chrome DevTo…...
整形在内存中的存储(例题逐个解析)
目录 一.相关知识点 1.截断: 2.整形提升: 3.如何 截断,整型提升? (1)负数 (2)正数 (3)无符号整型,高位补0 注意:提升后得到的…...
python中多重继承和泛型 作为模板让子类实现具体业务逻辑
示例代码: T TypeVar("T", bound"NoSQLBaseDocument")# 与 MongoDB 数据库交互的基础文档类 class NoSQLBaseDocument(BaseModel, Generic[T], ABC):id: UUID4 Field(default_factoryuuid.uuid4)def __eq__(self, value: object) -> bool…...
2025 香港 Web3 嘉年华:全球 Web3 生态的年度盛会
自 2023 年首届香港 Web3 嘉年华成功举办以来,这一盛会已成为全球 Web3 领域规模最大、影响力最深远的行业活动之一。2025 年 4 月 6 日至 9 日,第三届香港 Web3 嘉年华将在香港盛大举行。本届活动由万向区块链实验室与 HashKey Group 联合主办、W3ME 承…...
ERC-6909 最小多代币标准
ERC-6909 Token标准是 ERC-1155 Token标准的一种简化替代方案。 ERC-1155 标准引入了一种多Token接口,使得单个智能合约能够结合可替代的和不可替代的Token(即,ERC20 和 ERC721)。 ERC-1155 解决了多个挑战,例如降…...
07-单链表-单链表基本操作
题目 来源 826. 单链表 - AcWing题库 思路 详见代码,主要思想就是用数组来模拟链表的创建。数组其实跟静态链表等价,由于动态链表动态new对于大数据太过于耗时,因此采用数组的方式。那数组如何起到链表的效果?用下标来索引。 …...
FFMPEG录制远程监控摄像头MP4
手绘效果图 上图是录制功能的HTML前端页面,录制功能和解码视频放在一起。录制功能关键是录制(开始录制按钮)、停止录像按钮。当点击“录制”的时候则会开始录制MP4文件, 当点击停止的时候就会停止录制MP4。经过录制后,则会生成MP4,并放到我的RV1126的/tm…...
Spring Boot 的自动装配
Spring Boot 的自动装配(Auto Configuration)是其核心特性之一,通过智能化的条件判断和配置加载机制,极大简化了传统 Spring 应用的配置复杂度。其原理和实现过程可概括为以下几个关键点: 一、核心触发机制:…...
Python中的“泛型”和“多重继承”
“泛型”和“多重继承”属于 Python 的语法规则。 1. 泛型(Generic[T]) 通俗解释 泛型允许你在定义类或函数时,不指定具体的类型,而是使用一个“占位符”(通常命名为 T)。这就像你制作一个盒子࿰…...
【C++】多参数构造函数使用explict的情形
在 C 中,“无非默认值” 指的是:构造函数的参数没有设置默认值(即所有参数都必须显式传递)。这个说法通常出现在讨论多参数构造函数是否需要使用 explicit 关键字时。 具体解释 多参数构造函数: • 如果一个构造函数有…...
C# Unity 唐老狮 No.10 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho C# 1. 内存中,堆和…...
使用DeepSeek,优化斐波那契数函数,效果相当不错
下面这段代码定义了一个递归函数 fibonacci,用于计算第 n 个斐波那契数。 def fibonacci(n):if n < 1:return nelse:return fibonacci(n - 1) fibonacci(n - 2)虽然代码逻辑正确,但其性能较差,尤其是对于较大的 n 值,其复杂度…...
【GPT入门】第22课 langchain LCEL介绍
【GPT入门】第22课 langchain LCEL介绍 1. LCEL介绍与特点2. 原生API与LCEL的对比2. 简单demo 1. LCEL介绍与特点 LCEL 即 LangChain Expression Language,是 LangChain 推出的一种声明式语言,用于简化和优化在 LangChain 框架内构建复杂链和应用的过程…...
市场监管总局升级12315平台 专项整治四大市场顽疾保障消费安全
大湾区经济网湾区财经讯,在今天下午举行的国务院新闻办新闻发布会上,市场监管总局负责人表示,将开展食品非法添加、假冒伪劣、价格欺诈、虚假宣传四大领域专项整治行动,并强化缺陷产品召回监管,全面保障消费者“安全消…...
FineBI6.x进阶篇-可视化专题
参考 参考:https://edu.fanruan.com/video/526 如何选择合适的图表:https://help.fanruan.com/dvg/doc-view-3.html 参考:https://help.fanruan.com/finebi/ 什么是GLAD原则:https://help.fanruan.com/dvg/doc-view-81.html …...
一对一交友App源码开发新趋势:精准匹配与多元盈利模式解析
一、 营商环境分析:机遇与挑战并存 近年来,随着移动互联网的普及和用户需求的不断升级,一对一交友App市场呈现出蓬勃发展的态势。然而,机遇与挑战并存,开发者需要审时度势,才能在激烈的市场竞争中脱颖而出…...
算法基础篇(蓝桥杯常考点)
算法基础篇 前言 算法内容还有搜索,数据结构(进阶),动态规划和图论 数学那个的话大家也知道比较难,放在最后讲 这期包含的内容可以看目录 模拟那个算法的话就是题说什么写什么,就不再分入目录中了 注意事…...
【Pandas】pandas Series cat
# Pandas2.2 Series ## Accessors |方法|描述| |-|:-------| |Series.str|对 Series 中的字符串元素进行矢量化字符串操作| |Series.cat|用于处理分类数据(Categorical Data)的属性| ### pandas.Series.cat pandas.Series.cat 是用于处理分类数据&am…...
Python的类和对象(3)
1、类的继承 父类:被继承 子类:继承者 – 可以使用父类的所有属性和方法、大大简化代码。 语法:在类名字后加上(继承的类名字) # 定义类 -- 父类 class Car:# 定义类属性wheel "有车轮"engine "有引…...
C语言修饰符汇总详解
在C语言中,修饰符(或称类型限定符)是用于修饰数据类型的关键字,可以改变变量或类型的性质和行为。它们通常用来控制存储类型、符号、大小、对齐、访问权限等。C语言中的修饰符主要可以分为以下几类: 类型修饰符存储类别修饰符常量和易变修饰符以下是C语言中所有修饰符的详…...
猎豹移动(Cheetah Mobile)
本文来自腾讯元宝 公司背景与发展历程 成立与早期定位 猎豹移动成立于2010年11月,由金山安全与可牛影像合并而成,初期以移动安全工具和清理软件为核心业务。其明星产品包括《猎豹清理大师》(Clean Master)和《猎豹浏览器》&…...
VLN 论文精读(二)VL-Nav: Real-time Vision-Language Navigation with Spatial Reasoning
这篇笔记用来描述2025年发表在arxiv上的一篇有关VLN领域的论文,由纽约州立大学布法罗分校和卡耐基梅隆联合发布。其主要创新点在于:像素级的视觉-语意特征、低算力移动设备部署、30Hz控制实时性、VLM模型的zero-shot ; 整个导航流程大概如下…...
优选算法系列(2.滑动窗口 _ 上)
目录 解法⼀(暴力求解)(不会超时,可以通过):一.长度最小的子数组(medium) 题目链接209. 长度最小的子数组 - 力扣(LeetCode) 解法: 代码&#…...
RK3568 android11 基于PN7160的NXP NFC移植
一,概述 1. 模块概述 PN7160专为在各种系统实现快速集成而设计,支持所有符合NFC Forum的模式,包括Android和Linux驱动程序,并支持实时操作系统和无操作系统的应用(PN7160不符合EMVCo)。嵌入式NFC固件减少了对主机交互的需求,并最大限度缩小了代码尺寸,使设计更轻松。…...
【网工第6版】第1章 计算机网络概论
目录 1计算机网络形成和发展 ■计算机网络 ■我国互联网发展 ■计算机网路分类 ■计算机网络应用 2 OSI和TCP/IP参考模型 ■网络分层的意义 ■OSI参考模型 ■TCP/IP参考模型 ■TCP/IP参考模型协议 3 数据封装与解封过程 ■封装 ■解封 1计算机网络形成和发展 ■计…...
【嵌入式】keil5安装(同时兼容C51和STM32)
最近在开发STM32的时候,安装Keil5,遇到STM32和C51的共存的问题,在网上找了很多方法,又遇到一些bug,最终还是弄好了。因此将处理的过程记录下来,希望对遇到相同问题的朋友一些启发。 1、下载安装包 Keil P…...
每日一题--进程与协程的区别
进程是什么? 进程(Process) 是操作系统进行 资源分配和调度的基本单位,代表一个正在执行的程序实例。每个进程拥有独立的虚拟地址空间、代码、数据和系统资源(如文件句柄、网络端口等)。进程之间通过 IPC&…...
网络安全运维应急响应与溯源分析实战案例
在日常运维过程中,网络安全事件时有发生,快速响应和精准溯源是保障业务稳定运行的关键。本文将通过一个实际案例,详细解析从发现问题到溯源定位,再到最终解决的完整流程。 目录 一、事件背景 二、事件发现 1. 监控告警触发 2…...
leetcode29. 两数相除-medium
1 题目:两数相除 官方标定难度:中 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。…...
深海300米的低温环境中的BMS优化方法
在深海300米的低温环境中,采用扩展卡尔曼滤波(EKF)结合温度补偿模型实现电池管理系统(BMS)的荷电状态(SOC)精确估计,需通过以下步骤实现: 1. 低温电池模型建立 1.1 电池…...
高主频GPU+RTX4090:AI生图性能优化超150%
概述:消费级高主频CPU搭配 RTX 4090显卡可以显著提高AI生图的性能,相比于企业级CPU具有更大的吞吐量和更优的成本效益。 引言:在AI图像生成过程中,CPU与GPU的协同效应对系统的整体性能至关重要。测试表明,与RTX 4090显…...
OpenCV 图像双线性插值
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 双线性插值是一种 二维插值方法,用于计算 栅格(Grid) 或 像素点 之间的插值值。它主要用于 图像缩放、旋转、变换 等操作,以在新像素位置估算灰度值或颜色值。 如上图所示,假设存在一个二维离散函数(如图像)…...