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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Socket¸ßÐÔÄÜIOÄ£ÐÍdzÎö
 
×÷Õߣº·¶Ö¾¶«£¨Florian£©µÄ²©¿Í À´Ô´£ºÂëÅ©Íø ·¢²¼ÓÚ£º2015-02-12
  5478  次浏览      27
 

·þÎñÆ÷¶Ë±à³Ì¾­³£ÐèÒª¹¹Ôì¸ßÐÔÄܵÄIOÄ£ÐÍ£¬³£¼ûµÄIOÄ£ÐÍÓÐËÄÖÖ£º

£¨1£©Í¬²½×èÈûIO£¨Blocking IO£©£º¼´´«Í³µÄIOÄ£ÐÍ¡£

£¨2£©Í¬²½·Ç×èÈûIO£¨Non-blocking IO£©£ºÄ¬ÈÏ´´½¨µÄsocket¶¼ÊÇ×èÈûµÄ£¬·Ç×èÈûIOÒªÇósocket±»ÉèÖÃΪNONBLOCK¡£×¢ÒâÕâÀïËù˵µÄNIO²¢·ÇJavaµÄNIO£¨New IO£©¿â¡£

£¨3£©IO¶à·¸´Óã¨IO Multiplexing£©£º¼´¾­µäµÄReactorÉè¼ÆÄ£Ê½£¬ÓÐʱҲ³ÆÎªÒì²½×èÈûIO£¬JavaÖеÄSelectorºÍLinuxÖеÄepoll¶¼ÊÇÕâÖÖÄ£ÐÍ¡£

£¨4£©Òì²½IO£¨Asynchronous IO£©£º¼´¾­µäµÄProactorÉè¼ÆÄ£Ê½£¬Ò²³ÆÎªÒì²½·Ç×èÈûIO¡£

ͬ²½ºÍÒì²½µÄ¸ÅÄîÃèÊöµÄÊÇÓû§Ïß³ÌÓëÄں˵Ľ»»¥·½Ê½£ºÍ¬²½ÊÇÖ¸Óû§Ï̷߳¢ÆðIOÇëÇóºóÐèÒªµÈ´ý»òÕßÂÖѯÄÚºËIO²Ù×÷Íê³Éºó²ÅÄܼÌÐøÖ´ÐУ»¶øÒì²½ÊÇÖ¸Óû§Ï̷߳¢ÆðIOÇëÇóºóÈÔ¼ÌÐøÖ´ÐУ¬µ±ÄÚºËIO²Ù×÷Íê³Éºó»á֪ͨÓû§Ị̈߳¬»òÕßµ÷ÓÃÓû§Ïß³Ì×¢²áµÄ»Øµ÷º¯Êý¡£

×èÈûºÍ·Ç×èÈûµÄ¸ÅÄîÃèÊöµÄÊÇÓû§Ï̵߳÷ÓÃÄÚºËIO²Ù×÷µÄ·½Ê½£º×èÈûÊÇÖ¸IO²Ù×÷ÐèÒª³¹µ×Íê³Éºó²Å·µ»Øµ½Óû§¿Õ¼ä£»¶ø·Ç×èÈûÊÇÖ¸IO²Ù×÷±»µ÷ÓúóÁ¢¼´·µ»Ø¸øÓû§Ò»¸ö״ֵ̬£¬ÎÞÐèµÈµ½IO²Ù×÷³¹µ×Íê³É¡£

ÁíÍ⣬Richard Stevens ÔÚ¡¶Unix ÍøÂç±à³Ì¡·¾í1ÖÐÌáµ½µÄ»ùÓÚÐźÅÇý¶¯µÄIO£¨Signal Driven IO£©Ä£ÐÍ£¬ÓÉÓÚ¸ÃÄ£ÐͲ¢²»³£Ó㬱¾ÎIJ»×÷Éæ¼°¡£½ÓÏÂÀ´£¬ÎÒÃÇÏêϸ·ÖÎöËÄÖÖ³£¼ûµÄIOÄ£Ð͵ÄʵÏÖÔ­Àí¡£ÎªÁË·½±ãÃèÊö£¬ÎÒÃÇͳһʹÓÃIOµÄ¶Á²Ù×÷×÷ΪʾÀý¡£

Ò»¡¢Í¬²½×èÈûIO

ͬ²½×èÈûIOÄ£ÐÍÊÇ×î¼òµ¥µÄIOÄ£ÐÍ£¬Óû§Ïß³ÌÔÚÄں˽øÐÐIO²Ù×÷ʱ±»×èÈû¡£

ͼ1 ͬ²½×èÈûIO

Èçͼ1Ëùʾ£¬Óû§Ïß³Ìͨ¹ýϵͳµ÷ÓÃread·¢ÆðIO¶Á²Ù×÷£¬ÓÉÓû§¿Õ¼äתµ½Äں˿ռ䡣Äں˵ȵ½Êý¾Ý°üµ½´ïºó£¬È»ºó½«½ÓÊÕµÄÊý¾Ý¿½±´µ½Óû§¿Õ¼ä£¬Íê³Éread²Ù×÷¡£

Óû§Ïß³ÌʹÓÃͬ²½×èÈûIOÄ£Ð͵Äα´úÂëÃèÊöΪ£º

{
read(socket, buffer);
process(buffer);
}

¼´Óû§ÐèÒªµÈ´ýread½«socketÖеÄÊý¾Ý¶ÁÈ¡µ½bufferºó£¬²Å¼ÌÐø´¦Àí½ÓÊÕµÄÊý¾Ý¡£Õû¸öIOÇëÇóµÄ¹ý³ÌÖУ¬Óû§Ïß³ÌÊDZ»×èÈûµÄ£¬Õâµ¼ÖÂÓû§ÔÚ·¢ÆðIOÇëÇóʱ£¬²»ÄÜ×öÈκÎÊÂÇ飬¶ÔCPUµÄ×ÊÔ´ÀûÓÃÂʲ»¹»¡£

¶þ¡¢Í¬²½·Ç×èÈûIO

ͬ²½·Ç×èÈûIOÊÇÔÚͬ²½×èÈûIOµÄ»ù´¡ÉÏ£¬½«socketÉèÖÃΪNONBLOCK¡£ÕâÑù×öÓû§Ï߳̿ÉÒÔÔÚ·¢ÆðIOÇëÇóºó¿ÉÒÔÁ¢¼´·µ»Ø¡£

ͼ2 ͬ²½·Ç×èÈûIO

Èçͼ2Ëùʾ£¬ÓÉÓÚsocketÊÇ·Ç×èÈûµÄ·½Ê½£¬Òò´ËÓû§Ï̷߳¢ÆðIOÇëÇóʱÁ¢¼´·µ»Ø¡£µ«²¢Î´¶ÁÈ¡µ½ÈκÎÊý¾Ý£¬Óû§Ïß³ÌÐèÒª²»¶ÏµØ·¢ÆðIOÇëÇó£¬Ö±µ½Êý¾Ýµ½´ïºó£¬²ÅÕæÕý¶ÁÈ¡µ½Êý¾Ý£¬¼ÌÐøÖ´ÐС£

Óû§Ïß³ÌʹÓÃͬ²½·Ç×èÈûIOÄ£Ð͵Äα´úÂëÃèÊöΪ£º

{
while(read(socket, buffer) != SUCCESS)
;
process(buffer);
}

¼´Óû§ÐèÒª²»¶ÏµØµ÷ÓÃread£¬³¢ÊÔ¶ÁÈ¡socketÖеÄÊý¾Ý£¬Ö±µ½¶ÁÈ¡³É¹¦ºó£¬²Å¼ÌÐø´¦Àí½ÓÊÕµÄÊý¾Ý¡£Õû¸öIOÇëÇóµÄ¹ý³ÌÖУ¬ËäÈ»Óû§Ïß³Ìÿ´Î·¢ÆðIOÇëÇóºó¿ÉÒÔÁ¢¼´·µ»Ø£¬µ«ÊÇΪÁ˵ȵ½Êý¾Ý£¬ÈÔÐèÒª²»¶ÏµØÂÖѯ¡¢Öظ´ÇëÇó£¬ÏûºÄÁË´óÁ¿µÄCPUµÄ×ÊÔ´¡£Ò»°ãºÜÉÙÖ±½ÓʹÓÃÕâÖÖÄ£ÐÍ£¬¶øÊÇÔÚÆäËûIOÄ£ÐÍÖÐʹÓ÷Ç×èÈûIOÕâÒ»ÌØÐÔ¡£

Èý¡¢IO¶à·¸´ÓÃ

IO¶à·¸´ÓÃÄ£ÐÍÊǽ¨Á¢ÔÚÄÚºËÌṩµÄ¶à··ÖÀ뺯Êýselect»ù´¡Ö®Éϵģ¬Ê¹ÓÃselectº¯Êý¿ÉÒÔ±ÜÃâͬ²½·Ç×èÈûIOÄ£ÐÍÖÐÂÖѯµÈ´ýµÄÎÊÌâ¡£

ͼ3 ¶à··ÖÀ뺯Êýselect

Èçͼ3Ëùʾ£¬Óû§Ê×ÏȽ«ÐèÒª½øÐÐIO²Ù×÷µÄsocketÌí¼Óµ½selectÖУ¬È»ºó×èÈûµÈ´ýselectϵͳµ÷Ó÷µ»Ø¡£µ±Êý¾Ýµ½´ïʱ£¬socket±»¼¤»î£¬selectº¯Êý·µ»Ø¡£Óû§Ïß³ÌÕýʽ·¢ÆðreadÇëÇ󣬶ÁÈ¡Êý¾Ý²¢¼ÌÐøÖ´ÐС£

´ÓÁ÷³ÌÉÏÀ´¿´£¬Ê¹ÓÃselectº¯Êý½øÐÐIOÇëÇóºÍͬ²½×èÈûÄ£ÐÍûÓÐÌ«´óµÄÇø±ð£¬ÉõÖÁ»¹¶àÁËÌí¼Ó¼àÊÓsocket£¬ÒÔ¼°µ÷ÓÃselectº¯ÊýµÄ¶îÍâ²Ù×÷£¬Ð§Âʸü²î¡£µ«ÊÇ£¬Ê¹ÓÃselectÒÔºó×î´óµÄÓÅÊÆÊÇÓû§¿ÉÒÔÔÚÒ»¸öÏß³ÌÄÚͬʱ´¦Àí¶à¸ösocketµÄIOÇëÇó¡£Óû§¿ÉÒÔ×¢²á¶à¸ösocket£¬È»ºó²»¶ÏµØµ÷ÓÃselect¶ÁÈ¡±»¼¤»îµÄsocket£¬¼´¿É´ïµ½ÔÚͬһ¸öÏß³ÌÄÚͬʱ´¦Àí¶à¸öIOÇëÇóµÄÄ¿µÄ¡£¶øÔÚͬ²½×èÈûÄ£ÐÍÖУ¬±ØÐëͨ¹ý¶àÏ̵߳ķ½Ê½²ÅÄÜ´ïµ½Õâ¸öÄ¿µÄ¡£

Óû§Ïß³ÌʹÓÃselectº¯ÊýµÄα´úÂëÃèÊöΪ£º

{
select(socket);
while(1) {
sockets = select();
for(socket in sockets) {
if(can_read(socket)) {
read(socket, buffer);
process(buffer);
}
}
}
}

ÆäÖÐwhileÑ­»·Ç°½«socketÌí¼Óµ½select¼àÊÓÖУ¬È»ºóÔÚwhileÄÚÒ»Ö±µ÷ÓÃselect»ñÈ¡±»¼¤»îµÄsocket£¬Ò»µ©socket¿É¶Á£¬±ãµ÷ÓÃreadº¯Êý½«socketÖеÄÊý¾Ý¶ÁÈ¡³öÀ´¡£

È»¶ø£¬Ê¹ÓÃselectº¯ÊýµÄÓŵ㲢²»½öÏÞÓÚ´Ë¡£ËäÈ»ÉÏÊö·½Ê½ÔÊÐíµ¥Ïß³ÌÄÚ´¦Àí¶à¸öIOÇëÇ󣬵«ÊÇÿ¸öIOÇëÇóµÄ¹ý³Ì»¹ÊÇ×èÈûµÄ£¨ÔÚselectº¯ÊýÉÏ×èÈû£©£¬Æ½¾ùʱ¼äÉõÖÁ±Èͬ²½×èÈûIOÄ£ÐÍ»¹Òª³¤¡£Èç¹ûÓû§Ïß³ÌÖ»×¢²á×Ô¼º¸ÐÐËȤµÄsocket»òÕßIOÇëÇó£¬È»ºóÈ¥×ö×Ô¼ºµÄÊÂÇ飬µÈµ½Êý¾Ýµ½À´Ê±ÔÙ½øÐд¦Àí£¬Ôò¿ÉÒÔÌá¸ßCPUµÄÀûÓÃÂÊ¡£

IO¶à·¸´ÓÃÄ£ÐÍʹÓÃÁËReactorÉè¼ÆÄ£Ê½ÊµÏÖÁËÕâÒ»»úÖÆ¡£

ͼ4 ReactorÉè¼ÆÄ£Ê½

Èçͼ4Ëùʾ£¬EventHandler³éÏóÀà±íʾIOʼþ´¦ÀíÆ÷£¬ËüÓµÓÐIOÎļþ¾ä±úHandle£¨Í¨¹ýget_handle»ñÈ¡£©£¬ÒÔ¼°¶ÔHandleµÄ²Ù×÷handle_event£¨¶Á/дµÈ£©¡£¼Ì³ÐÓÚEventHandlerµÄ×ÓÀà¿ÉÒÔ¶Ôʼþ´¦ÀíÆ÷µÄÐÐΪ½øÐж¨ÖÆ¡£ReactorÀàÓÃÓÚ¹ÜÀíEventHandler£¨×¢²á¡¢É¾³ýµÈ£©£¬²¢Ê¹ÓÃhandle_eventsʵÏÖʼþÑ­»·£¬²»¶Ïµ÷ÓÃͬ²½Ê¼þ¶à··ÖÀëÆ÷£¨Ò»°ãÊÇÄںˣ©µÄ¶à··ÖÀ뺯Êýselect£¬Ö»ÒªÄ³¸öÎļþ¾ä±ú±»¼¤»î£¨¿É¶Á/дµÈ£©£¬select¾Í·µ»Ø£¨×èÈû£©£¬handle_events¾Í»áµ÷ÓÃÓëÎļþ¾ä±ú¹ØÁªµÄʼþ´¦ÀíÆ÷µÄhandle_event½øÐÐÏà¹Ø²Ù×÷¡£

ͼ5 IO¶à·¸´ÓÃ

Èçͼ5Ëùʾ£¬Í¨¹ýReactorµÄ·½Ê½£¬¿ÉÒÔ½«Óû§Ïß³ÌÂÖѯIO²Ù×÷״̬µÄ¹¤×÷ͳһ½»¸øhandle_eventsʼþÑ­»·½øÐд¦Àí¡£Óû§Ïß³Ì×¢²áʼþ´¦ÀíÆ÷Ö®ºó¿ÉÒÔ¼ÌÐøÖ´ÐÐ×öÆäËûµÄ¹¤×÷£¨Òì²½£©£¬¶øReactorÏ̸߳ºÔðµ÷ÓÃÄں˵Äselectº¯Êý¼ì²ésocket״̬¡£µ±ÓÐsocket±»¼¤»îʱ£¬Ôò֪ͨÏàÓ¦µÄÓû§Ị̈߳¨»òÖ´ÐÐÓû§Ï̵߳Ļص÷º¯Êý£©£¬Ö´ÐÐhandle_event½øÐÐÊý¾Ý¶ÁÈ¡¡¢´¦ÀíµÄ¹¤×÷¡£ÓÉÓÚselectº¯ÊýÊÇ×èÈûµÄ£¬Òò´Ë¶à·IO¸´ÓÃÄ£ÐÍÒ²±»³ÆÎªÒì²½×èÈûIOÄ£ÐÍ¡£×¢Ò⣬ÕâÀïµÄËù˵µÄ×èÈûÊÇÖ¸selectº¯ÊýÖ´ÐÐʱÏ̱߳»×èÈû£¬¶ø²»ÊÇÖ¸socket¡£Ò»°ãÔÚʹÓÃIO¶à·¸´ÓÃÄ£ÐÍʱ£¬socket¶¼ÊÇÉèÖÃΪNONBLOCKµÄ£¬²»¹ýÕâ²¢²»»á²úÉúÓ°Ï죬ÒòΪÓû§·¢ÆðIOÇëÇóʱ£¬Êý¾ÝÒѾ­µ½´ïÁË£¬Óû§Ïß³ÌÒ»¶¨²»»á±»×èÈû¡£

Óû§Ïß³ÌʹÓÃIO¶à·¸´ÓÃÄ£Ð͵Äα´úÂëÃèÊöΪ£º

void UserEventHandler::handle_event() {
if(can_read(socket)) {
read(socket, buffer);
process(buffer);
}
} {
Reactor.register(new UserEventHandler(socket));
}

Óû§ÐèÒªÖØÐ´EventHandlerµÄhandle_eventº¯Êý½øÐжÁÈ¡Êý¾Ý¡¢´¦ÀíÊý¾ÝµÄ¹¤×÷£¬Óû§Ïß³ÌÖ»ÐèÒª½«×Ô¼ºµÄEventHandler×¢²áµ½Reactor¼´¿É¡£ReactorÖÐhandle_eventsʼþÑ­»·µÄα´úÂë´óÖÂÈçÏ¡£

Reactor::handle_events() {
while(1) {
sockets = select();
for(socket in sockets) {
get_event_handler(socket).handle_event();
}
}
}

ʼþÑ­»·²»¶ÏµØµ÷ÓÃselect»ñÈ¡±»¼¤»îµÄsocket£¬È»ºó¸ù¾Ý»ñÈ¡socket¶ÔÓ¦µÄEventHandler£¬Ö´ÐÐÆ÷handle_eventº¯Êý¼´¿É¡£

IO¶à·¸´ÓÃÊÇ×ʹÓõÄIOÄ£ÐÍ£¬µ«ÊÇÆäÒì²½³Ì¶È»¹²»¹»¡°³¹µ×¡±£¬ÒòΪËüʹÓÃÁË»á×èÈûÏ̵߳Äselectϵͳµ÷Óá£Òò´ËIO¶à·¸´ÓÃÖ»ÄܳÆÎªÒì²½×èÈûIO£¬¶ø·ÇÕæÕýµÄÒì²½IO¡£

ËÄ¡¢Òì²½IO

¡°ÕæÕý¡±µÄÒì²½IOÐèÒª²Ù×÷ϵͳ¸üÇ¿µÄÖ§³Ö¡£ÔÚIO¶à·¸´ÓÃÄ£ÐÍÖУ¬Ê¼þÑ­»·½«Îļþ¾ä±úµÄ״̬ʼþ֪ͨ¸øÓû§Ị̈߳¬ÓÉÓû§Ïß³Ì×ÔÐжÁÈ¡Êý¾Ý¡¢´¦ÀíÊý¾Ý¡£¶øÔÚÒì²½IOÄ£ÐÍÖУ¬µ±Óû§Ïß³ÌÊÕµ½Í¨ÖªÊ±£¬Êý¾ÝÒѾ­±»Äں˶ÁÈ¡Íê±Ï£¬²¢·ÅÔÚÁËÓû§Ïß³ÌÖ¸¶¨µÄ»º³åÇøÄÚ£¬ÄÚºËÔÚIOÍê³Éºó֪ͨÓû§Ïß³ÌÖ±½ÓʹÓü´¿É¡£

Òì²½IOÄ£ÐÍʹÓÃÁËProactorÉè¼ÆÄ£Ê½ÊµÏÖÁËÕâÒ»»úÖÆ¡£

ͼ6 ProactorÉè¼ÆÄ£Ê½

Èçͼ6£¬ProactorģʽºÍReactorģʽÔڽṹÉϱȽÏÏàËÆ£¬²»¹ýÔÚÓû§£¨Client£©Ê¹Ó÷½Ê½Éϲî±ð½Ï´ó¡£ReactorģʽÖУ¬Óû§Ïß³Ìͨ¹ýÏòReactor¶ÔÏó×¢²á¸ÐÐËȤµÄʼþ¼àÌý£¬È»ºóʼþ´¥·¢Ê±µ÷ÓÃʼþ´¦Àíº¯Êý¡£¶øProactorģʽÖУ¬Óû§Ï߳̽«AsynchronousOperation£¨¶Á/дµÈ£©¡¢ProactorÒÔ¼°²Ù×÷Íê³ÉʱµÄCompletionHandler×¢²áµ½AsynchronousOperationProcessor¡£AsynchronousOperationProcessorʹÓÃFacadeģʽÌṩÁËÒ»×éÒì²½²Ù×÷API£¨¶Á/дµÈ£©¹©Óû§Ê¹Ó㬵±Óû§Ï̵߳÷ÓÃÒì²½APIºó£¬±ã¼ÌÐøÖ´ÐÐ×Ô¼ºµÄÈÎÎñ¡£AsynchronousOperationProcessor »á¿ªÆô¶ÀÁ¢µÄÄÚºËÏß³ÌÖ´ÐÐÒì²½²Ù×÷£¬ÊµÏÖÕæÕýµÄÒì²½¡£µ±Òì²½IO²Ù×÷Íê³Éʱ£¬AsynchronousOperationProcessor½«Óû§Ïß³ÌÓëAsynchronousOperationÒ»Æð×¢²áµÄProactorºÍCompletionHandlerÈ¡³ö£¬È»ºó½«CompletionHandlerÓëIO²Ù×÷µÄ½á¹ûÊý¾ÝÒ»Æðת·¢¸øProactor£¬Proactor¸ºÔð»Øµ÷ÿһ¸öÒì²½²Ù×÷µÄʼþÍê³É´¦Àíº¯Êýhandle_event¡£ËäÈ»ProactorģʽÖÐÿ¸öÒì²½²Ù×÷¶¼¿ÉÒÔ°ó¶¨Ò»¸öProactor¶ÔÏ󣬵«ÊÇÒ»°ãÔÚ²Ù×÷ϵͳÖУ¬Proactor±»ÊµÏÖΪSingletonģʽ£¬ÒÔ±ãÓÚ¼¯Öл¯·Ö·¢²Ù×÷Íê³Éʼþ¡£

ͼ7 Òì²½IO

Èçͼ7Ëùʾ£¬Òì²½IOÄ£ÐÍÖУ¬Óû§Ïß³ÌÖ±½ÓʹÓÃÄÚºËÌṩµÄÒì²½IO API·¢ÆðreadÇëÇó£¬ÇÒ·¢ÆðºóÁ¢¼´·µ»Ø£¬¼ÌÐøÖ´ÐÐÓû§Ï̴߳úÂë¡£²»¹ý´ËʱÓû§Ïß³ÌÒѾ­½«µ÷ÓõÄAsynchronousOperationºÍCompletionHandler×¢²áµ½Äںˣ¬È»ºó²Ù×÷ϵͳ¿ªÆô¶ÀÁ¢µÄÄÚºËÏß³ÌÈ¥´¦ÀíIO²Ù×÷¡£µ±readÇëÇóµÄÊý¾Ýµ½´ïʱ£¬ÓÉÄں˸ºÔð¶ÁÈ¡socketÖеÄÊý¾Ý£¬²¢Ð´ÈëÓû§Ö¸¶¨µÄ»º³åÇøÖС£×îºóÄں˽«readµÄÊý¾ÝºÍÓû§Ïß³Ì×¢²áµÄCompletionHandler·Ö·¢¸øÄÚ²¿Proactor£¬Proactor½«IOÍê³ÉµÄÐÅϢ֪ͨ¸øÓû§Ị̈߳¨Ò»°ãͨ¹ýµ÷ÓÃÓû§Ïß³Ì×¢²áµÄÍê³Éʼþ´¦Àíº¯Êý£©£¬Íê³ÉÒì²½IO¡£

Óû§Ïß³ÌʹÓÃÒì²½IOÄ£Ð͵Äα´úÂëÃèÊöΪ£º

void UserCompletionHandler::handle_event(buffer) {
process(buffer);
} {
aoi_read(socket, new UserCompletionHandler);
}

Óû§ÐèÒªÖØÐ´CompletionHandlerµÄhandle_eventº¯Êý½øÐд¦ÀíÊý¾ÝµÄ¹¤×÷£¬²ÎÊýbuffer±íʾProactorÒѾ­×¼±¸ºÃµÄÊý¾Ý£¬Óû§Ïß³ÌÖ±½Óµ÷ÓÃÄÚºËÌṩµÄÒì²½IO API£¬²¢½«ÖØÐ´µÄCompletionHandler×¢²á¼´¿É¡£

Ïà±ÈÓÚIO¶à·¸´ÓÃÄ£ÐÍ£¬Òì²½IO²¢²»Ê®·Ö³£Ó㬲»ÉÙ¸ßÐÔÄܲ¢·¢·þÎñ³ÌÐòʹÓÃIO¶à·¸´ÓÃÄ£ÐÍ+¶àÏß³ÌÈÎÎñ´¦ÀíµÄ¼Ü¹¹»ù±¾¿ÉÒÔÂú×ãÐèÇ󡣿öÇÒĿǰ²Ù×÷ϵͳ¶ÔÒì²½IOµÄÖ§³Ö²¢·ÇÌØ±ðÍêÉÆ£¬¸ü¶àµÄÊDzÉÓÃIO¶à·¸´ÓÃÄ£ÐÍÄ£ÄâÒì²½IOµÄ·½Ê½£¨IOʼþ´¥·¢Ê±²»Ö±½Ó֪ͨÓû§Ị̈߳¬¶øÊǽ«Êý¾Ý¶ÁдÍê±Ïºó·Åµ½Óû§Ö¸¶¨µÄ»º³åÇøÖУ©¡£Java7Ö®ºóÒѾ­Ö§³ÖÁËÒì²½IO£¬¸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔ³¢ÊÔʹÓá£

±¾ÎÄ´Ó»ù±¾¸ÅÄî¡¢¹¤×÷Á÷³ÌºÍ´úÂëʾÀýÈý¸ö²ã´Î¼òÒªÃèÊöÁ˳£¼ûµÄËÄÖÖ¸ßÐÔÄÜIOÄ£Ð͵ĽṹºÍÔ­Àí£¬ÀíÇåÁËͬ²½¡¢Òì²½¡¢×èÈû¡¢·Ç×èÈûÕâЩÈÝÒ×»ìÏýµÄ¸ÅÄͨ¹ý¶Ô¸ßÐÔÄÜIOÄ£Ð͵ÄÀí½â£¬¿ÉÒÔÔÚ·þÎñ¶Ë³ÌÐòµÄ¿ª·¢ÖÐÑ¡Ôñ¸ü·ûºÏʵ¼ÊÒµÎñÌØµãµÄIOÄ£ÐÍ£¬Ìá¸ß·þÎñÖÊÁ¿¡£Ï£Íû±¾ÎĶÔÄãÓÐËù°ïÖú¡£

   
5478 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
Visual C++±à³ÌÃüÃû¹æÔò
ÈκÎʱºò¶¼ÊÊÓõÄ20¸öC++¼¼ÇÉ
CÓïÑÔ½ø½×
´®¿ÚÇý¶¯·ÖÎö
ÇáÇáËÉËÉ´ÓCһ·×ßµ½C++
C++±à³Ì˼Ïë


C++²¢·¢´¦Àí+µ¥Ôª²âÊÔ
C++³ÌÐò¿ª·¢
C++¸ß¼¶±à³Ì
C/C++¿ª·¢
C++Éè¼ÆÄ£Ê½
C/C++µ¥Ôª²âÊÔ


±±¾© ǶÈëʽC¸ßÖÊÁ¿±à³Ì
Öйúº½¿Õ ǶÈëʽC¸ßÖÊÁ¿±à³Ì
»ªÎª C++¸ß¼¶±à³Ì
±±¾© C++¸ß¼¶±à³Ì
µ¤·ð˹ C++¸ß¼¶±à³Ì
±±´ó·½Õý CÓïÑÔµ¥Ôª²âÊÔ
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ