Review The C10K Problem - Part 2

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的修改,这样就å…去了这些扫æçš„è¿‡ç¨‹ï¼Œå½“ç„¶å†…éƒ¨çš„å®žçŽ°åº”è¯¥æ¯”è¿™ä¸ªå¤æ‚的多。

1 comment so far

  1. 你猜 May 2, 2008 2:41 am

    呃……我的ç†è§£å’Œä½ ä¼¼ä¹Žæœ‰ä¸€ç‚¹ç‚¹ä¸åŒï¼šäº‹å®žä¸Šéƒ½æ˜¯kernel主动通知的,事实上kernel也通知ä¸åˆ°åº”用程åºå§ï¼Œå°±fd而言~
    å®žçŽ°ç¡®å®žå¾ˆå¤æ‚,差别也特别大å§~

Leave a comment

Please be polite and on topic. Your e-mail will never be published.