¸ßÊÖ½ø½×±Ø¶Á£ºLinuxÄں˵Äͬ²½»úÖÆ

×÷Õß: uu 2005-09-14 15:11:50
±¾ÎÄÏêϸµÄ½éÉÜÁËLinuxÄÚºËÖеÄͬ²½»úÖÆ£ºÔ­×Ó²Ù×÷¡¢ÐźÅÁ¿¡¢¶ÁдÐźÅÁ¿ºÍ×ÔÐýËøµÄAPI£¬Ê¹ÓÃÒªÇóÒÔ¼°Ò»Ð©µäÐÍʾÀý

Ò»¡¢ÒýÑÔ

ÔÚÏÖ´ú²Ù×÷ϵͳÀͬһʱ¼ä¿ÉÄÜÓжà¸öÄÚºËÖ´ÐÐÁ÷ÔÚÖ´ÐУ¬Òò´ËÄÚºËÆäʵÏó¶à½ø³Ì¶àÏ̱߳à³ÌÒ»ÑùÒ²ÐèҪһЩͬ²½»úÖÆÀ´Í¬²½¸÷Ö´Ðе¥Ôª¶Ô¹²ÏíÊý¾ÝµÄ·ÃÎÊ¡£ÓÈÆäÊÇÔÚ¶à´¦ÀíÆ÷ϵͳÉÏ£¬¸üÐèҪһЩͬ²½»úÖÆÀ´Í¬²½²»Í¬´¦ÀíÆ÷ÉϵÄÖ´Ðе¥Ôª¶Ô¹²ÏíµÄÊý¾ÝµÄ·ÃÎÊ¡£

ÔÚÖ÷Á÷µÄLinuxÄÚºËÖаüº¬Á˼¸ºõËùÓÐÏÖ´úµÄ²Ù×÷ϵͳ¾ßÓеÄͬ²½»úÖÆ£¬ÕâЩͬ²½»úÖÆ°üÀ¨£ºÔ­×Ó²Ù×÷¡¢ÐźÅÁ¿£¨semaphore£©¡¢¶ÁдÐźÅÁ¿£¨rw_semaphore£©¡¢spinlock¡¢BKL(Big Kernel Lock)¡¢rwlock¡¢brlock£¨Ö»°üº¬ÔÚ2.4ÄÚºËÖУ©¡¢RCU£¨Ö»°üº¬ÔÚ2.6ÄÚºËÖУ©ºÍseqlock£¨Ö»°üº¬ÔÚ2.6ÄÚºËÖУ©¡£

¶þ¡¢Ô­×Ó²Ù×÷

Ëùνԭ×Ó²Ù×÷£¬¾ÍÊǸòÙ×÷¾ø²»»áÔÚÖ´ÐÐÍê±Ïǰ±»ÈÎºÎÆäËûÈÎÎñ»òʼþ´ò¶Ï£¬Ò²¾Í˵£¬ËüµÄ×îСµÄÖ´Ðе¥Î»£¬²»¿ÉÄÜÓбÈËü¸üСµÄÖ´Ðе¥Î»£¬Òò´ËÕâÀïµÄÔ­×Óʵ¼ÊÊÇʹÓÃÁËÎïÀíѧÀïµÄÎïÖÊ΢Á£µÄ¸ÅÄî¡£

Ô­×Ó²Ù×÷ÐèÒªÓ²¼þµÄÖ§³Ö£¬Òò´ËÊǼܹ¹Ïà¹ØµÄ£¬ÆäAPIºÍÔ­×ÓÀàÐ͵͍Òå¶¼¶¨ÒåÔÚÄÚºËÔ´ÂëÊ÷µÄinclude/asm/atomic.hÎļþÖУ¬ËüÃǶ¼Ê¹Óûã±àÓïÑÔʵÏÖ£¬ÒòΪCÓïÑÔ²¢²»ÄÜʵÏÖÕâÑùµÄ²Ù×÷¡£

Ô­×Ó²Ù×÷Ö÷ÒªÓÃÓÚʵÏÖ×ÊÔ´¼ÆÊý£¬ºÜ¶àÒýÓüÆÊý(refcnt)¾ÍÊÇͨ¹ýÔ­×Ó²Ù×÷ʵÏֵġ£Ô­×ÓÀàÐͶ¨ÒåÈçÏ£º


typedef struct
{
volatile int counter;
}
atomic_t;


volatileÐÞÊÎ×ֶθæËßgcc²»Òª¶Ô¸ÃÀàÐ͵ÄÊý¾Ý×öÓÅ»¯´¦Àí£¬¶ÔËüµÄ·ÃÎʶ¼ÊǶÔÄÚ´æµÄ·ÃÎÊ£¬¶ø²»ÊǶԼĴæÆ÷µÄ·ÃÎÊ¡£

Ô­×Ó²Ù×÷API°üÀ¨£º


atomic_read(atomic_t * v);


¸Ãº¯Êý¶ÔÔ­×ÓÀàÐ͵ıäÁ¿½øÐÐÔ­×Ó¶Á²Ù×÷£¬Ëü·µ»ØÔ­×ÓÀàÐ͵ıäÁ¿vµÄÖµ¡£


atomic_set(atomic_t * v, int i);


¸Ãº¯ÊýÉèÖÃÔ­×ÓÀàÐ͵ıäÁ¿vµÄֵΪi¡£


void atomic_add(int i, atomic_t *v);


¸Ãº¯Êý¸øÔ­×ÓÀàÐ͵ıäÁ¿vÔö¼ÓÖµi¡£


atomic_sub(int i, atomic_t *v);


¸Ãº¯Êý´ÓÔ­×ÓÀàÐ͵ıäÁ¿vÖмõÈ¥i¡£


int atomic_sub_and_test(int i, atomic_t *v);


¸Ãº¯Êý´ÓÔ­×ÓÀàÐ͵ıäÁ¿vÖмõÈ¥i£¬²¢ÅжϽá¹ûÊÇ·ñΪ0£¬Èç¹ûΪ0£¬·µ»ØÕ棬·ñÔò·µ»Ø¼Ù¡£


void atomic_inc(atomic_t *v);


¸Ãº¯Êý¶ÔÔ­×ÓÀàÐͱäÁ¿vÔ­×ÓµØÔö¼Ó1¡£


void atomic_dec(atomic_t *v);


¸Ãº¯Êý¶ÔÔ­×ÓÀàÐ͵ıäÁ¿vÔ­×ӵؼõ1¡£


int atomic_dec_and_test(atomic_t *v);


¸Ãº¯Êý¶ÔÔ­×ÓÀàÐ͵ıäÁ¿vÔ­×ӵؼõ1£¬²¢ÅжϽá¹ûÊÇ·ñΪ0£¬Èç¹ûΪ0£¬·µ»ØÕ棬·ñÔò·µ»Ø¼Ù¡£


int atomic_inc_and_test(atomic_t *v);


¸Ãº¯Êý¶ÔÔ­×ÓÀàÐ͵ıäÁ¿vÔ­×ÓµØÔö¼Ó1£¬²¢ÅжϽá¹ûÊÇ·ñΪ0£¬Èç¹ûΪ0£¬·µ»ØÕ棬·ñÔò·µ»Ø¼Ù¡£


int atomic_add_negative(int i, atomic_t *v);


¸Ãº¯Êý¶ÔÔ­×ÓÀàÐ͵ıäÁ¿vÔ­×ÓµØÔö¼ÓI£¬²¢ÅжϽá¹ûÊÇ·ñΪ¸ºÊý£¬Èç¹ûÊÇ£¬·µ»ØÕ棬·ñÔò·µ»Ø¼Ù¡£


int atomic_add_return(int i, atomic_t *v);


¸Ãº¯Êý¶ÔÔ­×ÓÀàÐ͵ıäÁ¿vÔ­×ÓµØÔö¼Ói£¬²¢ÇÒ·µ»ØÖ¸ÏòvµÄÖ¸Õë¡£


int atomic_sub_return(int i, atomic_t *v);


¸Ãº¯Êý´ÓÔ­×ÓÀàÐ͵ıäÁ¿vÖмõÈ¥i£¬²¢ÇÒ·µ»ØÖ¸ÏòvµÄÖ¸Õë¡£


int atomic_inc_return(atomic_t * v);


¸Ãº¯Êý¶ÔÔ­×ÓÀàÐ͵ıäÁ¿vÔ­×ÓµØÔö¼Ó1²¢ÇÒ·µ»ØÖ¸ÏòvµÄÖ¸Õë¡£


int atomic_dec_return(atomic_t * v);

¸Ãº¯Êý¶ÔÔ­×ÓÀàÐ͵ıäÁ¿vÔ­×ӵؼõ1²¢ÇÒ·µ»ØÖ¸ÏòvµÄÖ¸Õë¡£

Ô­×Ó²Ù×÷ͨ³£ÓÃÓÚʵÏÖ×ÊÔ´µÄÒýÓüÆÊý£¬ÔÚTCP/IPЭÒéÕ»µÄIPË鯬´¦ÀíÖУ¬¾ÍʹÓÃÁËÒýÓüÆÊý£¬Ë鯬¶ÓÁнṹstruct ipqÃèÊöÁËÒ»¸öIPË鯬£¬×Ö¶Îrefcnt¾ÍÊÇÒýÓüÆÊýÆ÷£¬ËüµÄÀàÐÍΪatomic_t£¬µ±´´½¨IPËéÆ¬Ê±£¨ÔÚº¯Êýip_frag_createÖУ©£¬Ê¹ÓÃatomic_setº¯Êý°ÑËüÉèÖÃΪ1£¬µ±ÒýÓøÃIPËéÆ¬Ê±£¬¾ÍʹÓú¯Êýatomic_inc°ÑÒýÓüÆÊý¼Ó1¡£

µ±²»ÐèÒªÒýÓøÃIPËéÆ¬Ê±£¬¾ÍʹÓú¯Êýipq_putÀ´ÊͷŸÃIPË鯬£¬ipq_putʹÓú¯Êýatomic_dec_and_test°ÑÒýÓüÆÊý¼õ1²¢ÅжÏÒýÓüÆÊýÊÇ·ñΪ0£¬Èç¹ûÊǾÍÊÍ·ÅIPË鯬¡£º¯Êýipq_kill°ÑIPË鯬´Óipq¶ÓÁÐÖÐɾ³ý£¬²¢°Ñ¸Ãɾ³ýµÄIPË鯬µÄÒýÓüÆÊý¼õ1£¨Í¨¹ýʹÓú¯Êýatomic_decʵÏÖ£©¡£

Ïà¹Ø×ÊѶ