libevent源码深度剖析十
libevent源碼深度剖析十
——支持I/O多路復用技術
張亮
????? Libevent的核心是事件驅動、同步非阻塞,為了達到這一目標,必須采用系統(tǒng)提供的I/O多路復用技術,而這些在Windows、Linux、 Unix等不同平臺上卻各有不同,如何能提供優(yōu)雅而統(tǒng)一的支持方式,是首要關鍵的問題,這其實不難,本節(jié)就來分析一下。
1 統(tǒng)一的關鍵
????? Libevent支持多種I/O多路復用技術的關鍵就在于結構體eventop,這個結構體前面也曾提到過,它的成員是一系列的函數(shù)指針, 定義在event-internal.h文件中:
????? 在libevent中,每種I/O demultiplex機制的實現(xiàn)都必須提供這五個函數(shù)接口,來完成自身的初始化、銷毀釋放;對事件的注冊、注銷和分發(fā)。
比如對于epoll,libevent實現(xiàn)了5個對應的接口函數(shù),并在初始化時并將eventop的5個函數(shù)指針指向這5個函數(shù),那么程序就可以使用epoll作為I/O demultiplex機制了。
2 設置I/O demultiplex機制
????? Libevent把所有支持的I/O demultiplex機制存儲在一個全局靜態(tài)數(shù)組eventops中,并在初始化時選擇使用何種機制,數(shù)組內容根據(jù)優(yōu)先級順序聲明如下:
???? 然后libevent根據(jù)系統(tǒng)配置和編譯選項決定使用哪一種I/O demultiplex機制,這段代碼在函數(shù)event_base_new()中:
??? 可以看出,libevent在編譯階段選擇系統(tǒng)的I/O demultiplex機制,而不支持在運行階段根據(jù)配置再次選擇。
??? 以Linux下面的epoll為例,實現(xiàn)在源文件epoll.c中,eventops對象epollops定義如下:
變量epollops中的函數(shù)指針具體聲明如下,注意到其返回值和參數(shù)都和eventop中的定義嚴格一致,這是函數(shù)指針的語法限制。
????? 那么如果選擇的是epoll,那么調用結構體eventop的init和dispatch函數(shù)指針時,實際調用的函數(shù)就是epoll的初始化函數(shù)epoll_init()和事件分發(fā)函數(shù)epoll_dispatch()了;
???? 關于epoll的具體用法這里就不多說了,可以參見介紹epoll的文章(本人的哈哈):
http://blog.csdn.net/sparkliang/archive/2009/11/05/4770655.aspx
???? C++語言提供了虛函數(shù)來實現(xiàn)多態(tài),在C語言中,這是通過函數(shù)指針實現(xiàn)的。對于各類函數(shù)指針的詳細說明可以參見文章:
http://blog.csdn.net/sparkliang/archive/2009/06/09/4254115.aspx
同樣的,上面epollops以及epoll的各種函數(shù)都直接定義在了epoll.c源文件中,對外都是不可見的。對于libevent的使用者而言,完全不會知道它們的存在,對epoll的使用也是通過eventop來完成的,達到了信息隱藏的目的。
3 小節(jié)
??? 支持多種I/O demultiplex機制的方法其實挺簡單的,借助于函數(shù)指針就OK了。通過對源代碼的分析也可以看出,Libevent是在編譯階段選擇系統(tǒng)的I/O demultiplex機制的,而不支持在運行階段根據(jù)配置再次選擇。
轉載于:https://www.cnblogs.com/breg/p/3725762.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的libevent源码深度剖析十的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海尔空调自动开关机是什么原因
- 下一篇: 《转》请放下你的无效社交