ÀÖÓãµç¾º

½ÌÓýÐÐÒµA¹ÉIPOµÚÒ»¹É£¨¹ÉƱ´úÂë 003032£©

È«¹ú×Éѯ/ͶËßÈÈÏߣº400-618-4000

C/C++¼¼Êõ֪ʶµã£ºÉîÈëdz³ö-·þÎñÆ÷¸ß²¢·¢¿âlibevent(¶þ)

¸üÐÂʱ¼ä: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/

0 ·ÖÏíµ½£º
ºÍÎÒÃÇÔÚÏß½»Ì¸£¡
¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿