网络编程模型综述 之 UNIX网络I/O模型
阻塞I/O
???????? Socket設(shè)置為阻塞模式,當(dāng)socket不能立即完成I/O操作時(shí),進(jìn)程或線程進(jìn)入等待狀態(tài),直到操作完成。如下圖:
????????
???????? 這種模型非常經(jīng)典,也被廣泛使用,優(yōu)勢(shì)在于非常簡(jiǎn)單,等待的過(guò)程中占用的系統(tǒng)資源微乎其微,程序調(diào)用返回時(shí),必定可以拿到數(shù)據(jù);
???????? 但簡(jiǎn)單也帶來(lái)一些缺點(diǎn),程序在數(shù)據(jù)到來(lái)并準(zhǔn)備好以前,不能進(jìn)行其他操作,需要有一個(gè)線程專(zhuān)門(mén)用于等待,這種代價(jià)對(duì)于需要處理大量連接的服務(wù)器而言,是很難接受的;
非阻塞I/O
???????? 把socket設(shè)置成非阻塞模式,與阻塞模式不同的是:無(wú)數(shù)據(jù)時(shí),也不會(huì)進(jìn)入等待,而是立即返回特定錯(cuò)誤,如下圖:
????????
這種模式在沒(méi)有數(shù)據(jù)可以接收時(shí),可以進(jìn)行其他的一些操作,比如有多個(gè)socket時(shí),可以去查看其他socket有沒(méi)有可以接收的數(shù)據(jù);
實(shí)際應(yīng)用中,這種I/O模型的直接使用并不常見(jiàn),因?yàn)樗枰煌5牟樵?#xff0c;而這些查詢大部分會(huì)是無(wú)必要的調(diào)用,白白浪費(fèi)了系統(tǒng)資源;
非阻塞I/O應(yīng)該算是一個(gè)鋪墊,為I/O復(fù)用和信號(hào)驅(qū)動(dòng)奠定了非阻塞使用的基礎(chǔ)。
I/O復(fù)用
???????? I/O復(fù)用模型能讓一個(gè)或多個(gè)socket可讀或可寫(xiě)準(zhǔn)備好時(shí),應(yīng)用能被通知到;I/O復(fù)用模型早期用select實(shí)現(xiàn),它的工作流程如下圖:
????
???????? 這種模型的使用場(chǎng)景一般有這樣一個(gè)共同特點(diǎn):都有多個(gè)socket需要處理,這樣能在獲取I/O事件時(shí)復(fù)用同一個(gè)等待機(jī)制。比如監(jiān)聽(tīng)服務(wù)器,既要處理監(jiān)聽(tīng)的socket,又要處理連接的socket。
???????? I/O復(fù)用是應(yīng)用場(chǎng)景較多的一種模式,socket連接數(shù)多時(shí),大多會(huì)采用它。除了select以外,I/O復(fù)用的還可以用poll、epoll、kqueue(freebsd)來(lái)實(shí)現(xiàn),后兩者在處理大量連接時(shí)性能上有很大的提高。
信號(hào)驅(qū)動(dòng)
???????? 信號(hào)驅(qū)動(dòng)模型是在socket準(zhǔn)備好的時(shí)候用信號(hào)的方式進(jìn)行通知,然后應(yīng)用程序從內(nèi)核讀取數(shù)據(jù)。
???????? 然而,對(duì)于socket,SIGIO觸發(fā)意味著多種可能,對(duì)于UDP有兩種,對(duì)于TCP,則有7種,要想?yún)^(qū)分是何種操作引起的signal都是一件困難的事情,所以這種模型很少被實(shí)用,直到內(nèi)核2.3起,引入了POSIX RT-Signal機(jī)制以后,這一現(xiàn)象得到些許改善。
???????
異步I/O
???????? 在標(biāo)準(zhǔn)Unix下,異步I/O是由“aio_XXX”接口提供的,它把一個(gè)信號(hào)和值與每一個(gè)I/O操作關(guān)聯(lián)起來(lái)。異步I/O是POSIX 1003.1b實(shí)時(shí)標(biāo)準(zhǔn)的擴(kuò)展,也屬于Single Unix Specification,version 2。
???????? 幾年前,Ben LaHaise實(shí)現(xiàn)了Linux AIO,合并到了2.5.32的內(nèi)核中,在2.6時(shí)它正式成為標(biāo)準(zhǔn)特性。然而,令人遺憾的是,它目前還不支持對(duì)socket的操作,相信不久以后會(huì)完善起來(lái)。
???????? 異步I/O的模型與I/O復(fù)用和信號(hào)驅(qū)動(dòng)頗有些相似,但最大的區(qū)別是:信號(hào)到達(dá)時(shí),I/O操作已經(jīng)由內(nèi)核完成,應(yīng)用只需要繼續(xù)處理數(shù)據(jù)就好;
???????? POSIX的AIO的操作流程如下:
評(píng)論這張
總結(jié)
以上是生活随笔為你收集整理的网络编程模型综述 之 UNIX网络I/O模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ARM又被盯上!曝三星电子有意收购
- 下一篇: px、dp和sp,这些单位有什么区别?