【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)
inode
和 block
的映射
该博文中有详细解释:【Linux系统】inode 和 block 的映射原理
目录与文件名
这里有几个问题:
问题一: 我们访问文件,都是用的文件名,没用过 inode
号啊?
之前总是说可以通过一个文件的 inode
号就可以获取该磁盘文件的相关信息
但是,我们凭什么可以获得 inode
?
我们用户操作好像不是通过 inode
操作的,而是通过文件名操作的!
问题二:文件名存储在哪里呢?
之前说过,在 Linux
下, 文件名不在 inode
结构中保存?为什么?
那 文件名存储在哪里呢?存储在目录文件!
问题三:目录是文件吗?如何理解?
目录文件
目录其实也是文件:目录文件
命令 ls -lid 目录文件名
:查看该目录文件属性信息,如该文件的 inode
号
不卖关子:目录文件的内容存储的是文件名和 inode
的映射关系
目录既然是文件,当然也就可以打开!!!!!
举例:在终端上打开一个目录文件
(1)命令 for i in {1..5}; do touch "test$i.c"; done
:在当前目录创建 5 个 test1.c 、test2.c 这样命名的文件
(2)命令 vim .
:查看当前目录文件
既然 目录也是文件,目录文件也要有对应的数据块的!
目录 = inode
+ data block
= 属性 + 内容
文件名和 inode
是互为映射的
因为在 Linux
或 Windows
等操作系统中的文件目录下都不能存在同名文件
如何保证文件的命名唯一性呢,可以依靠 文件名 和 inode
的映射关系,inode
绝对是唯一的,相应的文件名也为唯一的。
- 用户输入文件名,同时一般需要带上路径,系统就会在该路径下,寻找对应文件名,通过 文件名和
inode
的映射,找到该文件的唯一inode
值进行文件磁盘访问的相关操作 - 文件名单向映射唯一一个
inode
值,而inode
值可以被多个文件名映射,这种机制是通过硬链接实现的!
为什么一个目录能有 读/写/执行 rwx 权限
到这里,你应该可以明白,为什么一个目录还能有 读、写、执行 权限
若一个目录没有读权限,你就不能访问该目录下的文件:就是因为目录文件本身内部存储着文件名和inode的映射关系,必须要读目录,才能拿到该映射关系,才能拿到 inode 才能访问该文件
若一个目录没有写权限,就无法在该目录下创建文件、删除文件、修改文件名…:就是因为目录文件本身用于存储文件名和inode的映射关系,必须要有写权限,才能将文件名和inode的映射关系写入该目录文件中,而 创建文件本质就是将新文件和inode的映射关系写入、删除文件本质就是删除文件和inode的映射关系、修改文件名本质就是修改了新文件名和inode的映射关系
若一个目录没有执行权限,就无法进入该目录:进不去该目录的本质是打不开该目录文件
问题:普通文件和目录文件在底层有区别吗?
在我们前面讲解的 磁盘文件系统中,是否会区分该文件是普通文件、还是目录文件吗?
不会,在底层一视同仁!
在底层的 磁盘文件系统中,文件的属性存储在 inode
中,文件的内容存储在 Block
中,普通文件和目录文件本质都是 属性 + 内容,因此不会区分文件类型,而是按部就班的直接存储属性和内容这样的数据
问题:为什么要进行文件名和 inode
的映射?
那为什么要设计 inode 和文件名进行映射呢,为什么要套这一层呢?
效率问题:若我们使用文件名表示一个文件,系统寻找文件时,则需要比对众多的文件名(字符串!),时间复杂度是 O(n)
!
而文件名映射的 inode
,则只需比较 数值类型的 inode 数字串,时间复杂度是 O(1)
!
其实系统管理用户也是通过:用户名和 User
编号的映射关系
命令 ls -l
可以看到文件的创建者
命令 ls -ln
:带上一个 n ,表示能显示数字就显示数字
此时就能看到用户名在系统看来就是一串数字!
不只是这几个例子:还是什么 GID :组别ID…
系统会主动规避字符串,而是使用映射的数字,字符串是给人看的,数字对系统来说才是高效的!
重新理解 ls -l
命令
该命令本质上是打开当前目录的目录文件,遍历所有文件和 inode
的映射关系,通过 inode
值找到磁盘中该文件的 inode
结构体,返回该结构体中存储的文件属性信息,将这些文件信息和文件名拼接处理成字符串展示到屏幕上,下图中文件名前面的都是该文件存储在 struct inode
中的文件信息!
可是问题又来了!
找到文件名 -> 首先要打开当前目录 -> 当前目录,也是文件!!也有文件名的呀!!
那目录的文件名如何被找到呢?
目录的目录的文件名又如何被找到呢?套娃呢
此时就需要 逆向的路径解析!
逆向路径解析
我如果需要访问 /lesson21
目录文件内容(如访问 test.txt
文件),就需要拿到目录文件 lesson21
的 inode
找到磁盘中的相关的数据块,此时就要目录文件 /code
提供/lesson21
目录文件的 inode
值
我如果需要访问目录文件 /code
,就需要拿到目录文件 /code
的 inode
找到磁盘中的相关的数据块,此时就要目录文件 /112
提供/code
目录文件的 inode
值
一环一环,本级目录文件的内容访问,需要拿到 inode值,只能通过上级目录文件拿到该inode值
最终逆向回到根目录,而根目录是写死的,根目录文件的 inode值可以直接被获取然后访问对应数据块,相当于递归到出口了!!
正解:其实路径是被正向解析的,逆向只是为了方便理解路径需要被解析的!
系统其实是获取一个全路径,从根目录开始一次从左向右,依次解析路径的!!!
问题:为什么任何一个文件都要有路径?
就是要一环套一环的嵌套存储数据!!!!
没有路径,就根本不能直接找到该文件,只有通过一个全路径,对全路径进行一次解析解环,最终才能找到目标!
问题:为什么每个进程都要有一个 CWD
??
每个进程都有一个当前工作目录(CWD, Current Working Directory)主要是为了方便文件路径的引用。当你在命令行中运行程序或脚本时,很多时候需要访问或操作文件系统中的文件。这些文件可能位于不同的目录中,而使用相对路径来引用它们可以极大地简化这一过程。
当你启动一个新的进程时,它会继承其父进程的当前工作目录,除非特别指定了另一个工作目录。例如,当你从Bash启动一个程序时,这个程序默认的当前工作目录就是启动它的那个Bash进程的当前工作目录。这就是为什么即使是像Bash这样的祖先进程也需要维护一个CWD——它不仅用于自身的操作,也为所有由它启动的子进程提供了一个起点。
当前工作目录 CWD 最主要作用是用于形成相对路径
如下图,一个点 的意思是当前目录,两个点 的意思是上级目录
若你在当前目录下,打开当前目录的一个 log.txt
文件,只需要用当前目录的一个点 + 文件名的形式组成的路径,这就是相对路径!
open("./log.txt");
在该程序底层,表示当前目录的这个点,就会用 CWD
替换掉,如下:
// 假如 cwd 为 /root/code/"./log.txt"等于
"/root/code/log.txt"
问题:路径需要被重复解析吗?
前面我们讲解了一个文件需要被系统做层层的路径解析,这个过程其实是不断的在访问磁盘,和磁盘进行IO交互的
/home/whb/code/code/112/code/1esson21
我们通过路径解析找到文件 lesson21
,那如果我们还要查找访问当前路径下的 test1.c
,难道我们还需要将该路径再次重复的解析一遍吗??
/home/whb/code/code/112/code/test1.c
并不需要,Linux
系统会对路径进行缓存,解释如下:
路径缓存和缓存树 struct dentry
结构
路径缓存
在磁盘文件系统中是没有文件路径的概念的,如果有也是逻辑上的存在(路径本就是从物理层面抽象出来的一种逻辑化的概念)
磁盘中仅仅存在纯粹的 inode
和数据块,就是纯粹的存储文件及其数据内容
而我们操作系统中又是如何通过例如一个 tree
命令将整个系统的路径关系展示出来的呢?
是不是系统遍历了所有文件路径,然后不断和磁盘交互得来的,肯定不是,这样太慢了
其实,Linux
系统会对路径进行缓存!,而且就是通过 多叉树这样的结构进行缓存的!!
缓存路径的多叉树并不会一次性将磁盘中的所有文件路径缓存下来,这个树展示的只是磁盘文件系统中的一小部分文件路径
除了一些基本文件和访问几率较大的文件会先被缓存下来,还有就是会缓存我们历史访问过的文件路径
如果下次还需使用到该路径,就直接查找文件路径缓存树即可
我们使用 find
命令查询文件时
比如在根目录下,按照名字查询目标文件:find / -name test.txt
find
命令查询文件也是要不断访问磁盘对应文件数据块内容
而我们说过,首次进行 find
命令查询时可能会比较慢,第二次之后就相对比较快了
这就是因为首次查询时,系统已经将访问过的文件路径缓存下来了,第二次之后的查询就不用过多的访问磁盘,只需查询路径树即可!!!
缓存树的 struct dentry
结构
Linux中,在内核中维护树状路径结构的内核结构体叫做: struct dentry
树的组成:一个 struct dentry
结构实际上算作一种树节点结构,多个 struct dentry
结构链接就形成所谓的 文件路径缓存树 !
struct dentry
结构:含有三个主要的字段
- 父节点指针 :指向父亲
struct dentry
节点结构 - 子节点指针 :指向孩子
struct dentry
节点结构 inode
值:本文件对应的inode
值
每个文件都有dentry
:每个文件其实都要有对应的 dentry
结构,包括普通文件。这样所有被打开的文件,就可以在内存中形成整个树形结构。
LRU
淘汰机制:整个树形节点也同时会隶属于 LRU(Least Recently Used)
,最近最少使用)结构中,进行节点淘汰。
整个树形节点也同时会隶属于Hash,方便快速查找。
更重要的是,这个树形结构,整体构成了Linux的路径缓存结构,打开访问任何文件,都在先在这棵树下根据路径进行查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry结构,缓存新路径。
例如我们需要通过该路径访问该 test
文件:/home/test
系统会在系统内存中的文件路径缓存 dentry
树中,根据给出的路径,正向解析,解析过程如下:
- 从根目录开始:
- 从根目录
/
的dentry
开始,根目录的dentry
通常是内核中固定的。 - 通过根目录的
dentry
获取根目录的inode
。
- 从根目录
- 查找
home
目录:- 在根目录的
inode
中查找文件名home
的目录项。 - 如果找到
home
的目录项,获取home
的inode
号。 - 系统为文件
home
创建一个struct dentry
结构,并链接到文件缓存多叉树中。
- 在根目录的
- 查找
test
文件:- 在
home
目录的inode
中查找文件名test
的目录项。 - 如果找到
test
的目录项,获取test
的inode
号。 - 系统为文件
test
创建一个struct dentry
结构,并链接到文件缓存多叉树中。
- 在
这个过程少不了访问磁盘,因此路径解析一次通常会将文件路径缓存到文件缓存多叉树上,便于下次路径查询利用。
进程层面
这块内容记住就好:
通过查询源码,进程 task_struct
、文件 struct file
和 文件dentry
之间的关系如下
进程 struct task_struct
中存在文件描述符表 struct files_struct *file
,该表中存储着文件描述符和文件 struct file
的映射关系,而每个加载到内存中的文件都会有对于的 struct file
结构,这个结构体中包含着很多和文件在内存中操作相关的字段属性,如
const struct file_operations *f_op
操作函数表、struct address_space
内核文件缓冲区、struct path *f_path
文件路径相关属性,指向一个path结构体struct path
该path结构体中包含着dentry
结构dentry
结构:包含着不少的字段:-
struct dentry *d_parent
:指向父节点 -
struct list_head d_child
:指向子节点 -
struct inode *d_inode
:指向文件属性结构inode
-
图示如下:下面有多张图片,选自己能看懂的即可
题外话:其中,进程 task_struct
中 struct fs_struct *fs
指向的 struct fs_struct
结构中,存储着 pwd
,这就是为什么每个进程都有自己的 pwd
!
这个 pwd
是一种 struct path
路径结构,内部也存储着一个 dentry
,当我们获取当前的 pwd
时,就是通过查询 pwd
的 dentry
的所处路径!
再次梳理:
目录项结构就是 struct dentry
,存储在上级目录文件的 inode
结构指向的数据块中
本目录文件目录项结构 struct dentry
中存储着本目录文件的 inode
结构指针,通过该指针找到自己的 inode
结构,进一步访问自己数据块的内容,内容中存储着自己这个目录文件存储的所有下级文件的目录项:下级文件名和其 inode
号的映射关系
路径解析核心是依次读取目录文件的 dentry
,并通过读取该 dentry
的 inode
查找下一级目录或文件的目录项,并获取下级目录或文件的 inode
号。同时每次读取过的目录文件的 dentry
就会加载到内存中,并链接到文件缓存多叉树中,包括最终需要打开的文件,也是先要将该文件的 dentry
结构加载到内存中,然后才是通过dentry
结构访问 inode
完整流程
这是一次从路径解析到文件打开,再到文件读取的完整流程,目的是为了从具体的例子中梳理之前的学习内容,包括:文件打开需要的`struct file` 、路径解析、`inode` 结构等等综合知识点!
1. 路径解析
假设我们要访问路径 /home/test
并打开 test
文件,路径解析过程如下:
(1) 从根目录开始
- 从根目录
/
的dentry
开始,根目录的dentry
通常是内核中固定的。 - 通过根目录的
dentry
获取根目录的inode
。
(2) 查找 home
目录:
- 在根目录的
inode
中查找文件名home
的目录项。 - 如果找到
home
的目录项,获取home
的inode
号。 - 为文件
home
创建一个struct dentry
结构,并链接到文件缓存多叉树中。
(3) 查找 test
文件:
- 在
whb
目录的inode
中查找文件名test
的目录项。 - 如果找到
test
的目录项,获取test
的inode
号。 - 为文件
test
创建一个struct dentry
结构,并链接到文件缓存多叉树中。
2. 文件打开
当文件 test
被打开时,内核会执行以下步骤:
(1) 获取 inode
结构:
- 通过
test
文件的inode
号,从磁盘中读取inode
结构并加载到内存中。 inode
结构包含文件的元数据,如权限、所有者、大小、数据块指针等。
(2) 创建 struct file
结构:
- 内核为
test
文件创建一个struct file
结构。 struct file
结构包含文件描述符、文件操作指针、文件偏移量等信息。struct file
结构中的inode
指针指向test
文件的inode
结构。struct file
结构中的dentry
指针指向test
文件的dentry
结构。
到这一步,可以知道,其实文件的 struct dentry
结构,是在 struct file
结构之前创建的,当 struct file
结构创建后,内部的属性 dentry
指针才会指向本文件早已创建好的 dentry
结构!
(3) 返回文件描述符:
- 内核为
test
文件分配一个文件描述符,并将其返回给用户空间。 - 用户空间通过文件描述符来操作文件。
3. 文件读取
当用户调用 read
系统调用读取文件内容时,内核会执行以下步骤:
(1) 查找数据块:
- 通过
test
文件的inode
结构中的数据块指针,找到文件内容所在的数据块。 - 数据块指针可能包括直接块指针、一级间接块指针、二级间接块指针等。
(2) 加载数据块到内存:
- 将数据块从磁盘读取到内存中,存放在内核的文件缓冲区中。
(3) 拷贝数据到用户缓冲区:
- 内核将文件缓冲区中的数据拷贝到用户提供的缓冲区中。
- 用户可以通过
read
系统调用获取文件内容。
分区挂载
分区挂载
相关文章:
【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)
inode 和 block 的映射 该博文中有详细解释:【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题: 问题一: 我们访问文件,都是用的文件名,没用过 inode 号啊? 之前总是说可以通过一个…...
为AI聊天工具添加一个知识系统 之46 蒙板程序设计(第一版):Facet六边形【意识形态:操纵】
本文要点 要点 (原先标题冒号后只有 “Facet”后改为“Face六边形【意识形态】” ,是 事后想到的,本文并未明确提出。备忘在这里作为后续的“后期制作”的备忘) 前面讨论的(“之41 纯粹的思维”)中 说到,“意识”三…...
Vue.js组件开发-如何处理跨域请求
在Vue.js组件开发中,处理跨域请求(CORS,即跨来源资源共享)通常不是直接在Vue组件中解决的,而是需要后端服务器进行相应的配置,以允许来自不同源的请求。不过,前端开发者也需要了解一些基本的COR…...
unity学习19:unity里用C#脚本获取 gameobject 和 Componenet
目录 1 gameObject 和component 2 gameObject 与C#脚本 2.1 使用 this.gameObject 或gameObject(注意大小写) 2.2 获得其他信息 3 获取其他 GameObject的方法 3.1 获得自身挂载的GameObject 3.2 用find去查找其他的GameObject的名字或tag 3.3 …...
【React】插槽渲染机制
目录 通过 children 属性结合条件渲染通过 children 和 slot 属性实现具名插槽通过 props 实现具名插槽 在 React 中,并没有直接类似于 Vue 中的“插槽”机制(slot)。但是,React 可以通过 props和 children 来实现类似插槽的功能…...
【数据分享】1929-2024年全球站点的逐月平均气温数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…...
立创开发板入门第六课 音频-扬声器和麦克风 I2S驱动
音频芯片介绍 开发板上带有一个麦克风,一个扬声器,音频编解码芯片使用ES8311。麦克风直接连接到了ES8311芯片上,ES8311和扬声器之间,还有一个音频驱动放大器。ES8311通过I2S接口与ESP32-C3连接。 ES8311这个芯片不仅使用I2S接口…...
使用 Java 实现基于 DFA 算法的敏感词检测
使用 Java 实现基于 DFA 算法的敏感词检测 1. 引言 敏感词检测在内容审核、信息过滤等领域有着广泛的应用。本文将介绍如何使用 DFA(Deterministic Finite Automaton,确定有限状态自动机) 算法,在 Java 中实现高效的敏感词检测。…...
springboot集成websocket实现实时大量数据,效率性能高
前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习&…...
如何在 Google Cloud Shell 中使用 Visual Studio Code (VS Code)?
Google Cloud Shell 是一个基于浏览器的命令行界面,它提供了一个临时的虚拟机环境,允许开发者在没有本地环境配置的情况下使用 Google Cloud 的各种服务。它还提供了一个免费的 5GB 存储空间以及可以在其中执行所有 Google Cloud 操作的命令行界面。 Vis…...
ChatGPT大模型极简应用开发-目录
引言 要理解 ChatGPT,了解其背后的 Transformer 架构和 GPT 技术一路的演进则变得非常必要。 ChatGPT 背后的 LLM 技术使普通人能够通过自然语言完成过去只能由程序员通过编程语言实现的任务,这是一场巨大的变革。然而,人类通常容易高估技术…...
ZooKeeper 核心知识全解析:架构、角色、节点与应用
1.ZooKeeper 分布式锁怎么实现的 ZooKeeper 是一个高效的分布式协调服务,它提供了简单的原语集来构建更复杂的同步原语和协调数据结构。利用 ZooKeeper 实现分布式锁主要依赖于它的顺序节点(Sequential Node)特性以及临时节点(Ep…...
redis实现限流
令牌桶逻辑 计算逻辑: 代码: import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool;/*** ClassName RedisRateLimiterTokenBucket* Description TODO* Author zhang zhengdong* DATE 2025/1/17 20:22* Version 1.0*/ public class…...
云服务器扫描出漏洞怎么办?
随着云计算技术的发展,越来越多的企业和个人选择使用云服务器来托管其应用和服务。然而,安全问题也随之而来。当云服务器的安全扫描显示存在漏洞时,如何正确应对成为了关键。本文将详细介绍发现漏洞后的处理步骤,并提供一些实用的…...
【影刀RPA_启动任务api】
影刀RPA_启动任务api #启动任务api import requests import json from time import sleepyingdao_Info{"accessKeyId":"XXX","accessKeySecret":"XXX","scheduleUuid":XXX,"robotUuid1":"XXX","r…...
Swift语言的多线程编程
Swift语言的多线程编程 在现代软件开发中,多线程编程是提高应用性能和响应速度的重要手段。尤其是在 iOS 和 macOS 开发中,由于用户界面(UI)的交互性和复杂性,合理利用多线程可以极大地提升用户体验。本文将深入探讨 Swift 语言中的多线程编…...
js-判断一个object(对象)是否为空
1.Object.keys() 方法 const obj {};if (Object.keys(obj).length 0) {console.log(Object is empty); } else {console.log(Object is not empty); }Object.keys() 方法返回一个包含对象自身可枚举属性名称的数组。如果这个数组为空,那么对象就是空的。 2.JSO…...
AI在SEO中的关键词优化策略探讨
内容概要 在当今数字化时代,人工智能(AI)正逐渐重塑搜索引擎优化(SEO)行业。AI技术的快速发展使得SEO策略发生了翻天覆地的变化,特别是在关键词优化方面。关键词优化的基本概念是通过选择与用户搜索意图密…...
无缝过渡:将 Ansys 子结构模型转换为 Nastran
了解如何将 Ansys 子结构模型无缝转换为 Nastran,以满足有效载荷动态模型要求 Ansys 子结构模型的优势 Ansys 子结构模型为从事大型装配体结构分析和仿真的工程师和分析师提供了多项优势。 这些模型通过将复杂结构划分为更小、更易于管理的子结构,可以…...
单片机存储器和C程序编译过程
1、 单片机存储器 只读存储器不是并列关系,是从ROM发展到FLASH的过程 RAM ROM 随机存储器 只读存储器 CPU直接存储和访问 只读可访问不可写 临时存数据,存的是CPU正在使用的数据 永久存数据,存的是操作系统启动程序或指令 断电易失 …...
Unity3D实现WEBGL打开Window文件对话框打开/上传文件
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉一、unity设置👉1-1、创建Plugins文件夹👉1-2、搭建UI👉二、使用步骤👉2-1、打包webgl👉三、第二种插件实现打开文件对话框👉壁纸分享👉总结👉前言 Unity3D发布的WEBGL程序是不支持…...
探索 Transformer²:大语言模型自适应的新突破
目录 一、来源: 论文链接:https://arxiv.org/pdf/2501.06252 代码链接:SakanaAI/self-adaptive-llms 论文发布时间:2025年1月14日 二、论文概述: 图1 Transformer 概述 图2 训练及推理方法概述 图3 基于提示的…...
SDL2:arm64下编译使用 -- SDL2多媒体库使用音频实例
SDL2:Android-arm64端编译使用 2. SDL2:Android-arm64端编译使用2.1 安装和配置NDK2.2 下载编译SDL22.3 SDL2使用示例:Audio2.4 Android设备运行 2. SDL2:Android-arm64端编译使用 在Linux系统上使用Android NDK编译和使用arm64下…...
Ubuntu、Windows系统网络设置(ping通内外网)
一、 虚拟机VMware和Ubuntu系统的网络配置说明 1、虚拟机的网络适配器的模式有三种: 桥接模式NAT模式主机模式 2、虚拟机VMware的网卡配置(如何进行配置界面(虚拟机->设置)) 注意: 1、以上桥接模式(ubuntu有独立IP)、NAT模式(没有独立IP)都可以联…...
安全类脚本:拒绝ssh暴力破解
要求如下: 一个小时内,连续密码错误4次。 Linux lastb 命令用于列出登入系统失败的用户相关信息。 实验过程如下: 1. 创建两个IP地址不同的干净环境,分别是:192.168.46.101 Rocky 2 和 192.168.46.120 openEuler 2. 2.…...
uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机-下
现在说明几个重要的点, OSStartHighRdy 的作用就是把任务栈复制到系统栈上面,再利用RET的时候会从系统栈上到一个地址放到PC寄存器上来实现任务运行。OSCtxSw是任务切换,把系统栈全部备份到当前任务栈映射上,然后改OSTCBCur,调用…...
关于jwt和security
JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西-腾讯云开发者社区-腾讯云 SpringBoot整合Security安全框架、控制权限让我们一起来看看Security吧!我想每个写项目的人,都…...
OpenAI Whisper:语音识别技术的革新者—深入架构与参数
当下语音识别技术正以前所未有的速度发展,极大地推动了人机交互的便利性和效率。OpenAI的Whisper系统无疑是这一领域的佼佼者,它凭借其卓越的性能、广泛的适用性和创新的技术架构,正在重新定义语音转文本技术的规则。今天我们一起了解一下Whi…...
Python 3.9及以上版本支持的新的字符串函数 str.removeprefix()
在 Python 3.9 中,新增了 str.removeprefix() 方法,用于从字符串的开头移除指定的前缀(如果存在)。如果字符串不以指定前缀开头,原字符串保持不变。 用法: str.removeprefix(prefix)prefix: 要移除的前缀…...
Python爬虫入门
豆瓣榜单250爬取: 直接上代码: import requests import redef top250_crawer(url, sum):headers {User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36}try:response re…...
hive连接mysql报错:Unknown version specified for initialization: 3.1.0
分享下一些报错的可能原因吧 1.要开启hadoop 命令:start-all.sh 2.检查 hive-site.xml 和 hive-env.sh。 hive-site.xml中应设置自己mysql的用户名和密码 我的hive-site.xml如下: <configuration><property><name>javax.jdo.opt…...
wandb使用遇到的一些问题
整合了一下使用wandb遇到的问题 1.请问下如果电脑挂了代理,应该怎么办呢?提示:Network error (ProxyError), entering retry loop. 在本地(而非服务器)运行代码时,常常因为开启代理而无法使用wandb&#…...
18. C语言 结构体内存布局分析与优化
本章目录: 结构体的内存布局1. 对齐规则2. 填充与对齐 示例分析代码示例输出结果分析1. debug_size1_t 结构体2. debug_size2_t 结构体 如何优化结构体内存布局1. 成员排序优化2. 使用 #pragma pack 指令注意事项 总结 在C语言中,结构体(structÿ…...
MyBatisPlus学习笔记
To be continue… 文章目录 介绍快速入门入门案例常用注解常用配置 核心功能条件构造器自定义SQLService接口 介绍 MyBatisPlus只做增强不做改变,引入它不会对现有工程产生影响。只需简单配置,即可快速进行单表CRUD操作,从而节省大量时间。…...
Jetpack工具箱:不只是插件,它是开发灵魂
引言 想象一下,一个 Android 开发者面对堆积如山的需求文档、无穷无尽的 BUG 修复时,突然发现了一款神器——Jetpack!这是一套专为 Android 开发者设计的库和工具集,它就像你的“编程助手”,从架构优化到 UI 管理&…...
2024年博客之星年度评选—创作影响力评审入围名单公布
2024年博客之星活动地址https://www.csdn.net/blogstar2024 TOP 300 榜单排名 用户昵称博客主页 身份 认证 评分 原创 博文 评分 平均 质量分评分 互动数据评分 总分排名三掌柜666三掌柜666-CSDN博客1001002001005001wkd_007wkd_007-CSDN博客1001002001005002栗筝ihttps:/…...
LoadBalancer负载均衡服务调用
LoadBalancer LoadBalancer(负载均衡器)是Spring Cloud中的一个关键组件,用于在微服务架构中实现服务请求的负载均衡。它的主要作用是将客户端的请求分发到多个服务实例上,以提高系统的可用性、性能和容错能力。通过LoadBalancer&…...
《CPython Internals》阅读笔记:p221-p231
《CPython Internals》学习第 12天,p221-p231 总结,总计 11 页。 一、技术总结 无。 二、英语总结(生词:2) 1.at a time idiom. separately(单独地) in the specified groups(一次)。示例: (1) I can only do one thing at …...
【机器学习实战入门】基于深度学习的乳腺癌分类
什么是深度学习? 作为对机器学习的一种深入方法,深度学习受到了人类大脑和其生物神经网络的启发。它包括深层神经网络、递归神经网络、卷积神经网络和深度信念网络等架构,这些架构由多层组成,数据必须通过这些层才能最终产生输出。…...
Golang Gin系列-1:Gin 框架总体概述
本文介绍了Gin框架,探索了它的关键特性,并建立了简单入门的应用程序。在这系列教程里,我们会探索Gin的主要特性,如路由、中间件、数据库集成等,最终能使用Gin框架构建健壮的web应用程序。 总体概述 Gin是Go编程语言的…...
【Python】第二弹---深入理解编程基础:从常量、变量到注释的全面解析
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、常量和表达式 2、变量和类型 2.1、变量是什么 2.2、变量的语法 2.3、变量的类型 2.4、动态类型特…...
RPA编程实践:Electron简介
文章目录 前言使用Electron构建桌面应用程序什么是Electron?为什么选择Electron?如何使用Electron实现上述想法?1. 创建基本的Electron应用2. 配置BrowserWindow3. 定制化你的应用4. 打包与分发 前言 Electron,用官网的话说&…...
svn tag
一般发布版本前,需要在svn上打个tag。步骤如下: 1、空白处右击,选择TortoiseSVN->Branch/tag; 2、填写To path,即tag的路基以及tag命名(一般用版本号来命名);填写tag信息;勾选cr…...
SpringBoot错误码国际化
先看测试效果: 1. 设置中文 2.设置英文 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//…...
AAPM:基于大型语言模型代理的资产定价模型,夏普比率提高9.6%
“AAPM: Large Language Model Agent-based Asset Pricing Models” 论文地址:https://arxiv.org/pdf/2409.17266v1 Github地址:https://github.com/chengjunyan1/AAPM 摘要 这篇文章介绍了一种利用LLM代理的资产定价模型(AAPM)…...
LabVIEW桥接传感器配置与数据采集
该LabVIEW程序主要用于配置桥接传感器并进行数据采集,涉及电压激励、桥接电阻、采样设置及错误处理。第一个VI("Auto Cleanup")用于自动清理资源,建议保留以确保系统稳定运行。 以下是对图像中各个组件的详细解释&#…...
《汽车维修技师》是什么级别的期刊?是正规期刊吗?能评职称吗?
问题解答: 问:《汽车维修技师》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《汽车维修技师》级别? 答:省级。主管单位:北方联合出版传媒(…...
python(25) : 含有大模型生成的公式的文本渲染成图片并生成word文档(支持flask接口调用)
公式样例 渲染前 \[ \sqrt{1904.615384} \approx 43.64 \] 渲染后 安装依赖 pip install matplotlib -i https://mirrors.aliyun.com/pypi/simple/ requestspip install sympy -i https://mirrors.aliyun.com/pypi/simple/ requestspip install python-docx -i https…...
深度学习项目--基于LSTM的火灾预测研究(pytorch实现)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 LSTM模型一直是一个很经典的模型,这个模型当然也很复杂,一般需要先学习RNN、GRU模型之后再学,GRU、LSTM的模型讲解将…...
云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”
2024 年 12 月 24 日,由中国信息通信研究院(以下简称“中国信通院”)主办的“2025 中国信通院深度观察报告会:算力互联网分论坛”,在北京隆重召开。本次论坛以“算力互联网 新质生产力”为主题,全面展示中国…...