ΪÁËÈ·±£ÄÚ´æ²Ù×÷µÄÕýÈ·ÐÔºÍÒ»ÖÂÐÔ£¬LinuxÄÚºËÒýÈëÁËÄÚ´æÆÁÕÏ£¨Memory Barrier£©ÕâÒ»ÖØÒª»úÖÆ
±¾ÎĽ«ÉîÈë̽ÌÖLinuxÄÚºËÆÁÕϵÄÔÀí¡¢ÖÖÀà¡¢×÷Óü°ÆäÔÚ¶à´¦ÀíÆ÷»·¾³ÖеĹؼüÓ¦ÓÃ
ÄÚ´æÆÁÕϵı³¾° ÔÚÉîÈë̽ÌÖLinuxÄÚºËÆÁÕÏ֮ǰ£¬ÎÒÃÇÐèÒªÏÈÁ˽âΪʲôÐèÒªÕâÖÖ»úÖÆ
ÄÚ´æÆÁÕϵÄÒýÈëÖ÷ÒªÔ´ÓÚÒÔϼ¸¸ö·½ÃæµÄÎÊÌ⣺ 1.µ¥´¦ÀíÆ÷ϵÄÂÒÐòÎÊÌ⣺ÏÖ´úµÄ´¦ÀíÆ÷ΪÁËÌá¸ßÖ´ÐÐЧÂÊ£¬²ÉÓÃÁËÂÒÐòÖ´ÐУ¨Out-of-Order Execution£©¼¼Êõ
´¦ÀíÆ÷ÔÚÈ¡³öÖ¸Áîºó£¬»áÏÈ·ÖÎöÖ¸Áî¼äµÄÒÀÀµ¹ØÏµ£¬È»ºó¾¡Á¿²¢ÐÐÖ´ÐÐûÓÐÒÀÀµ¹ØÏµµÄÖ¸Áî
ËäÈ»×îÖÕÌá½»¸ø³ÌÐòµÄ½á¹ûÊǰ´ÕÕÖ¸Áî˳ÐòµÄ£¬µ«Ö¸ÁîµÄʵ¼ÊÖ´ÐÐ˳Ðò¿ÉÄÜÊÇÂÒÐòµÄ
ÕâÖÖÂÒÐòÖ´ÐÐÔÚ´ó¶àÊýÇé¿öÏÂÊÇÓÐÒæµÄ£¬µ«ÔÚÄ³Ð©ÌØ¶¨³¡¾°Ï£¨Èç·ÃÎÊÍâΧÉ豸¿ØÖƼĴæÆ÷ʱ£©£¬±ØÐëÑϸñ°´ÕÕÖ¸Áî˳ÐòÖ´ÐÐ
2.¶à´¦ÀíÆ÷ϵÄÄÚ´æÍ¬²½ÎÊÌ⣺ÔÚ¶à´¦ÀíÆ÷ϵͳÖУ¬Ã¿¸ö´¦ÀíÆ÷¶¼ÓÐ×Ô¼ºµÄ»º´æ£¬²¢Í¨¹ý»º´æÒ»ÖÂÐÔÐÒ飨ÈçMESIÐÒ飩À´Í¬²½Êý¾Ý
È»¶ø£¬ÓÉÓÚ»º´æµÄ´æÔںʹ¦ÀíÆ÷¼äÊý¾Ýͬ²½µÄÑÓ³Ù£¬Ò»¸ö´¦ÀíÆ÷¶ÔÄÚ´æµÄÐ޸ĿÉÄܲ»»áÁ¢¼´·´Ó³ÔÚÆäËû´¦ÀíÆ÷µÄ»º´æÖУ¬µ¼ÖÂÆäËû´¦ÀíÆ÷·ÃÎʵ½µÄÊý¾ÝÊǹýʱµÄ
ÕâÖÖÏÖÏó³ÆÎª¡°»º´æ²»Ò»ÖÂÐÔ¡±
3.±àÒëÆ÷ÓÅ»¯ÎÊÌ⣺±àÒëÆ÷ÔÚ±àÒë´úÂëʱ£¬ÎªÁËÉú³É¸ü¸ßЧµÄ»úÆ÷Â룬¿ÉÄÜ»á¶ÔÖ¸Áî½øÐÐÖØÅÅ
ÕâÖÖÖØÅÅÓÐʱ»áµ¼Ö²»·ûºÏ³ÌÐòÔ±Ô¤ÆÚµÄÖ´ÐÐ˳Ðò£¬ÌرðÊÇÔÚ¶àÏ̱߳à³ÌÖУ¬¿ÉÄܵ¼ÖÂÊý¾Ý¾ºÕùºÍ¾ºÌ¬Ìõ¼þ
ÄÚ´æÆÁÕϵÄÔÀí ÄÚ´æÆÁÕÏÊÇÒ»ÖÖ±£Ö¤ÄÚ´æ·ÃÎÊ˳ÐòµÄ·½·¨£¬ËüÈ·±£ÔÚÆÁÕÏ֮ǰµÄËùÓÐÄÚ´æ²Ù×÷ÔÚÆÁÕÏÖ®ºóµÄ²Ù×÷֮ǰÍê³É£¬²¢ÇÒÕâÖÖ˳Ðò¶ÔËùÓд¦ÀíÆ÷¶¼ÊǿɼûµÄ
ÄÚ´æÆÁÕÏ¿ÉÒÔ·ÖΪÒÔϼ¸ÖÖÀàÐÍ£º 1.дÆÁÕÏ£¨Write Barriers£©£ºÈ·±£ÔÚдÆÁÕÏ֮ǰµÄËùÓÐд²Ù×÷ÔÚдÆÁÕÏÖ®ºóµÄд²Ù×÷֮ǰÍê³É
ÕâÖÖÆÁÕÏÖ÷ÒªÓÃÓÚ±£Ö¤Ð´²Ù×÷µÄ˳ÐòÐÔ£¬µ«²¢²»Äܱ£Ö¤ÆÁÕÏ֮ǰµÄд²Ù×÷ÔÚÆÁÕÏÖ¸Áî½áÊøÇ°Íê³É
2.¶ÁÆÁÕÏ£¨Read Barriers£©£ºÈ·±£ÔÚ¶ÁÆÁÕÏ֮ǰµÄËùÓжÁ²Ù×÷ÔÚ¶ÁÆÁÕÏÖ®ºóµÄ¶Á²Ù×÷֮ǰÍê³É
´ËÍ⣬¶ÁÆÁÕÏ»¹°üº¬Êý¾ÝÒÀÀµÆÁÕϵŦÄÜ£¬¼´È·±£ÒÀÀµÓÚ֮ǰ¶Á²Ù×÷µÄ½á¹ûµÄºóÐø²Ù×÷ÔÚÕýÈ·µÄÊý¾Ý±»¶Áȡ֮ºóÖ´ÐÐ
3.ͨÓÃÆÁÕÏ£¨General Barriers£©£ºÈ·±£ÔÚͨÓÃÆÁÕÏ֮ǰµÄËùÓжÁд²Ù×÷ÔÚͨÓÃÆÁÕÏÖ®ºóµÄ¶Áд²Ù×÷֮ǰÍê³É
ÕâÊÇ×îÑϸñµÄÆÁÕÏÀàÐÍ£¬ÒòΪËüÍ¬Ê±Ô¼ÊøÁ˶Áд²Ù×÷µÄ˳Ðò
È»¶ø£¬ÓÉÓÚÆäÑϸñÐÔ£¬Í¨ÓÃÆÁÕϵÄÖ´ÐÐЧÂÊÏà¶Ô½ÏµÍ
ÄÚ´æÆÁÕϵÄ×÷Óà ÄÚ´æÆÁÕÏÔÚLinuxÄÚºËÖеÄ×÷ÓÃÖ÷ÒªÌåÏÖÔÚÒÔϼ¸¸ö·½Ã棺 1.±£Ö¤ÄÚ´æ²Ù×÷µÄ˳ÐòÐÔ£ºÍ¨¹ýÄÚ´æÆÁÕÏ£¬³ÌÐòÔ±¿ÉÒÔÈ·±£Ìض¨ÄÚ´æ²Ù×÷µÄ˳Ðò£¬´Ó¶ø±ÜÃâÓÉÓÚ´¦ÀíÆ÷ÂÒÐòÖ´Ðлò±àÒëÆ÷ÓÅ»¯µ¼ÖµÄÖ´ÐÐ˳Ðò²»·ûºÏÔ¤ÆÚµÄÎÊÌâ
2.ά»¤»º´æÒ»ÖÂÐÔ£ºÔÚ¶à´¦ÀíÆ÷ϵͳÖУ¬ÄÚ´æÆÁÕÏ¿ÉÒÔÈ·±£Ò»¸ö´¦ÀíÆ÷¶ÔÄÚ´æµÄÐÞ¸ÄÄܹ»¼°Ê±µØ·´Ó³ÔÚÆäËû´¦ÀíÆ÷µÄ»º´æÖУ¬´Ó¶øÎ¬»¤»º´æµÄÒ»ÖÂÐÔ
3.·ÀÖ¹±àÒëÆ÷ÓÅ»¯µ¼ÖµÄÎÊÌ⣺±àÒëÆ÷ÔÚÓÅ»¯´úÂëʱ£¬¿ÉÄÜ»áÖØÅÅÖ¸ÁîµÄ˳Ðò
ÄÚ´æÆÁÕÏ¿ÉÒÔ×èÖ¹±àÒëÆ÷¶ÔÌØ¶¨Ö¸Áî½øÐÐÖØÅÅ£¬´Ó¶øÈ·±£³ÌÐòµÄÕýÈ·Ö´ÐÐ
LinuxÄÚºËÖеÄÄÚ´æÆÁÕÏʵÏÖ ÔÚLinuxÄÚºËÖУ¬ÄÚ´æÆÁÕϵÄʵÏÖÒÀÀµÓÚ¾ßÌåµÄ´¦ÀíÆ÷¼Ü¹¹
¶ÔÓÚ²»Í¬µÄ´¦ÀíÆ÷¼Ü¹¹£¬ÄÚºËÌṩÁËÏàÓ¦µÄºêºÍº¯ÊýÀ´ÊµÏÖÄÚ´æÆÁÕÏ
1.±àÒëÆ÷ÆÁÕÏ£º±àÒëÆ÷ÆÁÕÏÖ÷ÒªÓÃÓÚ×èÖ¹±àÒëÆ÷¶ÔÖ¸Áî½øÐÐÖØÅÅ
ÔÚGCC±àÒëÆ÷ÖУ¬¿ÉÒÔʹÓÃ`__asm____volatile__(: : :memory)`À´ÊµÏÖÒ»¸ö¼òµ¥µÄ±àÒëÆ÷ÆÁÕÏ
Õâ¸öÆÁÕϲ»»á¸Ä±ä´¦ÀíÆ÷µÄÖ´ÐÐ˳Ðò£¬µ«»á×èÖ¹±àÒëÆ÷¶ÔÆÁÕÏǰºóµÄÖ¸Áî½øÐÐÖØÅÅ
2.´¦ÀíÆ÷ÄÚ´æÆÁÕÏ£º´¦ÀíÆ÷ÄÚ´æÆÁÕÏÔòÓÃÓÚÈ·±£´¦ÀíÆ÷¶ÔÄÚ´æ²Ù×÷µÄ˳ÐòÐÔ
ÔÚx86¼Ü¹¹ÖУ¬¿ÉÒÔʹÓÃ`lock`ǰ׺µÄÖ¸ÁÈç`lock addl $0x0,(%esp)`£©À´ÊµÏÖÄÚ´æÆÁÕÏ
ÕâÖÖÆÁÕϲ»½ö»á×èÖ¹±àÒëÆ÷¶ÔÖ¸Áî½øÐÐÖØÅÅ£¬»¹»áÒý·¢´¦ÀíÆ÷µÄ»º´æÒ»ÖÂÐÔ»úÖÆ£¬´Ó¶øÈ·±£ÄÚ´æ²Ù×÷µÄ˳ÐòÐÔ
ÄÚ´æÆÁÕϵÄʹÓó¡¾° ÄÚ´æÆÁÕÏÔÚLinuxÄÚºËÖеÄʹÓó¡¾°·Ç³£¹ã·º£¬°üÀ¨µ«²»ÏÞÓÚÒÔϼ¸¸ö·½Ã棺 1.É豸Çý¶¯³ÌÐò£ºÔÚ±àдÉ豸Çý¶¯³ÌÐòʱ£¬¾³£ÐèÒª·ÃÎÊÉ豸µÄ¿ØÖƼĴæÆ÷ºÍ״̬¼Ä´æÆ÷
ÕâЩ¼Ä´æÆ÷µÄ·ÃÎʱØÐëÑϸñ°´ÕÕÒ»¶¨µÄ˳Ðò½øÐУ¬·ñÔò¿ÉÄܻᵼÖÂÉ豸¹¤×÷Òì³£
´Ëʱ£¬¿ÉÒÔʹÓÃÄÚ´æÆÁÕÏÀ´È·±£¼Ä´æÆ÷·ÃÎʵÄ˳ÐòÐÔ
2.ÄÚºËͬ²½»úÖÆ£ºLinuxÄÚºËÌṩÁ˶àÖÖͬ²½»úÖÆ£¨Èç×ÔÐýËø¡¢»¥³âËøµÈ£©À´È·±£¶àÏ̱߳à³ÌÖеÄÊý¾ÝÒ»ÖÂÐÔ
ÕâЩͬ²½»úÖÆÔÚʵÏÖʱ£¬Í¨³£»áʹÓÃÄÚ´æÆÁÕÏÀ´È·±£²Ù×÷µÄ˳ÐòÐԺͿɼûÐÔ
3.Ô×Ó²Ù×÷£ºÔÚijЩÇé¿öÏ£¬ÐèÒª¶Ô±äÁ¿½øÐÐÔ×Ó²Ù×÷£¨ÈçÔ×Ó¼Ó¼õ¡¢Ô×ӱȽϲ¢½»»»µÈ£©
ÕâЩ²Ù×÷±ØÐë±£Ö¤ÔÚÖ´Ðйý³ÌÖв»»á±»ÆäËûÏ̴߳ò¶Ï£¬²¢ÇÒÆä½á¹û¶ÔÆäËûÏß³ÌÊǿɼûµÄ
´Ëʱ£¬¿ÉÒÔʹÓÃÄÚ´æÆÁÕÏÀ´È·±£Ô×Ó²Ù×÷µÄ˳ÐòÐԺͿɼûÐÔ
½áÂÛ ×ÛÉÏËùÊö£¬LinuxÄÚºËÆÁÕÏÊÇÒ»ÖÖÈ·±£ÄÚ´æ·ÃÎÊ˳ÐòµÄ¹Ø¼ü¼¼Êõ
Ëüͨ¹ýÌṩ²»Í¬ÀàÐÍµÄÆÁÕÏÀ´Ô¼Êø´¦ÀíÆ÷ºÍ±àÒëÆ÷¶ÔÄÚ´æ²Ù×÷µÄ˳ÐòÐÔ£¬´Ó¶øÎ¬»¤ÁËÄÚ´æµÄÒ»ÖÂÐԺͳÌÐòµÄÕýÈ·ÐÔ
ÔÚ¶à´¦ÀíÆ÷ϵͳºÍ¶àÏ̱߳à³ÌÖУ¬ÄÚ´æÆÁÕϵÄ×÷ÓÃÓÈÎªÖØÒª
Òò´Ë£¬ÉîÈëÀí½âÄÚ´æÆÁÕϵÄÔÀíºÍʹÓ÷½·¨¶ÔÓÚ±àд¸ßЧ¡¢¿É¿¿µÄLinuxÄں˴úÂëÖÁ¹ØÖØÒª