最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java文件IO操作教程之DirectIO的意義

 更新時間:2019年03月03日 10:03:26   作者:徐靖峰  
這篇文章主要給大家介紹了關(guān)于Java文件IO操作教程之DirectIO的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在前文《文件IO操作的一些最佳實(shí)踐》中,我介紹了一些 Java 中常見的文件操作的接口,并且就 PageCache 和 DIrect IO 進(jìn)行了探討,最近我自己封裝了一個 Direct IO 的庫,趁著這個機(jī)會,本文重點(diǎn)談?wù)?Java 中 Direct IO 的意義,以及簡單介紹下我自己的輪子。

Java 中的 Direct IO

如果你閱讀過我之前的文章,應(yīng)該已經(jīng)了解 Java 中常用的文件操作接口為:FileChannel,并且沒有直接操作 Direct IO 的接口。這也就意味著 Java 無法繞開 PageCache 直接對存儲設(shè)備進(jìn)行讀寫,但對于使用 Java 語言來編寫的數(shù)據(jù)庫,消息隊(duì)列等產(chǎn)品而言,的確存在繞開 PageCache 的需求:

  • PageCache 屬于操作系統(tǒng)層面的概念,用戶層面很難干預(yù),User BufferCache 顯然比 Kernel PageCache 要可控
  • 現(xiàn)代操作系統(tǒng)會使用盡可能多的空閑內(nèi)存來充當(dāng) PageCache,當(dāng)操作系統(tǒng)回收 PageCache 內(nèi)存的速度低于應(yīng)用寫緩存的速度時,會影響磁盤寫入的速率,直接表現(xiàn)為寫入 RT 增大,這被稱之為“毛刺現(xiàn)象”

PageCache 可能會好心辦壞事,采用 Direct IO + 自定義內(nèi)存管理機(jī)制會使得產(chǎn)品更加的可控,高性能。

Direct IO 的限制

在 Java 中使用 Direct IO 最終需要調(diào)用到 c 語言的 pwrite 接口,并設(shè)置 O_DIRECT flag,使用 O_DIRECT 存在不少限制

  • 操作系統(tǒng)限制:Linux 操作系統(tǒng)在 2.4.10 及以后的版本中支持 O_DIRECT flag,老版本會忽略該 Flag;Mac OS 也有類似于 O_DIRECT 的機(jī)制
  • 用于傳遞數(shù)據(jù)的緩沖區(qū),其內(nèi)存邊界必須對齊為 blockSize 的整數(shù)倍
  • 用于傳遞數(shù)據(jù)的緩沖區(qū),其傳遞數(shù)據(jù)的大小必須是 blockSize 的整數(shù)倍。
  • 數(shù)據(jù)傳輸?shù)拈_始點(diǎn),即文件和設(shè)備的偏移量,必須是 blockSize 的整數(shù)倍

查看系統(tǒng) blockSize 大小的方式:stat /boot/|grep “IO Block”

ubuntu@VM-30-130-ubuntu:~$ stat /boot/|grep “IO Block”
Size: 4096 Blocks: 8 IO Block: 4096 directory

通常為 4kb

Java 使用 Direct IO

項(xiàng)目地址

https://github.com/lexburner/kdio

引入依賴

<dependency>
 <groupId>moe.cnkirito.kdio</groupId>
 <artifactId>kdio-core</artifactId>
 <version>1.0.0</version>
</dependency>

注意事項(xiàng)

// file path should be specific since the different file path determine whether your system support direct io
public static DirectIOLib directIOLib = DirectIOLib.getLibForPath("/");
// you should always write into your disk the Integer-Multiple of block size through direct io.
// in most system, the block size is 4kb
private static final int BLOCK_SIZE = 4 * 1024;

Direct IO 寫

private static void write() throws IOException {
 if (DirectIOLib.binit) {
  ByteBuffer byteBuffer = DirectIOUtils.allocateForDirectIO(directIOLib, 4 * BLOCK_SIZE);
  for (int i = 0; i < BLOCK_SIZE; i++) {
   byteBuffer.putInt(i);
  }
  byteBuffer.flip();
  DirectRandomAccessFile directRandomAccessFile = new DirectRandomAccessFile(new File("./database.data"), "rw");
  directRandomAccessFile.write(byteBuffer, 0);
 } else {
  throw new RuntimeException("your system do not support direct io");
 }
}

Direct IO 讀

public static void read() throws IOException {
 if (DirectIOLib.binit) {
  ByteBuffer byteBuffer = DirectIOUtils.allocateForDirectIO(directIOLib, 4 * BLOCK_SIZE);
  DirectRandomAccessFile directRandomAccessFile = new DirectRandomAccessFile(new File("./database.data"), "rw");
  directRandomAccessFile.read(byteBuffer, 0);
  byteBuffer.flip();
  for (int i = 0; i < BLOCK_SIZE; i++) {
   System.out.print(byteBuffer.getInt() + " ");
  }
 } else {
  throw new RuntimeException("your system do not support direct io");
 }
}

主要 API

  • DirectIOLib.java 提供 Native 的 pwrite 和 pread
  • DirectIOUtils.java 提供工具類方法,比如分配 Block 對齊的 ByteBuffer
  • DirectChannel/DirectChannelImpl.java 提供對 fd 的 Direct 包裝,提供類似 FileChannel 的讀寫 API。
  • DirectRandomAccessFile.java 通過 DIO 的方式打開文件,并暴露 IO 接口。

總結(jié)

這個簡單的 Direct IO 框架參考了smacke/jaydio,這個庫自己搞了一套 Buffer 接口跟 JDK 的類庫不兼容,且讀寫實(shí)現(xiàn)里面加了一塊 Buffer 用于緩存內(nèi)容至 Block 對齊有點(diǎn) Direct IO 的語義。同時,感謝塵央同學(xué)的指導(dǎo),這個小輪子的代碼量并不多,初始代碼引用自他的一個小 demo(已獲得本人授權(quán))。為什么需要這么一個庫?主要是考慮后續(xù)會出現(xiàn)像「中間件性能挑戰(zhàn)賽」和「PolarDB性能挑戰(zhàn)賽」這樣的比賽,Java 本身的 API 可能不足以發(fā)揮其優(yōu)勢,如果有一個庫可以屏蔽掉 Java 和 CPP 選手的差距,豈不是美哉?我也將這個庫發(fā)到了中央倉庫,方便大家在自己的代碼中引用。

后續(xù)會視需求,會這個小小的輪子增加注入 fadvise,mmap 等系統(tǒng)調(diào)用的映射,也歡迎對文件操作感興趣的同學(xué)一起參與進(jìn)來,pull request & issue are welcome!

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Java多線程及線程安全實(shí)現(xiàn)方法解析

    Java多線程及線程安全實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Java多線程及線程安全實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • JDBC實(shí)現(xiàn)Mysql自動重連機(jī)制的方法詳解

    JDBC實(shí)現(xiàn)Mysql自動重連機(jī)制的方法詳解

    最近在工作中發(fā)現(xiàn)了一個問題,通過查找相關(guān)的資料終于解決了,下面這篇文章主要給大家介紹了關(guān)于JDBC實(shí)現(xiàn)Mysql自動重連機(jī)制的相關(guān)資料,文中給出多種解決的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • JAVA生成八位不重復(fù)隨機(jī)數(shù)最快的方法總結(jié)(省時間省空間)

    JAVA生成八位不重復(fù)隨機(jī)數(shù)最快的方法總結(jié)(省時間省空間)

    隨機(jī)數(shù)在實(shí)際中使用很廣泛,比如要隨即生成一個固定長度的字符串、數(shù)字,這篇文章主要給大家介紹了關(guān)于JAVA生成八位不重復(fù)隨機(jī)數(shù)最快的方法,文中介紹的方法省時間省空間,需要的朋友可以參考下
    2024-03-03
  • 兩行Javascript代碼生成UUID的方法

    兩行Javascript代碼生成UUID的方法

    這篇文章主要介紹了兩行Javascript代碼生成UUID的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Redis之SpringDataRedis用法詳解

    Redis之SpringDataRedis用法詳解

    這篇文章主要介紹了Redis之SpringDataRedis的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 解析ConcurrentHashMap: put方法源碼分析

    解析ConcurrentHashMap: put方法源碼分析

    ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見問題---ConcurrentHashMap知識,一起看看吧
    2021-06-06
  • java關(guān)于調(diào)用方法的匯總

    java關(guān)于調(diào)用方法的匯總

    本文小編給大家整理了在Java中關(guān)于靜態(tài)調(diào)用和動態(tài)調(diào)用的方法匯總,值得大家學(xué)習(xí)和參考。
    2017-11-11
  • 使用Files.walkFileTree遍歷目錄文件

    使用Files.walkFileTree遍歷目錄文件

    這篇文章主要介紹了使用Files.walkFileTree遍歷目錄文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 手把手教你實(shí)現(xiàn)idea中配置國內(nèi)源

    手把手教你實(shí)現(xiàn)idea中配置國內(nèi)源

    idea的國內(nèi)源配置十分重要,能夠提升程序開發(fā)的效率而且也是減少bug的一種有效防范,本文就來介紹一下idea中配置國內(nèi)源,具有一定的參考價值,感興趣的可以了解一下
    2023-07-07
  • 淺談一下Servlet的定義以及運(yùn)行原理

    淺談一下Servlet的定義以及運(yùn)行原理

    相信有很多剛?cè)胄械呐笥褧苫骃ervlet到底是個什么意思,那么這篇文章就來淺談一下到底什么是Servlet,以及Servlet的原理與如何寫一個Servlet,,需要的朋友可以參考下
    2023-03-03

最新評論

肥乡县| 江陵县| 漳浦县| 神池县| 颍上县| 桦甸市| 松阳县| 黔西县| 英德市| 寻乌县| 宁城县| 乃东县| 隆安县| 北安市| 宜君县| 蓝山县| 河北区| 图片| 蒙自县| 平舆县| 东宁县| 镇原县| 长寿区| 如东县| 宜兰县| 沙洋县| 平谷区| 普宁市| 称多县| 泰州市| 沙洋县| 龙山县| 安康市| 古交市| 威海市| 天柱县| 西乡县| 沽源县| 文化| 佳木斯市| 浪卡子县|