Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÈçºÎÀí½â¸ßÐÔÄÜÍøÂçÄ£ÐÍ
 
  1951  次浏览      27
 2018-9-18
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚ51cto£¬±¾ÎÄÖ¼ÔÚΪ´ó¼ÒÌṩÓÐÓõĸÅÀÀÒÔ¼°ÍøÂç·þÎñÄ£Ð͵ıȽϣ¬ÒÔ½Ò¿ªÉè¼ÆºÍʵÏÖ¸ßÐÔÄÜÍøÂç¼Ü¹¹µÄÉñÃØÃæÉ´¡£

·þÎñ¶Ë´¦ÀíÍøÂçÇëÇó

Ê×ÏÈ¿´¿´·þÎñ¶Ë´¦ÀíÍøÂçÇëÇóµÄµäÐ͹ý³Ì£º

ÓÉÉÏͼ¿ÉÒÔ¿´µ½£¬Ö÷Òª´¦Àí²½Öè°üÀ¨£º

1.»ñÈ¡ÇëÇóÊý¾Ý£¬¿Í»§¶ËÓë·þÎñÆ÷½¨Á¢Á¬½Ó·¢³öÇëÇ󣬷þÎñÆ÷½ÓÊÜÇëÇó£¨1-3£©¡£

2.¹¹½¨ÏìÓ¦£¬µ±·þÎñÆ÷½ÓÊÕÍêÇëÇ󣬲¢ÔÚÓû§¿Õ¼ä´¦Àí¿Í»§¶ËµÄÇëÇó£¬Ö±µ½¹¹½¨ÏìÓ¦Íê³É£¨4£©¡£

3.·µ»ØÊý¾Ý£¬·þÎñÆ÷½«Òѹ¹½¨ºÃµÄÏìÓ¦ÔÙͨ¹ýÄں˿ռäµÄÍøÂç I/O ·¢»¹¸ø¿Í»§¶Ë£¨5-7£©¡£

Éè¼Æ·þÎñ¶Ë²¢·¢Ä£ÐÍʱ£¬Ö÷ÒªÓÐÈçÏÂÁ½¸ö¹Ø¼üµã£º

1.·þÎñÆ÷ÈçºÎ¹ÜÀíÁ¬½Ó£¬»ñÈ¡ÊäÈëÊý¾Ý¡£

2.·þÎñÆ÷ÈçºÎ´¦ÀíÇëÇó¡£

ÒÔÉÏÁ½¸ö¹Ø¼üµã×îÖÕ¶¼Óë²Ù×÷ϵͳµÄ I/O Ä£ÐÍÒÔ¼°Ïß³Ì(½ø³Ì)Ä£ÐÍÏà¹Ø£¬ÏÂÃæÏêϸ½éÉÜÕâÁ½¸öÄ£ÐÍ¡£

I/O Ä£ÐÍ

½éÉܲÙ×÷ϵͳµÄ I/O Ä£ÐÍ֮ǰ£¬ÏÈÁ˽âһϼ¸¸ö¸ÅÄ

1.×èÈûµ÷ÓÃÓë·Ç×èÈûµ÷Óá£

2.×èÈûµ÷ÓÃÊÇÖ¸µ÷Óýá¹û·µ»ØÖ®Ç°£¬µ±Ç°Ï̻߳ᱻ¹ÒÆð¡£µ÷ÓÃÏß³ÌÖ»ÓÐÔڵõ½½á¹ûÖ®ºó²Å»á·µ»Ø¡£

3.·Ç×èÈûµ÷ÓÃÖ¸ÔÚ²»ÄÜÁ¢¿ÌµÃµ½½á¹û֮ǰ£¬¸Ãµ÷Óò»»á×èÈûµ±Ç°Ï̡߳£

Á½ÕßµÄ×î´óÇø±ðÔÚÓÚ±»µ÷Ó÷½ÔÚÊÕµ½ÇëÇóµ½·µ»Ø½á¹û֮ǰµÄÕâ¶Îʱ¼äÄÚ£¬µ÷Ó÷½ÊÇ·ñÒ»Ö±Ôڵȴý¡£

×èÈûÊÇÖ¸µ÷Ó÷½Ò»Ö±Ôڵȴý¶øÇÒ±ðµÄÊÂÇéʲô¶¼²»×ö£»·Ç×èÈûÊÇÖ¸µ÷Ó÷½ÏÈȥæ±ðµÄÊÂÇé¡£

ͬ²½´¦ÀíÓëÒì²½´¦Àí

ͬ²½´¦ÀíÊÇÖ¸±»µ÷Ó÷½µÃµ½×îÖÕ½á¹ûÖ®ºó²Å·µ»Ø¸øµ÷Ó÷½£»Òì²½´¦ÀíÊÇÖ¸±»µ÷Ó÷½ÏÈ·µ»ØÓ¦´ð£¬È»ºóÔÙ¼ÆËãµ÷Óýá¹û£¬¼ÆËãÍê×îÖÕ½á¹ûºóÔÙ֪ͨ²¢·µ»Ø¸øµ÷Ó÷½¡£

×èÈû¡¢·Ç×èÈûºÍͬ²½¡¢Òì²½µÄÇø±ð

×èÈû¡¢·Ç×èÈûºÍͬ²½¡¢Òì²½ÆäʵÕë¶ÔµÄ¶ÔÏóÊDz»Ò»ÑùµÄ£º

1.×èÈû¡¢·Ç×èÈûµÄÌÖÂÛ¶ÔÏóÊǵ÷ÓÃÕß¡£

2.ͬ²½¡¢Òì²½µÄÌÖÂÛ¶ÔÏóÊDZ»µ÷ÓÃÕß¡£

recvfrom º¯Êý

recvfrom º¯Êý(¾­ Socket ½ÓÊÕÊý¾Ý)£¬ÕâÀï°ÑËüÊÓΪϵͳµ÷Óá£

Ò»¸öÊäÈë²Ù×÷ͨ³£°üÀ¨Á½¸ö²»Í¬µÄ½×¶Î£º

µÈ´ýÊý¾Ý×¼±¸ºÃ

´ÓÄÚºËÏò½ø³Ì¸´ÖÆÊý¾Ý

¶ÔÓÚÒ»¸öÌ×½Ó×ÖÉϵÄÊäÈë²Ù×÷£¬µÚÒ»²½Í¨³£Éæ¼°µÈ´ýÊý¾Ý´ÓÍøÂçÖе½´ï¡£µ±ËùµÈ´ý·Ö×éµ½´ïʱ£¬Ëü±»¸´ÖƵ½ÄÚºËÖеÄij¸ö»º³åÇø¡£µÚ¶þ²½¾ÍÊǰÑÊý¾Ý´ÓÄں˻º³åÇø¸´ÖƵ½Ó¦Óýø³Ì»º³åÇø¡£

ʵ¼ÊÓ¦ÓóÌÐòÔÚϵͳµ÷ÓÃÍê³ÉÉÏÃæµÄ 2 ²½²Ù×÷ʱ£¬µ÷Ó÷½Ê½µÄ×èÈû¡¢·Ç×èÈû£¬²Ù×÷ϵͳÔÚ´¦ÀíÓ¦ÓóÌÐòÇëÇóʱ£¬´¦Àí·½Ê½µÄͬ²½¡¢Òì²½´¦ÀíµÄ²»Í¬£¬¿ÉÒÔ·ÖΪ 5 ÖÖ I/O Ä£ÐÍ¡££¨²Î¿¼¡¶UNIXÍøÂç±à³Ì¾í1¡·£©

×èÈûʽ I/O Ä£ÐÍ(blocking I/O£©

ÔÚ×èÈûʽ I/O Ä£ÐÍÖУ¬Ó¦ÓóÌÐòÔÚ´Óµ÷Óà recvfrom ¿ªÊ¼µ½Ëü·µ»ØÓÐÊý¾Ý±¨×¼±¸ºÃÕâ¶Îʱ¼äÊÇ×èÈûµÄ£¬recvfrom ·µ»Ø³É¹¦ºó£¬Ó¦Óýø³Ì¿ªÊ¼´¦ÀíÊý¾Ý±¨¡£

±ÈÓ÷£ºÒ»¸öÈËÔÚµöÓ㣬µ±Ã»ÓãÉϹ³Ê±£¬¾Í×øÔÚ°¶±ßÒ»Ö±µÈ¡£

Óŵ㣺³ÌÐò¼òµ¥£¬ÔÚ×èÈûµÈ´ýÊý¾ÝÆÚ¼ä½ø³Ì/Ïß³Ì¹ÒÆð£¬»ù±¾²»»áÕ¼Óà CPU ×ÊÔ´¡£

ȱµã£ºÃ¿¸öÁ¬½ÓÐèÒª¶ÀÁ¢µÄ½ø³Ì/Ï̵߳¥¶À´¦Àí£¬µ±²¢·¢ÇëÇóÁ¿´óʱΪÁËά»¤³ÌÐò£¬ÄÚ´æ¡¢Ïß³ÌÇл»¿ªÏú½Ï´ó£¬ÕâÖÖÄ£ÐÍÔÚʵ¼ÊÉú²úÖкÜÉÙʹÓá£

·Ç×èÈûʽ I/O Ä£ÐÍ(non-blocking I/O£©

ÔÚ·Ç×èÈûʽ I/O Ä£ÐÍÖУ¬Ó¦ÓóÌÐò°ÑÒ»¸öÌ×½Ó¿ÚÉèÖÃΪ·Ç×èÈû£¬¾ÍÊǸæËßÄںˣ¬µ±ËùÇëÇóµÄ I/O ²Ù×÷ÎÞ·¨Íê³Éʱ£¬²»Òª½«½ø³Ì˯Ãß¡£

¶øÊÇ·µ»ØÒ»¸ö´íÎó£¬Ó¦ÓóÌÐò»ùÓÚ I/O ²Ù×÷º¯Êý½«²»¶ÏµÄÂÖѯÊý¾ÝÊÇ·ñÒѾ­×¼±¸ºÃ£¬Èç¹ûûÓÐ×¼±¸ºÃ£¬¼ÌÐøÂÖѯ£¬Ö±µ½Êý¾Ý×¼±¸ºÃΪֹ¡£

±ÈÓ÷£º±ßµöÓã±ßÍæÊÖ»ú£¬¸ô»áÔÙ¿´¿´ÓÐûÓÐÓãÉϹ³£¬Óеϰ¾ÍѸËÙÀ­¸Ë¡£

Óŵ㣺²»»á×èÈûÔÚÄں˵ĵȴýÊý¾Ý¹ý³Ì£¬Ã¿´Î·¢ÆðµÄ I/O ÇëÇó¿ÉÒÔÁ¢¼´·µ»Ø£¬²»ÓÃ×èÈûµÈ´ý£¬ÊµÊ±ÐԽϺá£

ȱµã£ºÂÖѯ½«»á²»¶ÏµØÑ¯ÎÊÄںˣ¬Õ⽫ռÓôóÁ¿µÄ CPU ʱ¼ä£¬ÏµÍ³×ÊÔ´ÀûÓÃÂʽϵͣ¬ËùÒÔÒ»°ã Web ·þÎñÆ÷²»Ê¹ÓÃÕâÖÖ I/O Ä£ÐÍ¡£

I/O ¸´ÓÃÄ£ÐÍ(I/O multiplexing£©

ÔÚ I/O ¸´ÓÃÄ£ÐÍÖУ¬»áÓõ½ Select »ò Poll º¯Êý»ò Epoll º¯Êý(Linux 2.6 ÒÔºóµÄÄں˿ªÊ¼Ö§³Ö)£¬ÕâÁ½¸öº¯ÊýÒ²»áʹ½ø³Ì×èÈû£¬µ«ÊǺÍ×èÈû I/O ÓÐËù²»Í¬¡£

ÕâÁ½¸öº¯Êý¿ÉÒÔͬʱ×èÈû¶à¸ö I/O ²Ù×÷£¬¶øÇÒ¿ÉÒÔͬʱ¶Ô¶à¸ö¶Á²Ù×÷£¬¶à¸öд²Ù×÷µÄ I/O º¯Êý½øÐмì²â£¬Ö±µ½ÓÐÊý¾Ý¿É¶Á»ò¿Éдʱ£¬²ÅÕæÕýµ÷Óà I/O ²Ù×÷º¯Êý¡£

±ÈÓ÷£º·ÅÁËÒ»¶ÑÓã¸Í£¬ÔÚ°¶±ßÒ»Ö±ÊØ×ÅÕâ¶ÑÓã¸Í£¬Ã»ÓãÉϹ³¾ÍÍæÊÖ»ú¡£

Óŵ㣺¿ÉÒÔ»ùÓÚÒ»¸ö×èÈû¶ÔÏó£¬Í¬Ê±ÔÚ¶à¸öÃèÊö·ûÉϵȴý¾ÍÐ÷£¬¶ø²»ÊÇʹÓöà¸öÏß³Ì(ÿ¸öÎļþÃèÊö·ûÒ»¸öÏß³Ì)£¬ÕâÑù¿ÉÒÔ´ó´ó½Úʡϵͳ×ÊÔ´¡£

ȱµã£ºµ±Á¬½ÓÊý½ÏÉÙʱЧÂÊÏà±È¶àÏß³Ì+×èÈû I/O Ä£ÐÍЧÂʽϵͣ¬¿ÉÄÜÑÓ³Ù¸ü´ó£¬ÒòΪµ¥¸öÁ¬½Ó´¦ÀíÐèÒª 2 ´Îϵͳµ÷Óã¬Õ¼ÓÃʱ¼ä»áÓÐÔö¼Ó¡£

ÐźÅÇý¶¯Ê½ I/O Ä£ÐÍ£¨signal-driven I/O)

ÔÚÐźÅÇý¶¯Ê½ I/O Ä£ÐÍÖУ¬Ó¦ÓóÌÐòʹÓÃÌ×½Ó¿Ú½øÐÐÐźÅÇý¶¯ I/O£¬²¢°²×°Ò»¸öÐźŴ¦Àíº¯Êý£¬½ø³Ì¼ÌÐøÔËÐв¢²»×èÈû¡£

µ±Êý¾Ý×¼±¸ºÃʱ£¬½ø³Ì»áÊÕµ½Ò»¸ö SIGIO Ðźţ¬¿ÉÒÔÔÚÐźŴ¦Àíº¯ÊýÖе÷Óà I/O ²Ù×÷º¯Êý´¦ÀíÊý¾Ý¡£

±ÈÓ÷£ºÓã¸ÍÉÏϵÁ˸öÁåîõ£¬µ±ÁåîõÏ죬¾ÍÖªµÀÓãÉϹ³£¬È»ºó¿ÉÒÔרÐÄÍæÊÖ»ú¡£

Óŵ㣺Ï̲߳¢Ã»ÓÐÔڵȴýÊý¾Ýʱ±»×èÈû£¬¿ÉÒÔÌá¸ß×ÊÔ´µÄÀûÓÃÂÊ¡£

ȱµã£ºÐźŠI/O ÔÚ´óÁ¿ IO ²Ù×÷ʱ¿ÉÄÜ»áÒòΪÐźŶÓÁÐÒç³öµ¼ÖÂû·¨Í¨Öª¡£

ÐźÅÇý¶¯ I/O ¾¡¹Ü¶ÔÓÚ´¦Àí UDP Ì×½Ó×ÖÀ´ËµÓÐÓ㬼´ÕâÖÖÐźÅ֪ͨÒâζ×ŵ½´ïÒ»¸öÊý¾Ý±¨£¬»òÕß·µ»ØÒ»¸öÒì²½´íÎó¡£

µ«ÊÇ£¬¶ÔÓÚ TCP ¶øÑÔ£¬ÐźÅÇý¶¯µÄ I/O ·½Ê½½üºõÎÞÓã¬ÒòΪµ¼ÖÂÕâÖÖ֪ͨµÄÌõ¼þΪÊýÖڶ࣬ÿһ¸öÀ´½øÐÐÅбð»áÏûºÄºÜ´ó×ÊÔ´£¬Óëǰ¼¸ÖÖ·½Ê½Ïà±ÈÓÅÊÆ¾¡Ê§¡£

Òì²½ I/O Ä£ÐÍ£¨asynchronous I/O£©

ÓÉ POSIX ¹æ·¶¶¨Ò壬ӦÓóÌÐò¸æÖªÄÚºËÆô¶¯Ä³¸ö²Ù×÷£¬²¢ÈÃÄÚºËÔÚÕû¸ö²Ù×÷£¨°üÀ¨½«Êý¾Ý´ÓÄں˿½±´µ½Ó¦ÓóÌÐòµÄ»º³åÇø£©Íê³Éºó֪ͨӦÓóÌÐò¡£

ÕâÖÖÄ£ÐÍÓëÐźÅÇý¶¯Ä£Ð͵ÄÖ÷񻂿±ðÔÚÓÚ£ºÐźÅÇý¶¯ I/O ÊÇÓÉÄÚºË֪ͨӦÓóÌÐòºÎʱÆô¶¯Ò»¸ö I/O ²Ù×÷£¬¶øÒì²½ I/O Ä£ÐÍÊÇÓÉÄÚºË֪ͨӦÓóÌÐò I/O ²Ù×÷ºÎʱÍê³É¡£

Óŵ㣺Òì²½ I/O Äܹ»³ä·ÖÀûÓà DMA ÌØÐÔ£¬Èà I/O ²Ù×÷Óë¼ÆËãÖØµþ¡£

ȱµã£ºÒªÊµÏÖÕæÕýµÄÒì²½ I/O£¬²Ù×÷ϵͳÐèÒª×ö´óÁ¿µÄ¹¤×÷¡£Ä¿Ç° Windows ÏÂͨ¹ý IOCP ʵÏÖÁËÕæÕýµÄÒì²½ I/O¡£

¶øÔÚ Linux ϵͳÏ£¬Linux 2.6²ÅÒýÈ룬Ŀǰ AIO ²¢²»ÍêÉÆ£¬Òò´ËÔÚ Linux ÏÂʵÏָ߲¢·¢ÍøÂç±à³Ìʱ¶¼ÊÇÒÔ IO ¸´ÓÃÄ£ÐÍģʽΪÖ÷¡£

5 ÖÖ I/O Ä£ÐÍ×ܽá

´ÓÉÏͼÖÐÎÒÃÇ¿ÉÒÔ¿´³ö£¬Ô½Íùºó£¬×èÈûÔ½ÉÙ£¬ÀíÂÛÉÏЧÂÊÒ²ÊÇ×îÓÅ¡£

ÕâÎåÖÖ I/O Ä£ÐÍÖУ¬Ç°ËÄÖÖÊôÓÚͬ²½ I/O£¬ÒòΪÆäÖÐÕæÕýµÄ I/O ²Ù×÷(recvfrom)½«×èÈû½ø³Ì/Ị̈߳¬Ö»ÓÐÒì²½ I/O Ä£ÐͲÅÓë POSIX ¶¨ÒåµÄÒì²½ I/O ÏàÆ¥Åä¡£

Ïß³ÌÄ£ÐÍ

½éÉÜÍê·þÎñÆ÷ÈçºÎ»ùÓÚ I/O Ä£Ð͹ÜÀíÁ¬½Ó£¬»ñÈ¡ÊäÈëÊý¾Ý£¬ÏÂÃæ½éÉÜ»ùÓÚ½ø³Ì/Ïß³ÌÄ£ÐÍ£¬·þÎñÆ÷ÈçºÎ´¦ÀíÇëÇó¡£

ÖµµÃ˵Ã÷µÄÊÇ£¬¾ßÌåÑ¡ÔñÏ̻߳¹Êǽø³Ì£¬¸ü¶àÊÇÓëÆ½Ì¨¼°±à³ÌÓïÑÔÏà¹Ø¡£

ÀýÈç C ÓïÑÔʹÓÃÏ̺߳ͽø³Ì¶¼¿ÉÒÔ(ÀýÈç Nginx ʹÓýø³Ì£¬Memcached ʹÓÃÏß³Ì)£¬Java ÓïÑÔÒ»°ãʹÓÃÏß³Ì(ÀýÈç Netty)£¬ÎªÁËÃèÊö·½±ã£¬ÏÂÃæ¶¼Ê¹ÓÃÏß³ÌÀ´½øÐÐÃèÊö¡£

´«Í³×èÈû I/O ·þÎñÄ£ÐÍ

ÌØµã£º

²ÉÓÃ×èÈûʽ I/O Ä£ÐÍ»ñÈ¡ÊäÈëÊý¾Ý¡£

ÿ¸öÁ¬½Ó¶¼ÐèÒª¶ÀÁ¢µÄÏß³ÌÍê³ÉÊý¾ÝÊäÈ룬ҵÎñ´¦Àí£¬Êý¾Ý·µ»ØµÄÍêÕû²Ù×÷¡£

´æÔÚÎÊÌ⣺

µ±²¢·¢Êý½Ï´óʱ£¬ÐèÒª´´½¨´óÁ¿Ïß³ÌÀ´´¦ÀíÁ¬½Ó£¬ÏµÍ³×ÊÔ´Õ¼Óýϴó¡£

Á¬½Ó½¨Á¢ºó£¬Èç¹ûµ±Ç°Ïß³ÌÔÝʱûÓÐÊý¾Ý¿É¶Á£¬ÔòÏ߳̾Í×èÈûÔÚ Read ²Ù×÷ÉÏ£¬Ôì³ÉÏß³Ì×ÊÔ´ÀË·Ñ¡£

Reactor ģʽ

Õë¶Ô´«Í³×èÈû I/O ·þÎñÄ£Ð굀 2 ¸öȱµã£¬±È½Ï³£¼ûµÄÓÐÈçϽâ¾ö·½°¸£º

»ùÓÚ I/O ¸´ÓÃÄ£ÐÍ£¬¶à¸öÁ¬½Ó¹²ÓÃÒ»¸ö×èÈû¶ÔÏó£¬Ó¦ÓóÌÐòÖ»ÐèÒªÔÚÒ»¸ö×èÈû¶ÔÏóÉϵȴý£¬ÎÞÐè×èÈûµÈ´ýËùÓÐÁ¬½Ó¡£

µ±Ä³ÌõÁ¬½ÓÓÐеÄÊý¾Ý¿ÉÒÔ´¦Àíʱ£¬²Ù×÷ϵͳ֪ͨӦÓóÌÐò£¬Ï̴߳Ó×èÈû״̬·µ»Ø£¬¿ªÊ¼½øÐÐÒµÎñ´¦Àí¡£

»ùÓÚÏ̳߳ظ´ÓÃÏß³Ì×ÊÔ´£¬²»±ØÔÙΪÿ¸öÁ¬½Ó´´½¨Ị̈߳¬½«Á¬½ÓÍê³ÉºóµÄÒµÎñ´¦ÀíÈÎÎñ·ÖÅ䏸Ï߳̽øÐд¦Àí£¬Ò»¸öÏ߳̿ÉÒÔ´¦Àí¶à¸öÁ¬½ÓµÄÒµÎñ¡£

I/O ¸´ÓýáºÏÏ̳߳أ¬Õâ¾ÍÊÇ Reactor ģʽ»ù±¾Éè¼ÆË¼Ï룬ÈçÏÂͼ£º

Reactor ģʽ£¬ÊÇָͨ¹ýÒ»¸ö»ò¶à¸öÊäÈëͬʱ´«µÝ¸ø·þÎñ´¦ÀíÆ÷µÄ·þÎñÇëÇóµÄʼþÇý¶¯´¦Àíģʽ¡£

·þÎñ¶Ë³ÌÐò´¦Àí´«Èë¶à·ÇëÇ󣬲¢½«ËüÃÇͬ²½·ÖÅɸøÇëÇó¶ÔÓ¦µÄ´¦ÀíỊ̈߳¬Reactor ģʽҲ½Ð Dispatcher ģʽ¡£

¼´ I/O ¶àÁ˸´ÓÃͳһ¼àÌýʼþ£¬ÊÕµ½Ê¼þºó·Ö·¢(Dispatch ¸øÄ³½ø³Ì)£¬ÊDZàд¸ßÐÔÄÜÍøÂç·þÎñÆ÷µÄ±Ø±¸¼¼ÊõÖ®Ò»¡£

Reactor ģʽÖÐÓÐ 2 ¸ö¹Ø¼ü×é³É£º

Reactor£¬Reactor ÔÚÒ»¸öµ¥¶ÀµÄÏß³ÌÖÐÔËÐУ¬¸ºÔð¼àÌýºÍ·Ö·¢Ê¼þ£¬·Ö·¢¸øÊʵ±µÄ´¦Àí³ÌÐòÀ´¶Ô IO ʼþ×ö³ö·´Ó¦¡£ Ëü¾ÍÏñ¹«Ë¾µÄµç»°½ÓÏßÔ±£¬Ëü½ÓÌýÀ´×Ô¿Í»§µÄµç»°²¢½«ÏßÂ·×ªÒÆµ½Êʵ±µÄÁªÏµÈË¡£

Handlers£¬´¦Àí³ÌÐòÖ´ÐÐ I/O ʼþÒªÍê³ÉµÄʵ¼Êʼþ£¬ÀàËÆÓÚ¿Í»§ÏëÒªÓëÖ®½»Ì¸µÄ¹«Ë¾ÖеÄʵ¼Ê¹ÙÔ±¡£Reactor ͨ¹ýµ÷¶ÈÊʵ±µÄ´¦Àí³ÌÐòÀ´ÏìÓ¦ I/O ʼþ£¬´¦Àí³ÌÐòÖ´ÐзÇ×èÈû²Ù×÷¡£

¸ù¾Ý Reactor µÄÊýÁ¿ºÍ´¦Àí×ÊÔ´³ØÏ̵߳ÄÊýÁ¿²»Í¬£¬ÓÐ 3 ÖÖµäÐ͵ÄʵÏÖ£º

µ¥ Reactor µ¥Ïß³Ì

µ¥ Reactor ¶àÏß³Ì

Ö÷´Ó Reactor ¶àÏß³Ì

ÏÂÃæÏêϸ½éÉÜÕâ 3 ÖÖʵÏÖ·½Ê½¡£

µ¥ Reactor µ¥Ïß³Ì

ÆäÖУ¬Select ÊÇÇ°Ãæ I/O ¸´ÓÃÄ£ÐͽéÉܵıê×¼ÍøÂç±à³Ì API£¬¿ÉÒÔʵÏÖÓ¦ÓóÌÐòͨ¹ýÒ»¸ö×èÈû¶ÔÏó¼àÌý¶à·Á¬½ÓÇëÇ󣬯äËû·½°¸Ê¾ÒâͼÀàËÆ¡£

·½°¸ËµÃ÷£º

Reactor ¶ÔÏóͨ¹ý Select ¼à¿Ø¿Í»§¶ËÇëÇóʼþ£¬ÊÕµ½Ê¼þºóͨ¹ý Dispatch ½øÐзַ¢¡£

Èç¹ûÊǽ¨Á¢Á¬½ÓÇëÇóʼþ£¬ÔòÓÉ Acceptor ͨ¹ý Accept ´¦ÀíÁ¬½ÓÇëÇó£¬È»ºó´´½¨Ò»¸ö Handler ¶ÔÏó´¦ÀíÁ¬½ÓÍê³ÉºóµÄºóÐøÒµÎñ´¦Àí¡£

Èç¹û²»Êǽ¨Á¢Á¬½Óʼþ£¬Ôò Reactor »á·Ö·¢µ÷ÓÃÁ¬½Ó¶ÔÓ¦µÄ Handler À´ÏìÓ¦¡£

Handler »áÍê³É Read¡úÒµÎñ´¦Àí¡úSend µÄÍêÕûÒµÎñÁ÷³Ì¡£

Óŵ㣺ģÐͼòµ¥£¬Ã»ÓжàÏ̡߳¢½ø³ÌͨÐÅ¡¢¾ºÕùµÄÎÊÌ⣬ȫ²¿¶¼ÔÚÒ»¸öÏß³ÌÖÐÍê³É¡£

ȱµã£ºÐÔÄÜÎÊÌ⣬ֻÓÐÒ»¸öỊ̈߳¬ÎÞ·¨ÍêÈ«·¢»Ó¶àºË CPU µÄÐÔÄÜ¡£Handler ÔÚ´¦Àíij¸öÁ¬½ÓÉϵÄÒµÎñʱ£¬Õû¸ö½ø³ÌÎÞ·¨´¦ÀíÆäËûÁ¬½Óʼþ£¬ºÜÈÝÒ×µ¼ÖÂÐÔÄÜÆ¿¾±¡£

¿É¿¿ÐÔÎÊÌ⣬Ïß³ÌÒâÍâÅÜ·É£¬»òÕß½øÈëËÀÑ­»·£¬»áµ¼ÖÂÕû¸öϵͳͨÐÅÄ£¿é²»¿ÉÓ㬲»ÄܽÓÊպʹ¦ÀíÍⲿÏûÏ¢£¬Ôì³É½Úµã¹ÊÕÏ¡£

ʹÓó¡¾°£º¿Í»§¶ËµÄÊýÁ¿ÓÐÏÞ£¬ÒµÎñ´¦Àí·Ç³£¿ìËÙ£¬±ÈÈç Redis£¬ÒµÎñ´¦ÀíµÄʱ¼ä¸´ÔÓ¶È O(1)¡£

µ¥ Reactor ¶àÏß³Ì

·½°¸ËµÃ÷£º

Reactor ¶ÔÏóͨ¹ý Select ¼à¿Ø¿Í»§¶ËÇëÇóʼþ£¬ÊÕµ½Ê¼þºóͨ¹ý Dispatch ½øÐзַ¢¡£

Èç¹ûÊǽ¨Á¢Á¬½ÓÇëÇóʼþ£¬ÔòÓÉ Acceptor ͨ¹ý Accept ´¦ÀíÁ¬½ÓÇëÇó£¬È»ºó´´½¨Ò»¸ö Handler ¶ÔÏó´¦ÀíÁ¬½ÓÍê³ÉºóÐøµÄ¸÷ÖÖʼþ¡£

Èç¹û²»Êǽ¨Á¢Á¬½Óʼþ£¬Ôò Reactor »á·Ö·¢µ÷ÓÃÁ¬½Ó¶ÔÓ¦µÄ Handler À´ÏìÓ¦¡£

Handler Ö»¸ºÔðÏìӦʼþ£¬²»×ö¾ßÌåÒµÎñ´¦Àí£¬Í¨¹ý Read ¶ÁÈ¡Êý¾Ýºó£¬»á·Ö·¢¸øºóÃæµÄ Worker Ï̳߳ؽøÐÐÒµÎñ´¦Àí¡£

Worker Ï̳߳ػá·ÖÅä¶ÀÁ¢µÄÏß³ÌÍê³ÉÕæÕýµÄÒµÎñ´¦Àí£¬ÈçºÎ½«ÏìÓ¦½á¹û·¢¸ø Handler ½øÐд¦Àí¡£

Handler ÊÕµ½ÏìÓ¦½á¹ûºóͨ¹ý Send ½«ÏìÓ¦½á¹û·µ»Ø¸ø Client¡£

Óŵ㣺¿ÉÒÔ³ä·ÖÀûÓöàºË CPU µÄ´¦ÀíÄÜÁ¦¡£

ȱµã£º¶àÏß³ÌÊý¾Ý¹²ÏíºÍ·ÃÎʱȽϸ´ÔÓ£»Reactor ³Ðµ£ËùÓÐʼþµÄ¼àÌýºÍÏìÓ¦£¬ÔÚµ¥Ïß³ÌÖÐÔËÐУ¬¸ß²¢·¢³¡¾°ÏÂÈÝÒ׳ÉΪÐÔÄÜÆ¿¾±¡£

Ö÷´Ó Reactor ¶àÏß³Ì

Õë¶Ôµ¥ Reactor ¶àÏß³ÌÄ£ÐÍÖУ¬Reactor ÔÚµ¥Ïß³ÌÖÐÔËÐУ¬¸ß²¢·¢³¡¾°ÏÂÈÝÒ׳ÉΪÐÔÄÜÆ¿¾±£¬¿ÉÒÔÈà Reactor ÔÚ¶àÏß³ÌÖÐÔËÐС£

·½°¸ËµÃ÷£º

Reactor Ö÷Ïß³Ì MainReactor ¶ÔÏóͨ¹ý Select ¼à¿Ø½¨Á¢Á¬½Óʼþ£¬ÊÕµ½Ê¼þºóͨ¹ý Acceptor ½ÓÊÕ£¬´¦Àí½¨Á¢Á¬½Óʼþ¡£

Acceptor ´¦Àí½¨Á¢Á¬½Óʼþºó£¬MainReactor ½«Á¬½Ó·ÖÅä Reactor ×ÓÏ̸߳ø SubReactor ½øÐд¦Àí¡£

SubReactor ½«Á¬½Ó¼ÓÈëÁ¬½Ó¶ÓÁнøÐмàÌý£¬²¢´´½¨Ò»¸ö Handler ÓÃÓÚ´¦Àí¸÷ÖÖÁ¬½Óʼþ¡£

µ±ÓÐеÄʼþ·¢Éúʱ£¬SubReactor »áµ÷ÓÃÁ¬½Ó¶ÔÓ¦µÄ Handler ½øÐÐÏìÓ¦¡£

Handler ͨ¹ý Read ¶ÁÈ¡Êý¾Ýºó£¬»á·Ö·¢¸øºóÃæµÄ Worker Ï̳߳ؽøÐÐÒµÎñ´¦Àí¡£

Worker Ï̳߳ػá·ÖÅä¶ÀÁ¢µÄÏß³ÌÍê³ÉÕæÕýµÄÒµÎñ´¦Àí£¬ÈçºÎ½«ÏìÓ¦½á¹û·¢¸ø Handler ½øÐд¦Àí¡£

Handler ÊÕµ½ÏìÓ¦½á¹ûºóͨ¹ý Send ½«ÏìÓ¦½á¹û·µ»Ø¸ø Client¡£

Óŵ㣺¸¸Ïß³ÌÓë×ÓÏ̵߳ÄÊý¾Ý½»»¥¼òµ¥Ö°ÔðÃ÷È·£¬¸¸Ïß³ÌÖ»ÐèÒª½ÓÊÕÐÂÁ¬½Ó£¬×ÓÏß³ÌÍê³ÉºóÐøµÄÒµÎñ´¦Àí¡£

¸¸Ïß³ÌÓë×ÓÏ̵߳ÄÊý¾Ý½»»¥¼òµ¥£¬Reactor Ö÷Ïß³ÌÖ»ÐèÒª°ÑÐÂÁ¬½Ó´«¸ø×ÓỊ̈߳¬×ÓÏß³ÌÎÞÐè·µ»ØÊý¾Ý¡£

ÕâÖÖÄ£ÐÍÔÚÐí¶àÏîÄ¿Öй㷺ʹÓ㬰üÀ¨ Nginx Ö÷´Ó Reactor ¶à½ø³ÌÄ£ÐÍ£¬Memcached Ö÷´Ó¶àỊ̈߳¬Netty Ö÷´Ó¶àÏß³ÌÄ£Ð͵ÄÖ§³Ö¡£

3 ÖÖģʽ¿ÉÒÔÓøö±ÈÓ÷À´Àí½â£º²ÍÌü³£³£¹ÍÓ¶½Ó´ýÔ±¸ºÔðÓ­½Ó¹Ë¿Í£¬µ±¹Ë¿ÍÈë×øºó£¬ÊÌÓ¦ÉúרÃÅΪÕâÕÅ×À×Ó·þÎñ¡£

µ¥ Reactor µ¥Ị̈߳¬½Ó´ýÔ±ºÍÊÌÓ¦ÉúÊÇͬһ¸öÈË£¬È«³ÌΪ¹Ë¿Í·þÎñ¡£

µ¥ Reactor ¶àỊ̈߳¬1 ¸ö½Ó´ýÔ±£¬¶à¸öÊÌÓ¦Éú£¬½Ó´ýÔ±Ö»¸ºÔð½Ó´ý¡£

Ö÷´Ó Reactor ¶àỊ̈߳¬¶à¸ö½Ó´ýÔ±£¬¶à¸öÊÌÓ¦Éú¡£

Reactor ģʽ¾ßÓÐÈçϵÄÓŵ㣺

ÏìÓ¦¿ì£¬²»±ØÎªµ¥¸öͬ²½Ê±¼äËù×èÈû£¬ËäÈ» Reactor ±¾ÉíÒÀÈ»ÊÇͬ²½µÄ¡£

±à³ÌÏà¶Ô¼òµ¥£¬¿ÉÒÔ×î´ó³Ì¶ÈµÄ±ÜÃ⸴ÔӵĶàÏ̼߳°Í¬²½ÎÊÌ⣬²¢ÇÒ±ÜÃâÁ˶àÏß³Ì/½ø³ÌµÄÇл»¿ªÏú¡£

¿ÉÀ©Õ¹ÐÔ£¬¿ÉÒÔ·½±ãµÄͨ¹ýÔö¼Ó Reactor ʵÀý¸öÊýÀ´³ä·ÖÀûÓà CPU ×ÊÔ´¡£

¿É¸´ÓÃÐÔ£¬Reactor Ä£Ðͱ¾ÉíÓë¾ßÌåʼþ´¦ÀíÂß¼­Î޹أ¬¾ßÓкܸߵĸ´ÓÃÐÔ¡£

Proactor Ä£ÐÍ

ÔÚ Reactor ģʽÖУ¬Reactor µÈ´ýij¸öʼþ»òÕß¿ÉÓ¦ÓûòÕß²Ù×÷µÄ״̬·¢Éú£¨±ÈÈçÎļþÃèÊö·û¿É¶Áд£¬»òÕßÊÇ Socket ¿É¶Áд£©¡£

È»ºó°ÑÕâ¸öʼþ´«¸øÊÂÏÈ×¢²áµÄ Handler£¨Ê¼þ´¦Àíº¯Êý»òÕ߻ص÷º¯Êý£©£¬ÓɺóÕßÀ´×öʵ¼ÊµÄ¶Áд²Ù×÷¡£

ÆäÖеĶÁд²Ù×÷¶¼ÐèÒªÓ¦ÓóÌÐòͬ²½²Ù×÷£¬ËùÒÔ Reactor ÊÇ·Ç×èÈûͬ²½ÍøÂçÄ£ÐÍ¡£

Èç¹û°Ñ I/O ²Ù×÷¸ÄΪÒì²½£¬¼´½»¸ø²Ù×÷ϵͳÀ´Íê³É¾ÍÄܽøÒ»²½ÌáÉýÐÔÄÜ£¬Õâ¾ÍÊÇÒì²½ÍøÂçÄ£ÐÍ Proactor¡£

Proactor ÊǺÍÒì²½ I/O Ïà¹ØµÄ£¬Ïêϸ·½°¸ÈçÏ£º

1.Proactor Initiator ´´½¨ Proactor ºÍ Handler ¶ÔÏ󣬲¢½« Proactor ºÍ Handler ¶¼Í¨¹ý AsyOptProcessor£¨Asynchronous Operation Processor£©×¢²áµ½Äںˡ£

2.AsyOptProcessor ´¦Àí×¢²áÇëÇ󣬲¢´¦Àí I/O ²Ù×÷¡£

3.AsyOptProcessor Íê³É I/O ²Ù×÷ºó֪ͨ Proactor¡£

4.Proactor ¸ù¾Ý²»Í¬µÄʼþÀàÐͻص÷²»Í¬µÄ Handler ½øÐÐÒµÎñ´¦Àí¡£

5.Handler Íê³ÉÒµÎñ´¦Àí¡£

¿ÉÒÔ¿´³ö Proactor ºÍ Reactor µÄÇø±ð£º

1.Reactor ÊÇÔÚʼþ·¢Éúʱ¾Í֪ͨÊÂÏÈ×¢²áµÄʼþ£¨¶ÁдÔÚÓ¦ÓóÌÐòÏß³ÌÖд¦ÀíÍê³É£©¡£

2.Proactor ÊÇÔÚʼþ·¢Éúʱ»ùÓÚÒì²½ I/O Íê³É¶Áд²Ù×÷£¨ÓÉÄÚºËÍê³É£©£¬´ý I/O ²Ù×÷Íê³Éºó²Å»Øµ÷Ó¦ÓóÌÐòµÄ´¦ÀíÆ÷À´½øÐÐÒµÎñ´¦Àí¡£

3.ÀíÂÛÉÏ Proactor ±È Reactor ЧÂʸü¸ß£¬Òì²½ I/O ¸ü¼Ó³ä·Ö·¢»Ó DMA(Direct Memory Access£¬Ö±½ÓÄÚ´æ´æÈ¡)µÄÓÅÊÆ£¬µ«ÊÇÓÐÈçÏÂȱµã£º

4.±à³Ì¸´ÔÓÐÔ£¬ÓÉÓÚÒì²½²Ù×÷Á÷³ÌµÄʼþµÄ³õʼ»¯ºÍʼþÍê³ÉÔÚʱ¼äºÍ¿Õ¼äÉ϶¼ÊÇÏ໥·ÖÀëµÄ£¬Òò´Ë¿ª·¢Òì²½Ó¦ÓóÌÐò¸ü¼Ó¸´ÔÓ¡£Ó¦ÓóÌÐò»¹¿ÉÄÜÒòΪ·´ÏòµÄÁ÷¿Ø¶ø±äµÃ¸ü¼ÓÄÑÒÔ Debug¡£

5.ÄÚ´æÊ¹Ó㬻º³åÇøÔÚ¶Á»òд²Ù×÷µÄʱ¼ä¶ÎÄÚ±ØÐë±£³Öס£¬¿ÉÄÜÔì³É³ÖÐøµÄ²»È·¶¨ÐÔ£¬²¢ÇÒÿ¸ö²¢·¢²Ù×÷¶¼ÒªÇóÓжÀÁ¢µÄ»º´æ£¬Ïà±È Reactor ģʽ£¬ÔÚ Socket ÒѾ­×¼±¸ºÃ¶Á»òдǰ£¬ÊDz»ÒªÇ󿪱ٻº´æµÄ¡£

6.²Ù×÷ϵͳ֧³Ö£¬Windows ÏÂͨ¹ý IOCP ʵÏÖÁËÕæÕýµÄÒì²½ I/O£¬¶øÔÚ Linux ϵͳÏ£¬Linux 2.6 ²ÅÒýÈ룬ĿǰÒì²½ I/O »¹²»ÍêÉÆ¡£

Òò´ËÔÚ Linux ÏÂʵÏָ߲¢·¢ÍøÂç±à³Ì¶¼ÊÇÒÔ Reactor Ä£ÐÍΪÖ÷¡£

   
1951 ´Îä¯ÀÀ       27
????

HTTP????
nginx??????
SD-WAN???
5G?????
 
????

??????????
IPv6???????
??????????
???????
????

????????
????????
???????????????
??????????