第一章 java的I/O演進之路

1.1、I/O基礎入門

  • 沒有數據緩衝區,I/O性能存在問題
  • 沒有C或者C++中的Channel概念,只有輸入和輸出流
  • 同步阻塞式I/O通信(BIO),通常會導致通信現成被長時間阻塞
  • 支持的字符集有限,硬件可移植性不好

1.1.1、Linux模型I/O模型簡介

Linux的內核將所有外部設備都看做一個文件來操作,對一個文件的讀寫操作會調用內核提供的系統命令,返回一個file descriptor(fd,文件描述符)。
根據UNIX網絡編程對I/O模型的分類,UNIX提供了5中I/O模型,分別如下:

  1. 阻塞I/O模型
    最常用的I/O模型就是阻塞I/O模型
    在這裏插入圖片描述
  2. 非阻塞I/O模型非阻塞I/O模型
    在這裏插入圖片描述
  3. I/O複用模型
    Linux提供select/poll,進程通過將一個或者多個fd傳遞給select或poll系統調用,阻塞在select操作上,這樣select/poll可以幫我們偵測多個fd是否處於就緒系統。select/poll是順序掃描fd是否就緒,而且支持的fd數量有限,因此它的使用受到了一些制約。
    Linxu提供了epoll系統調用,epoll使用基於事件驅動方式代替順順掃描,因此性能更高。當有fd就緒時,立即回調函數rollback
    在這裏插入圖片描述
  4. 信號驅動模型
    在這裏插入圖片描述
  5. 異步I/O
    告知內核啓動某個操作,並讓內核在整個操作完成後通知我們
    在這裏插入圖片描述
  • 異步I/O和信號驅動的區別
  1. 信號驅動I/O由內核通知我們何時開始一個I/O操作
  2. 異步I/O模型由內核通知我們I/O操作何時已經完成

1.1.2、I/O多路複用技術

I/O多路複用技術通過把多個I/O的阻塞複用通一個select的阻塞上,從而使得系統在單線程的情況下可以同時處理多個客戶端請求。

I/O多路複用的主要應用場景如下:

  • 服務器需要同時處理多個處於監聽狀態或者多個連接狀態的套接字
  • 服務器需要同時處理多種網絡協議的套接字

目前支持I/O多路複用的系統調用有 select、pselect、poll、epoll
爲了克服select的缺點,epoll與select的原理比較類似,爲了克服select缺點,epoll作爲了很多重大改進,現總結如下。

  1. 支持一個進程打開的socket描述符(FD)不受限制(僅受限於操作系統的最大文件句柄數)。
  2. I/O效率不會隨着FD數目的增加而線性下降。
  3. 使用mmap加速內核與用戶空間的消息傳遞
  4. epoll的API更加簡單。

1.2、java的I/O演進

1.3、總結

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