IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
文章目錄
- IO模型
- 阻塞IO
- 非阻塞IO
- 信號(hào)驅(qū)動(dòng)IO
- 多路復(fù)用IO
- 異步IO
IO模型
根據(jù)各自的特性不同,IO模型被分為阻塞IO、非阻塞IO、信號(hào)驅(qū)動(dòng)IO、異步IO、多路復(fù)用IO五類。
最主要的兩個(gè)區(qū)別就是阻塞與非阻塞,同步與異步。
阻塞與非阻塞
阻塞與非阻塞最主要的區(qū)別就是程序在等待調(diào)用結(jié)果時(shí)的狀態(tài)。
- 阻塞: 為了完成一個(gè)功能發(fā)起調(diào)用,如果不具備完成功能的條件,則調(diào)用會(huì)一直等待
- 非阻塞: 為了完成一個(gè)功能發(fā)起調(diào)用,如果不具備完成功能的條件,則立即報(bào)錯(cuò)返回
同步與異步
并發(fā)模型和I/O模型都有同步/異步的概念:
-
并發(fā)模式中兩者最主要的區(qū)別就是功能完成的流程是否是順序化的,
-
I/O模型中兩者最主要的區(qū)別是注冊(cè)的是就緒事件還是完成事件,完成I/O操作的是用戶程序自身還是內(nèi)核系統(tǒng)。
-
同步: 功能完成的流程是順序化的。注冊(cè)就緒事件,讀寫事件由自身完成。
-
異步: 功能完成的流程是不確定的,注冊(cè)完成事件,讀寫事件由內(nèi)核完成。
下列五種IO模型,從前往后處理的效率逐漸增加,對(duì)資源的利用也增加充分,但是流程也越來(lái)越復(fù)雜。
阻塞IO
發(fā)起IO調(diào)用,如果不具備IO條件,則一直等待直到條件就緒。以 recvfrom 為例:(recvfrom:UDP數(shù)據(jù)的讀寫函數(shù))
- 優(yōu)點(diǎn): 流程以及代碼實(shí)現(xiàn)都非常簡(jiǎn)單,任務(wù)順序操作。
- 缺點(diǎn): 任務(wù)處理效率較低,無(wú)法充分利用資源。
非阻塞IO
發(fā)起一個(gè)IO調(diào)用,如果不具備IO條件,則立即報(bào)錯(cuò)返回(無(wú)需等待),繼續(xù)執(zhí)行其他命令。通過(guò)一個(gè)循環(huán)來(lái)不斷發(fā)起IO請(qǐng)求,直到條件就緒。
- 優(yōu)點(diǎn): 與阻塞IO相比較來(lái)說(shuō),利用了等待的時(shí)間去做了其他的事情,對(duì)資源的利用更加充分。
- 缺點(diǎn): 與阻塞IO對(duì)比,IO調(diào)用需要循環(huán)發(fā)起,流程更加復(fù)雜。 并且如果IO條件就緒了,也要等待同一個(gè)調(diào)用上一輪循環(huán)結(jié)束后進(jìn)入當(dāng)前循環(huán),才能進(jìn)行處理,這就導(dǎo)致了 IO 不夠?qū)崟r(shí)。
非阻塞IO可以通過(guò) fcntl函數(shù) 設(shè)置描述符狀態(tài)來(lái)實(shí)現(xiàn):
void SetNoBlock(int fd) {int flag = fcntl(fd, F_GETFL, 0);flag |= O_NONBLOCK;fcntl(fd, F_SETFL, flag); }信號(hào)驅(qū)動(dòng)IO
自定義一個(gè)IO就緒的信號(hào),當(dāng)IO就緒時(shí)就發(fā)出這個(gè)信號(hào)。在沒(méi)有收到信號(hào)時(shí),可以繼續(xù)處理其他事情,一旦收到信號(hào),就會(huì)中斷當(dāng)前操作,來(lái)優(yōu)先處理IO事件。程序沒(méi)有阻塞階段。
- 優(yōu)點(diǎn): 相較于非阻塞IO,仍具有資源利用更加充分的優(yōu)勢(shì);并且信號(hào)到來(lái)后就直接強(qiáng)行中斷進(jìn)行處理,更加實(shí)時(shí)。
- 缺點(diǎn): 因?yàn)樾枰远x信號(hào),又要有主控流程也要有信號(hào)處理流程,并且還需要考慮信號(hào)是否可靠導(dǎo)致的事件丟失情況,流程會(huì)更加的復(fù)雜。
多路復(fù)用IO
用于對(duì)大量的IO事件進(jìn)行監(jiān)控,能夠讓用戶只針對(duì)就緒了指定事件(可讀、可寫、異常) 的IO進(jìn)行操作。只針對(duì)就緒的描述符進(jìn)行操作,避免了阻塞,并且提高了效率。
值得一提的是,I/O復(fù)用函數(shù)對(duì)I/O本身的讀寫操作是阻塞的,他們能提高程序效率的原因在于具有同時(shí)監(jiān)聽(tīng)多個(gè)I/O事件的能力。
在 Linux 下,操作系統(tǒng)提供了三種模型:select模型、poll模型、epoll模型。
異步IO
IO處理的順序不確定,整個(gè)IO的過(guò)程(等待 + 數(shù)據(jù)拷貝)由操作系統(tǒng)來(lái)完成而并非用戶。程序沒(méi)有阻塞階段。
流程:
- 優(yōu)點(diǎn): 對(duì)資源的利用最為充分, 以最高的效率進(jìn)行任務(wù)的處理。
- 缺點(diǎn): 資源消耗較高, 流程最為復(fù)雜。
總結(jié)
以上是生活随笔為你收集整理的IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 谷歌浏览器安装草料二维码插件
- 下一篇: Kindle fire 刷机