IO的多路復(fù)用:一個進(jìn)程可以監(jiān)視多個描述符,一旦某個描述符讀就緒或?qū)懢途w,能夠通知進(jìn)程程序進(jìn)行相應(yīng)的讀寫操作
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了莆田免費建站歡迎大家使用!使用場景:
1.當(dāng)客戶處理多個描述符(網(wǎng)絡(luò)套接口)或一個客戶同時處理多個套接口
2.TCP服務(wù)器既要處理監(jiān)聽套接口又要處理已經(jīng)連接的套接口
3.一個服務(wù)器處理多個服務(wù)或多個協(xié)議也要使用I/O復(fù)用
與多進(jìn)程和多線程相比,I/O多路復(fù)用大優(yōu)點系統(tǒng)開銷小,系統(tǒng)也不必創(chuàng)建進(jìn)程或線程,因而也不用維護(hù)這些進(jìn)程和線程
支持I/O多路復(fù)用的系統(tǒng)調(diào)用:select、poll、epoll本質(zhì)上都是同步IO,因此它們都要在讀寫事件就緒后自己負(fù)責(zé)讀寫
1.select
基本原理:該函數(shù)監(jiān)視的文件描述符分讀描述符集、寫描述符集、異常描述符集,調(diào)用該函數(shù)后select就會一直阻塞等待,直到有描述符就緒(至少有一個),或者超時等待
優(yōu)點:具有良好的跨平臺性
缺點:
1.單個進(jìn)程所打開文件描述符個數(shù)有數(shù)量限制,32位平臺下默認(rèn)1024,64位平臺下默認(rèn)2048
2.每次都要對sock集進(jìn)行線性掃描(輪詢)每次都要從用戶態(tài)切換到內(nèi)核態(tài),需要的開銷大
3.需要維護(hù)一個用來存放大量描述符的數(shù)據(jù)結(jié)構(gòu)(數(shù)組),在內(nèi)核和用戶空間之間的傳遞復(fù)制開銷也很大
4.每次調(diào)用select函數(shù)前都要對timeout進(jìn)行初始化,還要對它所關(guān)心的文件描述符所在的描述符集進(jìn)行初始化工作
select中的timeout結(jié)構(gòu)體:
1.若傳NULL,就是將select設(shè)置為阻塞狀態(tài),一定要等到一個或多個描述符狀態(tài)發(fā)生變化
2.若設(shè)為0秒0毫秒,則變?yōu)橐粋€非阻塞函數(shù),不管描述符狀態(tài)是否發(fā)生變化都立即返回
3.若設(shè)為大于0,則函數(shù)會在timeout時間內(nèi)阻塞,超時時間內(nèi)若有事件到來就返回
2.poll
基本原理:將用戶傳入的數(shù)組拷貝到內(nèi)核區(qū),輪詢查看每個描述符對應(yīng)的事件狀態(tài),若事件就緒就加入等待隊列中繼續(xù)遍歷,若遍歷結(jié)束沒有事件就緒,就掛起進(jìn)程,直到有就緒事件到達(dá)或超時被喚醒,之后又要輪詢
poll中含有一個結(jié)構(gòu)體,它包含了要監(jiān)視的事件和發(fā)生的事件,不在使用select中的參數(shù)值傳遞方式。
優(yōu)點:沒有大連接數(shù)的限制,因為它基于鏈表來存儲
水平觸發(fā),在每次調(diào)用該函數(shù)時都會再次檢測該socket來查看該socket緩沖區(qū)中的數(shù)據(jù)是否已被讀完
缺點:
1.在每次調(diào)用該函數(shù)后都要輪詢遍歷描述符來獲取就緒的socket
2.當(dāng)同時連接大量客戶端時,而在某一時刻可能只有很少的處于就緒狀態(tài),隨著監(jiān)視的描述符數(shù)量增長,它的效率也會降低
適用場景:連接數(shù)量少并且每個連接都十分活躍
3.epoll:使用一個描述符來管理多個描述符,將用戶所關(guān)心的描述符相應(yīng)事件存放到內(nèi)核的事件表上,只需拷貝一次
使用三個函數(shù):
epoll_create創(chuàng)建一個epollfd
epoll_ctl進(jìn)行注冊某個socket描述符
epoll_wait等待就緒事件
基本原理:支持水平觸發(fā)和邊緣觸發(fā),一般默認(rèn)水平觸發(fā),當(dāng)使用邊緣觸發(fā)時,只告訴進(jìn)程哪些描述符已經(jīng)變?yōu)榫途w狀態(tài)并且只通知一次。會先注冊所要關(guān)心的文件描述符及它所關(guān)心的事件,內(nèi)核也會采用相應(yīng)的回調(diào)機(jī)制來激活該描述符,使用epoll_wait只返回就緒的事件
優(yōu)點:
1.沒有大并發(fā)連接的限制,不需要輪詢的方式每次都要遍歷描述符集,不會隨著描述符數(shù)目的增加而下降
2.使用mmap(內(nèi)存映射技術(shù))加速與內(nèi)核之間的消息傳遞,減少了從用戶到內(nèi)存的拷貝次數(shù)
,不同于select和poll的消息傳遞方式,通過內(nèi)核與用戶空間共享一塊內(nèi)存來實現(xiàn)
兩種工作模式:
LT:當(dāng)調(diào)用epoo_wait檢測到描述符事件發(fā)生并通知應(yīng)用程序,應(yīng)用程序應(yīng)立即處理,若不處理,則下次還會再次告知上層應(yīng)用程序
ET:調(diào)用epoll_wait檢測到描述符事件發(fā)生并通知上層應(yīng)用且只通知一次,只支持非阻塞socket(避免由于一個句柄的阻塞讀或?qū)懽尯罄m(xù)的多個文件描述符一直阻塞等待),在很大程度上減少了時間被重復(fù)觸發(fā)的次數(shù)
適用場景:同時處理大量客戶端同時請求連接服務(wù)器
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。