IO的多路復(fù)用:一個(gè)進(jìn)程可以監(jiān)視多個(gè)描述符,一旦某個(gè)描述符讀就緒或?qū)懢途w,能夠通知進(jìn)程程序進(jìn)行相應(yīng)的讀寫操作
在惠水等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制開(kāi)發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站,成都外貿(mào)網(wǎng)站建設(shè),惠水網(wǎng)站建設(shè)費(fèi)用合理。
使用場(chǎng)景:
1.當(dāng)客戶處理多個(gè)描述符(網(wǎng)絡(luò)套接口)或一個(gè)客戶同時(shí)處理多個(gè)套接口
2.TCP服務(wù)器既要處理監(jiān)聽(tīng)套接口又要處理已經(jīng)連接的套接口
3.一個(gè)服務(wù)器處理多個(gè)服務(wù)或多個(gè)協(xié)議也要使用I/O復(fù)用
與多進(jìn)程和多線程相比,I/O多路復(fù)用最大優(yōu)點(diǎn)系統(tǒng)開(kāi)銷小,系統(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就會(huì)一直阻塞等待,直到有描述符就緒(至少有一個(gè)),或者超時(shí)等待
優(yōu)點(diǎn):具有良好的跨平臺(tái)性
缺點(diǎn):
1.單個(gè)進(jìn)程所打開(kāi)文件描述符個(gè)數(shù)有數(shù)量限制,32位平臺(tái)下默認(rèn)1024,64位平臺(tái)下默認(rèn)2048
2.每次都要對(duì)sock集進(jìn)行線性掃描(輪詢)每次都要從用戶態(tài)切換到內(nèi)核態(tài),需要的開(kāi)銷大
3.需要維護(hù)一個(gè)用來(lái)存放大量描述符的數(shù)據(jù)結(jié)構(gòu)(數(shù)組),在內(nèi)核和用戶空間之間的傳遞復(fù)制開(kāi)銷也很大
4.每次調(diào)用select函數(shù)前都要對(duì)timeout進(jìn)行初始化,還要對(duì)它所關(guān)心的文件描述符所在的描述符集進(jìn)行初始化工作
select中的timeout結(jié)構(gòu)體:
1.若傳NULL,就是將select設(shè)置為阻塞狀態(tài),一定要等到一個(gè)或多個(gè)描述符狀態(tài)發(fā)生變化
2.若設(shè)為0秒0毫秒,則變?yōu)橐粋€(gè)非阻塞函數(shù),不管描述符狀態(tài)是否發(fā)生變化都立即返回
3.若設(shè)為大于0,則函數(shù)會(huì)在timeout時(shí)間內(nèi)阻塞,超時(shí)時(shí)間內(nèi)若有事件到來(lái)就返回
2.poll
基本原理:將用戶傳入的數(shù)組拷貝到內(nèi)核區(qū),輪詢查看每個(gè)描述符對(duì)應(yīng)的事件狀態(tài),若事件就緒就加入等待隊(duì)列中繼續(xù)遍歷,若遍歷結(jié)束沒(méi)有事件就緒,就掛起進(jìn)程,直到有就緒事件到達(dá)或超時(shí)被喚醒,之后又要輪詢
poll中含有一個(gè)結(jié)構(gòu)體,它包含了要監(jiān)視的事件和發(fā)生的事件,不在使用select中的參數(shù)值傳遞方式。
優(yōu)點(diǎn):沒(méi)有最大連接數(shù)的限制,因?yàn)樗阪湵韥?lái)存儲(chǔ)
水平觸發(fā),在每次調(diào)用該函數(shù)時(shí)都會(huì)再次檢測(cè)該socket來(lái)查看該socket緩沖區(qū)中的數(shù)據(jù)是否已被讀完
缺點(diǎn):
1.在每次調(diào)用該函數(shù)后都要輪詢遍歷描述符來(lái)獲取就緒的socket
2.當(dāng)同時(shí)連接大量客戶端時(shí),而在某一時(shí)刻可能只有很少的處于就緒狀態(tài),隨著監(jiān)視的描述符數(shù)量增長(zhǎng),它的效率也會(huì)降低
適用場(chǎng)景:連接數(shù)量少并且每個(gè)連接都十分活躍
3.epoll:使用一個(gè)描述符來(lái)管理多個(gè)描述符,將用戶所關(guān)心的描述符相應(yīng)事件存放到內(nèi)核的事件表上,只需拷貝一次
使用三個(gè)函數(shù):
epoll_create創(chuàng)建一個(gè)epollfd
epoll_ctl進(jìn)行注冊(cè)某個(gè)socket描述符
epoll_wait等待就緒事件
基本原理:支持水平觸發(fā)和邊緣觸發(fā),一般默認(rèn)水平觸發(fā),當(dāng)使用邊緣觸發(fā)時(shí),只告訴進(jìn)程哪些描述符已經(jīng)變?yōu)榫途w狀態(tài)并且只通知一次。會(huì)先注冊(cè)所要關(guān)心的文件描述符及它所關(guān)心的事件,內(nèi)核也會(huì)采用相應(yīng)的回調(diào)機(jī)制來(lái)激活該描述符,使用epoll_wait只返回就緒的事件
優(yōu)點(diǎn):
1.沒(méi)有最大并發(fā)連接的限制,不需要輪詢的方式每次都要遍歷描述符集,不會(huì)隨著描述符數(shù)目的增加而下降
2.使用mmap(內(nèi)存映射技術(shù))加速與內(nèi)核之間的消息傳遞,減少了從用戶到內(nèi)存的拷貝次數(shù)
,不同于select和poll的消息傳遞方式,通過(guò)內(nèi)核與用戶空間共享一塊內(nèi)存來(lái)實(shí)現(xiàn)
兩種工作模式:
LT:當(dāng)調(diào)用epoo_wait檢測(cè)到描述符事件發(fā)生并通知應(yīng)用程序,應(yīng)用程序應(yīng)立即處理,若不處理,則下次還會(huì)再次告知上層應(yīng)用程序
ET:調(diào)用epoll_wait檢測(cè)到描述符事件發(fā)生并通知上層應(yīng)用且只通知一次,只支持非阻塞socket(避免由于一個(gè)句柄的阻塞讀或?qū)懽尯罄m(xù)的多個(gè)文件描述符一直阻塞等待),在很大程度上減少了時(shí)間被重復(fù)觸發(fā)的次數(shù)
適用場(chǎng)景:同時(shí)處理大量客戶端同時(shí)請(qǐng)求連接服務(wù)器