epoll和select的區(qū)別?
select的句柄數(shù)目受限。而epoll沒有,它的限制是最大的打開文件句柄數(shù)目。
epoll是不會(huì)隨著FD的數(shù)目增長而降低效率,在selec中采用輪詢處理,其中的數(shù)據(jù)結(jié)構(gòu)類似一個(gè)數(shù)組的數(shù)據(jù)結(jié)構(gòu),而epoll是維護(hù)一個(gè)隊(duì)列,直接看隊(duì)列是不是空就可以了。
epoll使用mmap加速內(nèi)核與用戶空間的消息傳遞。 擴(kuò)展資料
問題的引出,當(dāng)需要讀兩個(gè)以上的I/O的時(shí)候,如果使用阻塞式的I/O,那么可能長時(shí)間的阻塞在一個(gè)描述符上面,另外的.描述符雖然有數(shù)據(jù)但是不能讀出來,這樣實(shí)時(shí)性不能滿足要求,大概的解決方案有以下幾種:
1.使用多進(jìn)程或者多線程,但是這種方法會(huì)造成程序的復(fù)雜,而且對與進(jìn)程與線程的創(chuàng)建維護(hù)也需要很多的開銷。(Apache服務(wù)器是用的子進(jìn)程的方式,優(yōu)點(diǎn)可以隔離用戶)
2.用一個(gè)進(jìn)程,但是使用非阻塞的I/O讀取數(shù)據(jù),當(dāng)一個(gè)I/O不可讀的時(shí)候立刻返回,檢查下一個(gè)是否可讀,這種形式的循環(huán)為輪詢(polling),這種方法比較浪費(fèi)CPU時(shí)間,因?yàn)榇蠖鄶?shù)時(shí)間是不可讀,但是仍花費(fèi)時(shí)間不斷反復(fù)執(zhí)行read系統(tǒng)調(diào)用。
3.異步I/O(asynchronous I/O),當(dāng)一個(gè)描述符準(zhǔn)備好的時(shí)候用一個(gè)信號告訴進(jìn)程,但是由于信號個(gè)數(shù)有限,多個(gè)描述符時(shí)不適用。
4.一種較好的方式為I/O多路轉(zhuǎn)接(I/O multiplexing)(貌似也翻譯多路復(fù)用),先構(gòu)造一張有關(guān)描述符的列表(epoll中為隊(duì)列),然后調(diào)用一個(gè)函數(shù),直到這些描述符中的一個(gè)準(zhǔn)備好時(shí)才返回,返回時(shí)告訴進(jìn)程哪些I/O就緒。select和epoll這兩個(gè)機(jī)制都是多路I/O機(jī)制的解決方案,select為POSIX標(biāo)準(zhǔn)中的,而epoll為Linux所特有的。