1、select: select庫是在linux和windows平臺都基本支持的 事件驅(qū)動模型庫,并且在接口的定義也基本相同,只是部分參 數(shù)的含義略有差異,最大并發(fā)限制1024,是最早期的事件驅(qū)動模型。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比陽高網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式陽高網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋陽高地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。
? 2、poll: 在Linux 的基本驅(qū)動模型,windows不支持此驅(qū)動模型,是select的升級版,取消了最大的并發(fā)限制,在編譯 nginx的時候可以使用--with-poll_module和--without-poll_module這兩個指定是否編譯select庫。
? 3、epoll: epoll是庫是Nginx服務(wù)器支持的最高性能的事件驅(qū)動庫之一,是公認的非常優(yōu)秀的事件驅(qū)動模型,它和select 和poll有很大的區(qū)別,epoll是poll的升級版,但是與poll的效率有很大的區(qū)別. epoll的處理方式是創(chuàng)建一個待處理的事件列表,然后把這個列表發(fā)給內(nèi)核,返回的時候在去輪訓檢查這個表,以 判斷事件是否發(fā)生,epoll支持一個進程打開的最大事件描述符的上限是系統(tǒng)可以打開的文件的最大數(shù),同時 epoll庫的IO效率不隨描述符數(shù)目增加而線性下降,因為它只會對內(nèi)核上報的“活躍”的描述符進行操作。
Select:POSIX所規(guī)定,目前幾乎在所有的平臺上支持,其良好跨平臺支持也是它的一個優(yōu)點,本質(zhì)上是通過設(shè)置或者檢查存放fd標志位的數(shù)據(jù)結(jié)構(gòu)來進行下一步處理缺點單個進程能夠監(jiān)視的文件描述符的數(shù)量存在最大限制,在Linux上一般為1024,可以通過修改宏定義FD_SETSIZE,再重新編譯內(nèi)核實現(xiàn),但是這樣也會造成效率的降低單個進程可監(jiān)視的fd數(shù)量被限制,默認是1024,修改此值需要重新編譯內(nèi)核對socket是線性掃描,即采用輪詢的方法,效率較低select采取了內(nèi)存拷貝方法來實現(xiàn)內(nèi)核將 FD消息通知給用戶空間,這樣一個用來存放大量fd的數(shù)據(jù)結(jié)構(gòu),這樣會使得用戶空間和內(nèi)核空間在傳遞該結(jié)構(gòu)時復制開銷大
poll:本質(zhì)上和select沒有區(qū)別,它將用戶傳入的數(shù)組拷貝到內(nèi)核空間,然后查詢每個fd對應的設(shè)備狀態(tài)其沒有最大連接數(shù)的限制,原因是它是基于鏈表來存儲的大量的fd的數(shù)組被整體復制于用戶態(tài)和內(nèi)核地址空間之間,而不管這樣的復制是不是有意義poll特點是“水平觸發(fā)”,如果報告了fd后,沒有被處理,那么下次poll時會再次報告該fd?
在Linux 2.6內(nèi)核中提出的select和poll的增強版本支持水平觸發(fā)LT和邊緣觸發(fā)ET,最大的特點在于邊緣觸發(fā),它只告訴進程哪些fd剛剛變?yōu)榫托钁B(tài),并且只會通知一次使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內(nèi)核就會采用類似callback的回調(diào)機制來激活該fd,epoll_wait便可以收到通知優(yōu)點:沒有最大并發(fā)連接的限制:能打開的FD的上限遠大于1024(1G的內(nèi)存能監(jiān)聽約10萬個端口),具體查看/proc/sys/fs/file-max,此值和系統(tǒng)內(nèi)存大小相關(guān)效率提升:非輪詢的方式,不會隨著FD數(shù)目的增加而效率下降;只有活躍可用的FD才會調(diào)用callback函數(shù),即epoll最大的優(yōu)點就在于它只管理“活躍”的連接,而跟連接總數(shù)無關(guān)內(nèi)存拷貝,利用mmap(Memory Mapping)加速與內(nèi)核空間的消息傳遞;即epoll使用mmap減少復制開銷