一章 Java IO 的演進之路
java基礎入門 IO基礎知識
-
1.4之前的版本
-
沒有數據緩衝區,
-
沒有Channel概念
-
同步阻塞I/O通信(BIO)導致通信線程被長時間阻塞
-
支持的字符集有限,硬件可移植性不好
-
-
Linux網絡I/O模型簡介
-
Linux的內核將所有外部設備都看做一個文件來操作,對一個文件的讀寫操作會調用內核提供的系統命令,返回一個file descriptor fd 文件描述符,而對一個socket的讀寫也會有相應的描述符,稱爲socketfd socket描述符,描述符就是一個數字,它指向內核中的一個結構體
-
Linux 提供了5種I/O模型
-
阻塞I/O模型
-
在進程空間中調用recvfrom,其系統調用直到數據包到達且被複制到進程的緩衝區中或者發生錯誤時才返回,在此期間會一直等待。
-
-
非阻塞I/O模型
-
recv從應用層到內核的時候,如果該緩衝區沒有數據的化,就直接返回一個ewoludblock錯誤,一般都會非阻塞I/O模型進行輪詢檢查這個狀態,看內核是不是又數據到來
-
-
I/O複用模型
-
Linux提供了select/poll,進程通過將一個或多給fd傳遞給select或poll系統調用。阻塞在select操作上,這樣可以幫助我們偵測多給fd是否處於就緒狀態。順序掃描fd是否就緒,而且支持的fd數量有限
-
epoll系統調用,epoll使用基於事件驅動方式代替順序掃描,性能更高,當又fd就緒時,立即回調函數 rollback
-
-
信號驅動I/O模型
-
開啓套接口信號驅動I/O功能,並通過系統調用sigaction指向一個信號處理函數(此係統調用立即返回,進程繼續工作,非阻塞)。當數據準備就緒時,就爲該進程生成一個sigio信號,通過信號回調,通知應用程序調用recvfrom來讀取數據,並通知主循環函數處理數據
-
-
異步I/O
-
告知內核啓動某個操作,並讓內核在整個操作完成後(包括將數據從內核複製到用戶自己的緩衝區)通知我們。
-
-
-
-
I/O多路複用技術
-
I/O多路複用技術通過把多個I/O的阻塞複用到同一個select的阻塞上,從而使得系統在單線的情況下可以同時處理多個請求的客戶端請求。
I/O多路複用的最大優勢是系統開銷小,系統不需要創建新的額外進程或者線程,
-
應用場景
-
服務器需要同時處理多個監聽狀態或者多個來連接狀態的套接字
-
服務器需要同時處理多種網絡協議的套接字
-
支持I/O多路複用的系統調用又select,pselect,poll,epoll
-
-
epoll
-
1.支持一個進程打開的socket描述符fd不受限制(僅受限於操作系統的最大文件句柄數)
-
cat /proc/sys/fs/file-max 查看
-
select 默認1024
-
-
2.IO效率不會隨着FD數碼的增加而線性下降
-
select/poll每次調用都會進行線性掃描全部的集合,導致效率線性下降
-
epoll 只會對“活躍”的socket進行操作
-
在內核實現中,epoll是根據每個fd上面的callback函數實現的,那麼只有活躍的socket纔會主動的去調用callback函數,
-
epoll實現了一個僞AIO,
-
-
-
3.使用mmap加速內核與用戶空間的消息傳遞
-
無論是select,poll,epoll都需內核把FD消息通知給用戶空間,如何避免不必要的內存複製就顯的非常重要,epoll是通過內核和用戶空間Mmap同一塊內存實現的
-
-
4.epoll的API更加簡單
-
創建一個epoll描述符,添加一個監聽事件,阻塞等待所監聽的事件發生,關閉描述符
-
-
-
java的IO演進
-
環境
-
採用Java BIO開發的服務器端軟件,只有通過硬件的不斷擴容來滿足,高併發,低時延,極大的增加了成本。隨着集規模的不斷膨脹,系統的可維護性也面臨巨大的挑戰。
-
-
發展簡史
-
jdk1.0 - 1.3 非常原始
-
2002 1.4 NIO JSR-51 java.nio
-
進行異常I/O操作的緩存區 ByteBuffer;
-
進行異步I/O操作的管道 Pipe;
-
進行各種I/O操作的channel,包括ServerSocketChannel,和SocketChannel
-
各種字符集的編碼能力和解碼能力
-
實現非阻塞I/O操作的多路複用器selector
-
perl正則表達式庫
-
文件通道FileChannel
-
-
20011 1.7 NIO2 JSR-203
-
提供了批量活動文件的屬性的API
-
提供了AIO
-
JSR-51定義的通道功能,
-
-
總結
1.我們瞭解了5種網絡模型,
2.學習了I/O多路複用技術的基礎
借鑑書籍:
《權威指南》李林峯