一、概述

二、理论笔记

三、实现

DFSInputStream.read() 首先调用 tryReadZeroCopy() 方法尝试以零拷贝模式读取数据块,如果当前配置或者数据块的状态不支持零拷贝,则调用 ByteBufferUtil.fallbackRead() 退化为一个普通的读取操作。

在传统的文件 I/O 操作中,都是调用操作系统提供的系统调用函数 read() 或 write() 来执行读写操作的,此时调用此函数的进程会由用户态切换到内核态,然后操作系统的内核代码负责将相应的文件数据读取到内核的 I/O 缓冲区,最后再把数据从内核 IO 缓冲区拷贝到进程的私有地址空间中,完成一次 IO 操作。

3.1. 校验

3.1.1. 同一个数据块

首先确保读取是在同一个数据块之内

3.1.2. 映射数据 <= 2GB

确保读取映射数据没有超过 2GB

3.2. 获取数据块文件在内存中的映射对象

tryReadZeroCopy() 会通过调用 blockReader.getclientMmap()将文件映射到内存中,并返回 ClientMmap对象。这个对象当中
包含了 MappedByteBuffer 对象

BlockReader.getClientMmap