IO模型和java IO

常見IO模型有以下幾種

1.最簡單的阻塞IO模型:用戶線程請求數據,內核準備數據,將數據從內核複製到用戶空間,從請求阻塞到獲取數據,顯然對資源利用率低

    用餐館的例子來解釋:用戶點菜,廚師準備好菜品,將菜給到用戶,期間用戶一直在等待,無法做別的事


2.非阻塞IO模型:用戶線程請求數據,並且直接返回內核準備數據結果,如爲準備好,則輪詢結果,當數據準備好後,再將數據複製到用戶空間,該模型對資源消耗較大

   用餐館的例子來解釋:用戶點菜,然後每隔一段時間,詢問一下菜品是否做好,若沒做好則做自己的事情


3.IO複用模型:用戶線程通過阻塞在select/poll,來監控多個IO請求,當某個IO請求準備就緒後,進行數據複製操作。此模型雖然看似效率低,但是好處是能夠在同一個線程進行多個IO。

用餐館的例子來解釋:添加一個服務員,將用戶點的菜品告知服務員,服務員阻塞輪詢菜品準備情況,當某個菜品準備完成,告知用戶,期間用戶可以做自己的事情。

在java NIO中使用Reactor模型來實現多路IO複用模型


Handles:標識通過操作系統管理的各種資源,包括套接字、打開文件、鎖、定時器等,在Unix系統中是文件描述符,在Windows系統中是句柄。

Initiation Dispatcher:用於管理Event Handler,即EventHandler的容器,用以註冊、移除EventHandler等;另外,它還作爲Reactor模式的入口調用Synchronous Event Demultiplexer的select方法以阻塞等待事件返回,當阻塞等待返回時,根據事件發生的Handle將其分發給對應的Event Handler處理,即回調EventHandler中的handle_event()方法。

Synchronous Event Demultiplexer:阻塞等待一系列的Handle中的事件到來,如果阻塞等待返回,即表示在返回的Handle中可以不阻塞的執行返回的事件類型。這個模塊一般使用操作系統的select來實現。在Java NIO中用Selector來封裝,當Selector.select()返回時,可以調用Selector的selectedKeys()方法獲取Set<SelectionKey>,一個SelectionKey表達一個有事件發生的Channel以及該Channel上的事件類型。

EventHandler定義事件處理方法:handle_event(),以供InitiationDispatcher回調使用

因爲select是阻塞的,所以此種模型並不是真正的異步非阻塞io,異步非阻塞IO需要操作系統的支持,異步IO和多路複用的IO最大的一個區別在於,多路複用IO是在數據準備好後通知用戶線程,而異步IO是在將數據複製至用戶空間後通知用戶線程。


Java IO與NIO

1.同步阻塞IO:一個請求對應一個應答模型,每一個請求,開啓一個線程處理

2.僞異步IO:添加一個線程池,從而減小線程開銷

3.非阻塞NIO:利用selector的多路複用IO模型,使用單線程管理




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