這篇文章主要講解了“怎么理解UNIX的網(wǎng)絡(luò)I/O模型”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么理解UNIX的網(wǎng)絡(luò)I/O模型”吧!
從策劃到設(shè)計(jì)制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、域名注冊(cè)、虛擬空間、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、 網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進(jìn)步。
UNIX的網(wǎng)絡(luò)I/O模型:
概念:
1)linux內(nèi)核對(duì)一個(gè)文件的讀寫操作會(huì)調(diào)用內(nèi)核提供的系統(tǒng)命令,返回一個(gè)文件描述符(file discriptor,簡(jiǎn)稱fd)。
描述符就是一個(gè)數(shù)字,它指向內(nèi)核中的一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體包含了文件路徑等信息。 eg:對(duì)socket的讀寫會(huì)返回一個(gè)描述符 socketfd
2)一次?絡(luò)I/O的讀操作會(huì)包含下面這兩個(gè)階段:1)等待數(shù)據(jù)準(zhǔn)備就緒 2)數(shù)據(jù)從內(nèi)核復(fù)制到用戶空間(即用戶進(jìn)程)。
1)阻塞I/O模型:blocking I/O
概念:用戶進(jìn)程從阻塞的socket中讀取數(shù)據(jù)時(shí),只有當(dāng)數(shù)據(jù)包到達(dá)該socket的接收緩存區(qū)且數(shù)據(jù)被復(fù)制到進(jìn)程空間的緩存區(qū)中 或 發(fā)生錯(cuò)誤時(shí) 才返回,在此期間進(jìn)程會(huì)一直阻塞等待。
說明:默認(rèn)情況下,所有的文件操作都是阻塞的。
缺點(diǎn):客戶端的并發(fā)訪問量比較高時(shí),服務(wù)端需要?jiǎng)?chuàng)建大量的線程來響應(yīng)請(qǐng)求,當(dāng)線程的數(shù)量膨脹后,系統(tǒng)的性能會(huì)急劇下降甚至宕機(jī)。
偽異步I/O模型:
概念:為了解決阻塞I/O模型中需要為每一個(gè)請(qǐng)求都創(chuàng)建一個(gè)線程的問題,服務(wù)端可以使用線程池來實(shí)現(xiàn)一個(gè)偽異步I/O模型。
偽異步I/O模型可能導(dǎo)致的級(jí)聯(lián)故障:某臺(tái)服務(wù)器故障導(dǎo)致響應(yīng)緩慢 -> 線程讀取故障服務(wù)節(jié)點(diǎn)的響應(yīng) -> 所有線程被故障節(jié)點(diǎn)阻塞,后續(xù)IO消息都在隊(duì)列中 -> 隊(duì)列積滿 -> 新的客戶端請(qǐng)求被拒絕,服務(wù)器無響應(yīng)
2)非阻塞I/O模型:nonblocking I/O
概念:用戶進(jìn)程從非阻塞的socket中讀取數(shù)據(jù)時(shí),若該套接字的接收緩存區(qū)中沒有數(shù)據(jù),則內(nèi)核會(huì)直接返回一個(gè)錯(cuò)誤。
說明:一般當(dāng)socket設(shè)為非阻塞狀態(tài)時(shí),用戶進(jìn)程會(huì)輪詢內(nèi)核(eg:循環(huán)調(diào)用recvfrom函數(shù)),直到內(nèi)核有數(shù)據(jù)返回為止,因此會(huì)導(dǎo)致大量cpu資源被占用。
3)I/O復(fù)用模型:I/O multiplexing
概念:將多個(gè)待監(jiān)聽的fd注冊(cè)到多路復(fù)用器(selector)中,注冊(cè)的時(shí)候需要指定該fd上待監(jiān)聽的事件,selector會(huì)一直監(jiān)聽注冊(cè)的fd,當(dāng)fd上有事件發(fā)生時(shí),selector會(huì)做出相應(yīng)的處理。
說明:
與阻塞I/O模型相比,I/O復(fù)用模型是阻塞在select調(diào)用(或poll調(diào)用、或epoll調(diào)用)上,而不是阻塞在真正的I/O操作上。注意:阻塞是針對(duì)發(fā)起方而言的。
獲取fd的狀態(tài):內(nèi)核把fd的信息通知給用戶空間。
水平觸發(fā):若就緒的fd未被用戶進(jìn)程處理,則該fd在下一次查詢時(shí)依舊會(huì)返回。
邊緣觸發(fā):無論就緒的fd是否被用戶進(jìn)程處理,該fd在下一次查詢時(shí)將不再返回。
優(yōu)點(diǎn):
客戶端發(fā)起的連接操作是異步的,故單線程可以同時(shí)處理多個(gè)客戶端的IO請(qǐng)求。系統(tǒng)不需要為每個(gè)客戶端請(qǐng)求都創(chuàng)建一個(gè)線程,這樣大大降低了系統(tǒng)的開銷,
缺點(diǎn):
select調(diào)用:
概念:多路復(fù)用器(selector)由select函數(shù)實(shí)現(xiàn)。
監(jiān)聽機(jī)制:
輪詢注冊(cè)的fd,并根據(jù)fd的狀態(tài)做相應(yīng)的處理:
讀就緒狀態(tài) -> 讀數(shù)據(jù) 并 刪除該讀就緒事件
寫就緒狀態(tài) -> 寫數(shù)據(jù) 并 刪除該寫就緒事件
接收(accept)就緒狀態(tài) -> 注冊(cè)新的讀就緒事件 并 刪除該接收就緒事件
...
獲取fd的狀態(tài):內(nèi)核把所有監(jiān)聽的fd的信息整體復(fù)制到用戶空間。
觸發(fā)方式:水平觸發(fā)。
優(yōu)點(diǎn):與非阻塞式I/O模式相比,select調(diào)用不需要客戶端不斷地發(fā)出請(qǐng)求。
缺點(diǎn):
單個(gè)進(jìn)程可以打開的fd數(shù)量有限,默認(rèn)1024個(gè),如果要修改這個(gè)默認(rèn)值,需要重新編譯內(nèi)核。
每次select調(diào)用都會(huì)線性地掃描所有監(jiān)聽的fd(即:無論fd是否就緒,select都會(huì)去檢查它的狀態(tài)),當(dāng)監(jiān)聽的fd數(shù)量比較多時(shí),I/O效率呈線性下降。
poll調(diào)用:
概念:多路復(fù)用器(selector)由poll函數(shù)實(shí)現(xiàn)。
監(jiān)聽機(jī)制:同select調(diào)用。
觸發(fā)方式:水平觸發(fā)。
優(yōu)點(diǎn):
單個(gè)進(jìn)程可以打開的fd數(shù)量不受限制。
缺點(diǎn):
線性地掃描所有監(jiān)聽的fd,當(dāng)監(jiān)聽的fd數(shù)量比較多時(shí),I/O效率呈線性下降。
epoll調(diào)用:
概念:selector由一系列epoll_函數(shù)實(shí)現(xiàn)。
監(jiān)聽機(jī)制:
當(dāng)fd就緒時(shí),fd會(huì)立即回調(diào)rollback函數(shù)。而那些沒有就緒的fd則不會(huì)回調(diào)rollback函數(shù)。
獲取fd的狀態(tài):使用內(nèi)存映射,不需要把fd的信息從內(nèi)核復(fù)制到用戶空間。
觸發(fā)方式:默認(rèn)是水平觸發(fā),支持邊緣觸發(fā)。
優(yōu)點(diǎn):
單個(gè)進(jìn)程可以打開的fd數(shù)量不受限制。(僅受限于操作系統(tǒng)的最大文件句柄數(shù),1g內(nèi)存的最大文件句柄數(shù)為10w左右)
由于epoll采用的是回調(diào)函數(shù)的方式,而不是線性掃描的方式,故I/O效率不會(huì)隨著fd數(shù)量的增加而線性下降。
使用內(nèi)存映射,避免了內(nèi)存復(fù)制的開銷,加速了內(nèi)核與用戶空間的消息傳遞。
缺點(diǎn):
在連接數(shù)少并且連接都十分活躍的情況下,epoll的性能可能比select和poll的性能差,畢竟epoll的通知機(jī)制需要很多函數(shù)回調(diào)。
4)信號(hào)驅(qū)動(dòng)式I/O模型:SIGIO
開啟套接字信號(hào)驅(qū)動(dòng)IO功能,并通過sigaction系統(tǒng)調(diào)用,執(zhí)行一個(gè)信號(hào)處理函數(shù),當(dāng)數(shù)據(jù)報(bào)準(zhǔn)備好時(shí),內(nèi)核就為該進(jìn)程產(chǎn)生一個(gè)SIGIO信號(hào),用戶進(jìn)程收到這個(gè)信號(hào)后,就可以開始進(jìn)行I/O操作了。
該系統(tǒng)調(diào)用會(huì)立即返回,在等待數(shù)據(jù)報(bào)到達(dá)期間,用戶進(jìn)程不會(huì)被阻塞。
說明:信號(hào)驅(qū)動(dòng)式I/O模型使用的場(chǎng)景比較少。
5)異步I/O模型:POSIX定義的異步IO函數(shù)
調(diào)用異步IO函數(shù),讓內(nèi)核在整個(gè)I/O操作(包括將數(shù)據(jù)從內(nèi)核復(fù)制到用戶自己的緩沖區(qū))完成后通知用戶進(jìn)程。
該系統(tǒng)調(diào)用會(huì)立即返回,在等待I/O操作期間,用戶進(jìn)程不被阻塞。
說明:同步/異步是針對(duì)執(zhí)行方而言的。
感謝各位的閱讀,以上就是“怎么理解UNIX的網(wǎng)絡(luò)I/O模型”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么理解UNIX的網(wǎng)絡(luò)I/O模型這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
當(dāng)前標(biāo)題:怎么理解UNIX的網(wǎng)絡(luò)I/O模型
標(biāo)題網(wǎng)址:http://jinyejixie.com/article38/ipjspp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、Google、靜態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站內(nèi)鏈、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)