java IO 模型--快速分清 同步|阻塞
阿新 • • 發佈:2019-04-07
實現 需要 不可 寫入 阻塞io soc 線程數 block iops
IO 介紹
IO 模型
IO請求 分為兩個階段:等待資源 和 使用資源;
IO請求:一般需要請求特殊資源(如 磁盤、RAM 或文件),當資源被上一個使用者使用沒有釋放的時候, IO請求會被阻塞,直到資源可用。
等待資源 階段有兩種策略:
- 阻塞:當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系統的方方面面。
一些概念: 1、 IOPS:每秒處理的IO 數量。 2、多路復用技術:
信號通路的帶寬大於單一信號的數據量大小,為了有效利用帶寬,希望信號通路可以一次性傳遞多個信號數據,這就是多路復用技術。 nio中就是,一個線程可以監聽多個通信信道(不同的socket),所以是多個通信信道復用一個監聽|輪詢線程,即多路復用
分類:頻分多路復用 和 時分多路復用
IO 組合方式:
java IO 模型--快速分清 同步|阻塞