BLOCK层代码分析(1)数据的组织BIO

article/2025/11/8 7:16:08

        对于BLOCK层,表示一个IO的数据结构为BIO和request。对于request在后续的章节中做介绍,这里只介绍与BIO相关的结构体。

1. bio/bio_vec结构体

        bio结构体用于表示数据在内存中的组织以及IO完成情况。结构体bio包含两个重要的结构体: bio_vec和bi_iter。

        结构体bio_vec描述了IO数据在内存中的组织,通过此结构体可以找到数据在内存中的位置。每个bio可能包含多块连续的内存,每块连续的内存用结构体bio_vec表示,其中结构体bio_vec中bv_page指向本块连续内存的物理页的起始位置,bv_len指连续内存的长度,bv_offset表示连续物理内存的起始offset。

        结构体bi_iter描述了数据在硬盘中位置以及当前IO数据的完成情况。其中bi_sector表示数据在硬盘中的扇区号,即表示了数据在硬盘中的位置。bi_size表示BIO剩余未完成的大小。bi_idx表示当前处理到的bio_vec的索引号,即前面的都已经处理完。bi_bvec_done表示当前bio_vec已经完成的大小。

        下图简单描述了bio/bio_vec/bvec_iter之间关系的例子。其中bio包含两块连续内存,分别指向bio_vec 0和bio_vec 1。其中bio_vec 0数据起始位置并不是页首,因此会有offset偏移。而IO已完成bio_vec0,当前在处理bio_vec 1。

        结构体bio其他成员bi_next指向下一个bio;bi_pool指向bio的mempool池;bi_inline_vecs[]表示内置bio_vec,若定义BIOSET_NEED_BVECS,此时在分配bio时也会同时分配一定数目内置bio_vec(这对性能有优化,一般系统中一个IO包含的连续数据段不多时,不需要额外分配其他的bio_vec)。

2. bio_set结构体 

        bio_set主要用于分配bio,其中bio_slab是bio缓冲池(SLAB),大小为front_pad + sizeof(struct bio) + back_pad(若定义BIOSET_NEED_BVECS,此时是内置的bio_vec)。

        bio_slab是bio的SLAB缓存池,用于分配bio结构体。

        bio_pool和bvec_pool分别为分配bio和bio_vec的mempool池,在分配bio和bio_vec时默认是从SLAB分配,但设置mempool池时会提前分配一定数量的内存对象, 当内存不足无法从SLAB分配时会从mempool池中分配。

3. biovec_slab结构体

        结构体biovec_slab为分配bio_vec的SLAB缓冲池。默认系统中定义了四种大小的SLAB缓冲池:

  1. biovec-16: biovec数目为16个,当数据的连续内存数目在5~16个时会从此缓冲池申请;
  2. Biovec-64: biovec数目为64个,当数据的连续内存数目在17~64个时会从此缓冲池申请;
  3. biovec-128: biovec数目为128个,当数据的连续内存数目在65~128个时会从此缓冲池申请;
  4. biovec-max: biovec数目为BIO_MAX_VECS个,当数据的连续内存数目在129~BIO_MAX_VECS个时会从此缓冲池申请;

        有人可能会产生疑问:如果biovec数目为1~4时,没有缓存池可以分配,它是怎么分配的?对于这种情况,就是在BIO中内置biovec的,在分配BIO同时也分配了内置biovec。

4. 小结

        对于数据的组织,需要分别分配BIO和biovec,在biovec数目为1~4时,BIO直接使用内置biovec;当超过4时,分配从bio缓冲池和biovec缓冲池申请bio和biovec,并关联起来。

 

  


http://chatgpt.dhexx.cn/article/sPKoYL8d.shtml

相关文章

Java NIO、BIO介绍

Java BIO 基本介绍 I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。Java 共支持 3 种网络编程模型 I/O 模式:BIO、NIO、AIO。Java BIO:同步并阻塞(传统阻塞型&#xff…

BIO和NIO详解

到底什么是“IO Block” 很多人说BIO不好,会“block”,但到底什么是IO的Block呢?考虑下面两种情况: 用系统调用read从socket里读取一段数据用系统调用read从一个磁盘文件读取一段数据到内存 如果你的直觉告诉你,这两…

Java基础知识——BIO模式

文章目录 一、Java的I/O总述1、I/O模型2、应用 二、BIO模式1、传统的服务器、客户端通信(一对一):2、服务器和客户端的通信(一对多)3、伪异步IO编程4、BIO模式下的文件上传 一、Java的I/O总述 I/O模型:就是用什么样的通道或者通信模式和架构进行数据的传…

块设备驱动、bio理解

别人写过的内容,我就不写了。贴一下大佬的博客,写的非常好: 块设备驱动实战基础篇一 (170行代码构建一个逻辑块设备驱动) 块设备驱动实战基础篇二 (继续完善170行过滤驱动代码至200行) 块设备…

Java Bio编程

IO模型 基本说明 io模型就是数据的发送与接收,这个直接决定了程序之间通信的效率Java的网络编程常见三种Io分别是:bio,nio,aioBio:阻塞并且同步,服务器实现一个连接对应一个线程,如果这个连接…

JAVA BIO 编程

1. JAVA BIO基本介绍 Java BIO 就是传统的 java io 编程,其相关的类和接口在 java.io;BIO(blocking I/O) : 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果…

Java BIO

BIO通信模型 BIO通信服务端,通常有一个独立的Acceptor线程负责监听客户端的连接。接收到客户端连接请求后会为每个客户端创建一个新的线程进行链路处理,处理完成后返回应答给客户端,也就是经典的请求-应答通信模型。但是随着客户端…

BIO和NIO

两种通信模式BIO和NIO ​ io是指计算机的输入输出操作,广义的讲就是数据在的一种传输,可分为磁盘io(硬盘的读写)和网络io(socket的读写),这里的两种模式都是基于网络io的。 io的分类 阻塞I/O…

BIO、NIO、AIO详解

一、Java的I/O演进之路 Java共支持3种网络编程的I/O模型:BIO、NIO、AIO BIO: 同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理&…

OpenSSL BIO源码简析

文章目录 1. BIO简介BIO chainBIO数据结构BIO_METHOD数据结构 2. Base64示例分析初始化构造BIO链写数据free 1. BIO简介 相关文档 /html/man7/bio.html /html/man3/BIO_*.htmlbio - Basic I/O abstraction,即IO抽象层。 BIO有两种: source/sink BIO,…

二、JAVA BIO

NIO 目录 文章目录 二、JAVA BIO1、 Java BIO基本介绍2、 java BIO工作机制3、传统的BIO编程实例回顾3.1、客户端案例如下3.2、服务端案例如下3.3、输出3.4、小结 4、BIO模式下多发和多收消息4.1、客户端代码如下4.2、服务端代码如下4.3、输出 5、BIO模式下接收多个客户端5.1、…

BIO和NIO的区别

1.BIO基本介绍 BIO是传统的Java IO编程,其基本的类和接口在java.io包中BIO(blocking I/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何…

网络编程之中篇——BIO模型详述

1、BIO介绍 1.1、BIO的概念 BIO(Blocking IO)同步阻塞IO模型,在JDK 1.4之前,建立网络链接采用的只有BIO的模型 需要服务端首先启动建立一个ServerSocket实例,然后客户端启动Socket实例对服务端进行连接通信&#xf…

BIO,NIO,AIO分别是什么?他们有什么区别?

1、BIO 概念: BIO是一种同步阻塞I/O模式,服务实现模式为一个连接对应一个线程,即客户端发送一个连接,服务端要有一个线程来处理。 存在的问题: 一旦有高并发的大量请求,就会有如下问题: 1)线程…

JAVA BIO与NIO、AIO的区别(这个容易理解)

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信&#…

Quartus II 上手攻略

第一次接触EDA实验,对这方面的相关操作并不熟悉。本篇文章结合上课内容和B站Quartus进行整理,总结一下Quartus 这款软件的基本使用。 参考的B站教学链接:《Quartus II 软件安装与入门教程》 Quartus 软件简介 Quartus II 是Altera公司为其FP…

完全卸载quartus ii 9.0

即将毕业了,把电脑一些不用的软件清清,发现quartus软件贼占空间,删除又貌似找不到卸载的exe,百度了好多都不靠谱 下面介绍一种方法,可以很好的卸载掉quartus,原先我的quartus是安装在D盘下,结果…

Quartus II与Modelsim软件安装教程

Quartus II与Modelsim软件安装教程 一、Quartus II软件安装1、Quartus II安装2、器件安装3、Quartus 破解4、USB Blaster 驱动安装 二、Modelsim软件安装1、modelsim安装2、modelsim注册 三、参考资料 一、Quartus II软件安装 本节主要讲述Quartus II13.1软件的安装使用&#x…

Quartus II13.1安装教程

安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文。 1.鼠标右击【Quartus II 13.1】压缩包选择【解压到Quartus II 13.1】。 2.双击打开解压后的【Quartus II 13.1】文件夹。 3.双击打开【Quartus】文件夹。 4.鼠标右击【Q…

Quartus II下载器件库

Quartus II下载器件库 1、在浏览器中输入网址 https://fpgasoftware.intel.com/18.1/?editionstandard&platformwindows, 或https://fpgasoftware.intel.com/ 进入如下图所示界面。 2、在版本类型和版本中输入Quartus II所对应的版本 3、输入完版本后&#…