在Linux 操作系统的庞大生态中,文件系统犹如一座城市的基础设施,支撑着数据的有序存储与高效访问。而 ext4 文件系统,作为 Linux 文件系统家族中的重要一员,自诞生起便凭借诸多先进特性备受瞩目。其中,extent 机制堪称 ext4 的一大核心亮点,它从根本上改变了文件数据的组织与寻址方式。在深入探究 ext4 extent 之前,让我们先回溯一下历史。早期的 ext2、ext3 文件系统采用直接 + 间接寻址模式来处理文件逻辑地址到物理块地址的映射,这种方式在面对大文件时,暴露出诸如物理块浪费、磁盘性能低下、效率不高以及易碎片化等诸多弊端。

extent 机制的引入,正是为了革除这些弊病。它以一种更为紧凑、高效的方式,描述大文件逻辑地址与物理地址的映射关系,大幅节省磁盘空间,显著提升寻址性能,并有效缓解碎片化问题。接下来,本文将深入 Linux 内核源码的世界,从数据结构定义、操作函数实现等底层视角,结合实例演示,全方位、深层次地剖析 ext4 extent,力图揭开其神秘面纱,让大家透彻理解其工作原理与精妙之处 。

一、Linux 文件系统小科普

在 Linux 系统的庞大体系中,文件系统就像是一个井然有序的图书馆,负责高效管理和存储数据。它不仅提供了文件和目录的组织管理功能,还负责文件读写、权限管理、存储设备的格式化等操作,其好坏直接影响到系统的性能、可靠性和安全性 。

图片

ext4 文件系统,作为 Linux 系统中广泛应用的文件系统,凭借其卓越的性能、强大的稳定性以及出色的兼容性,成为众多用户的信赖之选,也是当下 Linux 系统的默认文件系统。在 ext4 众多的特性中,extent 堪称其核心与灵魂所在,它的出现,彻底革新了文件数据的存储与管理方式,为提升文件系统的性能开辟了全新的路径。接下来,就让我们深入到 Linux 内核源码的世界,详细解读 ext4 extent。

二、ext4 extent是什么?

2.1传统文件系统的痛点

在 extent 出现之前,传统文件系统采用的是直接映射或间接映射方式,将文件逻辑块号映射到物理块号。在这种映射方式下,每个文件的数据块地址都需要在映射表中记录,随着文件规模不断增大,映射表会急剧膨胀,占用大量磁盘空间和内存资源。例如,一个 1GB 的文件,若以 4KB 为一个数据块,就需要 262144 个块地址记录在映射表中,这对系统资源是极大的消耗。

同时,复杂的映射关系也使得文件读写操作时,需要频繁访问映射表来获取物理块地址,大大增加了系统开销。以读取一个大文件为例,系统需要多次查询映射表,每次查询都伴随着磁盘 I/O 操作,这不仅增加了寻道时间,还延长了数据传输时间,导致文件读写速度大幅下降,严重影响系统性能。

2.2 extent闪亮登场

extent 的核心思想是将文件中的数据划分为若干个连续的物理块,这些连续的物理块被视为一个整体,即 extent。通过这种方式,文件的数据不再是零散地分布在磁盘的各个角落,而是以连续的块组形式存储,大大提高了数据的存储密度和连续性。比如,一个视频文件在存储时,其数据可以被划分为多个 extent,每个 extent 包含若干连续的物理块,这样在读取视频文件时,就可以一次性读取一个 extent 的数据,减少了磁盘寻道次数,提高了读取效率。

这种连续性存储方式带来了诸多显著的优势。首先,它减少了文件数据的碎片化程度,使得文件在磁盘上的存储更加紧凑和有序。这不仅有助于提高磁盘空间的利用率,还能减少文件读写时的寻道时间和旋转延迟,从而显著提升文件的读写性能。其次,extent 的使用简化了文件的映射关系,使得文件的逻辑块号与物理块号之间的映射更加直观和高效。通过 extent,文件系统可以直接定位到文件数据所在的物理块,无需像传统方式那样进行复杂的映射表查询,大大提高了文件的访问速度和效率。

2.3实际应用大放送

在实际应用中,extent 的优势得到了充分的体现。在处理大型数据库文件时,extent 能够确保数据库文件的数据连续存储,使得数据库的读写操作更加高效和稳定。例如,在一个企业级数据库系统中,经常需要对大规模数据进行查询和更新操作,使用 extent 存储数据可以大大提高数据库的响应速度,满足企业对数据处理的高要求。

在进行大规模文件传输时,extent 的连续性存储方式可以减少文件传输过程中的中断和错误,提高文件传输的成功率和速度。这对于需要频繁进行文件传输的场景,如数据备份、文件共享等,具有重要的实用价值。比如,在进行数据备份时,使用 extent 存储数据可以加快备份速度,减少备份时间,提高数据安全性。

三、ext4 extent诞生的故事

3.1 ext2、ext3 的 “老黄历”

在计算机发展的早期,数据量相对较小,对文件系统的性能要求也不像现在这么高。ext2 文件系统应运而生,它采用直接 + 间接寻址的方式,在 inode 结构体中的 i_block 数组里,前 12 个元素用于直接寻址,对于小文件来说,这种方式简单高效,系统能直接通过这些元素找到对应的物理块,快速访问文件数据。例如,一个大小为几十 KB 的文本文件,其数据块地址可以直接存储在这 12 个元素中,读取时无需复杂的寻址过程,大大提高了小文件的读写速度。

然而,随着数据量的不断增长,大文件的出现越来越频繁,ext2 的局限性逐渐暴露出来。当文件较大时,仅靠直接寻址无法满足需求,需要借助间接寻址。i_block 数组的第 13 个元素用于一级间接寻址,指向一个存储数据块地址的块;第 14 个元素用于二级间接寻址,通过多层索引来找到数据块地址;第 15 个元素用于三级间接寻址 。

这种复杂的寻址方式,在处理大文件时效率极其低下。以一个 1GB 的大文件为例,假设每个数据块大小为 4KB,那么这个文件就需要 262144 个数据块。在 ext2 文件系统中,为了记录这些数据块的地址,需要不断地进行间接寻址,这不仅浪费了大量的磁盘空间来存储索引信息,还导致文件读写时需要多次访问磁盘,增加了寻道时间和数据传输时间,大大降低了文件系统的性能。

ext3 在 2001 年出现,它在 ext2 的基础上增加了日志功能,大大提高了文件系统的可靠性和稳定性。在系统崩溃或掉电时,ext3 可以利用日志快速恢复文件系统的一致性,减少数据丢失的风险。然而,ext3 并没有从根本上解决 ext2 在处理大文件时的性能问题,仍然采用直接 + 间接寻址的方式,随着数据量的持续增长,ext3 在大文件处理上的局限性也越发明显,无法满足日益增长的存储和性能需求。

3.2 extent 来救场

为了解决 ext2 和 ext3 在大文件处理上的困境,extent 应运而生。extent 的出现,彻底改变了文件数据的存储和管理方式。它将文件中的数据划分为若干个连续的物理块,这些连续的物理块被视为一个整体,即 extent。通过这种方式,文件的数据不再是零散地分布在磁盘的各个角落,而是以连续的块组形式存储,大大提高了数据的存储密度和连续性。

在处理大文件时,extent 机制将大文件的数据存储在较少的 extent 中,减少了磁盘寻道时间和数据传输的开销,从而显著提高了大文件的读写速度。例如,对于一个大型视频文件,extent 可以将其数据存储在几个连续的 extent 中,读取时只需一次性读取这些 extent 的数据,而不需要像传统方式那样频繁地寻道和读取零散的数据块,大大提高了视频播放的流畅性和加载速度。

extent 还能有效减少文件碎片的产生,提高磁盘空间的利用率。在传统的文件系统中,由于文件数据的零散存储,容易产生大量的文件碎片,导致磁盘空间浪费和文件读写性能下降。而 extent 优先分配连续的磁盘空间,使得文件在磁盘上的存储更加紧凑和有序,减少了碎片的产生,提高了磁盘空间的利用率。

四、ext4 extent 核心数据结构

深入探究 ext4 extent,就如同打开了一扇通往文件系统底层世界的大门,其核心数据结构精妙而复杂,支撑着文件系统的高效运行。这些数据结构不仅是理解 ext4 extent 工作原理的关键,更是掌握文件系统性能优化的基础。接下来,让我们一同揭开 ext4 extent 核心数据结构的神秘面纱,领略其设计的精妙之处。

4.1 inode里的小秘密

inode,作为文件系统中的关键概念,在 ext4 extent 中扮演着举足轻重的角色。它是文件元数据的载体,存储着文件的各种属性信息,如文件大小、权限、所有者、创建时间、修改时间等 。这些属性信息对于文件的管理和访问至关重要,是文件系统进行各种操作的依据。

在 inode 结构体中,有一个重要的数组 i_block,它在文件寻址过程中起着关键作用。在传统的 ext2 和 ext3 文件系统中,i_block 数组的前 12 个元素用于直接寻址,直接存储文件数据块的物理地址。对于小文件而言,这种直接寻址方式简单高效,系统能迅速定位到文件数据所在的物理块,实现快速的数据访问。然而,当文件较大时,仅靠这 12 个直接寻址元素无法满足需求,就需要借助间接寻址。

i_block 数组的第 13 个元素指向一个块,该块中存储的是数据块的地址,通过这种一级间接寻址,系统可以访问更多的数据块;第 14 个元素用于二级间接寻址,通过多层索引来找到数据块地址;第 15 个元素则用于三级间接寻址 。这种复杂的寻址方式在处理大文件时,效率较低,且会占用大量的磁盘空间来存储索引信息。

在 ext4 文件系统中,引入 extent 机制后,inode 的结构和功能发生了一些变化。inode 不再仅仅通过 i_block 数组来进行文件寻址,而是结合 extent 来更高效地管理文件数据的存储位置。extent 的出现,使得 inode 能够以更紧凑、更高效的方式记录文件数据的物理位置,减少了寻址的复杂度和磁盘空间的浪费 。

4.2 extent 结构体剖析

extent 结构体是 ext4 extent 机制的核心组成部分,它精准地描述了文件逻辑块与物理块之间的映射关系。通过这个结构体,文件系统能够清晰地知晓文件数据在磁盘上的存储位置,实现高效的数据访问和管理。

extent 结构体包含了多个关键信息,其中文件逻辑块号(ee_block)明确标识了 extent 所对应的文件逻辑块的起始位置,它是文件数据在逻辑层面的索引。起始磁盘块号(由 ee_start_hi 和 ee_start_lo 共同确定)则指明了文件数据在磁盘上的实际起始物理位置,这是数据存储的物理起点。块数量(ee_len)表示该 extent 所包含的连续物理块的数量,它决定了 extent 的大小和数据存储的范围。

这些信息相互配合,构成了 extent 结构体的核心功能。通过文件逻辑块号,文件系统可以快速定位到需要访问的文件逻辑块;再结合起始磁盘块号和块数量,就能准确地找到对应的物理块,实现文件数据的高效读写。这种映射关系的建立,使得文件系统能够更有效地管理文件数据的存储,提高了数据访问的效率和可靠性 。

4.3 extent_tree 的魔法

对于大文件来说,单一的 extent 可能无法容纳其全部数据,此时 ext4 采用 extent_tree 来管理多个 extent。extent_tree 本质上是一种基于 B + 树的数据结构,这种结构在文件系统中发挥着重要的作用,极大地提升了文件系统的性能 。

在 extent_tree 中,B + 树的叶子节点存储着实际的 extent 信息,每个 extent 结构体都包含了文件逻辑块号到物理块号的映射关系。非叶子节点则作为索引节点,用于快速定位叶子节点。当文件系统需要查找某个文件逻辑块对应的物理块时,首先从根节点开始,通过比较逻辑块号在非叶子节点中进行索引查找,逐步向下遍历,最终找到对应的叶子节点,从而获取到准确的 extent 信息 。

这种基于B+树的间接寻址方式,具有诸多优势。B+树的结构特点使得数据查询更加高效,它能够快速定位到目标extent,减少了磁盘I/O操作的次数。与传统的直接 + 间接寻址方式相比,extent_tree大大减少了元数据的存储量,降低了磁盘空间的占用。B+树的平衡性和有序性也保证了文件系统在处理大文件时的稳定性和可靠性 。

五、ext4 extent运行机制

5.1文件创建时的操作

当用户在 Linux 系统中创建一个新文件时,ext4 文件系统会迅速响应,为文件分配连续的物理块,构建文件逻辑块号与物理块号的映射关系,这一过程涉及多个关键步骤。

系统首先会在文件系统中查找一个空闲的 inode,inode 是文件元数据的载体,包含了文件的各种属性信息,如文件大小、权限、所有者、创建时间、修改时间等 。一旦找到合适的空闲 inode,系统便会为其初始化相关信息,将文件的基本属性记录其中。

接着,ext4 文件系统会根据文件的大小和磁盘空间的使用情况,为文件分配连续的物理块。在分配物理块时,ext4 会优先尝试在磁盘上找到一段连续的空闲空间,将这些连续的物理块划分为一个 extent。例如,当创建一个大小为 10MB 的文件时,如果磁盘上存在一段连续的 10MB 空闲空间,ext4 会将这段空间分配给文件,形成一个 extent。这样做的好处是,文件的数据可以连续存储,大大提高了文件的读写性能。

在完成物理块的分配后,ext4 会构建文件逻辑块号与物理块号的映射关系。通过 extent 结构体,文件系统能够清晰地记录文件逻辑块号与物理块号之间的对应关系。每个 extent 结构体包含文件逻辑块号、起始磁盘块号和块数量等关键信息。文件逻辑块号(ee_block)明确标识了 extent 所对应的文件逻辑块的起始位置;起始磁盘块号(由 ee_start_hi 和 ee_start_lo 共同确定)则指明了文件数据在磁盘上的实际起始物理位置;块数量(ee_len)表示该 extent 所包含的连续物理块的数量。通过这些信息,文件系统可以快速定位到文件数据所在的物理块,实现高效的数据访问。

5.2文件读取的过程

在 Linux 系统中,当用户发起文件读取请求时,ext4 extent 会迅速响应,根据文件逻辑块号与物理块号的映射关系,快速定位到文件数据所在的物理块,并将数据读取到内存中,这一过程涉及多个关键步骤。

系统会根据用户提供的文件路径,找到对应的 inode。inode 中包含了文件的各种元数据信息,如文件大小、权限、所有者、创建时间、修改时间等 ,以及指向文件数据的指针。通过 inode,系统可以获取到文件的 extent tree 的指针,extent tree 是一种基于 B + 树的数据结构,用于组织和管理文件的 extent。

接着,系统会利用 extent tree 来查找文件数据所在的 extent。在 extent tree 中,B + 树的叶子节点存储着实际的 extent 信息,每个 extent 结构体都包含了文件逻辑块号到物理块号的映射关系。非叶子节点则作为索引节点,用于快速定位叶子节点。当系统需要查找某个文件逻辑块对应的物理块时,首先从根节点开始,通过比较逻辑块号在非叶子节点中进行索引查找,逐步向下遍历,最终找到对应的叶子节点,从而获取到准确的 extent 信息 。

在找到对应的 extent 后,系统会根据 extent 结构体中记录的物理块号,从磁盘上读取相应的数据块,并将数据读取到内存中。由于 extent 将文件数据存储在连续的物理块中,减少了磁盘寻道时间和数据传输的开销,从而大大提高了文件的读取速度。例如,当读取一个视频文件时,extent 机制可以使得视频数据能够连续地从磁盘读取到内存中,保证了视频播放的流畅性,减少了卡顿现象的发生。

5.3文件写入的步骤

在 Linux 系统中,当用户执行文件写入操作时,ext4 extent 会有条不紊地处理数据写入、空间分配及映射关系更新等流程,确保文件数据的准确存储和文件系统的高效运行。

当用户向文件写入数据时,系统首先会检查文件当前的大小和已分配的磁盘空间。如果文件需要扩展,即写入的数据量超过了当前已分配的磁盘空间,ext4 会为文件分配合适的 extent。在分配 extent 时,ext4 会优先尝试在磁盘上找到一段连续的空闲空间,将这些连续的物理块划分为一个新的 extent。例如,当用户向一个已存在的文件中追加 10MB 的数据时,如果磁盘上存在一段连续的 10MB 空闲空间,ext4 会将这段空间分配给文件,形成一个新的 extent。这样做的好处是,文件的数据可以连续存储,大大提高了文件的读写性能。

如果没有足够大的连续空间,ext4才会考虑分配不连续的空间,并将其作为多个extent来管理。在分配不连续的空间时,ext4会为每个不连续的空间创建一个新的 extent,并在extent tree 中记录这些 extent 的信息 。

在完成 extent 的分配后,系统会将用户写入的数据写入到新分配的 extent 中。同时,ext4会更新文件的inode信息,包括文件的大小、修改时间等,以反映文件的最新状态。ext4 还会更新 extent tree 中相关的映射关系,确保文件逻辑块号与物理块号的映射关系始终准确无误。例如,当用户向文件中写入新的数据时,ext4 会在 extent tree 中更新对应的 extent 结构体,记录新的数据存储位置和块数量等信息。

5.4文件删除的处理

在 Linux 系统中,当用户执行文件删除操作时,ext4 extent 会迅速响应,释放文件占用的物理块,更新映射关系及相关数据结构,以确保磁盘空间的有效回收和文件系统的一致性。

当用户删除一个文件时,系统首先会找到该文件对应的 inode。inode 中包含了文件的各种元数据信息,如文件大小、权限、所有者、创建时间、修改时间等 ,以及指向文件数据的指针。通过 inode,系统可以获取到文件的 extent tree 的指针,extent tree 是一种基于 B + 树的数据结构,用于组织和管理文件的 extent。

接着,系统会遍历 extent tree,找到文件占用的所有 extent,并将这些 extent 标记为空闲。在标记 extent 为空闲后,ext4 会将这些 extent 所占用的物理块释放回磁盘空间,以便后续文件的分配使用。例如,当删除一个包含多个 extent 的大文件时,ext4 会逐一将每个 extent 所占用的物理块标记为空闲,释放这些物理块,使得磁盘空间得到有效回收。

系统会删除文件的 inode 和 extent tree,更新文件系统的元数据信息,以反映文件的删除操作。这一步骤确保了文件系统的一致性,避免了因文件删除而导致的元数据不一致问题。在删除 inode 和 extent tree 后,文件在文件系统中的所有痕迹被彻底清除,完成了文件的删除操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87973.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87973.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87973.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

reactnative页面适配UI设计尺寸px转dp的完美解决方案px2dp精要篇

你的 px2dp 函数基本思路是正确的,但可以进一步优化以确保更精确的适配。以下是改进后的完美精确方案: 完美精确的适配方案 import { Dimensions, PixelRatio, Platform, ScaledSize } from react-native;// 获取屏幕尺寸(考虑横竖屏&#…

【世纪龙科技】汽车钣金虚拟仿真教学实训软件

在汽车后市场人才紧缺的当下,职业院校汽车钣金教学却长期面临“三难困境”:实训设备昂贵且损耗快、学生实操机会稀缺、教学评价依赖主观经验。江苏世纪龙科技公司以十余年汽车教育数字化积淀为基石,推出《汽车钣金教学软件》,通过…

Fiddler中文版抓包工具在后端API调试与Mock中的巧用

在现代开发中,前后端往往分属不同小组甚至不同公司,接口联调变得至关重要。尤其是在多团队合作、后端接口尚未完成或频繁变动的项目中,前端开发进度容易被阻碍。此时,通过灵活运用 Fiddler抓包工具,前端可以在后端接口…

基于 Flask框架开发的轻量级招聘网站

简单的招聘网站示例 这是一个基于 Flask 框架开发的轻量级招聘网站示例,采用 Jinja2 模板引擎和 Bootstrap 前端框架,模仿 拉勾网 风格,实现了招聘平台的核心功能。系统支持 个人用户 和 企业用户 两种角色,个人用户可以浏览职位、…

2025 年使用大模型进行软件工程:现实检验

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

如何使用单例模式保证全局唯一实例(复杂版本)

/// <summary> /// 登录管理类&#xff08;单例模式&#xff09;&#xff0c;负责用户登录、注销及用户信息管理 /// </summary> public class LoginMananger {// 用于线程同步的锁对象static object _lockObj new object();// 单例实例&#xff08;延迟初始化&am…

瑞斯拜考研词汇课笔记

学习视频链接&#xff1a;瑞斯拜考研词汇系统课-外刊50篇- 第一讲_哔哩哔哩_bilibili Text 1 1.气候危机让普通人经历了额外六周的高温天气。 The climate crisis caused the average person to experience six extra weeks of hot days. 2.碳排放是全球变暖的重要原因之一。 C…

SqlServer安装后JDBC连接失败——TCP/IP

朋友公司接了个项目&#xff0c;甲方BaBa用的数据库是SqlServer 2022的Express版本&#xff0c;朋友让我帮忙验证下环境有没有什么问题&#xff0c;软件开发用的框架还是比较老的&#xff0c;spring的xml方式配置&#xff0c;用的c3p0的数据库连接池&#xff0c;启动项目连接池…

如何解决pip安装报错ModuleNotFoundError: No module named ‘datetime’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘datetime’问题 摘要 在日常Python开发中&#xff0c;我们常常需要通过pip install来安装第三方包&#xff0c;但有时会在PyCharm的控制台里遇到奇怪的ModuleN…

Windows 10 2016 长期服务版

系统介绍 Windows 10 2016 长期服务版。专为需要高度稳定性和最小功能变更的环境设计。它不仅适合专业领域&#xff0c;也是办公环境的理想选择。 系统特点 一、极致的稳定性 精简的系统组件&#xff1a;移除许多现代应用&#xff0c;只保留基础功能。 无强制功能更新&…

基于springboot的文件上传系统:重新定义大文件传输的可靠性边界

一、文件分块上传解析1、为什么传统文件上传已经无法满足现代需求&#xff1f;在云原生时代&#xff0c;文件上传不再是简单的"选择文件-点击上传"的过程。随着视频、设计图、数据集等大文件的普及&#xff0c;传统的单文件上传方式面临着诸多挑战&#xff1a;网络不…

系统学习Python——并发模型和异步编程:进程、线程和GIL

分类目录&#xff1a;《系统学习Python》总目录 在文章《并发模型和异步编程&#xff1a;基础知识》我们简单介绍了Python中的进程、线程和协程。本文就着重介绍Python中的进程、线程和GIL的关系。 Python解释器的每个实例都是一个进程。使用multiprocessing或concurrent.futu…

【playwright篇】教程(十七)[html元素知识]

1 html中&#xff0c;button元素中的aria-describedby"tooltip-r1k"属性&#xff0c;主要用来做什么&#xff1f;在 HTML 中&#xff0c;button 元素中的 aria-describedby"tooltip-r1k" 属性主要用于提升网页的可访问性&#xff08;Accessibility&#xf…

Python: 正则表达式

正则表达式是处理文本数据的强大工具&#xff0c;Python通过re模块提供了完整的正则表达式功能。本文将详细介绍Python正则表达式的使用方法&#xff0c;包括基础语法、高级技巧和re模块API的详细解析。一、正则表达式基础1.1 什么是正则表达式正则表达式(Regular Expression)是…

pytest合并allure报告解决方案

背景 在执行自动化测试的过程中&#xff0c;为了实现自动化的高通过率&#xff0c;可能会反复的重试&#xff0c;直至大多数甚至全部用例执行通过&#xff0c;以此来需要人为分析的用例量&#xff0c;减少人力投入&#xff0c;提高执行效率&#xff1b; 在用例少或者资源消耗小…

Pr插件图文安装教程

Pr插件图文安装教程 Adobe Premiere Pro&#xff0c;简称Pr&#xff0c;是由Adobe公司开发的一款视频编辑软件。Adobe Premiere有较好的兼容性&#xff0c;且可以与Adobe公司推出的其他软件相互协作。这款软件广泛应用于广告制作和电视节目制作中&#xff0c;是视频编辑爱好者…

[netty5: HttpObjectEncoder HttpObjectDecoder]-源码解析

在阅读该篇文章之前&#xff0c;推荐先阅读以下内容&#xff1a; [netty5: HttpObject]-源码解析[netty5: MessageToMessageCodec & MessageToMessageEncoder & MessageToMessageDecoder]-源码分析[netty5: ByteToMessageCodec & MessageToByteEncoder & Byte…

uniapp的navigator跳转功能

接下来&#xff0c;我将围绕一个常见的电商小程序来构建一系列连贯的使用场景。在这个过程中&#xff0c;我们将把 <navigator> 组件的所有关键属性和方法都串联起来&#xff0c;并详细解释它们在每个环节所扮演的角色和作用。 核心场景&#xff1a;构建一个电商小程序的…

v-for的用法及案例

目录 一.v-for的用法 1.举例1 2.举例2 二.购物车案例 1.代码 2.存在的问题&#xff1a;复选框错位 3.解决方案&#xff1a; 赋值给key属性一个唯一的值 一.v-for的用法 1.举例1 <template><view><view v-for"(item,index) in 10" :key"…

BigQuery对象引用(ObjectRef)全面指南:一站式整合结构化与非结构化多模态数据分析

引言 企业需要同时管理有组织表格中的结构化数据&#xff0c;以及日益增长的非结构化数据&#xff08;如图片、音频和文档&#xff09;。传统上&#xff0c;联合分析这些多样化数据类型非常复杂&#xff0c;通常需要使用不同的工具。非结构化媒体通常需要导出到专门的服务进行…