¸üÐÂʱ¼ä:2017Äê11ÔÂ30ÈÕ16ʱ00·Ö À´Ô´:ÀÖÓã²¥¿Í ä¯ÀÀ´ÎÊý:
ÉÏÒ»Õ£¬ÎÒÃǼòµ¥½éÉÜÁËlibeventµÄ»·¾³µÄ°²×°£¬ºÍ¼òµ¥µÄÊÂÀý¡£ÏÖÔÚÏȲ»Òª×ż±·ÖÎöËûµÄ´úÂ룬ÔÚÕâÀïÎÒÊ×ÏÈÒª½éÉÜÒ»¸öרҵÃû´Ê“Reactorģʽ”¡£
2.1 ReactorµÄʼþ´¦Àí»úÖÆ
ÎÒÃÇÓ¦¸ÃºÜÇå³þº¯ÊýµÄµ÷ÓûúÖÆ¡£
1. ³ÌÐòµ÷Óú¯Êý
2. º¯ÊýÖ´ÐÐ
3. ³ÌÐòµÈ´ýº¯Êý½«½á¹ûºÍ¿ØÖÆÈ¨·µ»Ø¸ø³ÌÐò
4. ³ÌÐò¼ÌÐø´¦ÀíºÍÖ´ÐÐ
Reactor ±»·Òë³É ·´Ó¦¶Ñ£¬»òÕß·´Ó¦Æ÷¡£ Re-actor ·¢Òô¡£
ËûÊÇÒ»ÖÖʼþÇý¶¯»úÖÆ¡£ºÍÆÕͨº¯Êýµ÷ÓõIJ»Í¬Ö®´¦ÔÚÓÚ£¬ Ó¦ÓóÌÐò²»ÊÇÖ÷¶¯ µÄµ÷ÓÃij¿ÌAPIÍê³É´¦Àí£¬¶øÊÇǡǡÏà·´£¬reactorÄæÖÃÁËʼþµÄ´¦ÀíÁ÷³Ì£¬Ó¦ÓóÌÐòÐèÒªÌṩÏàÓ¦µÄ½Ó¿Ú×¢²áµ½reacotrÉÏ¡£Èç¹ûÏàÓ¦µÄʼþ·¢Éú¡£Reacotr½«Ö÷¶¯µ÷ÓÃÓ¦ÓóÌÐò×¢²áµÄ½Ó¿Ú£¬ÕâЩ½Ó¿Ú¾ÍÊÇÎÒÃdz£³£ËµµÄ“»Øµ÷º¯Êý”¡£
ÎÒÃÇʹÓÃlibevent¿ò¼ÜÒ²¾ÍÊÇÏëÀûÓÃÕâ¸ö¿ò¼ÜÈ¥×¢²áÏàÓ¦µÄʼþºÍ»Øµ÷º¯Êý¡£
µ±ÕâЩʼþ·¢Éúʱ£¬libevent»áµ÷ÓÃÕâЩע²áºÃµÄ»Øµ÷º¯Êý´¦ÀíÏàÓ¦µÄʼþ(I/O¶Áд¡¢¶¨Ê±ºÍÐźÅ)
ͨ¹ýreactorµ÷Óú¯Êý£¬²»ÊÇÄãÖ÷¶¯È¥µ÷Óú¯Êý£¬¶øÊǵÈ×Åϵͳµ÷Óá£
Ò»¾ä»°£º“²»Óôòµç»°¸øÎÒÃÇ£¬ÎÒô»á´òµç»°Í¨ÖªÄ㔡£
¾Ù¸öÀý×Ó£¬ÄãȥӦƸijxx¹«Ë¾£¬ÃæÊÔ½áÊøºó¡£
“ÆÕͨº¯Êýµ÷ÓûúÖÆ”¹«Ë¾µÄHR±È½ÏÀÁ£¬²»»á¼ÇÄãµÄÁªÏµ·½Ê½£¬ÄÇÕ¦°ì£¬ÄãÖ»ÄÜÃæÊÔÍê×Ô¼º´òµç»°Îʽá¹û¡£ÓÐûÓб»Â¼È¡°¡£¬»¹ÊDZ»¾Ü¾øÁË¡£
“Reacotr”¹«Ë¾µÄHR¾Í¼ÇÏÂÁËÄãµÄÁªÏµ·½Ê½£¬½á¹û³öÀ´ºóHR»áÖ÷¶¯´òµç»°Í¨ÖªÄã¡£ÓÐûÓб»Â¼È¡°¡£¬»¹ÊDZ¯¾çÁË¡£Äã²»ÓÃ×Ô¼º´òµç»°È¥ÎÊ£¬Êµ¼ÊÉÏÄãÒ²²»ÄÜ£¬ÄãûÓÐHRµÄÁªÏµ·½Ê½¡£
2.2 ReactorģʽµÄÓŵã
ReactorģʽÊDZàд¸ßÐÔÄÜÍøÂç·þÎñÆ÷µÄ±Ø±¸¼¼ÊõÖ®Ò»£¬Ëü¾ßÓÐÈçϵÄÓŵ㣺
1)ÏìÓ¦¿ì£¬²»±ØÎªµ¥¸öͬ²½Ê±¼äËù×èÈû£¬ËäÈ»Reactor±¾ÉíÒÀÈ»ÊÇͬ²½µÄ;
2)±à³ÌÏà¶Ô¼òµ¥£¬¿ÉÒÔ×î´ó³Ì¶ÈµÄ±ÜÃ⸴ÔӵĶàÏ̼߳°Í¬²½ÎÊÌ⣬²¢ÇÒ±ÜÃâÁ˶àÏß³Ì/½ø³ÌµÄÇл»¿ªÏú;
3)¿ÉÀ©Õ¹ÐÔ£¬¿ÉÒÔ·½±ãµÄͨ¹ýÔö¼ÓReactorʵÀý¸öÊýÀ´³ä·ÖÀûÓÃCPU×ÊÔ´;
4)¿É¸´ÓÃÐÔ£¬reactor¿ò¼Ü±¾ÉíÓë¾ßÌåʼþ´¦ÀíÂß¼Î޹أ¬¾ßÓкܸߵĸ´ÓÃÐÔ;
2.3 ReactorģʽµÄ±Ø±¸Ìõ¼þ
1) ʼþÔ´
LinuxÉÏÊÇÎļþÃèÊö·û£¬WindowsÉϾÍÊÇSocket»òÕßHandleÁË£¬ÕâÀïͳһ³ÆÎª“¾ä±ú¼¯”;³ÌÐòÔÚÖ¸¶¨µÄ¾ä±úÉÏ×¢²á¹ØÐĵÄʼþ£¬±ÈÈçI/Oʼþ¡£
2) event demultiplexer——ʼþ¶à··Ö·¢»úÖÆ
ÓɲÙ×÷ϵͳÌṩµÄI/O¶à·¸´ÓûúÖÆ£¬±ÈÈçselectºÍepoll¡£
³ÌÐòÊ×ÏȽ«Æä¹ØÐĵľä±ú(ʼþÔ´)¼°Æäʼþ×¢²áµ½event demultiplexerÉÏ;
µ±ÓÐʼþµ½´ïʱ£¬event demultiplexer»á·¢³ö֪ͨ“ÔÚÒѾע²áµÄ¾ä±ú¼¯ÖУ¬Ò»¸ö»ò¶à¸ö¾ä±úµÄʼþÒѾ¾ÍÐ÷”;
³ÌÐòÊÕµ½Í¨Öªºó£¬¾Í¿ÉÒÔÔÚ·Ç×èÈûµÄÇé¿ö϶Ôʼþ½øÐд¦ÀíÁË¡£
¶ÔÓ¦µ½libeventÖУ¬ÒÀÈ»ÊÇselect¡¢poll¡¢epollµÈ£¬µ«ÊÇlibeventʹÓýṹÌåeventop½øÐÐÁË·â×°£¬ÒÔͳһµÄ½Ó¿ÚÀ´Ö§³ÖÕâЩI/O¶à·¸´ÓûúÖÆ£¬´ïµ½Á˶ÔÍâÒþ²Øµ×²ãϵͳ»úÖÆµÄÄ¿µÄ¡£
3) Reactor——·´Ó¦Æ÷
Reactor£¬ÊÇʼþ¹ÜÀíµÄ½Ó¿Ú£¬ÄÚ²¿Ê¹ÓÃevent demultiplexer×¢²á¡¢×¢Ïúʼþ;²¢ÔËÐÐʼþÑ»·£¬µ±ÓÐʼþ½øÈ듾ÍÐ÷”״̬ʱ£¬µ÷ÓÃ×¢²áʼþµÄ»Øµ÷º¯Êý´¦Àíʼþ¡£
¶ÔÓ¦µ½libeventÖУ¬¾ÍÊÇevent_base½á¹¹Ìå¡£
Ò»¸öµäÐ͵ÄReactorÉùÃ÷·½Ê½£º
class Reactor
{
public:
int register_handler(Event_Handler *pHandler, int event);
int remove_handler(Event_Handler *pHandler, int event);
void handle_events(timeval *ptv);
// ...
};
4) Event Handler——ʼþ´¦Àí³ÌÐò
ʼþ´¦Àí³ÌÐòÌṩÁËÒ»×é½Ó¿Ú£¬Ã¿¸ö½Ó¿Ú¶ÔÓ¦ÁËÒ»ÖÖÀàÐ͵Äʼþ£¬¹©ReactorÔÚÏàÓ¦µÄʼþ·¢Éúʱµ÷Óã¬Ö´ÐÐÏàÓ¦µÄʼþ´¦Àí¡£Í¨³£Ëü»á°ó¶¨Ò»¸öÓÐЧµÄ¾ä±ú¡£
¶ÔÓ¦µ½libeventÖУ¬¾ÍÊÇevent½á¹¹Ìå¡£
ÏÂÃæÊÇÁ½ÖÖµäÐ͵ÄEvent HandlerÀàÉùÃ÷·½Ê½£¬¶þÕß»¥ÓÐÓÅȱµã¡£
class Event_Handler
{
public:
virtual void handle_read() = 0;
virtual void handle_write() = 0;
virtual void handle_timeout() = 0;
virtual void handle_close() = 0;
virtual HANDLE get_handle() = 0;
// ...
};
class Event_Handler
{
public:
// events maybe read/write/timeout/close .etc
virtual void handle_events(int events) = 0;
virtual HANDLE get_handle() = 0;
// ...
};
ÉÏÃæ½²µ½ÁËReactorµÄ»ù±¾¸ÅÄî¡¢¿ò¼ÜºÍ´¦ÀíÁ÷³Ì£¬¶ÔReactorÓиö»ù±¾ÇåÎúµÄÁ˽âºó£¬ÔÙÀ´¶Ô±È¿´libevent¾Í»á¸üÈÝÒ×Àí½âÁË£¬½ÓÏÂÀ´¾ÍÕýʽ½øÈëµ½libeventµÄ´úÂëÊÀ½çÁË£¬¼ÓÓÍ!
±¾ÎİæÈ¨¹éÀÖÓã²¥¿ÍC/C++ѧԺËùÓУ¬»¶Ó×ªÔØ£¬×ªÔØÇë×¢Ã÷×÷Õß³ö´¦¡£Ð»Ð»!
×÷ÕߣºÀÖÓã²¥¿ÍC/C++ѧԺ
Ê×·¢£ºhttp://www.itcast.cn/c/
±±¾©Ð£Çø