±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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 Ä£ÐÍΪÖ÷¡£ |