java IO 模型--快速分清 同步|阻塞

IO 介紹

IO 模型

IO請求 分爲兩個階段:等待資源 和 使用資源;
IO請求:通常須要請求特殊資源(如 磁盤、RAM 或文件),當資源被上一個使用者使用沒有釋放的時候, IO請求會被阻塞,直到資源可用。java

等待資源 階段有兩種策略:編程

  • 阻塞:當IO請求資源沒有準備好的時候,請求阻塞,直到獲得資源的響應(有資源 或者 超時異常);
  • 非阻塞:資源不可用時,IO請求直接返回,返回數據不可用標誌。

使用資源 階段,IO 分爲 同步IO 和 異步IO緩存

  • 同步IO:應用阻塞在發送數據和接受數據階段,直到數據發送或接收完畢 或 失敗返回;
  • 異步IO:應用發送或接受數據後,即返回,數據寫入OS 緩存,由OS 完成數據的發送或接受,完成後,發送成功後失敗標誌給應用。

Unix IO 模型

  • 阻塞IO:等待資源阻塞,使用資源同步;
  • 非阻塞IO:等待資源輪詢,使用資源同步;
  • IO 複用:支持多路複用,等待阻塞在複用選擇器上,使用資源同步的方式;
  • 信號驅動 :等待資源通知,使用資源同步;
  • 異步IO :等待 和 使用 採用通知的方式。

各類IO特色:異步

  • 阻塞IO:使用簡單,可是每一個socket請求會新建一個線程處理,這些線程大多數是沒有運算的,形成線程的膨脹;Java BIO 使用這種方式。
  • 非阻塞IO:採用輪詢的方式,所以不會形成線程的膨脹。java NIO 採用這種方式,大大減小了線程數,可使用一個線程完成對全部socket 的監聽。
    另外,NIO 底層採用多路複用IO的方式(select阻塞,支持多路複用),可是java 的實現接口,採用了輪詢的方式,貌似一種非阻塞的形態。
  • 同步IO:IO 操做結束以後才返回,效率低些,可是編程方式簡單。java BIONIO 都是採用這種方式。
  • 異步IO:因爲異步IO 只是寫入了緩存,由緩存到磁盤成功與否未可知,所以異步IO 至關於把IO操做分紅了兩部分:發起請求,獲取返回結果。所以對應用來講增長了編程複雜性。
    可是異步IO的性能是很是好的,而異步的思想貫穿了IT系統的方方面面。

一些概念: 一、 IOPS:每秒處理的IO 數量。 二、多路複用技術:
信號通路的帶寬大於單一信號的數據量大小,爲了有效利用帶寬,但願信號通路能夠一次性傳遞多個信號數據,這就是多路複用技術。 nio中就是,一個線程能夠監聽多個通訊信道(不一樣的socket),因此是多個通訊信道複用一個監聽|輪詢線程,即多路複用
分類:頻分多路複用 和 時分多路複用socket

IO 組合方式:
IO 組合方式性能

相關文章
相關標籤/搜索