多路 IO 復用模型
多路 IO 復用,有時也稱為事件驅動 IO。它的基本原理就是有個函數會不斷地輪詢所負責的所有 socket ,當某個 socket有數據到達了,就通知用戶進程。IO 復用模型的流程如圖:
當用戶進程調用了 select ,那么整個進程會被阻塞,而同時,內核會 “監視” 所有 select 負責的 socket ,當任何一個 socket中的數據準備好了, select 就會返回。這個時候用戶進程再調用 read 操作,將數據從內核拷貝到用戶進程。
這個模型和阻塞 IO 的模型其實并沒有太大的不同,事實上還更差一些 因為這里需要使用兩個系統調用,而阻塞 IO 只調用了一個系統調用recvfrom,用 select 的優勢在于它可以同時處理多個連接。
如果處理的連接數不是很高的話,使用 select/epoll Web server 定比使用多線程的阻塞 IO Web server性能更好,可能延遲還更大;select/poll 的優勢并不是對于單個連接能處理得更快,而是在于能處理更多的連接。
異步 IO 模型
上面是異步 IO 模型。
用戶進程發起 read 操作之后,立刻就可以開始去做其他的事;而另一方面,從內核的角度,當它收到一個異步的 read請求操作之后,首先會立刻返回,所以不會對用戶進程產生任何阻塞。
然后,內核會等待數據準備完成,然后將數據拷貝到用戶內存中,當這一切都完成之后,內核會給用戶進程發送一個信號,返回 read 操作已完成的信息。
調用阻塞 IO 一直阻塞住對應的進程直到操作完成,而非阻塞 IO 在內核還在準備數據的情況下會立刻返回。兩者的區別就在于同步 IO 進行 IO操作時會阻塞進程。
非阻塞 IO 在執行 recvfrom 這個系統調用的時候,如果內核的數據沒有準備好,這時候不會阻塞進程。但是當內核中數據準備好時,recvfrom會將數據從內核拷貝到用戶內存中,這個時候進程則被阻塞。
而異步 IO 則不 樣,當進程發起 IO 操作之后,就直接返回,直到內核發送一個信號,告訴進程 IO
已完成,則在這整個過程中,進程完全沒有被阻塞。
-
IO
+關注
關注
0文章
461瀏覽量
39283 -
驅動
+關注
關注
12文章
1851瀏覽量
85497 -
網絡
+關注
關注
14文章
7597瀏覽量
89110 -
模型
+關注
關注
1文章
3298瀏覽量
49072
發布評論請先 登錄
相關推薦
評論