多路 IO 復(fù)用模型
多路 IO 復(fù)用,有時(shí)也稱為事件驅(qū)動(dòng) IO。它的基本原理就是有個(gè)函數(shù)會(huì)不斷地輪詢所負(fù)責(zé)的所有 socket ,當(dāng)某個(gè) socket有數(shù)據(jù)到達(dá)了,就通知用戶進(jìn)程。IO 復(fù)用模型的流程如圖:
當(dāng)用戶進(jìn)程調(diào)用了 select ,那么整個(gè)進(jìn)程會(huì)被阻塞,而同時(shí),內(nèi)核會(huì) “監(jiān)視” 所有 select 負(fù)責(zé)的 socket ,當(dāng)任何一個(gè) socket中的數(shù)據(jù)準(zhǔn)備好了, select 就會(huì)返回。這個(gè)時(shí)候用戶進(jìn)程再調(diào)用 read 操作,將數(shù)據(jù)從內(nèi)核拷貝到用戶進(jìn)程。
這個(gè)模型和阻塞 IO 的模型其實(shí)并沒有太大的不同,事實(shí)上還更差一些 因?yàn)檫@里需要使用兩個(gè)系統(tǒng)調(diào)用,而阻塞 IO 只調(diào)用了一個(gè)系統(tǒng)調(diào)用recvfrom,用 select 的優(yōu)勢在于它可以同時(shí)處理多個(gè)連接。
如果處理的連接數(shù)不是很高的話,使用 select/epoll Web server 定比使用多線程的阻塞 IO Web server性能更好,可能延遲還更大;select/poll 的優(yōu)勢并不是對于單個(gè)連接能處理得更快,而是在于能處理更多的連接。
異步 IO 模型
上面是異步 IO 模型。
用戶進(jìn)程發(fā)起 read 操作之后,立刻就可以開始去做其他的事;而另一方面,從內(nèi)核的角度,當(dāng)它收到一個(gè)異步的 read請求操作之后,首先會(huì)立刻返回,所以不會(huì)對用戶進(jìn)程產(chǎn)生任何阻塞。
然后,內(nèi)核會(huì)等待數(shù)據(jù)準(zhǔn)備完成,然后將數(shù)據(jù)拷貝到用戶內(nèi)存中,當(dāng)這一切都完成之后,內(nèi)核會(huì)給用戶進(jìn)程發(fā)送一個(gè)信號,返回 read 操作已完成的信息。
調(diào)用阻塞 IO 一直阻塞住對應(yīng)的進(jìn)程直到操作完成,而非阻塞 IO 在內(nèi)核還在準(zhǔn)備數(shù)據(jù)的情況下會(huì)立刻返回。兩者的區(qū)別就在于同步 IO 進(jìn)行 IO操作時(shí)會(huì)阻塞進(jìn)程。
非阻塞 IO 在執(zhí)行 recvfrom 這個(gè)系統(tǒng)調(diào)用的時(shí)候,如果內(nèi)核的數(shù)據(jù)沒有準(zhǔn)備好,這時(shí)候不會(huì)阻塞進(jìn)程。但是當(dāng)內(nèi)核中數(shù)據(jù)準(zhǔn)備好時(shí),recvfrom會(huì)將數(shù)據(jù)從內(nèi)核拷貝到用戶內(nèi)存中,這個(gè)時(shí)候進(jìn)程則被阻塞。
而異步 IO 則不 樣,當(dāng)進(jìn)程發(fā)起 IO 操作之后,就直接返回,直到內(nèi)核發(fā)送一個(gè)信號,告訴進(jìn)程 IO
已完成,則在這整個(gè)過程中,進(jìn)程完全沒有被阻塞。
-
IO
+關(guān)注
關(guān)注
0文章
431瀏覽量
39023 -
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1814瀏覽量
85064 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7449瀏覽量
88472 -
模型
+關(guān)注
關(guān)注
1文章
3081瀏覽量
48593
發(fā)布評論請先 登錄
相關(guān)推薦
評論