NativeIO 源码解析

简介

NativeIO 主要用于实现一些 Java 未实现的 IO 相关的接口。通过 JNI 的的方式直接调用底层操作系统的系统函数,提升效率和性能。

源码详解

主要分下面几部分:

  • JNI 初始化,包括底层 JNI 代码。
  • 底层 IO 操作详解

初始化

核心初始化的代码是在 NativeIO 里面的静态代码块里面实现的,通过参数 hadoop.workaround.non.threadsafe.getpwuid 控制是否支持线程安全,默认是线程安全的。
初始化只会做一次,不会重复初始化,关键代码如下:

static {
      if (NativeCodeLoader.isNativeCodeLoaded()) {
        //确保只加初始化一次。
        try {
          Configuration conf = new Configuration();
          boolean workaroundNonThreadSafePasswdCalls = conf.getBoolean(
              WORKAROUND_NON_THREADSAFE_CALLS_KEY,
              WORKAROUND_NON_THREADSAFE_CALLS_DEFAULT);

          initNativePosix(workaroundNonThreadSafePasswdCalls);
          nativeLoaded = true;
          // 省略。。。。
        } catch (Throwable t) {
         // 省略。。。。
        }
      }
    }

initNativePosix 详解

initNativePosix 的 JNI 在 NativeIO.c 里面,函数的定义如下,其中,JNIEnv *env, jclass clazz 为 JNI 默认需要带的参数,jboolean doThreadsafeWorkaround 是函数 initNativePosix 的入参。

JNIEXPORT void JNICALL
Java_org_apache_hadoop_io_nativeio_NativeIO_initNative(
  JNIEnv *env, jclass clazz, jboolean doThreadsafeWorkaround) 

在 initNativePosix 里面核心函数有:

  • nioe_init(env):主要是初始化 NativeIOException 异常对象。
  • fd_init(env);初始化 java.io.FileDescriptor
  • workaround_non_threadsafe_calls_init(env);初始化一个 Object 对象,用于实现加锁。

底层 IO 操作

NativeIO 提供了很多底层 IO 操作的 JNI。主要包括:

函数名称 作用
getPmdkLibPath() 获取 HADOOP_PMDK_LIBRARY 的路径
isPmemCheck(long address, long length) 用于判断一段内存区域是否位于真正的持久内存上
pmemMapFile(String path, long length, boolean isFileExist); 是将持久内存(Persistent Memory,PMEM)上的文件映射到进程的虚拟地址空间,调用库函数 pmem_map_file
pmemUnMap(long address, long length) pmem_unmap 是持久内存编程中的一个关键函数,它就像一位负责收尾的清道夫,安全地解除之前建立的内存映射关系,并确保数据的持久化。

其他实现可自行查看 NativeIO.c,基本都是对操作系统函数的封装,不再重复列出用途。

  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    95 引用 • 122 回帖 • 634 关注
1 操作
zeekling 在 2025-12-14 17:15:46 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
zeekling
应无所住,而生其心。 --《金刚经》 吾生也有涯,而知也无涯。 --《庄子》 西安