怎么理解UNIX的網(wǎng)絡(luò)I/O模型

這篇文章主要講解了“怎么理解UNIX的網(wǎng)絡(luò)I/O模型”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么理解UNIX的網(wǎng)絡(luò)I/O模型”吧!

從策劃到設(shè)計(jì)制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶(hù)提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、域名注冊(cè)、虛擬空間、網(wǎng)絡(luò)營(yíng)銷(xiāo)、VI設(shè)計(jì)、 網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。為客戶(hù)提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶(hù)的口碑塑造優(yōu)易品牌,攜手廣大客戶(hù),共同發(fā)展進(jìn)步。

UNIX的網(wǎng)絡(luò)I/O模型:

    概念:
        1)linux內(nèi)核對(duì)一個(gè)文件的讀寫(xiě)操作會(huì)調(diào)用內(nèi)核提供的系統(tǒng)命令,返回一個(gè)文件描述符(file discriptor,簡(jiǎn)稱(chēng)fd)。
            描述符就是一個(gè)數(shù)字,它指向內(nèi)核中的一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體包含了文件路徑等信息。 eg:對(duì)socket的讀寫(xiě)會(huì)返回一個(gè)描述符 socketfd
        2)一次?絡(luò)I/O的讀操作會(huì)包含下面這兩個(gè)階段:1)等待數(shù)據(jù)準(zhǔn)備就緒 2)數(shù)據(jù)從內(nèi)核復(fù)制到用戶(hù)空間(即用戶(hù)進(jìn)程)。


    1)阻塞I/O模型:blocking I/O
        概念:用戶(hù)進(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ì)一直阻塞等待。

        說(shuō)明:默認(rèn)情況下,所有的文件操作都是阻塞的。
        缺點(diǎn):客戶(hù)端的并發(fā)訪(fǎng)問(wèn)量比較高時(shí),服務(wù)端需要?jiǎng)?chuàng)建大量的線(xiàn)程來(lái)響應(yīng)請(qǐng)求,當(dāng)線(xiàn)程的數(shù)量膨脹后,系統(tǒng)的性能會(huì)急劇下降甚至宕機(jī)。

        偽異步I/O模型:
            概念:為了解決阻塞I/O模型中需要為每一個(gè)請(qǐng)求都創(chuàng)建一個(gè)線(xiàn)程的問(wèn)題,服務(wù)端可以使用線(xiàn)程池來(lái)實(shí)現(xiàn)一個(gè)偽異步I/O模型。
            偽異步I/O模型可能導(dǎo)致的級(jí)聯(lián)故障:某臺(tái)服務(wù)器故障導(dǎo)致響應(yīng)緩慢 -> 線(xiàn)程讀取故障服務(wù)節(jié)點(diǎn)的響應(yīng) -> 所有線(xiàn)程被故障節(jié)點(diǎn)阻塞,后續(xù)IO消息都在隊(duì)列中 -> 隊(duì)列積滿(mǎn) -> 新的客戶(hù)端請(qǐng)求被拒絕,服務(wù)器無(wú)響應(yīng)

    2)非阻塞I/O模型:nonblocking I/O
        概念:用戶(hù)進(jìn)程從非阻塞的socket中讀取數(shù)據(jù)時(shí),若該套接字的接收緩存區(qū)中沒(méi)有數(shù)據(jù),則內(nèi)核會(huì)直接返回一個(gè)錯(cuò)誤。

        說(shuō)明:一般當(dāng)socket設(shè)為非阻塞狀態(tài)時(shí),用戶(hù)進(jìn)程會(huì)輪詢(xún)內(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)聽(tīng)的fd注冊(cè)到多路復(fù)用器(selector)中,注冊(cè)的時(shí)候需要指定該fd上待監(jiān)聽(tīng)的事件,selector會(huì)一直監(jiān)聽(tīng)注冊(cè)的fd,當(dāng)fd上有事件發(fā)生時(shí),selector會(huì)做出相應(yīng)的處理。

        說(shuō)明:
            與阻塞I/O模型相比,I/O復(fù)用模型是阻塞在select調(diào)用(或poll調(diào)用、或epoll調(diào)用)上,而不是阻塞在真正的I/O操作上。注意:阻塞是針對(duì)發(fā)起方而言的。
            獲取fd的狀態(tài):內(nèi)核把fd的信息通知給用戶(hù)空間。
            水平觸發(fā):若就緒的fd未被用戶(hù)進(jìn)程處理,則該fd在下一次查詢(xún)時(shí)依舊會(huì)返回。
            邊緣觸發(fā):無(wú)論就緒的fd是否被用戶(hù)進(jìn)程處理,該fd在下一次查詢(xún)時(shí)將不再返回。

        優(yōu)點(diǎn):
            客戶(hù)端發(fā)起的連接操作是異步的,故單線(xiàn)程可以同時(shí)處理多個(gè)客戶(hù)端的IO請(qǐng)求。系統(tǒng)不需要為每個(gè)客戶(hù)端請(qǐng)求都創(chuàng)建一個(gè)線(xiàn)程,這樣大大降低了系統(tǒng)的開(kāi)銷(xiāo),
        缺點(diǎn):


        select調(diào)用:
            概念:多路復(fù)用器(selector)由select函數(shù)實(shí)現(xiàn)。

            監(jiān)聽(tīng)機(jī)制:
                輪詢(xún)注冊(cè)的fd,并根據(jù)fd的狀態(tài)做相應(yīng)的處理:
                    讀就緒狀態(tài)             ->    讀數(shù)據(jù) 并 刪除該讀就緒事件
                    寫(xiě)就緒狀態(tài)             ->    寫(xiě)數(shù)據(jù) 并 刪除該寫(xiě)就緒事件
                    接收(accept)就緒狀態(tài)     ->    注冊(cè)新的讀就緒事件 并 刪除該接收就緒事件
                    ...
                獲取fd的狀態(tài):內(nèi)核把所有監(jiān)聽(tīng)的fd的信息整體復(fù)制到用戶(hù)空間。

            觸發(fā)方式:水平觸發(fā)。

            優(yōu)點(diǎn):與非阻塞式I/O模式相比,select調(diào)用不需要客戶(hù)端不斷地發(fā)出請(qǐng)求。
            缺點(diǎn):
                單個(gè)進(jìn)程可以打開(kāi)的fd數(shù)量有限,默認(rèn)1024個(gè),如果要修改這個(gè)默認(rèn)值,需要重新編譯內(nèi)核。
                每次select調(diào)用都會(huì)線(xiàn)性地掃描所有監(jiān)聽(tīng)的fd(即:無(wú)論fd是否就緒,select都會(huì)去檢查它的狀態(tài)),當(dāng)監(jiān)聽(tīng)的fd數(shù)量比較多時(shí),I/O效率呈線(xiàn)性下降。

        poll調(diào)用:
            概念:多路復(fù)用器(selector)由poll函數(shù)實(shí)現(xiàn)。

            監(jiān)聽(tīng)機(jī)制:同select調(diào)用。

            觸發(fā)方式:水平觸發(fā)。

            優(yōu)點(diǎn):
                單個(gè)進(jìn)程可以打開(kāi)的fd數(shù)量不受限制。
            缺點(diǎn):
                線(xiàn)性地掃描所有監(jiān)聽(tīng)的fd,當(dāng)監(jiān)聽(tīng)的fd數(shù)量比較多時(shí),I/O效率呈線(xiàn)性下降。

        epoll調(diào)用:
            概念:selector由一系列epoll_函數(shù)實(shí)現(xiàn)。

            監(jiān)聽(tīng)機(jī)制:
                當(dāng)fd就緒時(shí),fd會(huì)立即回調(diào)rollback函數(shù)。而那些沒(méi)有就緒的fd則不會(huì)回調(diào)rollback函數(shù)。
                獲取fd的狀態(tài):使用內(nèi)存映射,不需要把fd的信息從內(nèi)核復(fù)制到用戶(hù)空間。

            觸發(fā)方式:默認(rèn)是水平觸發(fā),支持邊緣觸發(fā)。

            優(yōu)點(diǎn):
                單個(gè)進(jìn)程可以打開(kāi)的fd數(shù)量不受限制。(僅受限于操作系統(tǒng)的最大文件句柄數(shù),1g內(nèi)存的最大文件句柄數(shù)為10w左右)
                由于epoll采用的是回調(diào)函數(shù)的方式,而不是線(xiàn)性?huà)呙璧姆绞?,故I/O效率不會(huì)隨著fd數(shù)量的增加而線(xiàn)性下降。
                使用內(nèi)存映射,避免了內(nèi)存復(fù)制的開(kāi)銷(xiāo),加速了內(nèi)核與用戶(hù)空間的消息傳遞。
            缺點(diǎn):
                在連接數(shù)少并且連接都十分活躍的情況下,epoll的性能可能比select和poll的性能差,畢竟epoll的通知機(jī)制需要很多函數(shù)回調(diào)。


    4)信號(hào)驅(qū)動(dòng)式I/O模型:SIGIO
        開(kāi)啟套接字信號(hào)驅(qū)動(dòng)IO功能,并通過(guò)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),用戶(hù)進(jìn)程收到這個(gè)信號(hào)后,就可以開(kāi)始進(jìn)行I/O操作了。
        該系統(tǒng)調(diào)用會(huì)立即返回,在等待數(shù)據(jù)報(bào)到達(dá)期間,用戶(hù)進(jìn)程不會(huì)被阻塞。
        
        說(shuō)明:信號(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ù)制到用戶(hù)自己的緩沖區(qū))完成后通知用戶(hù)進(jìn)程。
        該系統(tǒng)調(diào)用會(huì)立即返回,在等待I/O操作期間,用戶(hù)進(jìn)程不被阻塞。

        說(shuō)明:同步/異步是針對(duì)執(zhí)行方而言的。      

感謝各位的閱讀,以上就是“怎么理解UNIX的網(wǎng)絡(luò)I/O模型”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么理解UNIX的網(wǎng)絡(luò)I/O模型這一問(wèn)題有了更深刻的體會(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://muchs.cn/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)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司