簡(jiǎn)介
NativeIO主要用于實(shí)現一些Java未實(shí)現的IO相關(guān)的接口。通過(guò)JNI的的方式直接調用底層操作系統的系統函數,提升效率和性能。
源碼詳解
主要分下面幾部分:
- JNI初始化,包括底層JNI代碼。
- 底層IO操作詳解
初始化
核心初始化的代碼是在NativeIO里面的靜態(tài)代碼塊里面實(shí)現的,通過(guò)參數hadoop.workaround.non.threadsafe.getpwuid控制是否支持線(xiàn)程安全,默認是線(xiàn)程安全的。
初始化只會(huì )做一次,不會(huì )重復初始化,關(guān)鍵代碼如下:
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);初始化一個(gè)Object對象,用于實(shí)現加鎖。
底層IO操作
NativeIO提供了很多底層IO操作的JNI。主要包括:
| 函數名稱(chēng) |
作用 |
| getPmdkLibPath() |
獲取HADOOP_PMDK_LIBRARY的路徑 |
| isPmemCheck(long address, long length) |
用于判斷一段內存區域是否位于真正的持久內存上 |
| pmemMapFile(String path, long length, boolean isFileExist); |
是將持久內存(Persistent Memory,PMEM)上的文件映射到進(jìn)程的虛擬地址空間,調用庫函數pmem_map_file |
| pmemUnMap(long address, long length) |
pmem_unmap是持久內存編程中的一個(gè)關(guān)鍵函數,它就像一位負責收尾的清道夫,安全地解除之前建立的內存映射關(guān)系,并確保數據的持久化。 |
其他實(shí)現可自行查看NativeIO.c,基本都是對操作系統函數的封裝,不再重復列出用途。