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