日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

io操作是指什么_各种IO模型,一篇打尽

發布時間:2024/9/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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模型,一篇打尽的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。