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

Linux第20节 --- inode和文件系统

一、没有被打开的文件

如果一个文件没有被打开,那么该文件存储在哪里?

该文件是存储在磁盘当中的!

文件 = 文件内容 + 文件属性!

  • 文件的内容是按照数据块存储的;
  • 文件的属性其实就是inode(是一个128字节的数据块,包含该文件的所有属性);
  • Linux的文件在磁盘中存储,是将文件的内容和属性分开存储的!!!

磁盘的特性:

  • 磁头是一面一个;
  • 磁头和盘面不接触(挨得非常近);
  • 磁盘一般处于无尘环境;(灰尘对磁盘的影响很大!)
  • 数据是在盘面中存储的;
  • 磁盘是永久性存储介质(无电没影响);

如上图所示:绿色的是磁道,红色的是扇区;

磁盘中,一圈同心圆被称为磁道,磁道会被且为一小段一小段的区域,这一小段区域被称为扇区!磁盘会被分为无数个扇区;

磁盘被访问的最基本单元是扇区;一个扇区大小通常是512字节,甚至有4KB;

我们可以把磁盘看作是无数个扇区构成的存储介质;

要把数据存储到磁盘,第一个要解决的问题就是定位一个扇区!

因此,首先我们要先定位到哪个面,即定位用哪个磁头?

接下来我们要确定访问哪个磁道?然后再定位访问哪一个扇区?

同一磁道,从上面往下看就是柱面的概念!

磁头是同时移动的!

假如说当前三面磁盘六个磁头,磁头要移动的时候六个磁头同时动!

磁头的左右摆动实际上是定位磁道和柱面的过程!(确定当前半径即磁道大小!)

当磁头不动,光盘动的时候,该过程被称为定位扇区!

对磁盘来说:

  • 运动越少,效率越高;
  • 运动越多,效率越低;

对于磁盘寻址,有三个关键的参数:Cylinder(柱面),Header(磁头),Sector(磁道)三个参数;

根据这三个参数确定的扇区地址被称为CHS寻址法则;

如果当前我们有三个磁盘,一共六面;

我们将其延展开,逻辑上可以看作是线性的!

其中,每一面又包括许多磁道!每一个磁道又包括多个扇形;

那么最终我们可以得到以扇区为基本单位的数组:(任何一个扇区都有对应的下标)

但是磁盘确认只根据CHS,因此此时我们需要找到对应的CHS和我们抽象化的数组之间的关系!

假设当前磁盘一个盘面有2w个扇区,每个扇区有50个磁道,而每个磁道有400个扇区!

当前有一个扇区标号为28888;那么此时我们根据对应的逻辑运算可以反推得到该扇区位于哪个磁面,哪个磁道和扇区!

LBA地址即为我们抽象的逻辑地址!

回归到磁盘的硬件 

不仅CPU有寄存器,其他外设(磁盘)也有寄存器!

磁盘当中有三个寄存器:

  • 控制寄存器;
  • 数据寄存器;
  • 状态寄存器;

如果操作系统想要访问磁盘,此时需要告诉控制寄存器当前是读取还是写入?即控制寄存器控制IO方向(r/w),然后读取/写入的数据位于数据寄存器当中,接下来再获取LBA的地址即可进行读取或写入,最后返回操作后的结果;

文件系统

假设当前我们有800G的磁盘空间,分区的过程实际上就是定义一个结构体,该结构体包含了抽象数组中我们使用的起始地址和最终地址!

此时我们只需要把这分割好的200G管理好,那么按照相同的策略即可管理好总的800G的磁盘!

我们先看Data block:

Data blocks可以有很多块(block),每个block的大小可以是1024,2048,4096个字节,这三种选项;Data blocks是用于存放文件内容的;(此时凡是我们通过fopen,fread,fwrite访问磁盘,那么访问的基本单元都是上面三种我们设置的1,2,4KB大小(文件块大小)!一般而言,每个块只有自己对应的数据!)

inode table:存放的有单个文件的所有属性,一般的大小是128字节!一般而言,一个文件有一个inode!在inode里面有唯一的编号!且该文件内容有多少个块(block)这一信息也在inode!

inode可能大致如下结构所示:

inode不包含文件的名称!每个文件用唯一编号确认!

通过ls -li可以查看文件对应的编号:

在Linux系统里面标识一个文件使用的是inode编号!

 

假如说当前NUM = 15,那么是不是说该文件最大为4*15 = 60KB呢?

答案:不是!可以通过二级索引以上来进行扩容!

例如当前我们0~12为直接索引,直接指向文件内容;12,13,14可是是二级索引,引用的块用于存放新的数据块的指针!4KB = 4*1024;每个二级索引最大为4MB! 

1. 直接索引(Direct Index)

  • 定义: inode中的block[0]block[11](不同文件系统数量可能不同)是直接索引项,每个项直接指向一个数据块(Data Block)。例如,若直接索引项有12个,每个数据块大小为4KB,则直接索引可存储最大 12 × 4KB = 48KB 的文件。
  • 作用: 直接处理小文件,无需额外索引块,访问速度快。
  • 示例: 若文件仅占用直接索引块,系统直接通过block[i]找到对应数据块。

2. 二级索引(一级间接索引,Indirect Index)

  • 定义: inode中某个索引项(如block[12])指向一个一级间接索引块,该索引块本身存储多个数据块指针。假设每个指针占用4字节,一个4KB的索引块可存储 4096B / 4B = 1024个指针。此时,二级索引可支持 1024 × 4KB = 4MB 的数据。
  • 作用: 扩展中等大小文件的存储能力,避免直接索引项不足。
  • 流程
    1. inode的block[12]指向一个索引块。
    2. 索引块中的每个指针指向实际数据块。
    3. 系统通过两次磁盘访问(索引块 + 数据块)获取数据 。
       

3. 三级索引(二级间接索引,Double Indirect Index)

  • 定义: inode中某个索引项(如block[13])指向一个二级间接索引块,该索引块再指向多个一级间接索引块,每个一级索引块再指向数据块。此时,三级索引可支持 1024 × 1024 × 4KB = 4GB 的数据。
  • 作用: 支持大文件,通过多层间接索引扩展存储容量。
  • 流程
    1. inode的block[13]指向二级间接索引块。
    2. 二级索引块中的指针指向多个一级间接索引块。
    3. 每个一级索引块再指向数据块。
    4. 系统需三次磁盘访问(二级索引块 + 一级索引块 + 数据块) 。
       

我们如何知道哪个存放文件的数据块被使用了,哪个没有被使用?

Block Bitmap: Block Bitmap里面存放了记录Data Block中的哪个数据块被占用了,哪个数据块没被占用!(1个比特位表示1个块! --- 置为1表示该块被使用!)

4KB = 4096个字节 = 4096*4个比特位!

问题:删一个文件的时候,用不用把块(文件内容)清空呢?

不用!只需要将对应的位图清空!全设置为0即可!

inode位图(inode Bitmap): 每个bit表示一个inode是否空闲可用!(当一个文件有inode table的时候,可能会有多个inode!)
inode Bitmap 的比特位的位置与inode是否有效使用连接起来!
因此,当前如果我们要进行文件的删除,我们需要做以下的操作:
  • 获取当前文件的inode编号(在inode table里面)
  • 然后再inode bitmap查看该inode是否是有效的!
  • 如果有效,在通过inode table读取属性,获得inode编号与其内容的映射关系,将读取到的块号在block bitmap里面置为0!
  • 再在inode bitmap将对应的编号设置为0!

删文件对内容没有关系!

每一个文件的分组都有如上的结构;

在Linux中,inode编号是以分区为单位统一分配的(不能跨分区)! 

在一块分区内,inode的编号是确定的!(一般是预先设置好的!)
块必须大于等于扇区!
因为扇区是我们定义的磁盘访问的最小单位!
当我们对io进行读取的时候,一次夺取多个块,实际上是对数据的预加载机制!
可能我们只需要128KB,但是我们加载了512KB,多余的就可以被称为预加载的数据!
一般而言,inode的编号都是连续的!
有没有可能inode被用完了,但是数据块还存在?
有!因为inode的分配是固定的!

磁盘访问中是以块大小为基本单位的!扇区是最小单位!(例如8个扇区的大小即为1个块!)

GDT,Group Descriptor Table:块组描述符,描述块组属性信息,描述的是整个分组的基本使用情况!
Super Block:包含了文件系统的基本信息,其中包括当前文件系统分组的基本情况!(整个分区!)
  • 一共有多少个组;
  • 每个组的大小
  • 每个组的inode的大小;
  • 每个组的block的数量;
  • 每个组的其实inode;
  • 文件系统的类型和名称等!

super block不会在每一个组中都有!有的组可能没有,有的组可能有多份!

如果当前super block这个模块的内容挂掉了!那么当前根据组进行的分区等什么都做不了,因此整个分区都挂掉了!

所以一般会在Block group 0 ~ n中零零散散有多个Super block!

结论:每一个分区在被使用前,都需要提前将部分文件系统的属性信息提前设置进对应的分区当中!方便我们后续使用这个分区或者分组,这一过程叫做格式化!(具体点还会将Block Bitmap 和 inode Bitmap进行清空!再将对应的文件信息写入进去)

蓝色部分是为了管理后面红色部分的属性信息!

在Linux中,可以通过stat指令查看文件的详细信息(比ls更详细)

问题:

  1. 新建一个文件,系统要做什么?
  2. 删除一个文件,系统要做什么?
  3. 查找一个文件,系统要做什么?
  4. 修改一个文件,系统要做什么?

回答上面这些问题之前,我们可以先总结下我们得到的结论:

  • Linux中,一个文件只有一个对应的inode,每一个inode都有自己对应的inode编号!(inode的设置只在对应的分区有效,例如我们举例的200G)
  • inode表示文件的所有属性,文件名并不属于文件属性!

当我们在一个路径下创建文件,有了路径我们可以确定要创建到对应的那个分区!

系统会对当前的文件分配对应的inode编号(分配inode编号的过程,根据路径我们已经认定是在哪个区了,然后查询对应的GDT,可以发现对应的inode的使用率很低,然后再查询inode bitmap,查询到最近的没有被使用的inode编号,然后分配)

删除 = 允许被覆盖!

cat test.txt

在操作系统的层面上看:实际上是cat根据test.txt的inode找到对应的磁盘分区和分组,然后在inode BitMap确定该文件对应的inode是0还是1,如果是1,再到inode Table查询对应的存储空间(blocks),然后读取对应的数据块的内容;

stat test.txt

在操作系统的层面上看:实际上是stat也是根据文件的inode找到对应的inode table,再将里面的重要的属性提取出来!

问题:我们如何知道一个文件的inode编号?

用户从来没有关心过inode,用的是文件名!

解答:这是因为目录也是文件!也有自己对应的inode编号;

我们知道,文件 = 内容 + 属性,那么目录的内容是什么?即目录需不需要对应的数据块?

答案是需要的!在目录的数据块里面,存放了文件的文件名和对应的inode的映射关系!

问题:当我们执行ls /ll 的时候,对于磁盘文件操作系统应该是如何实现的?

找到当前目录文件的inode,然后根据inode再对应的inode table找到对应的数据块,此时可以找到文件名和对应文件的映射关系!此时可以找到目录里面文件的inode,从而对接到上面新建文件等四个过程!

因此接下来我们可以回答之前的四个问题:

  • 为什么同一个目录不能用同名文件?

文件名作为key值要找到对应的inode编号,即value!

  • 为什么目录下,没有w我们不能创建文件?

即使能将文件创建出来,但是这个文件的文件名和inode的映射关系无法写入到数据块中!

  • 为什么目录下,没有r我们不能查看文件?

查看文件之前,我们需要获取文件的inode,但是当前目录我们无法读取数据块中的内容!因此无法查看文件!

  • 为什么目录下,没有x我们不能进入目录?

进入一个目录需要cd,cd的本质实际上就是找到目录的inode,然后把当前系统的环境变量进行更新!但是当前我们无法获取inode!

  • 路径解析的必要条件: 当用户尝试进入目录(如执行cd dir)或访问目录内的文件(如cat dir/file),系统需要遍历目录的目录项以找到目标文件的inode号。这一过程需要访问目录的数据块,而访问数据块的前提是目录具备x权限 。
  • x权限与inode的关系: 目录的x权限控制了对目录数据块的搜索能力。即使有读权限(r),也只能列出文件名(通过ls),但无法通过inode号访问具体文件,因为系统无法定位到目录数据块的物理位置 。

关键问题:怎么获取目录的inode编号?

我们需要从当前目录进行递归向上寻找,直到找到根目录,根目录里面存放的有目录的inode信息!访问任何的文件,我们都需要路径来进行访问!

二、软硬链接

软链接是一个独立的文件!因为具有独立的inode!

建立硬链接的指令:

ln 原文件 硬链接名字
# 例如:ln cat.jpg my_pet.jpg

 建立软链接的指令:

ln -s 原文件 软链接名字
# 例如:ln -s cat.jpg shortcut_to_cat.jpg
  • ln是建立链接的指令!
  • -s表示建立软链接;
  • ln什么都不带表示表示硬链接!

针对硬链接: 

对于硬链接,我们发现文件和硬链接共用一个inode!

硬链接不是独立的文件,因为没有独立的inode!

硬链接形成的inode一样,所以对应的文件的特性是一样的!

结论:所谓的建立硬链接,本质其实就是在特定目录的数据块中新增文件名和指向的文件的inode的映射关系!

  • 硬链接的本质实际上就是取别名!
  • 任意的一个文件,无论是目录还是普通文件,都有inode编号!
  • 在每一个inode编号的内部,都有一个引用计数的计数器!(计数器的作用是表明当前有多少个文件指向这个inode)

可以存在多个文件名映射同一个inode!

引用计数为0的时候,该文件才会被彻底删除!

针对软链接: 

如何理解软连接?

软连接是一个独立的文件,有独立的inode编号,也有独立的数据块,它的数据块里面存放的是指向原文件的路径

因此,当我们进入如下操作的时候:

我们往源文件中写入数据,软链接的文件也能直接访问到(因为写入的是地址)! 

因此,如果将软链接删除,对源文件无影响;

但是如果将源文件进行删除,软链接就找不到了!

软连接类似于Windows中的快捷方式!

除了通过rm进行删除,我们还可以进行unlink进行删除!(软硬链接都可以!)

unlink 软/硬链接文件名

软链接的应用:

当我们需要执行的程序位于路径深处,但是此时我们想要在当前目录下运行,此时我们可以跟其进行软连接,而不用到路径深处来执行!

例如下面的例子:

硬链接的应用:

当前目录下我们有一个file文件,其硬链接数为1很好理解;

但是如果我们创建一个空目录,那么当前的硬链接数为2!

这是因为当我们进入到这个目录的时候,我们还有对应的一个点也就是当前目录! 

一个点是对应的文件夹的硬链接,所以它们的inode值是一样的! 

问题:为什么对应的..的硬链接数是3呢?

这是因为..(上级目录)是一个对应的硬链接,然后上一级目录是lesson22,这个目录还存在本身和当前目录.  !!!

如果我们子啊对应的dir目录下再创建一个子目录,这时候dir对应的硬链接会变为3!

这是因为创建的子目录里面包含了对应的..上级目录,这算一个硬链接!

规律:已知当前目录的硬链接数,那么这个目录下有多少个子目录呢?(硬链接数 -2)

应用:通常用于路径定位,采用硬链接可以进行路径间的切换!

问题:Linux内部不允许对目录进行硬链接,为什么?

如果我们要在根目录下根据文件名查找一个文件且此时与根目录实现硬链接:

此时我们需要读取路径上inode和其对应的属性,但是当我们找到硬链接的时候,此时又重新返回到根目录,造成死循环!

问题:目录内部有 ./..不是硬链接吗?

这是操作系统自己编码时实现的,操作系统可以,但是用户不可以,哪怕是root!

系统在搜索路径的时候,不会对.和..这两个硬链接的路径做搜索!所以不会出现死循环!

硬链接只是对应的文件名和一对对应的inode映射!不是真正的目录,依旧属于当前目录下的内容,因此rm删除目录不需要考虑.和..!

相关文章:

Linux第20节 --- inode和文件系统

一、没有被打开的文件 如果一个文件没有被打开,那么该文件存储在哪里? 该文件是存储在磁盘当中的! 文件 文件内容 文件属性! 文件的内容是按照数据块存储的;文件的属性其实就是inode(是一个128字节的…...

LeetCode - 19.删除链表的倒数第N个结点

目录 题目 解法一 双指针算法 核心思想 执行流程 具体例子 代码 解法二 两次遍历法 核心思想 执行流程 具体例子 代码 题目 19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 解法一 双指针算法 核心思想 利用双指针间隔固定距离(n1)&a…...

在 Ubuntu 上安装 cPanel

开始之前,请确保拥有一台 Ubuntu 服务器,推荐使用 Ubuntu 22.04 LTS。如果没有,可以查看免费服务器: 11个免费 VPS,够用一辈子了!(2025最新)Top 11 免费VPS推荐平台对比&#xff08…...

《Linux macOS :GCC升级方法》

GCC(GNU Compiler Collection)是广泛使用的编译器套件,升级到9以上版本可以获得更好的C17/20支持和性能优化。以下是不同Linux发行版和macOS的升级方法: Ubuntu/Debian 系统 添加工具链源 sudo apt update sudo apt install soft…...

C++ STL vector容器详解:从原理到实践

引言 亲爱的小伙伴们,今天我要和大家分享一个C编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性&#…...

[计算机网络]数据链路层

0 概论:数据链路层都干什么事,提供啥功能 比物理层再高一层就是数据链路层,咱们上一篇讲物理层,物理层直接接触传输介质,现在数据链路层是使用物理层的传输服务,然后实现更多的功能。物理层是只管把比特流…...

基于 vue-flow 实现可视化流程图

vue-flow 是一个基于 Vue.js 的强大且灵活的可视化流程图库,它允许开发者轻松创建交互式的流程图、工作流图、节点图等。 主要特点 易于使用 :提供了简洁的 API 和组件,开发者可以快速上手并创建复杂的流程图。高度可定制 :支持…...

【网络编程】HTTP(超文本传输协议)详解

🦄个人主页:修修修也 🎏所属专栏:网络编程 ⚙️操作环境:Visual Studio 2022 目录 📌HTTP定义 📌HTTP工作原理 1.客户端发起请求: 2.服务器处理请求: 3.客户端处理响应: 📌HTTP关键特性 🎏HTTP请求方法 &am…...

NuttX 与 PX4 系统开发全流程详解

NuttX 与 PX4 系统开发全流程详解 目录 1. NuttX 构建与使用2. NuttX 启动流程解析3. BootLoader 源码分析4. GPIO 驱动机制5. I2C 驱动分析6. PX4 系统架构简析7. uORB 消息机制8. PX4 应用开发示例9. 串口及 GPS 驱动解析10. MAVLink 协议与 PX4 交互 1. NuttX 构建与使用 …...

【Mytais系列】Myatis的设计模式

目录 设计模式 1. 工厂模式(Factory Pattern) 2. 建造者模式(Builder Pattern) 3. 动态代理模式(Dynamic Proxy Pattern) 4. 模板方法模式(Template Method Pattern) 5. 策略模…...

Linux:进程优先级及环境

一:孤儿进程 在Linux系统中,当一个进程创建了子进程后,如果父进程执行完毕或者提前退出而子进程还在运行,那么子进程就会成为孤儿进程。子进程就会被systemd(系统)进程收养,其pid为1 myproces…...

网络编程初识

注:此博文为本人学习过程中的笔记 1.socket api 这是操作系统提供的一组api,由传输层向应用层提供。 2.传输层的两个核心协议 传输层的两个核心协议分别是TCP协议和UDP协议,它们的差别非常大,编写代码的风格也不同&#xff0c…...

疾病传播模拟 ——python实操

1、需求 疾病传播模拟 定义一个Infection类,包含初始感染人数、每日感染率等属性,以及一个simulate_spread方法用于模拟疾病传播过程。 使用numpy随机生成初始感染人数(范围1-100)和每日感染率(范围0.01-0.1)。 创建Infection对象,模拟10天的疾病传播过程,每天计算感染…...

用docker ffmpeg测试视频vmaf分数,很快不用编译

之前测试vmaf要自己编译libvmaf,自己编译ffmpeg,巨麻烦,或者用老旧不再维护的docker仓库,最近在docker hub上发现了编译了libvmaf的ffmpeg的docker,而且镜像很小,适合直接运行。 # dest.mp4 评分视频&…...

【浅学】Windows下ffmpeg+nginx+flv将本地视频推流在本地搭建的Web前端页面中播放,超详细步骤

Nginx安装和配置 下载nginx-1.19.3-http-flv 模块预编译包并解压放在d盘,路径就跟安装步骤里说的一样(如下图),不然会有其他问题出现。 打开conf/nginx.conf,查看RTMP和http相关的配置,确认端口号和路由名称 ffpemg推流视频…...

SQL笔记——左连接、右连接、内连接

前言:总是忘记表连接的区别,在面试的时候也容易被问到,因此就好记性不如烂笔头吧 集合运算 有并集、交集、差集 联合查询*(针对行合并的)* union为关键字,就是将两个select的结果求并集(此时重…...

iOS启动优化:从原理到实践

前言 在iOS应用开发中,启动速度是影响用户体验的重要因素之一。研究表明,启动时间每增加1秒,用户留存率就会下降约7%。本文将深入探讨iOS启动优化的各个方面,从底层原理到具体实践,帮助开发者打造更快的应用启动体验。…...

202553-sql

目录 一、196. 删除重复的电子邮箱 - 力扣(LeetCode) 二、602. 好友申请 II :谁有最多的好友 - 力扣(LeetCode) 三、176. 第二高的薪水 - 力扣(LeetCode) 一、196. 删除重复的电子邮箱 - 力扣…...

Socket-TCP

在TCP/ip协议中,用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个通信! 端口号范围划分 0 - 1023: 知名端口号,HTTP,FTP,SSH 等这些广为使用的应用层协议,他们的端口号都是固定的。…...

BOSS的收入 - 华为OD机试(A卷,C++题解)

华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 代码不懂有疑问欢迎留言或私我们的VX:code5bug。 题目描述 一个 XX 产品行销总公司,只有一个 boss,其有若干一级分销&…...

神经网络的基本概念与深度解析——基于生物机制的仿生建模与工程实现

广义上讲,神经网络是泛指生物神经网络与人工神经网络这两个方面。所谓生物神经网络是指由中枢神经系统(脑和脊髓)及周围神经系统(感觉神经、运动神经、交感神经、副交感神经等)所构成的错综复杂的神经网络,…...

JavaScript基础-运算符优先级

在JavaScript编程中,理解运算符的优先级是编写正确且高效代码的关键之一。当一个表达式包含多个运算符时,JavaScript会根据运算符的优先级来决定执行顺序。如果不了解这些规则,可能会导致意外的结果。本文将详细介绍JavaScript中的运算符优先…...

【RocketMQ NameServer】- NameServer 启动源码

文章目录 1. 前言2. RocketMQ 通信架构3. NameServer 启动流程3.1 创建 NameServerController3.2 启动 NameServerController3.3 NamesrvController#initialize3.3.1 Netty 通信的整体流程3.3.2 创建 NettyRemotingServer 3.4 this.remotingServer.start()3.4.1 this.remotingS…...

Learning vtkjs之WindowedSincPolyDataFilter

过滤器 模型简化(光滑处理) 介绍 像是对模型进行特征信息的简化(光滑处理) 效果 核心代码 主要流程 const fullScreenRenderer vtkFullScreenRenderWindow.newInstance({background: [0, 0, 0],rootContainer: vtkContainerR…...

C++ - 数据容器之 forward_list(创建与初始化、元素访问、容量判断、元素遍历、添加元素、删除元素)

一、创建与初始化 引入 <forward_list> 并使用 std 命名空间 #include <forward_list>using namespace std;创建一个空 forward_list forward_list<int> fl;创建一个包含 5 个元素&#xff0c;每个元素初始化为 0 的 forward_list forward_list<int&g…...

ES6/ES11知识点

ES 全称ECMAScript &#xff0c;是脚本语言的规范&#xff0c;javascript是ES的一种实现。 作用域链 在 JavaScript 中&#xff0c;作用域链是一个非常重要的概念&#xff0c;它决定了变量和函数的访问顺序。掌握作用域链有助于深入理解执行上下文、闭包和变量查找等概念。 …...

力扣面试150题--二叉树的最大深度

Day 40 题目描述 做法 /*** 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…...

360驱动大师v2.0(含网卡版)驱动工具软件下载及安装教程

1.软件名称&#xff1a;360驱动大师 2.软件版本&#xff1a;2.0 3.软件大小&#xff1a;218 MB 4.安装环境&#xff1a;win7/win10/win11 5.下载地址&#xff1a; https://www.kdocs.cn/l/cdZMwizD2ZL1?RL1MvMTM%3D 提示&#xff1a;先转存后下载&#xff0c;防止资源丢失&…...

Excel-CLI:终端中的轻量级Excel查看器

在数据驱动的今天&#xff0c;Excel 文件处理成为了我们日常工作中不可或缺的一部分。然而&#xff0c;频繁地在图形界面与命令行界面之间切换&#xff0c;不仅效率低下&#xff0c;而且容易出错。现在&#xff0c;有了 Excel-CLI&#xff0c;一款运行在终端中的轻量级Excel查看…...

AI Agent开发第48课-DIFY中利用AI动态判断下一步流程-DIFY调用API、REDIS、LLM

开篇 之前我们在《AI Agent开发第47课-DIFY处理多步流程慢?你确认用对了?》中讲述了DIFY的设计中在整合多步LLM时如避免过多调用LLM的良好设计,并给出了AI工作流的相应设计手法。今天我们要在上一篇的基础上把“上门维修预约”这个流程进一步按照实际业务需求加入用户在整个…...

C# 操作符

C# 操作符 一、操作符概览二、优先级与运算顺序三、各类操作符的实例 一、操作符概览 操作符&#xff08;运算符&#xff09;的本质是函数的简记法 操作符不能脱离与它关联的数据类型 int x 5; int y 4; int z x / y; Console.WriteLine(z);//输出1double a 5.0; double b…...

python下载

一、下载python和IDIE 1.进入python官网 加载可能有点慢&#xff0c;因为是国外网站 下载 点击Downloads按钮&#xff0c;选择版本下载。 安装 勾选两个多选框&#xff0c;点击Install Now安装完成&#xff0c;进入开始菜单&#xff0c;多出一个Python xxx.xxx文件夹&…...

tp5 php获取农历年月日干支甲午

# 切换为国内镜像源 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 再次尝试安装 composer require overtrue/chinese-calendar核心写法一个农历转公历&#xff0c;一个公历转农历 农历闰月可能被错误标记&#xff08;例如 闰四月 应表示…...

MySQL安装完全指南:从零开始到配置优化(附避坑指南)

&#x1f525; 前言&#xff1a;为什么你总是装不好MySQL&#xff1f; &#xff08;实话实说&#xff09;每次看到新手在MySQL安装环节疯狂踩坑&#xff0c;老司机都忍不住想摔键盘&#xff01;明明官网下载的安装包&#xff0c;怎么就会报错呢&#xff1f;为什么别人的环境变…...

5.3刷题

P3370 【模板】字符串哈希 #include<bits/stdc.h> using namespace std; #define int long long typedef unsigned long long ull; int n; ull myhash(string s){ull code 0, x 131, y 140814840257324663;for(int i 0; i < s.size(); i){code (code * x (ull)…...

KeyPresser 一款自动化按键工具

1. 简介 KeyPresser 是一款自动化按键工具,它可以与窗口交互,并支持后台运行, 无需保持被控窗口在前台运行。用户可以选择要操作的目标窗口,并通过勾选复选框来控制要发送哪些按键消息。可以从组合框中选择所需的按键,并在编辑框中输入时间间隔以控制按键发送之间的延迟。程…...

# LeetCode 1007 行相等的最少多米诺旋转

LeetCode 1007 行相等的最少多米诺旋转 原题英文&#xff1a;Minimum Domino Rotations For Equal Row 难度&#xff1a;中等 | 标签&#xff1a;数组、贪心 1 题目重述 给定两行长度相同的多米诺骨牌&#xff1a; tops[i] 表示第 i 张骨牌上面的数字&#xff1b;bottoms[…...

【Agent搭建】利用coze平台搭建一个AI销售?

目录 一、关于coze 核心功能 二、搭建属于你自己智能体 备注&#xff1a;&#xff08;以下说明比较需要调整的板块&#xff09; 1、从Prompt工程开始 2、搭建工作流 3、添加知识 三、总结 一、关于coze Coze是字节跳动推出的AI应用开发平台&#xff0c;专注于帮助用户快速…...

Linux系统中安装GitLab

一、安装前准备&#xff1a;确认系统要求&#xff08;新手必看&#xff01;&#xff09; 系统版本&#xff1a;推荐 Ubuntu 20.04 或更高&#xff08;本文以 Ubuntu 22.04 为例&#xff09;。内存要求&#xff1a; 最低&#xff1a;2GB RAM&#xff08;仅建议测试环境&#xf…...

PowerShell安装Chocolatey

文章目录 环境背景安装参考 环境 Windows 11 专业版PowerShell 7.5.1.NET Framework 4.0Chocolatey v2.4.3 背景 Chocolatey是Windows上的包管理工具&#xff0c;有点类似于Linux的 yum 和 apt 命令。比如&#xff0c;PowerShell里默认没有 grep 命令&#xff0c;则可以通过…...

UDP / TCP 协议

目录 一、前言&#xff1a; 数据封装与分用&#xff1a; 二、网络协议分层模型&#xff1a; 三、UDP / TCP 协议 UDP 协议&#xff1a; 1、UDP 协议段格式&#xff1a; 2、UDP 的特点&#xff1a; TCP 协议&#xff1a; 1、TCP 协议段格式&#xff1a; 2、TCP 协议的十…...

Coding Practice,48天强训(28)

Topic 1&#xff1a;悠悠的重组数组 游游的重组偶数__牛客网 比较简单的一个题&#xff0c;因为前两天写了快速幂算法&#xff0c;一直想着用进位 &1之类的处理偶数&#xff0c;其实就正常用string装数字遍历%2就行了 #include <bits/stdc.h> using namespace std;…...

第一章 初识SpringMVC

一、什么是MVC MVC是一种软件架构模式&#xff08;是一种软件架构设计思想&#xff0c;不止Java开发中用到&#xff0c;其它语言也需要用到&#xff09;&#xff0c;它将应用分为三块&#xff1a; M&#xff1a;Model&#xff08;模型&#xff09; V&#xff1a;View&#xf…...

虚幻引擎入门笔记

【虚幻5】UE5新手入门尝试 虚幻引擎的基础设置 1.验证-当文件误删的时候&#xff0c;对其进行验证&#xff0c;可以恢复。 2.虚幻引擎极其强大&#xff0c;可以实现多种复合技能&#xff0c;所在创建项目页面可以看见不只是创建游戏的项目 3.更改虚幻引擎默认的缓存地址。有些…...

Oracle 11g通过dg4odbc配置dblink连接神通数据库

1、安装unixodbc 2、安装神通数据库 3、 配置神通数据库odbc数据源&#xff0c;测试连通性 4、配置透明网关、监听文件以及对应编写的hsodbc的ora文件&#xff0c;我这里是initst.ora ##对应编写的hsodbc的ora文件 vim $ORACLE_HOME/hs/admin/initst.ora ##添加如下 HS_FDS_CO…...

2.2 矩阵

考点一&#xff1a;方阵的幂 1. 计算方法 (1) ​找规律法​ ​适用场景​&#xff1a;低阶矩阵或具有周期性规律的矩阵。​示例​&#xff1a; 计算 A ( 0 1 1 0 ) n A \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}^n A(01​10​)n&#xff1a; 当 n n n 为奇…...

Linux《进程概念(下)》

在之前我们已经了解了进程基本的概念、知道了如何去创建子进程&#xff1b;还了解了进程状态、进程切换、进程O(1)调度算法等&#xff0c;那么接下来在本篇当中我们就来学习环境变量和程序地址空间的相关知识&#xff0c;相信通过本篇的学习你会有很大的所获&#xff0c;一起加…...

MySQL 比较运算符详解

&#xff08;1&#xff09;符号类型运算符 运算符名称作用示例等于运算符判断两个值、字符串或表达式是否相等SELECT * FROM users WHERE age 25SELECT name FROM products WHERE category Electronics<>安全等于运算符安全地判断两个值、字符串或表达式是否相等&…...

No qualifying bean of type ‘XXX‘ available

没有某类型的bean可供使用 问题一解决方案错误问题配置类YuApiClientConfig依赖导入测试方法 问题二解决方法问题现场问题解决 问题一 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.transbit.yuapiclientsd…...

手搓一个 MCP Server 实现水质在线数据查询

随着人工智能技术的快速发展,如何将大语言模型(LLM)与实际业务场景结合,提供精准、可控的服务成为一个热门话题。MCP(Model Context Protocol)作为一种开放协议,为应用程序向 LLM 提供标准化的上下文接口,极大地简化了这一过程。本文将以构建一个水质在线查询 MCP 服务…...