epoll簡單學(xué)習(xí)
epoll的EPOLLIN和EPOLLOU為什么不能同時(shí)關(guān)聯(lián) http://laokaddk.blog.51cto.com/368606/791945
epoll使用總結(jié) http://laokaddk.blog.51cto.com/368606/617497
epoll學(xué)習(xí):思考一種高性能的服務(wù)器處理框架 http://laokaddk.blog.51cto.com/368606/607231
epoll學(xué)習(xí)筆記 http://laokaddk.blog.51cto.com/368606/607017
簡單學(xué)習(xí)了一下epoll,之前也用過,這次又看了看,收獲如下:
兩種實(shí)現(xiàn)模式(在http://laokaddk.blog.51cto.com/368606/791945中都有提到):同一個(gè)線程 和 不同線程;
順便了解了一下驚群現(xiàn)象,如果用accept阻塞的方式就不存在驚群現(xiàn)象了,在不同線程中通過epoll_wait來出發(fā)accept行為的nginx的解決方法是通過進(jìn)程里原子的修改寄存器a來做到進(jìn)程間互斥的。
在不同線程模式下:listenfd需設(shè)置為非阻塞,注冊EPOLLIN就可以了,觸發(fā)時(shí)調(diào)用accept,有沒有連接都會立刻返回;
在同一個(gè)線程模式下:listenfd為阻塞模式,不注冊epoll,阻塞while調(diào)用accept即可;
ET觸發(fā)只支持非阻塞模式,這里針對的fd是accept接收到的然后epoll_add了的那些fds,原因是:因?yàn)镋T觸發(fā)需要處理函數(shù)一直處理完所有in/out數(shù)據(jù),比如read數(shù)據(jù),如果read到的字節(jié)數(shù)小于預(yù)先準(zhǔn)備讀入的字節(jié)數(shù),那么就可以認(rèn)為讀完了;如果是非阻塞模式,那么read會一直阻塞在那里。
epollfd不需要設(shè)置阻塞、非阻塞。
一般都用LT觸發(fā),不論哪種實(shí)現(xiàn)模式,EPOLLIN和EPOLLOUT都不同時(shí)設(shè)定,都是不斷切換來做的。
客戶端close掉socket時(shí),會喚醒服務(wù)端epoll_wait;
對于epoll_wait而言,針對一個(gè)fd只存在喚醒與被喚醒,至于是EPOLLIN還是EPOLLOUT,取決于你當(dāng)初epoll_add時(shí)的設(shè)定,因此如果你epoll_add時(shí)設(shè)定了EPOLLIN|EPOLLOUT,那么當(dāng)EPOLLIN發(fā)生時(shí)(內(nèi)核里當(dāng)然是可以區(qū)分EPOLLIN和EPOLLOUT的),你收到的fd上的事件依然是EPOLLIN|EPOLLOUT。
http://my.oschina.net/costaxu/blog/127394
http://blog.csdn.net/guomsh/article/details/8484222
http://blog.csdn.net/guomsh/article/details/8478209
http://blog.csdn.net/ctthuangcheng/article/details/8596818
http://blog.yunn.io/archives/114/
posted on 2013-07-04 17:36 so true 閱讀(514) 評論(0) 編輯 收藏 所屬分類: C&C++ 、Linux