io操作是指什么_各种IO模型,一篇打尽
一、阻塞/非阻塞-同步非同步
同步/異步
同步請求:A調用B,B的處理是同步的,在處理完之前他不會通知A,只有處理完之后才會明確的通知A;
異步請求:A調用B,B的處理是異步的,B在接到請求后先告訴A我已經接到請求了,然后異步去處理,處理完之后通過回調等方式再通知A。
同步/異步區別
同步和異步最大的區別就是被調用方的執行方式和返回時機;
同步指的是被調用方做完事情之后再返回;
異步指的是被調用方先返回,然后再做事情,做完之后再想辦法通知調用方。
阻塞/非阻塞
阻塞請求:A調用B,A一直等著B的返回,別的事情什么也不干;
非阻塞請求:A調用B,A不用一直等著B的返回,先去忙別的事情了。
阻塞/非阻塞區別
阻塞和非阻最大的區別就是在被調用方返回結果之前的這段時間內,調用方是否一直等待。
阻塞指的是調用方一直等待,別的事情什么都不做;
非阻塞指的是調用方先去忙別的事情。
阻塞/非阻塞和同步/異步的區別
阻塞、非阻塞和同步、異步其實針對的對象是不一樣的
阻塞、非阻塞說的是調用者
同步、異步說的是被調用者
二、Linux(UNIX)操作系統五種IO模型
什么是IO
拿一次磁盤文件讀取為例,我們要讀取的文件是存儲在磁盤上的,我們的目的是把它讀取到內存中。可以把這個步驟簡化成把數據從硬件(硬盤)中讀取到用戶空間中。
一次完整的釣魚(IO)操作,是魚(文件)從魚塘(硬盤)中轉移(拷貝)到魚簍(用戶空間)的過程。
阻塞IO模型
阻塞 I/O 是最簡單的 I/O 模型,一般表現為進程或線程等待某個條件,如果條件不滿足,則一直等下去。條件滿足,則進行下一步操作。
應用程序進行 recvfrom 系統調用時將阻塞在此調用,直到該套接字上有數據并且復制到用戶空間緩沖區。該模式一般配合多線程使用,應用進程每接收一個連接,為此連接創建一個線程來處理該連接上的讀寫以及業務處理。
非阻塞IO模型
應用進程與內核交互,目的未達到之前,不再一味的等著,而是直接返回。然后通過輪詢的方式,不停的去問內核數據準備有沒有準備好。如果某一次輪詢發現數據已經準備好了,那就把數據拷貝到用戶空間中。
應用進程通過 recvfrom 調用不停的去和內核交互,直到內核準備好數據。如果沒有準備好,內核會返回error,應用進程在得到error后,過一段時間再發送recvfrom請求。在兩次發送請求的時間段,進程可以先做別的事情。
IO復用模型
多個進程的IO可以注冊到同一個管道上,這個管道會統一和內核進行交互。當管道中的某一個請求需要的數據準備好之后,進程再把對應的數據拷貝到用戶空間中。
IO多路轉接是多了一個select函數,多個進程的IO可以注冊到同一個select上,當用戶進程調用該select,select會監聽所有注冊好的IO,如果所有被監聽的IO需要的數據都沒有準備好時,select調用進程會阻塞。
信號驅動IO模型
應用進程在讀取文件時通知內核,如果某個 socket 的某個事件發生時,請向我發一個信號。在收到信號后,信號對應的處理函數會進行后續處理。
異步IO模型
應用進程把IO請求傳給內核后,完全由內核去操作文件拷貝。內核完成相關操作后,會發信號告訴應用進程本次IO已經完成。
5種IO模型對比
三、Java中的三種IO模型
java IO模型和操作系統IO模型關系
Java中的IO還是借助操作系統的IO模型的,只不過是對操作系統IO模型的封裝而已啦。
可以把Java中的BIO、NIO和AIO理解為是Java語言對操作系統的各種IO模型的封裝。
java中提供的IO有關的API,在文件處理的時候,其實依賴操作系統層面的IO操作實現的。
比如在Linux 2.6以后,Java中NIO和AIO都是通過epoll來實現的,而在Windows上,AIO是通過IOCP來實現的。
阻塞IO(BIO)
同步阻塞I/O模式,數據的讀取寫入必須阻塞在一個線程內等待其完成。
BIO (Blocking I/O):有一排水壺在燒開水,BIO的工作模式就是,叫一個線程停留在一個水壺那,直到這個水壺燒開,才去處理下一個水壺。但是實際上線程在等待水壺燒開的時間段什么都沒有做。
BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO
非阻塞IO(NIO)
同時支持阻塞與非阻塞模式,但主要是使用同步非阻塞IO。
NIO (New I/O):NIO的做法是叫一個線程不斷的輪詢每個水壺的狀態,看看是否有水壺的狀態發生了改變,從而進行下一步的操作。
異步IO(AIO)
異步非阻塞I/O模型。
異步IO指的是異步非阻塞IO。
AIO ( Asynchronous I/O):為每個水壺上面裝了一個開關,水燒開之后,水壺會自動通知我水燒開了。
四、Reactor 模式
Reactor 模式跟 IO 模型關系
Reactor 模式跟 IO 模型中的 IO 多路復用模型非常相似
IO 多路復用模型可以看成是 Reactor 模式在 IO 模型上的應用
Reactor 模式在進程-線程模型上的應用。
1. 單進程單線程
只有一個進程,監聽套接字和連接套接字上的事件都由 Select 來處理。
過程
(1) 如果有建立連接的請求過來,Acceptor 負責接受并與之建立連接,同時將連接套接字加入 Select 進行監聽。
(2) 如果某個連接上有讀事件則進行 Read->業務處理->Write 等操作。
(3) 如此循環反復。
缺點:會有阻塞,在進行業務處理的時候不能進行其他操作:如建立連接,讀取其他套接字上的數據等。
2. 單進程多線程
與單進程單線程類似,不同的是該模型將業務處理放在線程中,進程就不會阻塞在業務處理上。
優點:比較完美的進程-線程模型,在 Java 實現中復雜度也不高,很多網絡庫都是基于此,比如 Netty 。
3. 多進程單線程
與非 Reactor 模式中的多進程單線程相似,只是本模式在子進程中使用了 IO 多路復用,實用性一下就上來了。大名鼎鼎的 nginx 就采用這種進程-線程模型。
缺點:子進程還是會阻塞在業務處理上。
4. 多進程多線程
5. 主從進程多線程
前面幾種 Reactor 模式的進程-線程模型中,連接的建立和連接的讀寫都是在同一進程中。本模型中將連接的建立和連接讀寫放在不同的進程中。
過程
(1) 主進程在監聽套接字上 Select 阻塞,一旦有請求過來則與之建立連接,并將連接套接字傳遞給從進程。
(2) 從進程在連接套接字上 Select 阻塞,一旦連接上有數據過來則進行 Read,并將業務通過線程來處理。如果有必要還會向連接 Write 數據。
五、常見組件使用的模型
netty-主從-多線程
tomcat-單進程多線程
redis-單進程單線程
ngnix-多進程單線程
總結
以上是生活随笔為你收集整理的io操作是指什么_各种IO模型,一篇打尽的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html引入jquery_jQuery
- 下一篇: docker pull 下载一半_Doc