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

【Linux学习笔记】ext2文件系统的深度剖析

【Linux学习笔记】ext2文件系统的深度剖析

🔥个人主页大白的编程日记

🔥专栏Linux学习笔记


文章目录

  • 【Linux学习笔记】ext2文件系统的深度剖析
    • 前言
    • 一.ext2文件系统
      • 1.1宏观认识
    • 二. Block Group
    • 三. 块组内部构成
      • 3.1 超级块(Super Block)
      • 3.2 GDT(Group Descriptor Table)
      • 3.3 块位图(Block Bitmap)
      • 3.4 inode位图(Inode Bitmap)
      • 3.5 节点表(Inode Table)
      • 3.6 Data Block
      • 3.7 inode和datablock映射(弱化)
      • 3.8 目录与文件名
      • 3.9 路径解析
      • 3.10 路径缓存
      • 3.11 挂载分区
      • 3.11.1 一个实验:
        • 3.8.2 一个结论
    • 四 软硬连接
      • 4.1 硬链接
      • 4.2 软链接
      • 4.3 软硬连接对比
      • 4.4 软硬连接的用途:
    • 五. 文件系统总结
    • 后言

前言

哈喽,各位小伙伴大家好!上期我们讲了磁盘的物理和逻辑结构 今天我们讲的是ext2文件系统的深度剖析。话不多说,我们进入正题!向大厂冲锋!
在这里插入图片描述

一.ext2文件系统

1.1宏观认识

所有的准备工作都已经做完,是时候认识下文件系统了。我们想要在硬盘上储文件,必须先把硬盘格
式化为某种格式的文件系统,才能存储文件。文件系统的目的就是组织和管理硬盘中的文件。在
Linux系统中,最常见的是ext2系列的文件系统。其早期版本为ext2,后来又发展出ext3和ext4。
ext3ext4虽然对ext2进行了增强,但是其核心设计并没有发生变化,我们仍是以较老的ext2作为 演示对象。

ext2文件系统将整个分区划分成若干个同样大小的块组(BlockGroup),如下图所示。只要能管理一个分区就能管理所有分区,也就能管理所有磁盘文件。
在这里插入图片描述

二. Block Group

上图中启动块(Boot Block/Sector)的大小是确定的,为1KB,由PC标准规定,用来存储磁盘分区信息和启动代码,任何文件系统都不能修改启动块。启动块之后才是ext2文件系统的开始。

ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子:

三. 块组内部构成

3.1 超级块(Super Block)

存放文件系统本身的结构信息,描述整个分区的文件系统信息。记录的信息主要有:blockinode的总量,未使用的blockinode的数量,一个blockinode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。

超级块在每个块组的开头都有一份拷贝(第一个块组必须有,后面的块组可以没有)。为了保证文件系统在磁盘部分扇区出现物理问题的情况下还能正常工作,就必须保证文件系统的super block信息在这种情况下也能正常访问。所以一个文件系统的super block会在多个block group中进行备份,这些super block区域的数据被保持一致。

/** Structure of the super block*/
struct ext2_super_block {__le32 s_inodes_count;    /* Inodes count */__le32 s_blocks_count;   /* Blocks count */__le32 s_r_blocks_count;  /* Reserved blocks count */__le32 s_free_blocks_count;/* Free blocks count */__le32 s_free_inodes_count;/* Free inodes count */__le32 s_first_data_block;/* First Data Block */__le32 s_log_block_size;  /* Block size */__le32 s_log_frag_size;  /* Fragment size */__le32 s_blocks_per_group;/* # Blocks per group */__le32 s_frags_per_group; /* # Fragments per group */__le32 s_inodes_per_group;/* # Inodes per group */__le32 s_mtime;          /* Mount time */__le32 s_wtime;          /* Write time */__le16 s_mnt_count;      /* Mount count */__le16 s_max_mnt_count;  /* Maximal mount count */__le16 s_magic;          /* Magic signature */__le16 s_state;          /* File system state */__le16 s_errors;         /* Behaviour when detecting errors */__le16 s_minor_rev_level;/* minor revision level */__le32 s_lastcheck;      /* time of last check */__le32 s_checkinterval;  /* max. time between checks */__le32 s_creator_os;     /* OS */__le32 s_rev_level;      /* Revision level */__le16 s_def_resuid;     /* Default uid for reserved blocks */__le16 s_def_resgid;     /* Default gid for reserved blocks *//** These fields are for EXT2_DYNAMIC_REV superblocks only.** Note: the difference between compatible feature set and* incompatible feature set is that if there is a bit set* in the incompatible feature set that the kernel doesn't* know about, it should refuse to mount the filesystem.** e2fsck's requirements are more strict; if it doesn't know* about a feature in either the compatible or incompatible* feature set, it must abort and not try to meddle with* things it doesn't understand...*/__le32 s_first_ino;       /* First non-reserved inode */__le16 s_inode_size;      /* size of inode structure */__le16 s_block_group_nr;  /* block group number */char s_volume_name[16];   /* volume name */char s_last_mounted[64];  /* directory where last mounted */__le32 s_algorithm_usage_bitmap;/* For compression *//* Performance hints.  Directory preallocation should only* happen if the EXT2_COMPAT_PREALLOC flag is on. */__u8 s_prealloc_blocks;   /* Nr of blocks to try to preallocate*/__u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */__u16 s_padding1;/* Journaling support valid if EXT4_FEATURE_COMPAT_HAS_JOURNAL set. */__u8 s_journal_uuid[16];  /* uuid of journal superblock */__u32 s_journal_inum;     /* inode number of journal file */__u32 s_journal_dev;      /* device number of journal file */__u32 s_last_orphan;      /* start of list of inodes to delete */__u32 s_hash_seed[4];     /* HTREE hash seed */__u8 s_def_hash_version;  /* Default hash version to use */__u8 s_reserved_char_pad;__u16 s_reserved_word_pad;__le32 s_default_mount_opts;/* Default mount options */__le32 s_first_meta_bg;/* First metablock block group */__le32 s_reserved[190];   /* Padding to the end of the block */
};

3.2 GDT(Group Descriptor Table)

块组描述符表,描述块组属性信息,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符存储一个块组的描述信息,如在这个块组中从哪里开始是inode Table,从哪里开始是Data Blocks,空间的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有一份拷贝。

// 磁盘级blockgroup的数据结构
struct ext2_group_desc
{__le32 bg_block_bitmap;  /* Blocks bitmap block */__le32 bg_inode_bitmap;  /* Inodes bitmap block */__le16 bg_inode_table;   /* Inodes table block */__le16 bg_free_blocks_count;/* Free blocks count */__le16 bg_free_inodes_count;/* Free inodes count */__le16 bg_used_dirs_count;/* Directories count */__le16 bg_pad;__le16 bg_reserved[3];
};

3.3 块位图(Block Bitmap)

  • Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

3.4 inode位图(Inode Bitmap)

  • 每个bit表示一个inode是否空闲可用。

3.5 节点表(Inode Table)

  • 存放文件属性如文件大小,所有者,最近修改时间等
  • 当前分组所有inode属性的集合
  • inode编号以分区为单位,整体划分,不可跨分区

3.6 Data Block

数据区:存放文件内容,也就是一个一个的Block。根据不同的文件类型有以下几种情况:

  • 对于普通文件,文件的数据存储在数据块中。
  • 对于目录,该目录下的所有文件名和目录名存储在所在的数据块中,除了文件名外,ls -l命令看到的其它信息是保存在该文件的inode中。
  • Block 号按照分区划分,不可跨分区
    在这里插入图片描述

3.7 inode和datablock映射(弱化)

  • inode内部存在 __le32 i_block[EXT2_N_BLOCKS]; /* Pointers to blocks */,EXT2_N_BLOCKS =15,就是用来进行inode和block映射的。
  • 这样文件=内容+属性,就都能找到了。

🔥 思考:

请解释:知道inode号的情况下,在指定分区,请解释:对文件进行增、删、查、改是在做什么?

💡 结论:

  • 分区之后的格式化操作,就是对分区进行分组,在每个分组中写入SB、GDT、Block Bitmap、Inode
    Bitmap等管理信息,这些管理信息统称:文件系统
  • 只要知道文件的inode号,就能在指定分区中确定是哪个分组,进而在哪个分组确定是哪个inode 拿到inode文件属性和内容就全部都有了

下面,通过touch一个新文件来看看如何工作。

[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc

为了说明问题,我们将上图简化:

创建一个新文件主要有以下4个操作:

  1. 存储属性
    内核先找到一个空闲的节点(这里是263466)。内核把文件信息记录到其中。

  2. 存储数据
    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。

  3. 记录分配情况
    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。

  4. 添加文件名到目录

新的文件名abc。Linux如何在当前的目录中记录这个文件?内核将入口(263466,
abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

3.8 目录与文件名

问题:

  • 我们访问文件,都是用的文件名,没用过inode号啊?
  • 目录是文件吗?如何理解?

答案:

  • 目录也是文件,但是磁盘上没有目录的概念,只有文件属性+文件内容的概念。
  • 目录的属性不用多说,内容保存的是:文件名和inode号的映射关系
// 验证说明代码,课堂不写了,直接复制粘贴即可
// readir.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>int main(int argc, char *argv[]) {if (argc != 2) {fprintf(stderr, "Usage: %s <directory>\n", argv[0]);exit(EXIT_FAILURE);}DIR *dir = opendir(argv[1]);  // 系统调用,自行查阅if (!dir) {perror("opendir");exit(EXIT_FAILURE);}struct dirent *entry;while ((entry = readdir(dir)) != NULL) {  // 系统调用,自行查阅// Skip the "." and ".." directory entriesif (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {continue;}printf("Filename: %s, Inode: %lu\n", entry->d_name, (unsigned long)entry->d_ino);}closedir(dir);return 0;
}

3.9 路径解析

问题:打开当前工作目录文件,查看当前工作目录文件的内容?当前工作目录不也是文件吗?我们访问当前工作目录不也是只知道当前工作目录的文件名吗?要访问它,不也得知道当前工作目录的inode吗?

  • 答案1:所以也要打开:当前工作目录的上级目录,额……,上级目录不也是目录吗??不还是上面的问题吗?
  • 答案2:所以类似“递归”,需要把路径中所有的目录全部解析,出口是“/”根目录。
  • 最终答案3:而实际上,任何文件,都有路径,访问目标文件,比如: /home/whb/code/test/test.c
    都要从根目录开始,依次打开每一个目录,根据目录名,依次访问每个目录下指定的目录,直到访问到test.c。这个过程叫做Linux路径解析。

💡 注意: 所以,我们知道了:访问文件必须要有目录+文件名=路径的原因
根目录固定文件名,inode号,无需查找,系统开机之后就必须知道

可是路径是谁提供?

  • 你访问文件,都是指令/工具访问,本质是进程访问,进程有CWD!进程提供路径。
  • 你open文件,提供了路径

可是最开始的路径从哪里来?

  • 所以Linux为什么要有根目录,根目录下为什么要有那么多缺省目录?
  • 你为什么要在家目录,你自己可以新建目录?
  • 上面所有行为:本质就是在磁盘文件系统中,新建目录文件。而你新建的任何文件,都在你或者系统指定的目录下新建,这不就是天然就有路径了嘛!
  • 系统+用户共同构建Linux路径结构。

3.10 路径缓存

问题1:Linux磁盘中,存在真正的目录吗?
答案:不存在,只有文件。只保存文件属性+文件内容

问题2:访问任何文件,都要从/目录开始进行路径解析
答案:原则上是,但是这样太慢,所以Linux会缓存历史路径结构

问题3:Linux目录的概念,怎么产生的?
答案:打开的文件是目录的话,由OS自己在内存中进行路径维护

  • Linux中,在内核中维护树状路径结构的内核结构体叫做:struct dentry
struct dentry {atomic_t d_count;unsigned int d_flags;    /* protected by d_lock */spinlock_t d_lock;        /* per dentry lock */struct inode *d_inode;    /* Where the name belongs to - NULL is negative *//* The next three fields are touched by __d_lookup. Place here so they all fit in a cache line. */struct hlist_node d_hash; /* lookup hash list */struct dentry *d_parent;  /* parent directory */struct qstr d_name;struct list_head d_lru;   /* LRU list *//* d_child and d_rcu can share memory */union {struct list_head d_child; /* child of parent list */struct rcu_head d_rcu;} d_u;struct list_head d_subdirs; /* our children */unsigned long d_time;       /* used by d_revalidate */struct dentry_operations *d_op;struct super_block *d_sb;   /* The root of the dentry tree */void *d_fsdata;             /* fs-specific data */
#ifdef CONFIG_PROFILINGstruct cookie_struct *d_cookie; /* cookie, if any */
#endifint d_mounted;unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */
};

💡 注意:

  • 每个文件其实都要有对应的dentry结构,包括普通文件。这样所有被打开的文件,就可以在内存中形成整个树形结构
  • 整个树形节点也同时会隶属于LRU(Least Recently Used, 最近最少使用)结构中,进行节点淘汰
    整个树形节点也同时会隶属于Hash,方便快速查找
  • 更重要的是,这个树形结构,整体构成了Linux的路径缓存结构,打开访问任何文件,都在先在这棵树下根据路径进行查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry结构,缓存新路径

3.11 挂载分区

我们已经能够根据inode号在指定分区找文件了,也已经能根据目录文件内容,找指定的inode了,在指定的分区内,我们可以为所欲为了。可是:

  • inode不是不能跨分区吗?Linux不可以有多个分区吗?我怎么知道我找的文件在哪一个分区?

3.11.1 一个实验:

$ dd if=/dev/zero of=./disk.img bs=1M count=5
$ mkfs.ext4 disk.img  # 将无序化写入文件系统
$ mkdir /mnt/mydisk
$ df -h
$ Filesystem      Size  Used Avail Use% Mounted on
$ udev            95M     0  95M   0% /dev
$ tmpfs           198M   72K  197M   1% /run
$ /dev/vda1        5G   2G  2G  42% /
$ tmpfs           96M     0  96M   0% /dev/shm
$ tmpfs           5.0M  4.0K  5.0M   1% /run/lock
$ tmpfs           96M     0  96M   0% /sys/fs/cgroup
$ tmpfs           198M   0  198M   0% /run/user/0
$ sudo mount -t ext4 ./disk.img /mnt/mydisk/  # 将分区挂载到指定的目录
$ df -h
$ Filesystem      Size  Used Avail Use% Mounted on
$ udev            95M     0  95M   0% /dev
$ tmpfs           198M   72K  197M   1% /run
$ /dev/vda1        5G   2G  2G  42% /
$ tmpfs           96M     0  96M   0% /dev/shm
$ tmpfs           5.0M  4.0K  5.0M   1% /run/lock
$ tmpfs           96M     0  96M   0% /sys/fs/cgroup
$ tmpfs           198M   0  198M   0% /run/user/0
$ /dev/loop0       4.9M  2.4K  4.5M   1% /mnt/mydisk
$ sudo umount /mnt/mydisk  # 卸载分区
3.8.2 一个结论
  • 分区写入文件系统,无法直接使用,需要和指定的目录关联,进行挂载才能使用。
  • 所以,可以根据访问目标文件的“路径前缀”准确判断我在哪一个分区。

四 软硬连接

4.1 硬链接

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。其实在Linux中可以让多个文件名对应于同一个inode。

[root@localhost linux]# touch abc
[root@localhost linux]# ln abc def
[root@localhost linux]# ls -li abc def
263466 abc
263466 def
  • abc和def的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数,inode 263466的硬链接数为2。
  • 我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。

4.2 软链接

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,但实际上,新的文件和被引用的文件的inode不同,应用常见上可以想象成一个快捷方式。在shell中的做法

[root@localhost linux]# ln -s abc.s abc
[root@localhost linux]# ls -li
263563 -rw-r--r-- 2 root root 0 915 17:45 abc
263488 -rw-r--r-- 2 root root 3 915 17:53 abc.s -> abc
263563 -rw-r--r-- 2 root root 0 915 17:45 def
261678 abc.s

acm
下面解释一下文件的三个时间:

  1. Access 最后访问时间
  2. Modify 文件内容最后修改时间
  3. Change 属性最后修改时间

4.3 软硬连接对比

  • 软连接是独立文件
  • 硬链接只是文件名和目标文件inode的映射关系

4.4 软硬连接的用途:

硬链接

  • . 和 … 就是硬链接
  • 文件备份

软连接

  • 类似快捷方式


五. 文件系统总结

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以的文件是fs_struct结构体找到pwd和根目录进行然后
他会通过path结构体里面vfmount挂载分区和dentry树的进行路径路径解析的进而找到文件的内容和属性!

后言

这就是ext2文件系统的深度剖析。大家自己好好消化!今天就分享到这! 感谢各位的耐心垂阅!咱们下期见!拜拜~

相关文章:

【Linux学习笔记】ext2文件系统的深度剖析

【Linux学习笔记】ext2文件系统的深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】ext2文件系统的深度剖析前言一.ext2文件系统1.1宏观认识 二. Block Group三. 块组内部构成3.1 超级块&am…...

Vue 3 官方 Hooks 的用法与实现原理

Vue 3 引入了 Composition API&#xff0c;使得生命周期钩子&#xff08;hooks&#xff09;在函数式风格中更清晰地表达。本篇文章将从官方 hooks 的使用、实现原理以及自定义 hooks 的结构化思路出发&#xff0c;全面理解 Vue 3 的 hooks 系统。 &#x1f4d8; 1. Vue 3 官方生…...

通过现代数学语言重构《道德经》核心概念体系,形成一个兼具形式化与启发性的理论框架

以下是对《道德经》的数学转述尝试&#xff0c;通过现代数学语言重构其核心概念&#xff0c;形成一个兼具形式化与启发性的理论框架&#xff1a; 0. 基础公理体系 定义&#xff1a; 《道德经》是一个动态宇宙模型 U(D,V,Φ)&#xff0c;其中&#xff1a; D 为“道”的无限维…...

openai-whisper-asr-webservice接入dify

openai-whisper-asr-webservice提供的asr的api其实并不兼容openai的api&#xff0c;所以在dify中是不能直接添加到语音转文字的模型中&#xff0c;对比了下两个api的传参情况&#xff0c;其实只要改动一处&#xff0c;就能支持&#xff1a; openai兼容的asr调用中formdata中音频…...

曾经在知乎上看到一个回答:“入职做FPGA,后续是否还可以转数字IC设计?”

曾经在知乎上看到一个回答&#xff1a;“入职做FPGA&#xff0c;后续是否还可以转数字IC设计&#xff1f;” 对比FPGA的行业薪资水平&#xff0c;数字IC行业中的一些基础性岗位薪资比FPGA要高一些。 除了薪资之外&#xff0c;更多FPGA开发者考虑转向数字IC设计的原因如下&…...

第4周_作业题_逐步构建你的深度神经网络

文章目录 ***逐步构建你的深度神经网络***0. 背景0.1 要解决的问题0.2 作业大纲0.3 构建深层神经网络步骤 1. 导入包2. 初始化参数2.1 2层神经网络2.2 L层神经网络 3. 前项传播函数3.1 前项传播步骤3.2 线性前向3.3 线性激活部分3.4 L层前项传播模型3.5 计算成本 4. 反向传播模…...

Linux 搭建FTP服务器(vsftpd)

搭建FTP服务器(vsftpd)&#xff1a; 文章目录 搭建FTP服务器(vsftpd)&#xff1a;配置镜像安装vsftpd配置vsftpd关闭SELinux&#xff1a;配置防火墙启动vsfptd服务并设置开机自启创建FTP用户测试windows中测试Linux测试下载get/mget上传put/mput删除文件delete 搭建SCP服务器(基…...

AWS中国区中API Gateway中403的AccessDeniedException问题

问题 在互联网使用API Gateway的域名访问接口&#xff0c;出现403问题AccessDeniedException。具体如下&#xff1a; 前提 这里API Gateway相关配置都没有问题。而且&#xff0c;vpc内网都能访问被代理的服务。这里api gateway不需要使用自定义域名。 解决 向客服发个工单…...

计量单片机 RN8302:特性、使用与应用

在现代电力监测与能源管理领域&#xff0c;精确的电能计量至关重要。计量单片机 RN8302 作为一款高性能的电能计量芯片&#xff0c;凭借其卓越的特性与功能&#xff0c;在众多应用场景中发挥着关键作用。本文将全面深入地介绍 RN8302 的各项特性、使用方法、注意事项以及广泛的…...

Flutter生物识别认证之Flutter指纹认证Flutter人脸认证

Flutter介绍&#xff1a; Flutter是谷歌开发的开源UI软件开发工具包&#xff0c;用于高效构建跨平台的应用程序&#xff0c;支持iOS、Android、Web、Windows、macOS和Linux。它使用Dart语言编写&#xff0c;提供了丰富的组件和工具&#xff0c;使开发者能够创建高质量、高性能…...

了解Android studio 初学者零基础推荐(2)

在kotlin中编写条件语句 if条件语句 fun main() {val trafficLight "gray"if (trafficLight "red") {println("Stop!")} else if (trafficLight "green") {println("go!")} else if (trafficLight "yellow")…...

【Java Web】1.Maven

&#x1f4d8;博客主页&#xff1a;程序员葵安 &#x1faf6;感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 文章目录 一、初始Maven 1.1 什么是Maven 1.2 Maven的作用 二、Maven概述 2.1 Maven模型 2.2 Maven仓库 2.3 创建Maven项目 2.4 POM配置…...

【Spark集成HBase】Spark读写HBase表

Spark读写HBase表 摘要一、实验环境准备1. 技术版本2. Maven 依赖配置 二、实验步骤1. 数据准备2. HBase 表结构设计3. 代码实现3.1 数据写入 HBase&#xff08;writeDataToHBase 方法&#xff09;3.2 数据读取与分析&#xff08;readHBaseData 方法3.3 Spark SQL 分析3.4 完整…...

【Linux】借助gcc源码修改,搜索头文件当前进展

从上图可以看出对于每次的搜索&#xff0c;都是从第一个目录开始搜索&#xff0c;图里也可以看到修改源代码所在的目录&#xff0c;函数&#xff0c;行&#xff0c;昨天的博客感觉对于找到的位置还是不太好。 在使用修改源代码编译的GCC&#xff0c;进行编译内核源代码时&#…...

jmeter登录接口生成一批token并写入csv文件

背景&#xff1a;大部分项目真实的业务接口都是需要token鉴权的&#xff0c;想对一批核心业务接口进行并发压测&#xff0c;必然要先生成一批token给这些接口并发循环调用。 基本的思路是这样的&#xff1a;一批手机号csv文件 -》登录接口循环读取csv文件并生成token -》每次…...

利用 Redis 设计高效分布式锁机制:保障操作原子性

利用 Redis 设计高效分布式锁机制:保障操作原子性 引言 在分布式系统中,多个节点可能会同时操作共享资源,导致数据不一致或竞争条件问题。因此,构建一个高效的 分布式锁机制 是保障数据完整性的重要策略。 Redis 作为一个高性能的内存数据库,因其 单线程特性 和 丰富的数…...

Redis 的速度为什么这么快

这里的速度快&#xff0c;Redis 的速度快是与 MySQL 等数据库相比较的&#xff0c;与直接操作内存数据相比&#xff0c;Redis 还是略有逊色。 Redis 是一个单线程模型&#xff0c;为什么比其他的多线程程序还要快&#xff0c;原因有以几点&#xff1a; 1、访问的对象不同 Re…...

Spring Cloud Gateway高并发限流——基于Redis实现方案解析

本文是一个基于 Spring Cloud Gateway 的分布式限流方案&#xff0c;使用Redis Lua实现高并发场景下的精准流量控制。该方案支持动态配置、多维度限流&#xff08;API路径/IP/用户&#xff09;&#xff0c;并包含完整的代码实现和性能优化建议。 一、架构设计 #mermaid-svg-vg…...

【VScode】python初学者的有力工具

还记得23年11月&#xff0c;我还在欣喜Spyder像Rstudio一样方便。 但苦于打开软件打开太卡、太耗时&#xff08;初始化-再加载一些东西&#xff09;&#xff0c;一度耗费了我学习的热情。 就在24年5月份&#xff0c;别人推荐下发现了一个更加轻量级、方便又快速的ID&#xff0…...

融合蛋白质语言模型和图像修复模型,麻省理工与哈佛联手提出PUPS ,实现单细胞级蛋白质定位

蛋白质亚细胞定位&#xff08;subcellular localization of a protein&#xff09;是指蛋白质在细胞结构中具体的定位情况&#xff0c; 这对蛋白质行使其生物学功能至关重要。举个简单例子&#xff0c;如果把细胞想象成一个庞大的企业&#xff0c;其中细胞核、线粒体、细胞膜等…...

火山引擎火山云带宽价格

首先&#xff0c;成本结构方面&#xff0c;火山云可能用的是高质量的带宽资源&#xff0c;比如BGP多线网络&#xff0c;这种网络能保证更好的连通性和稳定性&#xff0c;但成本更高。另外&#xff0c;如果火山云的数据中心节点分布在多个地区&#xff0c;尤其是海外&#xff0c…...

可信计算是什么?可信逻辑:计算系统安全的形式化分析框架

参考书籍《人工智能安全 (陈左宁 主编&#xff1b;卢锡城 、方滨兴 副主编&#xff09;》第二章内容&#xff1b; 相关博客&#xff1a;可信执行环境(TEE)&#xff1a;保障数据安全的核心技术 文章目录 一、可信计算的逻辑学基础1.1 可信性的逻辑定义与范畴1.2 双体系架构的逻…...

大模型应用开发之Dify进阶版使用教程—react前端+django后端+dify-API制作聊天界面

Dify进阶使用教程 文章目录 Dify进阶使用教程前言一、dify-docker环境搭建及简单使用二、本篇使用API源码部署启动dify后端启动dify前端基于通义模型的智能客服机器人应用与自己项目联动实战1. 使用API进行项目与dify联动1.1 在控制台主页,点击创建访问API1.2 进入API页面,这…...

快速创建 Vue 3 项目

安装 Node.js 和 Vue CL 安装 Node.js&#xff1a;访问 https://nodejs.org/ 下载并安装 LTS 版本。 安装完后&#xff0c;在终端检查版本&#xff1a; node -v npm -v安装 Vue CLI&#xff08;全局&#xff09;&#xff1a; npm install -g vue/cli创建 Vue 3 项目 vue cr…...

【VLNs篇】05:TGS-在无地图室外环境中使用视觉语言模型进行轨迹生成和选择

栏目内容论文标题TGS: Trajectory Generation and Selection using Vision Language Models in Mapless Outdoor Environments (TGS&#xff1a;在无地图室外环境中使用视觉语言模型进行轨迹生成和选择)研究问题在具有非结构化越野特征&#xff08;如建筑物、草地、路缘&#x…...

【未来展望】云、AI与元宇宙的融合架构

未来展望:云、AI与元宇宙的融合架构 一、技术背景与发展:从独立演进到深度融合二、技术特点:异构协同与场景化适配三、技术细节:架构层解构与核心组件四、未来发展:技术趋势与产业机遇五、结语:硅基与碳基文明的共生演进一、技术背景与发展:从独立演进到深度融合 云计算…...

React+Taro 微信小程序做一个页面,背景图需贴手机屏幕最上边覆盖展示

话不多说 直接上图 第一步 import { getSystemInfoSync } from tarojs/taro;第二步 render() {const cardBanner getImageUrlByGlobal(member-merge-bg.png);const { safeArea, statusBarHeight } getSystemInfoSync();const NAV_BAR_HEIGHT 44;const navBarHeight NAV…...

Linux笔记---信号(下)

1. sigaction函数 #include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 功能&#xff1a;sigaction函数用于检查或修改与指定信号相关联的处理动作。它可以用来设置信号处理函数、信号掩码等。 参数 signum&#…...

腾讯云媒体AI解码全球视频出海智能密码

当短剧平台撞上多语种字幕困境&#xff0c;当直播电商遭遇文化审核危机&#xff0c;当经典影视困于格式壁垒——这些内容出海的难题&#xff0c;正被腾讯云媒体AI的智能引擎逐个破解。从东南亚的直播卡顿到中东的宗教符号雷区&#xff0c;从老片的低清画质到元宇宙的渲染瓶颈&a…...

Django的请求和响应+template模板

&#x1f31f; 如果这篇文章触动了你的心弦&#xff0c;请不要吝啬你的支持&#xff01; 亲爱的读者&#xff0c; 感谢你花时间阅读这篇分享。希望这里的每一个字都能为你带来启发或是让你会心一笑。如果你觉得这篇文章有价值&#xff0c;或者它解决了你一直以来的一个疑问&a…...

JAVA8怎么使用9的List.of

在 Java 8 中&#xff0c;List.of 方法并不可用&#xff0c;因为这是从 Java 9 开始引入的用于创建不可变列表的便捷方法。要在 Java 8 中达到类似的效果&#xff0c;您需要使用其他方式来创建列表。常规的方法是先创建集合对象然后再添加元素 List<String> list new A…...

无人机避障——深蓝学院浙大Ego-Planner规划部分

ESDF-free&#xff1a; 被这种类型的障碍物死死卡住的情况&#xff1a; 在一定范围内建立ESDF&#xff1a; Ego-Planner框架&#xff1a; 找到{p,v} pair&#xff1a; 【注意】&#xff1a;首先根据在障碍物内航迹上的点Q&#xff0c;以及与它相邻但不在障碍物内的两个点&#…...

Qt 最新版6.9.0使用MQTT连接腾讯云详细教程

Qt 最新版6.9.0使用MQTT连接腾讯云详细教程 一、MQTT介绍二、MQTT库编译1、源码下载2、源码编译 三、库的使用方法四、MQTT连接设备1、包含头文件 2、定义一个mqtt客户端3、实例并连接相关信号与槽4、连接服务器5、订阅topic 一、MQTT介绍 1. 概述 全称: Message Queuing Tel…...

无人机避障——深蓝学院浙大栅格地图以及ESDF地图内容

Occupancy Grid Map & Euclidean Signed Distance Field: 【注意】&#xff1a;目的是为了将有噪声的传感器收集起来&#xff0c;用于实时的建图。 Occupancy Grid Map&#xff1a; 概率栅格&#xff1a; 【注意】&#xff1a;由于传感器带有噪声&#xff0c;在实际中基于…...

Vitis 2021.1安装步骤

1.将压缩文件解压 2.打开解压后的文件夹&#xff0c;双击应用程序 3.安装版本2021.1&#xff0c;不安装2024.2&#xff0c;点击“continue”,然后点击“next” 4.选择“vitis”&#xff0c;然后点击“next” 5.点击“next” 6.选择“I Agree”&#xff0c;点击“next…...

【Harmony】【鸿蒙】List列表View如果刷新内部的自定义View

创建自定义View Component export struct TestView{State leftIcon?:Resource $r(app.media.leftIcon)State leftText?:Resource | string $r(app.string.leftText)State rightText?:Resource | string $r(app.string.rightText)State rightIcon?:Resource $r(app.med…...

我店模式系统开发打造本地生活生态商圈

在当今快节奏的商业环境中&#xff0c;商家们面临着越来越多的挑战&#xff0c;包括市场竞争加剧、消费者需求多样化以及运营效率的提高等。为了应对这些挑战&#xff0c;越来越多的商家开始寻求信息化解决方案&#xff0c;以提升运营效率和客户体验。我的店模式系统平台应运而…...

LeetCode[222]完全二叉树的节点个数

思路&#xff1a; 这个节点个数可以使用递归左儿子个数递归右儿子个数1&#xff0c;这个1是根节点&#xff0c;最后结果为节点个数&#xff0c;但我们没有练习到完全二叉树的性质. 完全二叉树的性质是&#xff1a;我简单说一下&#xff0c;大概就是其他节点都满了&#xff0c;就…...

电机试验平台:实现高效精密测试的关键工具

电机是现代工业中广泛应用的关键设备&#xff0c;其性能直接影响着生产效率和产品质量。为了确保电机的可靠运行和优化设计&#xff0c;电机试验平台成为不可或缺的工具。本文将探讨电机试验平台的概念、功能和应用&#xff0c;以及其在实现高效精密测试中的关键作用。 一、电…...

基于 ZigBee 的 LED 路灯智能控制器的设计

标题:基于 ZigBee 的 LED 路灯智能控制器的设计 内容:1.摘要 本文围绕基于 ZigBee 的 LED 路灯智能控制器展开研究。背景在于传统路灯控制方式存在能耗高、管理不便等问题&#xff0c;为实现路灯的智能化控制和节能目的&#xff0c;采用 ZigBee 无线通信技术来设计 LED 路灯智…...

LeetCode Hot100 (哈希)

1. 两数之和 比较简单&#xff0c;建立个map&#xff0c;看看有没有当前对应的相反的值就可以了 class Solution {public int[] twoSum(int[] nums, int target) {TreeMap<Integer, Integer> arrnew TreeMap<Integer, Integer>();int x10;int x20;for(int i0;i<…...

【力扣题目分享】二叉树专题(C++)

目录 1、根据二叉树创建字符串 代码实现&#xff1a; 2、二叉树的层序遍历 代码实现&#xff1a; 变形题&#xff1a; 代码实现&#xff1a; 3、二叉树的最近公共祖先 代码实现&#xff1a; 4、二叉搜索树与双向链表 代码实现&#xff1a; 5、从前序与中序遍历序列构…...

【烧脑算法】单序列双指针:从暴力枚举到高效优化的思维跃迁

目录 相向双指针 1498. 满足条件的子序列数目 1782. 统计点对的数目 581. 最短无序连续子数组 同向双指针 2122. 还原原数组 ​编辑 2972. 统计移除递增子数组的数目 II ​编辑 思维拓展 1920. 基于排列构建数组 442. 数组中重复的数据 448. 找到所有数组中消失的…...

如何排查服务器 CPU 温度过高的问题并解决?

服务器CPU温度过高是一个常见的问题&#xff0c;可能导致服务器性能下降、系统稳定性问题甚至硬件损坏。有效排查和解决服务器CPU温度过高的问题对于确保服务器正常运行和延长硬件寿命至关重要。本文将介绍如何排查服务器CPU温度过高的问题&#xff0c;并提供解决方法&#xff…...

YOLO篇-3.1.YOLO服务器运行

1.服务器 服务器网站&#xff1a;AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL(这个是收费的) 2.数据集上传 进入网站&#xff0c;租用自己的服务器&#xff0c;租用好后点击jupyter。(这里需要先有一个数据集哦) 在根目录下进入datasets创建自己的工程名 在工程文件下…...

数智读书笔记系列034《最优解人生》对编程群体的理念契合

📘 书籍简介 核心观点 《Die with Zero》(中文译为《最优解人生》)由美国对冲基金经理比尔柏金斯(Bill Perkins)撰写,核心理念是“财产归零”。其核心主张是: 金钱是实现体验的工具:金钱本身无意义,其价值在于转化为有意义的体验,如旅行、学习、家庭时光或慈善活动…...

深度学习相比传统机器学习的优势

深度学习相比传统机器学习具有显著优势&#xff0c;主要体现在以下几个方面&#xff1a; 1. 特征工程的自动化 传统机器学习&#xff1a;依赖人工设计特征&#xff08;Feature Engineering&#xff09;&#xff0c;需要领域专家从原始数据中提取关键特征&#xff08;如边缘检测…...

深入探究C++11的核心特性

目录 引言 C11简介 统一的列表初始化 1. {} 初始化 2. std::initializer_list 变量类型推导 1. auto 2. decltype 3. nullptr 右值引用和移动语义 1. 左值引用和右值引用 2. 左值引用与右值引用比较 3. 右值引用使用场景和意义 移动赋值与右值引用的深入应用 1. 移…...

nltk-英文句子分词+词干化

一、准备工作 ①安装好nltk模块并在&#xff1a; nltk/nltk_data: NLTK Data 链接中手动下载模型并放入到对应文件夹下。 具体放到哪个文件夹&#xff0c;先执行看报错后的提示即可。 ②准备pos_map.json文件&#xff0c;放置到当前文件夹下。该文件用于词性统一 {"…...

系统性能分析基本概念(3) : Tuning Efforts

系统性能调优&#xff08;Tuning Efforts&#xff09;是指通过优化硬件、软件或系统配置来提升性能&#xff0c;减少延迟、提高吞吐量或优化资源利用率。以下是系统性能调优的主要努力方向&#xff0c;涵盖硬件、操作系统、应用程序和网络等多个层面&#xff0c;结合实际应用场…...