½ø³ÌÔÚºËÐĵÄе÷ϽøÐÐÏ໥¼äµÄͨѶ¡£LinuxÖ§³Ö´óÁ¿½ø³Ì¼äͨѶ(IPC)»úÖÆ¡£³ýÁËÐźź͹ܵÀÍ⣬Linux »¹Ö§³ÖUnixϵͳVÖеÄIPC»úÖÆ¡£
ϵͳÖÐÓÐÒ»×é±»Ïêϸ¶¨ÒåµÄÐźÅÀàÐÍ£¬ÕâЩÐźſÉÒÔÓɺËÐÄ»òÕßϵͳÖÐÆäËü¾ßÓÐÊʵ±È¨Ï޵Ľø³Ì²úÉú¡£Ê¹ÓÃkillÃüÁî(kill -l)¿ÉÒÔÁгöϵͳÖÐËùÓÐÒѾ¶¨ÒåµÄÐźš£ÔÚÎÒµÄϵͳ(Intelϵͳ)ÉÏÔËÐнá¹ûÈçÏ£º
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
µ±ÎÒÔÚAlpha AXPÖÐÔËÐдËÃüÁîʱ£¬µÃµ½Á˲»Í¬µÄÐźŸöÊý¡£³ýÁËÁ½¸öÐźÅÍ⣬½ø³Ì¿ÉÒÔºöÂÔÕâЩÐźÅÖеľø´ó²¿·Ö¡£ÆäÒ»ÊÇÒýÆð½ø³ÌÖÕÖ¹Ö´ÐеÄSIGSTOPÐźţ¬ÁíÒ»¸öÊÇÒýÆð½ø³ÌÍ˳öµÄSIGKILLÐźš£ ÖÁÓÚÆäËüÐźţ¬½ø³Ì¿ÉÒÔÑ¡Ôñ´¦ÀíËüÃǵľßÌ巽ʽ¡£½ø³Ì¿ÉÒÔ×èÈûÐźţ¬ÈçÈô²»×èÈû£¬Ôò¿ÉÒÔÔÚ×ÔÐд¦Àí´ËÐźźͽ«Æäת½»ºËÐÄ´¦ÀíÖ®¼ä×÷³öÑ¡Ôñ¡£Èç¹ûÓɺËÐÄÀ´´¦Àí´ËÐźţ¬Ëü½«Ê¹ÓöÔÓ¦´ËÐźŵÄȱʡ´¦Àí·½·¨¡£ ±ÈÈçµ±½ø³Ì½ÓÊÕµ½SIGFPE(¸¡µãÊýÒì³£)ʱ£¬ºËÐĵÄȱʡ²Ù×÷ÊÇÒýÆðcore dumpºÍ½ø³ÌµÄÍ˳ö¡£ÐźÅûÓйÌÓеÄÏà¶ÔÓÅÏȼ¶¡£Èç¹ûÔÚͬһʱ¿Ì¶ÔÓÚÒ»¸ö½ø³Ì²úÉúÁËÁ½¸öÐźţ¬ÔòËüÃǽ«¿ÉÄÜÒÔÈÎÒâ˳Ðòµ½´ï½ø³Ì²¢½øÐд¦Àí¡£Í¬Ê±Linux²¢²»Ìṩ´¦Àí¶à¸öÏàͬÀàÐÍÐźŵķ½Ê½¡£¼´½ø³ÌÎÞ·¨Çø·ÖËüÊÇÊÕµ½ÁË1¸ö»¹ÊÇ42¸öSIGCONTÐźš£
Linuxͨ¹ý´æ´¢ÔÚ½ø³Ìtask_structÖеÄÐÅÏ¢À´ÊµÏÖÐźš£ÐźŸöÊýÊܵ½´¦ÀíÆ÷×Ö³¤µÄÏÞÖÆ¡£32λ×Ö³¤µÄ´¦ÀíÆ÷×î¶à¿ÉÒÔÓÐ32¸öÐźŶø64λ´¦ÀíÆ÷ÈçAlpha AXP¿ÉÒÔÓÐ×î¶à64¸öÐźš£µ±Ç°Î´´¦ÀíµÄÐźű£´æÔÚsignalÓòÖУ¬²¢´øÓб£´æÔÚblockedÖеı»×èÈûÐÅºÅµÄÆÁ±ÎÂë¡£³ýÁËSIGSTOPºÍSIGKILLÍ⣬ËùÓеÄÐźŶ¼Äܱ»×èÈû¡£µ±²úÉú¿É×èÈûÐźÅʱ£¬´ËÐźſÉÒÔ±£³ÖÒ»Ö±´¦ÓÚ´ý´¦Àí״ֱ̬µ½×èÈûÊÍ·Å¡£Linux±£´æ×Åÿ¸ö½ø³Ì´¦Àíÿ¸ö¿ÉÄÜÐźŵÄÐÅÏ¢£¬ËüÃDZ£´æÔÚÿ¸ö½ø³Ìtask_structÖеÄsigactionÊý×éÖС£ÕâЩÐÅÏ¢°üÀ¨½ø³ÌÏ£Íû´¦ÀíµÄÐźÅËù¶ÔÓ¦µÄ¹ý³ÌµØÖ·£¬»òÕßָʾÊǺöÂÔÐźŻ¹ÊÇÓɺËÐÄÀ´´¦ÀíËüµÄ±ê¼Ç¡£Í¨¹ýϵͳµ÷Ó㬽ø³Ì¿ÉÒÔÐÞ¸ÄȱʡµÄÐźŴ¦Àí¹ý³Ì£¬Õ⽫¸Ä±äij¸öÐźŵÄsigactionÒÔ¼°×èÈûÆÁ±ÎÂë¡£
²¢²»ÊÇϵͳÖÐÿ¸ö½ø³Ì¶¼¿ÉÒÔÏòËùÓÐÆäËü½ø³Ì·¢ËÍÐźţºÖ»ÓкËÐĺͳ¬¼¶Óû§¾ßÓдËȨÏÞ¡£ÆÕͨ½ø³ÌÖ»ÄÜÏò¾ßÓÐÏàͬuidºÍgidµÄ½ø³Ì»òÕßÔÚͬһ½ø³Ì×éÖеĽø³Ì·¢ËÍÐźš£ÐźÅÊÇͨ¹ýÉèÖÃtask_struct½á¹¹ÖÐsignalÓòÀïµÄijһλÀ´²úÉúµÄ¡£Èç¹û½ø³ÌûÓÐ×èÈûÐźŲ¢ÇÒ´¦ÓÚ¿ÉÖжϵĵȴý״̬£¬Ôò¿ÉÒÔ½«Æä״̬¸Ä³ÉRunning£¬Í¬Ê±ÈçÈ·ÈϽø³Ì»¹´¦ÔÚÔËÐжÓÁÐÖУ¬¾Í¿ÉÒÔͨ¹ýÐźŻ½ÐÑËü¡£ÕâÑùϵͳÏ´η¢Éúµ÷¶Èʱ£¬µ÷¶È¹ÜÀíÆ÷½«Ñ¡ÔñËüÔËÐС£Èç¹û½ø³ÌÐèҪȱʡµÄÐźŴ¦Àí¹ý³Ì£¬ÔòLinux¿ÉÒÔÓÅ»¯¶Ô´ËÐźŵĴ¦Àí¡£ÀýÈçSIGWINCH£¨X´°¿ÚµÄ½¹µã¸Ä±ä£©Ðźţ¬Æäȱʡ´¦Àí¹ý³ÌÊÇʲôҲ²»×ö¡£
ÐźŲ¢·ÇÒ»²úÉú¾ÍÁ¢¿Ì½»¸ø½ø³Ì£¬¶øÊDZØÐëµÈ´ýµ½½ø³ÌÔÙ´ÎÔËÐÐʱ²Å½»¸ø½ø³Ì¡£Ã¿´Î½ø³Ì´Óϵͳµ÷ÓÃÖÐÍ˳öǰ£¬Ëü¶¼»á¼ì²ésignalºÍblockedÓò£¬¿´ÊÇ·ñÓпÉÒÔÁ¢¿Ì·¢Ë͵ķÇ×èÈûÐźš£Õâ¿´ÆðÀ´·Ç³£²»¿É¿¿£¬µ«ÊÇϵͳÖÐÿ¸ö½ø³Ì¶¼ÔÚ²»Í£µØ½øÐÐϵͳµ÷Óã¬ÈçÏòÖÕ¶ËÊä³ö×Ö·û¡£µ±È»½ø³Ì¿ÉÒÔÑ¡ÔñÈ¥µÈ´ýÐźţ¬´Ëʱ½ø³Ì½«Ò»Ö±´¦ÓÚ¿ÉÖжÏ״ֱ̬µ½ÐźųöÏÖ¡£¶Ôµ±Ç°²»¿É×èÈûÐźŵĴ¦Àí´úÂë·ÅÖÃÔÚsigaction½á¹¹ÖС£
Èç¹ûÐźŵĴ¦Àí¹ý³Ì±»ÉèÖóÉȱʡÔòÓɺËÐÄÀ´Ó¦¸¶Ëü¡£SIGSTOPÐźŵÄȱʡ´¦Àí¹ý³ÌÊǽ«µ±Ç°½ø³ÌµÄ״̬¸Ä±ä³ÉΪStopped²¢ÔËÐе÷¶È¹ÜÀíÆ÷ÒÔÑ¡ÔñÒ»¸öнø³Ì¼ÌÐøÔËÐС£SIGFPEµÄȱʡ´¦Àí¹ý³ÌÔòÊÇÒýÆðcore dump²¢Ê¹½ø³ÌÍ˳ö¡£µ±È»£¬½ø³Ì¿ÉÒÔ¶¨ÒåÆä×ÔÉíµÄÐźŴ¦Àí¹ý³Ì¡£Ò»µ©ÐźŲúÉú£¬Õâ¸ö¹ý³Ì¾Í½«±»µ÷Óá£ËüµÄµØÖ·´æ´¢ÔÚsigaction½á¹¹ÖС£ºËÐıØÐëµ÷Óýø³ÌµÄÐźŴ¦ÀíÀý³Ì£¬¾ßÌåÈçºÎÈ¥×öÒÀÀµÓÚ´¦ÀíÆ÷ÀàÐÍ£¬µ«ÊÇËùÓеÄCPU ±ØÐë´¦ÀíÕâ¸öÎÊÌ⣺Èç¹ûÐźŲúÉúʱ£¬µ±Ç°½ø³ÌÕýÔÚºËÐÄģʽÏÂÔËÐв¢ÇÒÂíÉÏÒª·µ»Øµ÷ÓúËÐÄ»òÕßϵͳÀý³ÌµÄ½ø³Ì£¬¶ø¸Ã½ø³Ì´¦ÔÚÓû§Ä£Ê½Ï¡£½â¾öÕâ¸öÎÊÌâÐèÒª²Ù×ݽø³ÌµÄ¶ÑÕ»¼°¼Ä´æÆ÷¡£½ø³ÌµÄ³ÌÐò¼ÆÊýÆ÷±»ÉèÖÃ³ÉÆäÐźŴ¦Àí¹ý³ÌµÄµØÖ·£¬¶ø²ÎÊýͨ¹ýµ÷Óÿò¼Ü»òÕ߼ĴæÆ÷´«µÝµ½´¦ÀíÀý³ÌÖС£µ±½ø³Ì¼ÌÐøÖ´ÐÐʱ£¬ÐźŴ¦ÀíÀý³ÌºÃÏóÆÕͨµÄº¯Êýµ÷ÓÃÒ»Ñù¡£
LinuxÊÇPOSIX¼æÈݵģ¬ËùÒÔµ±Ä³¸öÌØ¶¨ÐźŴ¦ÀíÀý³Ì±»µ÷ÓÃʱ£¬½ø³Ì¿ÉÒÔÉ趨ÄĸöÐźſÉÒÔ×èÈû¡£ÕâÒâζ×Å¿ÉÒÔÔÚ½ø³ÌÐźŴ¦Àí¹ý³ÌÖиıäblockedÆÁ±ÎÂë¡£µ±ÐźŴ¦ÀíÀý³Ì½áÊøÊ±£¬´ËblockedÆÁ±ÎÂë±ØÐëÉèÖóÉÔÓÐÖµ¡£ Òò´Ë£¬LinuxÌí¼ÓÁËÒ»¸ö¹ý³Ìµ÷ÓÃÀ´½øÐÐÕûÀí¹¤×÷£¬Í¨¹ýËüÀ´ÖØÐÂÉèÖñ»·¢ËÍÐźŽø³Ìµ÷ÓÃÕ»ÖеÄÔÓÐblockedÆÁ±ÎÂë¡£ ¶ÔÓÚͬһʱ¿Ì¼¸¸öÐźŴ¦Àí¹ý³Ì£¬Linuxͨ¹ý¶ÑÕ»·½Ê½À´ÓÅ»¯ÆäʹÓã¬Ã¿µ±Ò»¸ö´¦Àí¹ý³ÌÍ˳öʱ£¬ÏÂÒ»¸ö´¦Àí¹ý³Ì±ØÐëµÈµ½ÕûÀíÀý³Ì½áÊøºó²ÅÖ´ÐС£
$ ls | pr | lpr
ÔÚÕâ¸ö¹ÜµÀÓ¦ÓÃÖУ¬lsÁе±Ç°Ä¿Â¼µÄÊä³ö±»×÷Ϊ±ê×¼ÊäÈëË͵½pr³ÌÐòÖУ¬¶øprµÄÊä³öÓÖ±»×÷Ϊ±ê×¼ÊäÈëË͵½lpr³ÌÐòÖС£¹ÜµÀÊǵ¥ÏòµÄ×Ö½ÚÁ÷£¬Ëü½«Ä³¸ö½ø³ÌµÄ±ê×¼Êä³öÁ¬½Óµ½ÁíÍâ½ø³ÌµÄ±ê×¼ÊäÈë¡£µ«ÊÇʹÓùܵÀµÄ½ø³Ì¶¼²»»áÒâʶµ½Öض¨ÏòµÄ´æÔÚ£¬²¢ÇÒÆäÖ´Ðнá¹ûÒ²²»»áÓÐʲô²»Í¬¡£shell³ÌÐò¸ºÔðÔÚ½ø³Ì¼ä½¨Á¢ÁÙʱµÄ¹ÜµÀ¡£
ÔÚLinuxÖУ¬¹ÜµÀÊÇͨ¹ýÖ¸Ïòͬһ¸öÁÙʱVFS inodeµÄÁ½¸öfileÊý¾Ý½á¹¹À´ÊµÏֵ쬴ËVFS inodeÖ¸ÏòÄÚ´æÖеÄÒ»¸öÎïÀíÒ³Ãæ¡£Í¼5.1ÖÐÿ¸öfileÊý¾Ý½á¹¹Ö¸Ïò²»Í¬µÄÎļþ²Ù×÷Àý³ÌÏòÁ¿£¬Ò»¸öÊÇʵÏֶԹܵÀµÄд£¬ÁíÒ»¸ö´Ó¹ÜµÀÖжÁ¡£
ÕâÑù¾ÍÒþ²ØÁ˶Áд¹ÜµÀºÍ¶ÁдÆÕͨµÄÎļþʱϵͳµ÷ÓõIJî±ð¡£µ±Ð´Èë½ø³Ì¶Ô¹ÜµÀдʱ£¬×Ö½Ú±»¿½±´µ½¹²ÏíÊý¾ÝÒ³ÃæÖУ¬µ±¶ÁÈ¡½ø³Ì´Ó¹ÜµÀÖжÁʱ£¬×Ö½Ú´Ó¹²ÏíÊý¾ÝÒ³ÃæÖп½±´³öÀ´¡£Linux±ØÐëͬ²½¶Ô¹ÜµÀµÄ·ÃÎÊ¡£Ëü±ØÐë±£Ö¤¶ÁÕߺÍдÕßÒÔÈ·¶¨µÄ²½ÖèÖ´ÐУ¬Îª´ËÐèҪʹÓÃËø¡¢µÈ´ý¶ÓÁкÍÐźŵÈͬ²½»úÖÆ¡£
µ±Ð´ÕßÏë¶Ô¹ÜµÀдÈëʱ£¬ËüʹÓñê×¼µÄд¿âº¯Êý¡£±íʾ´ò¿ªÎļþºÍ´ò¿ª¹ÜµÀµÄÃèÐð·ûÓÃÀ´¶Ô½ø³ÌµÄfileÊý¾Ý ½á¹¹¼¯ºÏ½øÐÐË÷Òý¡£Linuxϵͳµ÷ÓÃʹÓÃÓɹܵÀfileÊý¾Ý½á¹¹Ö¸ÏòµÄwrite¹ý³Ì¡£Õâ¸öwrite¹ý³ÌÓñ£´æÔÚ±íʾ¹ÜµÀµÄVFS inodeÖеÄÐÅÏ¢À´¹ÜÀíдÇëÇó¡£
Èç¹ûûÓÐ×ã¹»µÄ¿Õ¼äÈÝÄɶÔËùÓÐдÈë¹ÜµÀµÄÊý¾Ý£¬Ö»Òª¹ÜµÀûÓб»¶ÁÕß¼ÓËø¡£ÔòLinuxΪдÕß¼ÓËø£¬²¢°Ñ´ÓдÈë½ø³ÌµØÖ·¿Õ¼äÖÐдÈëµÄ×Ö½Ú¿½±´µ½¹²ÏíÊý¾ÝÒ³ÃæÖÐÈ¥¡£Èç¹û¹ÜµÀ±»¶ÁÕß¼ÓËø»òÕßûÓÐ×ã¹»¿Õ¼ä´æ´¢Êý¾Ý£¬µ±Ç°½ø³Ì½«ÔڹܵÀinodeµÄµÈ´ý¶ÓÁÐÖÐ˯Ãߣ¬Í¬Ê±µ÷¶È¹ÜÀíÆ÷¿ªÊ¼Ö´ÐÐÒÔÑ¡ÔñÆäËü½ø³ÌÀ´Ö´ÐС£Èç¹ûдÈë½ø³ÌÊÇ¿ÉÖжϵģ¬Ôòµ±ÓÐ×ã¹»µÄ¿Õ¼ä»òÕ߹ܵÀ±»½âËøÊ±£¬Ëü½«±»¶ÁÕß»½ÐÑ¡£µ±Êý¾Ý±»Ð´Èëʱ£¬¹ÜµÀµÄVFS inode±»½âËø£¬Í¬Ê±ÈκÎÔÚ´ËinodeµÄµÈ´ý¶ÓÁÐÉÏ˯ÃߵĶÁÕß½ø³Ì¶¼½«±»»½ÐÑ¡£
´Ó¹ÜµÀÖжÁ³öÊý¾ÝµÄ¹ý³ÌºÍдÈëÀàËÆ¡£
½ø³ÌÔÊÐí½øÐзÇ×èÈû¶Á£¨ÕâÒÀÀµÓÚËüÃÇ´ò¿ªÎļþ»òÕ߹ܵÀµÄ·½Ê½£©£¬´ËʱÈç¹ûûÓÐÊý¾Ý¿É¶Á»òÕ߹ܵÀ±»¼ÓËø£¬ Ôò·µ»Ø´íÎóÐÅÏ¢±íÃ÷½ø³Ì¿ÉÒÔ¼ÌÐøÖ´ÐС£×èÈû·½Ê½Ôòʹ¶ÁÕß½ø³ÌÔڹܵÀinodeµÄµÈ´ý¶ÓÁÐÉÏ˯ÃßÖ±µ½Ð´Õß ½ø³Ì½áÊø¡£µ±Á½¸ö½ø³Ì¶Ô¹ÜµÀµÄʹÓýáÊøÊ±£¬¹ÜµÀinodeºÍ¹²ÏíÊý¾ÝÒ³Ãæ½«Í¬Ê±±»ÒÅÆú¡£
Linux»¹Ö§³ÖÃüÃû¹ÜµÀ(named pipe)£¬Ò²¾ÍÊÇFIFO¹ÜµÀ£¬ÒòΪËü×ÜÊǰ´ÕÕÏȽøÏȳöµÄÔÔò¹¤×÷¡£µÚÒ»¸ö±»Ð´Èë µÄÊý¾Ý½«Ê×ÏȴӹܵÀÖжÁ³öÀ´¡£ºÍÆäËü¹ÜµÀ²»Ò»Ñù£¬FIFO¹ÜµÀ²»ÊÇÁÙʱ¶ÔÏó£¬ËüÃÇÊÇÎļþϵͳÖеÄʵÌå²¢ÇÒ ¿ÉÒÔͨ¹ýmkfifoÃüÁîÀ´´´½¨¡£½ø³ÌÖ»ÒªÓµÓÐÊʵ±µÄȨÏ޾ͿÉÒÔ×ÔÓÉʹÓÃFIFO¹ÜµÀ¡£´ò¿ªFIFO¹ÜµÀµÄ·½Ê½ÉÔÓв»Í¬¡£ÆäËü¹ÜµÀÐèÒªÏÈ´´½¨£¨ËüµÄÁ½¸öfileÊý¾Ý½á¹¹£¬VFS inodeºÍ¹²ÏíÊý¾ÝÒ³Ãæ£©¶øFIFO¹ÜµÀÒѾ´æÔÚ£¬Ö»ÐèÒªÓÉʹÓÃÕß´ò¿ªÓë¹Ø±Õ¡£ÔÚдÕß½ø³Ì´ò¿ªËü֮ǰ£¬Linux±ØÐëÈöÁÕß½ø³ÌÏÈ´ò¿ª´ËFIFO¹ÜµÀ£»ÈκζÁÕß½ø³Ì´ÓÖжÁȡ֮ǰ±ØÐëÓÐдÕß½ø³ÌÏòÆäдÈëÊý¾Ý¡£FIFO¹ÜµÀµÄʹÓ÷½·¨ÓëÆÕͨ¹ÜµÀ»ù±¾Ïàͬ£¬Í¬Ê±ËüÃÇʹÓÃÏàͬÊý¾Ý½á¹¹ºÍ²Ù×÷¡£
ϵͳÖÐËùÓÐϵͳV IPC¶ÔÏóµÄLinuxÊý¾Ý½á¹¹°üº¬Ò»¸öipc_perm½á¹¹£¬Ëüº¬Óнø³ÌÓµÓÐÕߺʹ´½¨Õß¼°×é±êÖ¾·û¡£ÁíÍ⻹ÓжԴ˶ÔÏó£¨ÓµÓÐÕߣ¬×é¼°ÆäËü£©µÄ´æÈ¡Ä£Ê½ÒÔ¼°IPC¶ÔÏó¼ü¡£´Ë¼üÖµ±»ÓÃÀ´¶¨Î»ÏµÍ³V IPC¶ÔÏóµÄÒýÓñêÖ¾·û¡£ÕâÑùµÄ¼üÖµÒ»¹²ÓÐÁ½×飺¹«ÓÐÓë˽ÓС£Èç¹û´Ë¼üΪ¹«ÓУ¬ÔòϵͳÖÐÈκνÓÊÜȨÏÞ¼ì²éµÄ½ø³Ì¶¼¿ÉÒÔÕÒµ½ÏµÍ³V IPC¶ÔÏóµÄÒýÓñêÖ¾·û¡£ÏµÍ³V IPC¶ÔÏó¾ø²»ÄÜÓÃÒ»¸ö¼üÖµÀ´ÒýÓ㬶øÖ»ÄÜʹÓÃÒýÓñêÖ¾·û¡£
ÿ¸ömsqid_ds½á¹¹°üº¬Ò»¸öipc_perm½á¹¹ºÍÖ¸ÏòÒѾ½øÈë´Ë¶ÓÁÐÏûÏ¢µÄÖ¸Õë¡£ÁíÍ⣬Linux±£ÁôÓйضÓÁÐÐÞ¸Äʱ¼äÐÅÏ¢£¬ÈçÉÏ´ÎϵͳÏò¶ÓÁÐÖÐдÈëµÄʱ¼äµÈ¡£msqid_ds°üº¬Á½¸öµÈ´ý¶ÓÁУºÒ»¸öΪ¶ÓÁÐдÈë½ø³ÌʹÓöøÁíÒ»¸öÓɶÓÁжÁÈ¡½ø³ÌʹÓá£
ÿ´Î½ø³ÌÊÔͼÏòдÈë¶ÓÁÐдÈëÏûϢʱ£¬ÏµÍ³½«°ÑÆäÓÐЧÓû§ºÍ×é±êÖ¾·ûÓë´Ë¶ÓÁеÄipc_perm½á¹¹ÖеÄģʽ½øÐбȽϡ£Èç¹ûÔÊÐíдÈë²Ù×÷£¬Ôò°Ñ´ËÏûÏ¢´Ó´Ë½ø³ÌµÄµØÖ·¿Õ¼ä¿½±´µ½msgÊý¾Ý½á¹¹ÖУ¬²¢·ÅÖõ½´ËÏûÏ¢¶ÓÁÐβ²¿¡£ÓÉÓÚ LinuxÑϸñÏÞÖÆ¿ÉдÈëÏûÏ¢µÄ¸öÊýºÍ³¤¶È£¬¶ÓÁÐÖпÉÄÜÈÝÄɲ»ÏÂÕâ¸öÏûÏ¢¡£´Ëʱ£¬´ËдÈë½ø³Ì½«±»Ìí¼Óµ½Õâ¸öÏûÏ¢¶ÓÁеĵȴý¶ÓÁÐÖУ¬Í¬Ê±µ÷Óõ÷¶È¹ÜÀíÆ÷Ñ¡Ôñнø³ÌÔËÐС£µ±ÓÉÏûÏ¢´Ó´Ë¶ÓÁÐÖÐÊÍ·Åʱ£¬¸Ã½ø³Ì½«±»»½ÐÑ¡£
´Ó¶ÓÁÐÖжÁµÄ¹ý³ÌÓëÖ®ÀàËÆ¡£½ø³Ì¶ÔÕâ¸öдÈë¶ÓÁеķÃÎÊȨÏÞ½«±»ÔٴμìÑé¡£¶ÁÈ¡½ø³Ì½«Ñ¡Ôñ¶ÓÁÐÖеÚÒ»¸öÏûÏ¢£¨²»¹ÜÊÇʲôÀàÐÍ£©»òÕßµÚÒ»¸öÄ³ÌØ¶¨ÀàÐ͵ÄÏûÏ¢¡£Èç¹ûûÓÐÏûÏ¢¿ÉÒÔÂú×ã´ËÒªÇ󣬶ÁÈ¡½ø³Ì½«±»Ìí¼Ó µ½ÏûÏ¢¶ÓÁеĶÁÈ¡µÈ´ý¶ÓÁÐÖУ¬È»ºóϵͳÔËÐе÷¶È¹ÜÀíÆ÷¡£µ±ÓÐÐÂÏûϢдÈë¶ÓÁÐʱ£¬½ø³Ì½«±»»½ÐѼÌÐøÖ´ÐС£
ÐźŵÆ×î¼òµ¥µÄÐÎʽÊÇij¸ö¿ÉÒÔ±»¶à¸ö½ø³Ì¼ìÑéºÍÉèÖÃ(test&set)µÄÄÚ´æµ¥Ôª¡£Õâ¸ö¼ìÑéÓëÉèÖòÙ×÷¶Ôÿ¸ö½ø³Ì¶øÑÔÊDz»¿ÉÖжϻòÕß˵ÊÇÒ»¸öÔ×ÓÐÔ²Ù×÷£»Ò»µ©Æô¶¯ËÒ²ÖÕÖ¹²»ÁË¡£¼ìÑéÓëÉèÖòÙ×÷µÄ½á¹ûÊÇÐźŵƵ±Ç°Öµ¼Ó1£¬ Õâ¸öÖµ¿ÉÒÔÊÇÕýÊýÒ²¿ÉÒÔÊǸºÊý¡£¸ù¾ÝÕâ¸ö²Ù×÷µÄ½á¹û£¬½ø³Ì¿ÉÄÜ¿ÉÒÔһֱ˯Ãßµ½´ËÐźŵƵÄÖµ±»ÁíÒ»¸ö½ø³Ì¸ü¸ÄΪֹ¡£ÐźŵƿÉÓÃÀ´ÊµÏÖÁÙ½çÇø(critical region)£ºÄ³Ò»Ê±¿ÌÔÚ´ËÇøÓòÄڵĴúÂëÖ»Äܱ»Ò»¸ö½ø³ÌÖ´ÐС£
Èç¹ûÄãÓжà¸öÐ×÷½ø³Ì´ÓÒ»¸öÊý¾ÝÎļþÖжÁÈ¡ÓëдÈë¼Ç¼¡£ÓÐʱÄã¿ÉÄÜÐèÒªÕâЩÎļþ·ÃÎÊ×ñÑÑϸñµÄ·ÃÎÊ´ÎÐò¡£ ÄÇô¿ÉÔÚÎļþ²Ù×÷´úÂëÉÏʹÓÃÒ»¸ö³õʼֵΪ1µÄÐźŵƣ¬Ëü´øÓÐÁ½¸öÐźŵƲÙ×÷£¬Ò»¸ö¼ìÑé²¢¶ÔÐÅºÅµÆ Öµ¼õ1£¬¶øÁíÒ»¸ö¼ìÑé²¢¼Ó1¡£µÚÒ»¸ö·ÃÎÊÎļþµÄ½ø³Ì½«ÊÔͼ½«ÐźŵÆÖµ¼õ1£¬Èç¹û»ñµÃ³É¹¦ÔòÐźŵÆÖµ±ä³ÉÁË 0¡£´Ë½ø³ÌÓÚÊÇ¿ªÊ¼Ê¹ÓÃÕâ¸öÊý¾ÝÎļþ£¬µ«ÊÇ´ËʱÈç¹ûÁíÒ»½ø³ÌÒ²Ï뽫ÐźŵÆÖµ¼õ1£¬ÔòÐźŵÆÖµ½«Îª-1£¬Õâ´Î²Ù×÷½«»áʧ°Ü¡£Ëü½«¹ÒÆðÖ´ÐÐÖ±µ½µÚÒ»¸ö½ø³ÌÍê³É¶Ô´ËÊý¾ÝÎļþµÄʹÓᣴËʱÕâ¸öµÈ´ý½ø³Ì½«±»»½ÐÑ£¬Õâ´ÎËü¶ÔÐźŵƵIJÙ×÷½«³É¹¦¡£
ÿ¸öϵͳV IPCÐźŵƶÔÏó¶ÔÓ¦Ò»¸öÐźŵÆÊý×飬LinuxʹÓÃsemid_ds½á¹¹À´±íʾ¡£ÏµÍ³ÖÐËùÓÐsemid_ds½á¹¹ÓÉÒ»×ésemaryÖ¸ÕëÀ´Ö¸Ê¾¡£ÔÚÿ¸öÐźŵÆÊý×éÖÐÓÐÒ»¸ösem_nsems£¬Ëü±íʾһ¸öÓÉsem_baseÖ¸ÏòµÄsem½á¹¹¡£ÊÚȨµÄ½ø³Ì¿ÉÒÔʹÓÃϵͳµ÷ÓÃÀ´²Ù×ÝÕâЩ°üº¬ÏµÍ³V IPCÐźŵƶÔÏóµÄÐźŵÆÊý×é¡£Õâ¸öϵͳµ÷ÓÿÉÒÔ¶¨ÒåÐí¶àÖÖ²Ù×÷£¬Ã¿¸ö²Ù×÷ÓÃÈý¸öÊäÈëÀ´ÃèÐð£ºÐźŵÆË÷Òý¡¢²Ù×÷ÖµºÍÒ»×é±êÖ¾¡£ÐźŵÆË÷ÒýÊÇÒ»¸öÐźŵÆÊý×éµÄË÷Òý£¬¶ø²Ù×÷ÖµÊǽ«±»¼Óµ½ÐźŵÆÉϵÄÊýÖµ¡£Ê×ÏÈLinux½«¼ì²éÊÇ·ñËùÓвÙ×÷ÒѾ³É¹¦¡£Èç¹û²Ù×÷ÖµÓëÐźŵƵ±Ç°ÊýÖµÏà¼Ó´óÓÚ0£¬»òÕß²Ù×÷ÖµÓëÐźŵƵ±Ç°Öµ¶¼ÊÇ0£¬²Ù×÷½«»á³É¹¦¡£Èç¹ûËùÓÐÐźŵƲÙ×÷ʧ°Ü£¬Linux½ö½ö»á°ÑÄÇЩ²Ù×÷±ê־ûÓÐÒªÇóϵͳµ÷ÓÃΪ·Ç×èÈûÀàÐ͵Ľø³Ì¹ÒÆð¡£½ø³Ì¹ÒÆðºó£¬Linux±ØÐë±£´æÐźŵƲÙ×÷µÄÖ´ÐÐ״̬²¢½«µ±Ç°½ø³Ì·ÅÈëµÈ´ý¶ÓÁС£ÏµÍ³»¹ÔÚ¶ÑÕ»ÉϽ¨Á¢sem_queue½á¹¹²¢Ìî³ä¸÷¸öÓò¡£Õâ¸ösem_queue½á¹¹½«±»·Åµ½´ËÐźŵƶÔÏóµÈ´ý¶ÓÁеÄβ²¿£¨Ê¹Óà sem_pendingºÍsem_pending_lastÖ¸Õ룩¡£ÏµÍ³°Ñµ±Ç°½ø³ÌÖÃÈësem_queue½á¹¹Öеĵȴý¶ÓÁÐ(sleeper)ÖУ¬È»ºóÆô¶¯µ÷¶È¹ÜÀíÆ÷Ñ¡ÔñÆäËü½ø³ÌÔËÐС£
Èç¹ûËùÓÐÕâЩÐźŵƲÙ×÷¶¼³É¹¦ÔòÎÞÐè¹ÒÆðµ±Ç°½ø³Ì£¬Linux½«¶ÔÐźŵÆÊý×éÖÐµÄÆäËû³ÉÔ±½øÐÐÏàͬ²Ù×÷£¬È»ºó¼ì²éÄÇЩ´¦Óڵȴý»òÕß¹ÒÆð״̬µÄ½ø³Ì¡£Ê×ÏÈ£¬Linux½«ÒÀ´Î¼ì²é¹ÒÆð¶ÓÁÐ(sem_pending) ÖеÄÿ¸ö³ÉÔ±£¬¿´ÐźŵƲÙ×÷ÄÜ·ñ¼ÌÐø¡£Èç¹û¿ÉÒÔÔò½«Æäsem_queue½á¹¹´Ó¹ÒÆðÁ´±íÖÐɾ³ý²¢¶ÔÐźŵÆÊý×é·¢³öÐźŵƲÙ×÷¡£Linux»¹½«»½ÐÑ´¦ÓÚ˯Ãß״̬µÄ½ø³Ì²¢Ê¹Ö®³ÉΪÏÂÒ»¸öÔËÐеĽø³Ì¡£Èç¹ûÔÚ¶Ô¹ÒÆð¶ÓÁеıéÀú¹ý³ÌÖÐÓеÄÐźŵƲÙ×÷²»ÄÜÍê³ÉÔòLinux½«Ò»Ö±Öظ´´Ë¹ý³Ì£¬Ö±µ½ËùÓÐÐźŵƲÙ×÷Íê³ÉÇÒûÓнø³ÌÐèÒª¼ÌÐøË¯Ãß¡£
µ«ÊÇÐźŵƵÄʹÓÿÉÄܲúÉúÒ»¸öÑÏÖØµÄÎÊÌ⣺ËÀËø¡£µ±Ò»¸ö½ø³Ì½øÈëÁÙ½çÇøÊ±Ëü¸Ä±äÁËÐźŵƵÄÖµ¶øÀ뿪ÁÙ½çÇøÊ±ÓÉÓÚÔËÐÐʧ°Ü»òÕß±»kill¶øÃ»ÓиĻØÐźŵÆÊ±£¬ËÀËø½«»á·¢Éú¡£Linuxͨ¹ýά»¤Ò»×éÃèÐðÐźŵÆÊý×é±ä»¯µÄÁ´±íÀ´·ÀÖ¹¸ÃÏÖÏóµÄ·¢Éú¡£ËüµÄ¾ßÌå×ö·¨ÊÇÈÃLinux½«°Ñ´ËÐźŵÆÉèÖÃΪ½ø³Ì¶ÔÆä½øÐвÙ×÷ǰµÄ״̬¡£ÕâЩ״ֵ̬±»±£´æÔÚʹÓøÃÐźŵÆÊý×é½ø³ÌµÄsemid_dsºÍtask_struct½á¹¹µÄsem_undo½á¹¹ÖС£
ÐźŵƲÙ×÷½«ÆÈʹϵͳ¶ÔËüÒýÆðµÄ״̬±ä»¯½øÐÐά»¤¡£LinuxΪÿ¸ö½ø³Ìά»¤ÖÁÉÙÒ»¸ö¶ÔÓ¦ÓÚÐźŵÆÊý×éµÄsem_undo½á¹¹¡£Èç¹ûÇëÇó½øÐÐÐźŵƲÙ×÷µÄ½ø³ÌûÓиýṹ£¬Ôò±ØÒªÊ±Linux»áΪÆä´´½¨Ò»¸ö¡£Õâ¸ösem_undo ½á¹¹½«Í¬Ê±·ÅÈë´Ë½ø³ÌµÄtask_struct½á¹¹ºÍ´ËÐźŵÆÊý×éµÄsemid_ds½á¹¹ÖС£µ±¶ÔÐźŵƽøÐвÙ×÷ʱ£¬ÐźŵƱ仯ֵµÄ¸ºÊý±»ÖÃÈë½ø³ÌµÄsem_undo½á¹¹ÖиÃÐźŵÄÈë¿ÚÖС£ËùÒÔµ±²Ù×÷ֵΪ2ʱ£¬Ôò´ËÐźŵƵĵ÷ÕûÈë¿ÚÖн«¼ÓÈëÒ»¸ö-2¡£
ÏóÕý³£Í˳öÒ»Ñù£¬µ±½ø³Ì±»É¾³ýʱ£¬Linux½«±éÀú¸Ã½ø³ÌµÄsem_undo¼¯ºÏ¶ÔÐźŵÆÊý×éʹÓõ÷ÕûÖµ¡£Èç¹ûÐźŵƼ¯ºÏ±»É¾³ý¶øsem_undoÊý¾Ý½á¹¹»¹ÔÚ½ø³ÌµÄtask_struct½á¹¹ÖÐÔò´ËÐźŵÆÊý×é±êÖ¾·û½«±»ÖÃΪÎÞЧ¡£´Ëʱ ÐźŵÆÇå³ý´úÂëÖ»Ð趪Æúsem_undo½á¹¹¼´¿É¡£
¹²ÏíÄÚ´æÔÊÐíÒ»¸ö»ò¶à¸ö½ø³Ìͨ¹ýͬʱ³öÏÖÔÚËüÃÇÐéÄâµØÖ·¿Õ¼äÖеÄÄÚ´æÀ´Í¨Ñ¶¡£´ËÐéÄâÄÚ´æµÄÒ³Ãæ³öÏÖÔÚÿ¸ö¹²Ïí½ø³ÌÒ³±íÖС£µ«´ËÒ³Ãæ²¢²»Ò»¶¨Î»ÓÚËùÓй²Ïí½ø³ÌÐéÄâÄÚ´æµÄÏàͬλÖá£ºÍÆäËüϵͳV IPC¶ÔÏóµÄʹÓ÷½·¨Ò»Ñù£¬¶Ô¹²ÏíÄÚ´æÇøÓòµÄ·ÃÎÊÊÇͨ¹ý¼üºÍ·ÃÎÊȨÏÞ¼ìÑéÀ´¿ØÖƵġ£Ò»µ©ÄÚ´æ±»¹²Ïí£¬ÔòÔÙ²»»á¼ìÑé½ø³Ì¶Ô¶ÔÏóµÄʹÓ÷½Ê½¡£ËüÒÀÀµÓÚÆäËü»úÖÆ£¬ÈçϵͳVÐźŵƣ¬À´Í¬²½¶Ô¹²ÏíÄÚ´æµÄ·ÃÎÊ¡£
ÿ¸öд´½¨µÄ¹²ÏíÄÚ´æÇøÓòÓÉÒ»¸öshmid_dsÊý¾Ý½á¹¹À´±íʾ¡£ËüÃDZ»±£´æÔÙshm_segsÊý×éÖС£ shmid_dsÊý¾Ý½á¹¹ÃèÐð¹²ÏíÄÚ´æµÄ´óС£¬½ø³ÌÈçºÎʹÓÃÒÔ¼°¹²ÏíÄÚ´æÓ³Éäµ½Æä¸÷×ÔµØÖ·¿Õ¼äµÄ·½Ê½¡£Óɹ²ÏíÄÚ´æ´´½¨Õß¿ØÖƶԴËÄÚ´æµÄ´æÈ¡È¨ÏÞÒÔ¼°Æä¼üÊǹ«Óл¹ÊÇ˽ÓС£Èç¹ûËüÓÉ×㹻ȨÏÞ£¬Ëü»¹¿ÉÒÔ½«´Ë¹²ÏíÄÚ´æ¼ÓÔØµ½ÎïÀíÄÚ´æÖС£
ÿ¸öʹÓô˹²ÏíÄÚ´æµÄ½ø³Ì±ØÐëͨ¹ýϵͳµ÷Óý«ÆäÁ¬½Óµ½ÐéÄâÄÚ´æÉÏ¡£Õâʱ½ø³Ì´´½¨ÐµÄvm_area_structÀ´ÃèÐð´Ë¹²ÏíÄÚ´æ¡£½ø³Ì¿ÉÒÔ¾ö¶¨´Ë¹²ÏíÄÚ´æÔÚÆäÐéÄâµØÖ·¿Õ¼äµÄλÖ㬻òÕßÈÃLinuxÑ¡ÔñÒ»¿é×ã¹»´óµÄÇøÓò¡£ еÄvm_area_struct½á¹¹½«±»·Åµ½ÓÉshmid_dsÖ¸ÏòµÄvm_area_structÁ´±íÖС£Í¨¹ývm_next_sharedºÍvm_prev_shared Ö¸Õ뽫ËüÃÇÁ¬½ÓÆðÀ´¡£ÐéÄâÄÚ´æÔÚÁ¬½Óʱ²¢Ã»Óд´½¨£»½ø³Ì·ÃÎÊËüʱ²Å´´½¨¡£
µ±½ø³ÌÊ״ηÃÎʹ²ÏíÐéÄâÄÚ´æÖеÄÒ³ÃæÊ±½«²úÉúÒ³Ãæ´í¡£µ±È¡»Ø´ËÒ³Ãæºó£¬LinuxÕÒµ½ÁËÃèÐð´ËÒ³ÃæµÄvm_area_structÊý¾Ý½á¹¹¡£Ëü°üº¬Ö¸ÏòʹÓôËÖÖÀàÐÍÐéÄâÄÚ´æµÄ´¦Àíº¯ÊýµØÖ·Ö¸Õë¡£¹²ÏíÄÚ´æÒ³Ãæ´íÎó´¦Àí ´úÂ뽫ÔÚ´Ëshmid_ds¶ÔÓ¦µÄÒ³±íÈë¿ÚÁ´±íÖÐѰÕÒÊÇ·ñ´æÔڴ˹²ÏíÐéÄâÄÚ´æÒ³Ãæ¡£Èç¹û²»´æÔÚ£¬ÔòËü½«·ÖÅäÎïÀíÒ³Ãæ²¢ÎªÆä´´½¨Ò³±íÈë¿Ú¡£Í¬Ê±»¹½«Ëü·ÅÈ뵱ǰ½ø³ÌµÄÒ³±íÖУ¬´ËÈë¿Ú±»±£´æÔÚshmid_ds½á¹¹ÖС£ÕâÒâζ×ÅϸöÊÔͼ·ÃÎÊ´ËÄÚ´æµÄ½ø³Ì»¹»á²úÉúÒ³Ãæ´íÎ󣬹²ÏíÄÚ´æ´íÎó´¦Àíº¯Êý½«Îª´Ë½ø³ÌʹÓÃÆäд´½¨µÄÎïÀíÒ³Ãæ¡£ÕâÑù£¬µÚÒ»¸ö·ÃÎÊÐéÄâÄÚ´æÒ³ÃæµÄ½ø³Ì´´½¨Õâ¿éÄÚ´æ£¬ËæºóµÄ½ø³Ì°Ñ´ËÒ³Ãæ¼ÓÈëµ½¸÷×ÔµÄÐéÄâµØÖ·¿Õ¼äÖС£
µ±½ø³Ì²»ÔÙ¹²Ïí´ËÐéÄâÄÚ´æÊ±£¬½ø³ÌºÍ¹²ÏíÄÚ´æµÄÁ¬½Ó½«±»¶Ï¿ª¡£Èç¹ûÆäËü½ø³Ì»¹ÔÚʹÓÃÕâ¸öÄڴ棬Ôò´Ë²Ù×÷Ö»Ó°Ï쵱ǰ½ø³Ì¡£Æä¶ÔÓ¦µÄvm_area_struct½á¹¹½«´Óshmid_ds½á¹¹ÖÐɾ³ý²¢»ØÊÕ¡£µ±Ç°½ø³Ì¶ÔÓ¦´Ë¹²ÏíÄÚ´æµØÖ·µÄÒ³±íÈë¿ÚÒ²½«±»¸üв¢ÖÃΪÎÞЧ¡£µ±×îºóÒ»¸ö½ø³Ì¶Ï¿ªÓë¹²ÏíÄÚ´æµÄÁ¬½Óʱ£¬µ±Ç°Î»ÓÚÎïÀíÄÚ´æÖеĹ²ÏíÄÚ´æÒ³Ã潫±»ÊÍ·Å£¬Í¬Ê±»¹Óд˹²ÏíÄÚ´æµÄshmid_ds½á¹¹¡£
µ±¹²ÏíÄÚ´æÃ»Óб»ËøÈëÎïÀíÄÚ´æÊ±£¬Çé¿ö½«¸ü¼Ó¸´ÔÓ¡£´Ëʱ¹²ÏíÄÚ´æÒ³Ãæ¿ÉÄÜ»áÔÚÄÚ´æÊ¹Óø߷åÆÚ£¬±»½»»»µ½ÏµÍ³µÄ½»»»´ÅÅÌÉÏ¡£¹²ÏíÄÚ´æÈçºÎ±»½»»»Óëµ÷ÈëÎïÀíÄڴ潫ÔÚmmÒ»ÕÂÖÐÏêϸÃèÐð¡£
File translated from TEX by TTH, version 1.0.