Linux¶ÔI/O¶Ë¿Ú×ÊÔ´µÄ¹ÜÀí(1)

¡¶Linux¶ÔI/O¶Ë¿Ú×ÊÔ´µÄ¹ÜÀí(1)¡·ÕªÒª£º continue; return tmp; } } ¶Ôº¯ÊýµÄNOTE£º ¢ÙǰÈý¸öifÓï¾äÅжÏnewËùÃèÊöµÄ×ÊÔ´·¶Î§ÊÇ·ñ±»°üº¬ÔÚrootÄÚ£¬ÒÔ¼°ÊÇ·ñÊÇÒ»¶ÎÓÐЧµÄ×ÊÔ´£¨ÒòΪend±ØÐë´óÓÚstart£©¡£·ñÔò¾Í·µ»ØrootÖ¸Õ룬±íʾÓë¸ù½áµ¡­

continue;

return tmp;

}

}

¶Ôº¯ÊýµÄNOTE£º

¢ÙǰÈý¸öifÓï¾äÅжÏnewËùÃèÊöµÄ×ÊÔ´·¶Î§ÊÇ·ñ±»°üº¬ÔÚrootÄÚ£¬ÒÔ¼°ÊÇ·ñÊÇÒ»¶ÎÓÐЧµÄ×ÊÔ´£¨ÒòΪend±ØÐë´óÓÚstart£©¡£·ñÔò¾Í·µ»ØrootÖ¸Õ룬±íʾÓë¸ù½áµãÏà³åÍ»¡£

¢Ú½ÓÏÂÀ´ÓÃÒ»¸öforÑ­»·±éÀú¸ù½ÚµãrootµÄchildÁ´±í£¬ÒÔ±ã¼ì²éÊÇ·ñÓÐ×ÊÔ´³åÍ»£¬²¢½«new²åÈëµ½childÁ´±íÖеĺÏÊÊλÖã¨childÁ´±íÊÇÒÔI/O×ÊÔ´ÎïÀíµØÖ·´ÓµÍµ½¸ßµÄ˳ÐòÅÅÁеģ©¡£Îª´Ë£¬ËüÓÃtmpÖ¸ÕëÖ¸Ïòµ±Ç°Õý±»É¨ÃèµÄresource½á¹¹£¬ÓÃÖ¸ÕëpÖ¸Ïòǰһ¸öresource½á¹¹µÄsiblingÖ¸Õë³ÉÔ±±äÁ¿£¬pµÄ³õʼֵΪָÏòroot£­>sibling¡£ForÑ­»·ÌåµÄÖ´Ðв½ÖèÈçÏ£º

l ÈÃtmpÖ¸Ïòµ±Ç°Õý±»É¨ÃèµÄresource½á¹¹£¨tmp£½*p£©¡£

l ÅжÏtmpÖ¸ÕëÊÇ·ñΪ¿Õ£¨tmpÖ¸ÕëΪ¿Õ˵Ã÷ÒѾ­±éÀúÍêÕû¸öchildÁ´±í£©£¬»òÕßµ±Ç°±»É¨Ãè½ÚµãµÄÆðʼλÖÃstartÊÇ·ñ±ÈnewµÄ½áÊøÎ»ÖÃend»¹Òª´ó¡£Ö»ÒªÕâÁ½¸öÌõ¼þÖ®Ò»³ÉÁ¢µÄ»°£¬¾Í˵Ã÷ûÓÐ×ÊÔ´³åÍ»£¬ÓÚÊǾͿÉÒÔ°ÑnewÁ´ÈëchildÁ´±íÖУº¢ÙÉèÖÃnewµÄsiblingÖ¸ÕëÖ¸Ïòµ±Ç°Õý±»É¨ÃèµÄ½Úµãtmp£¨new->sibling=tmp£©£»¢Úµ±Ç°½ÚµãtmpµÄǰһ¸öÐֵܽڵãµÄsiblingÖ¸Õë±»ÐÞ¸ÄΪָÏònewÕâ¸ö½Úµã£¨*p=new£©£»¢Û½«newµÄparentÖ¸ÕëÉèÖÃΪָÏòroot¡£È»ºóº¯Êý¾Í¿ÉÒÔ·µ»ØÁË£¨·µ»ØÖµNULL±íʾûÓÐ×ÊÔ´³åÍ»£©¡£

l Èç¹ûÉÏÊöÁ½¸öÌõ¼þ¶¼²»³ÉÁ¢£¬Õâ˵Ã÷µ±Ç°±»É¨Ãè½ÚµãµÄ×ÊÔ´ÓòÓпÉÄÜÓënewÏà³åÍ»£¨Êµ¼ÊÉϾÍÊÇÁ½¸ö±ÕÇø¼äÓн»¼¯£©£¬Òò´ËÐèÒª½øÒ»²½Åжϡ£Îª´ËËüÊ×ÏÈÐÞ¸ÄÖ¸Õëp£¬ÈÃËüÖ¸Ïòtmp->sibling£¬ÒÔ±ãÓÚ¼ÌÐøÉ¨ÃèchildÁ´±í¡£È»ºó£¬ÅжÏtmp->endÊÇ·ñСÓÚnew->start£¬Èç¹ûСÓÚ£¬Ôò˵Ã÷µ±Ç°½ÚµãtmpºÍnewûÓÐ×ÊÔ´³åÍ»£¬Òò´ËÖ´ÐÐcontinueÓï¾ä£¬¼ÌÐøÏòÏÂɨÃèchildÁ´±í¡£·ñÔò£¬Èç¹ûtmp->end´óÓÚ»òµÈÓÚnew->start£¬Ôò˵Ã÷tmp->[start,end]ºÍnew->[start,end]Ö®¼äÓн»¼¯¡£ËùÒÔ·µ»Øµ±Ç°½ÚµãµÄÖ¸Õëtmp£¬±íʾ·¢Éú×ÊÔ´³åÍ»¡£

3£®2£®2 ×ÊÔ´µÄÊÍ·Å

º¯Êýrelease_resource()ÓÃÓÚʵÏÖI/O×ÊÔ´µÄÊÍ·Å¡£¸Ãº¯ÊýÖ»ÓÐÒ»¸ö²ÎÊý——¼´Ö¸Õëold£¬ËüÖ¸ÏòËùÒªÊͷŵÄ×ÊÔ´¡£ÆðÔ´´úÂëÈçÏ£º

int release_resource(struct resource *old)

{

int retval;

write_lock(&resource_lock);

retval = __release_resource(old);

write_unlock(&resource_lock);

return retval;

}

¿ÉÒÔ¿´³ö£¬Ëüʵ¼ÊÉÏͨ¹ýµ÷ÓÃ__release_resource()Õâ¸öÄÚ²¿¾²Ì¬º¯ÊýÀ´Íê³Éʵ¼ÊµÄ×ÊÔ´Êͷʤ×÷¡£º¯Êý__release_resource()µÄÖ÷ÒªÈÎÎñ¾ÍÊǽ«×ÊÔ´ÇøÓòold£¨Èç¹ûÒѾ­´æÔڵϰ£©´ÓÆä¸¸×ÊÔ´µÄchildÁ´±íÖØÕª³ý£¬ËüµÄÔ´´úÂëÈçÏ£º

static int __release_resource(struct resource *old)

ÄãµÄλÖ㺵çÄÔ¹ÊÕÏÍø >> ²Ù×÷ϵͳ >> Linux/Unix >> Linux¶ÔI/O¶Ë¿Ú×ÊÔ´µÄ¹ÜÀí(1)