IO概念和IO模型

1.前言

       IO的概念和模型很重要,不過每次看完資料過段時間又忘了,還得需要親自寫一下,加深下記憶和理解,本篇記錄參考偉峯的總結和網上資料整理而來,目的是加深這塊IO知識體系的記憶!在Unix的世界裏,一切皆文件,比如socket,在socket處理過程中,我們對這些流進行的讀寫操作就是IO操作,操作系統會把socket流轉換成一個文件描述符,也就是fd(整數),對這個整數的操作就是對socket操作.IO的分類可以分爲網絡IO和磁盤IO, I/O 模型就是操作系統執行 I/O 指令的方法。
主流的 I/O 模型通常有 5 種類型:IO模型可以分爲阻塞IO、非阻塞IO、信號驅動IO、IO多路轉接、異步IO這5種。每種 I/O 模型都有各自典型的使用場景,比如 Java 中 Socket 對象的阻塞模式和非阻塞模式就對應於前兩種模型;而 Linux 中的系統調用 select 函數就屬於 I/O 多路複用模型;大名鼎鼎的 epoll 系統調用則介於第三種和第四種模型之間;至於第五種模型,其實很少有 Linux 系統支持,反而是 Windows 系統提供了一個叫 IOCP 線程模型屬於這一種,通常情況下我們認爲後一種模型會比前一種模型要高級,比如 epoll 就比 select 要好,

2.IO類型

IO類型可以簡單分爲普通文件IO,FileChannel文件IO,零拷貝文件IO,普通網絡IO,網絡IO零拷貝具體參考下圖

 

 2.1 普通文件IO

    從上圖中可以看到一次讀寫文件的請求就有2次數據複製,分別是磁盤數據先到操作系統的內核,再從操作系統的內核到JVM裏,還有2次操作系統上下文切換

 2.2 FileChannel文件IO

       FileChannel會產生緩衝區,比如讀一個文件,就先將文件內容讀到到緩衝區(內存),再進行操作,就不需要像InputStream每次讀操作都要調用系統資源從文件處讀取。這個和普通文件IO的讀寫請求交互方式差不多,數據先從磁盤映射到緩衝區,用戶再從緩存區讀取數據,同理用戶寫數據到內存緩衝區,操作系統內核再把緩衝區的數據寫入磁盤,同樣也是2次內存拷貝和數據切換,但是內核可以通過預加載緩存等手段使得IO讀寫性能提高(OS負責),也可引做共享內存,減少IO操作,提升併發性;應用crash,保證這部分內容還能寫的進去文件。在我們調用channel.write(bytebuffer)之後,具體何時寫入磁盤、bytebuffer中內容暫存於哪裏(os cache)等相關一系列問題,就交由OS本身負責了,案例kafka
參考文檔

https://zhuanlan.zhihu.com/p/27650977 
https://www.imooc.com/wenda/detail/575214 
https://blog.csdn.net/wohiusdashi/article/details/82837808

 2.3  零拷貝文件IO

     mmap 通過內存映射,將文件映射到內核緩衝區,同時,用戶空間可以共享內核空間的數據。這樣,在進行網絡傳輸時,就可以減少內核空間到用戶空間的拷貝次數。當用戶修改“虛擬內存”數據,就相當於修改了文件。由內核完成刷盤持久化。將read/write這樣的IO操作,變成了內存或虛擬內存的讀寫。工具類MappedByteBuffer,案例rocketMQ 

參考文檔 
https://www.cnblogs.com/yuyutianxia/p/6253468.html
https://blog.csdn.net/qq_41969879/article/details/81629469
https://www.freesion.com/article/7040248729/

 2.4  普通網絡IO

  一次網絡請求,客戶端先通過socket建立連接到目標服務器的內核,再到目標的java進程,通過java進程讀取磁盤數據,從圖中可以看到涉及1次操作系統用戶態和內核態的切換,一次數據複製

 2.5  網絡零拷貝IO

   大致流程和普通網絡IO差不多,區別在於目標服務器java進程讀取數據後不經過JVM內存,直接通過sendFile把數據發給socket,像kafka,rocketmq都採用這種技術,類似的使用堆外內存的框架還有elasticsearch

參考https://www.jianshu.com/p/028cf0008ca5

3. IO模型

   這5種IO模型就是JVM和內核的交互的過程,下面2篇文章比較好理解,就不在單獨記錄了
https://blog.csdn.net/ZWE7616175/article/details/80591587
https://blog.csdn.net/jiangzhexi/article/details/106416159
Epoll的本質(內部實現原理)https://www.cnblogs.com/looyee/articles/12964911.html
select、poll和epoll的總結對比 https://blog.csdn.net/qq_35976351/article/details/85228002

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章