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