學(xué)習(xí)epoll有一段時(shí)間了,最近終于有一個(gè)服務(wù)器采用了epoll模型,從中積累了一些epoll的資料.個(gè)人感覺(jué)目前可以找到的epoll相關(guān)的資料太少了,因?yàn)閑poll僅被linux 2.6以上版本內(nèi)核所支持,它的應(yīng)用時(shí)間還比較短暫, 而一些講解網(wǎng)絡(luò)編程的相關(guān)權(quán)威書(shū)籍(如已逝的stevens的UNP)都沒(méi)有講解這個(gè)不能跨unix平臺(tái)的專(zhuān)有技術(shù),而epoll帶來(lái)的巨大效率提高又使得這項(xiàng)技術(shù)很有吸引力, 于是我決定將個(gè)人遇到的epoll相關(guān)問(wèn)題整理一下, 隨著對(duì)epoll的理解深入, 這份資料將不斷的完善下去.
需要說(shuō)明的是, 這份教材不適合網(wǎng)絡(luò)編程的初學(xué)者, 這里假設(shè)讀者具備一定的網(wǎng)絡(luò)編程基礎(chǔ), 使用過(guò)多路復(fù)用IO如select等.
1) 能不能給一個(gè)使用epoll相關(guān)API進(jìn)行IO監(jiān)控的示例?
在<<
epoll學(xué)習(xí)筆記>>中有一個(gè)簡(jiǎn)單的示例說(shuō)明epoll相關(guān)API的使用, 但是這個(gè)示例是非常簡(jiǎn)單的, 它僅僅關(guān)注于如何使用epoll相關(guān)函數(shù)上面, 如果要更好的使用epoll, 還需要自己動(dòng)手以及閱讀資料.
2) epoll和select都屬于多路復(fù)用IO嗎?與阻塞IO相比多路復(fù)用IO有什么優(yōu)點(diǎn)?
在<<
epoll為什么這么快>>, 重點(diǎn)是解釋epoll對(duì)比select在效率上提高的原因, 但是同時(shí)也解釋了多路復(fù)用IO的工作原理.
3) epoll的ET模式和LT模型有什么區(qū)別?
<<
epll學(xué)習(xí)筆記>>通過(guò)一個(gè)實(shí)例說(shuō)明了兩者之間的差異, 但是我想, 如果結(jié)合著man文檔(man epoll)來(lái)看效果會(huì)更好些.
4) 我的服務(wù)器是采用多進(jìn)程模型的, 我的父進(jìn)程首先創(chuàng)建了epoll所使用的fd, 然后再創(chuàng)建子進(jìn)程, 為什么使用的時(shí)候沒(méi)過(guò)多久epoll_wait函數(shù)就一直返回0, 這樣IO事件就不會(huì)得到通知了?
太巧了, 筆者也遇到過(guò)類(lèi)似的問(wèn)題, 花了好幾天的時(shí)間進(jìn)行調(diào)試, 很幸運(yùn)的是, 你不必像我這樣耗費(fèi)時(shí)間在這個(gè)問(wèn)題上面了, 因?yàn)樵?lt;<
多進(jìn)程服務(wù)器中,epoll的創(chuàng)建應(yīng)該在創(chuàng)建子進(jìn)程之后>>中已經(jīng)有了解答.
5)epoll的效率比起select來(lái)有很大的提高, 這里面有什么秘密嗎?
其實(shí)原理很簡(jiǎn)單, 就是計(jì)算機(jī)世界中"空間換時(shí)間"思想的體現(xiàn), 在<<
epoll為什么這么快>>中有詳細(xì)的解釋.