UNIX网络编程的5种IO模型
1、阻塞I/O模型:最常用的I/O模型就是阻塞I/O模型。我們以套接字接口為例來講解此模型,在進(jìn)程空間中調(diào)用recvfrom,其系統(tǒng)調(diào)用直到數(shù)據(jù)包到達(dá)且被復(fù)制到應(yīng)用進(jìn)程的緩沖區(qū)中或者發(fā)生錯(cuò)誤是才返回,在此期間一直會(huì)等待,進(jìn)程在從調(diào)用recvfrom開始到它返回的整段時(shí)間內(nèi)都是阻塞的,因?yàn)楸环Q為阻塞I/O模型。如圖1-1所示
2、非阻塞I/O模型:recvfrom從應(yīng)用層到內(nèi)核的時(shí)候,如果該緩沖區(qū)沒有數(shù)據(jù)的話,就直接返回一個(gè)EWOULDBLOCK錯(cuò)誤,一般都對(duì)非阻塞I/O模型進(jìn)行輪詢檢查這個(gè)狀態(tài),看內(nèi)核是不是有數(shù)據(jù)到來,如圖1-2所示
?3、I/O復(fù)用模型:Linux提供select/poll,進(jìn)程通過將一個(gè)或者多個(gè)fd傳遞給select或者poll系統(tǒng)調(diào)用,阻塞在select操作上,這樣select/poll可以幫我們偵測(cè)多個(gè)fd是否處于就緒狀態(tài)。select/poll是順序掃描fd是否就緒,而且支持的fd數(shù)量有限,因?yàn)樗氖褂檬艿揭恍┲萍s。Linux還提供了epoll系統(tǒng)調(diào)用,epoll使用基于事件驅(qū)動(dòng)的方式代替順序掃描,因此性能更高。當(dāng)有fd就緒的時(shí)候,立即調(diào)用回調(diào)函數(shù),如圖1-3所示
4、信號(hào)啟動(dòng)I/O模型:首先開啟套接字信號(hào)驅(qū)動(dòng)I/O功能,并通過系統(tǒng)調(diào)用sigaction執(zhí)行一個(gè)信號(hào)處理函數(shù)(此系統(tǒng)調(diào)用立即返回,進(jìn)程繼續(xù)工作,它是非阻塞)。當(dāng)數(shù)據(jù)準(zhǔn)備就緒的時(shí),就為該進(jìn)程生成一個(gè)SIGIO信號(hào),通過信號(hào)回調(diào)通知應(yīng)用程序調(diào)用recvfrom來讀取數(shù)據(jù),并通知主循環(huán)函數(shù)處理數(shù)據(jù),如圖1-4所示
5、異步I/O:告知內(nèi)核啟動(dòng)某個(gè)操作,并讓內(nèi)核在整個(gè)操作完成后(包括將數(shù)據(jù)從內(nèi)核復(fù)制到用戶自己的緩沖區(qū))通知我們。這種模型與信號(hào)驅(qū)動(dòng)模型的主要區(qū)別是:信號(hào)驅(qū)動(dòng)I/O由內(nèi)核通知我們何時(shí)可以開始一個(gè)I/O操作;異步I/O模型由內(nèi)核通知我們I/O操作何時(shí)完成,如圖1-5所示
?
?
?
總結(jié)
以上是生活随笔為你收集整理的UNIX网络编程的5种IO模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php家乡介绍网页,家乡网站设计与实现.
- 下一篇: 张小龙《微信背后的产品观》