select(), poll() çš„å±€é™æ€§
- ä¼ ç»Ÿæ–¹å¼çš„ select() 系统调用å—到 FD_SETSIZE 大å°çš„é™åˆ¶ã€‚这个é™åˆ¶è¢«ç¼–è¯‘è¿›äº†æ ‡å‡†åº“ï¼Œè™½ç„¶æŸäº›C函数库å…è®¸ä½ åœ¨ç¼–è¯‘çš„æ—¶å€™å¢žåŠ è¿™ä¸ªé™é¢ï¼Œä½†æ¯•ç«Ÿä¸æ˜¯ä¸€ä¸ªé€šç”¨çš„æ–¹æ³•。
- ä¼ ç»Ÿçš„ poll() 系统调用虽然没有 select() çš„ FD_SETSIZE 大å°çš„é™åˆ¶ï¼Œä½†æ˜¯åœ¨å¤„ç†ä¸Šåƒä¸ªè¿žæŽ¥çš„æ—¶å€™ä¼šå˜çš„è¶Šæ¥è¶Šæ…¢ï¼Œè™½ç„¶é‚£æ—¶ä¾¯å¤§éƒ¨åˆ†çš„fd都是闲置的,但是一便便的扫æfd的状æ€éžå¸¸è€—时。
kqueue() 和 epoll()
- kqueue() 是 FreeBSD 下推èçš„æ”¯æŒ edge-triggered æ–¹å¼çš„ poll 模å¼çš„æ›¿ä»£å“。
- epoll 则是在 Linux kernel 2.6 的时候æ£å¼åŠ å…¥è¿›æ¥çš„ï¼ŒåŒæ ·æ˜¯æŽ¨èçš„ edge-triggered çš„ poll 模å¼çš„æ›¿ä»£å“。
select(), poll() 与 kqueue(), epoll() 实现上的细微差别
- 为什么 select() å’Œ poll() ç³»ç»Ÿè°ƒç”¨åœ¨æ€§èƒ½ä¸Šä¼šæœ‰é—®é¢˜ï¼Œå°±å’Œä¹‹å‰æåˆ°çš„ä¸€æ ·ï¼Œç³»ç»Ÿæ€»æ˜¯éœ€è¦ä¸€æ¬¡æ¬¡çš„æ‰«æfile descriptorsåˆ—è¡¨æ¥æ ‡è®°é‚£äº›æ”¹å˜çš„部分,然åŽå®¢æˆ·ç«¯åº”ç”¨å†æ¬¡æ‰«æè¿™ä¸ªåˆ—表å–出fd进行æ“作,在æœåŠ¡å™¨è´Ÿè½½å¾ˆé«˜çš„æƒ…å†µä¸‹ï¼Œç»´æŠ¤çš„fd列表相当长,扫æçš„æ—¶é—´éžå¸¸é•¿ï¼ŒåŒæ—¶ä¹Ÿè®©CPUè´Ÿè·å¾ˆé«˜ã€‚
- kqueue() å’Œ epoll() 则是让 kernel 主动通知应用程åºå…³äºŽfdçš„ä¿®æ”¹ï¼Œè¿™æ ·å°±å…去了这些扫æçš„è¿‡ç¨‹ï¼Œå½“ç„¶å†…éƒ¨çš„å®žçŽ°åº”è¯¥æ¯”è¿™ä¸ªå¤æ‚的多。
呃……我的ç†è§£å’Œä½ 似乎有一点点ä¸åŒï¼šäº‹å®žä¸Šéƒ½æ˜¯kernel主动通知的,事实上kernel也通知ä¸åˆ°åº”用程åºå§ï¼Œå°±fd而言~
å®žçŽ°ç¡®å®žå¾ˆå¤æ‚,差别也特别大å§~