¡¡ ²Ù×÷ϵͳ  °ì¹«  ʵÓÃ֪ʶ  Éè¼Æ  ¿ª·¢  WEB¿ª·¢  ÒÆ¶¯¿ª·¢  Êý¾Ý¿â  Èí¼þ¹¤³Ì  Íø¹Ü  °²È«  ¹ÜÀí  ÐÅÏ¢»¯  ´ðÒÉ  ÇþµÀ 

Linux KernelºËÐÄÖÐÎÄÊÖ²á

2004-4-8¡¡ÍøÓÑÆÀÂÛ 0 Ìõ¡¡µã»÷½øÈëÂÛ̳

À´×Ô£ºÀ¶É­ÁÖ×ÔÓÉÈí¼þ

Chapter 1

Hardware Basic( Ó²¼þ»ù´¡ÖªÊ¶ )

    Ò»¸ö²Ù×÷ϵͳ±ØÐëºÍ×÷ΪËüµÄ»ù´¡µÄÓ²¼þϵͳ½ôÃÜÅäºÏ¡£²Ù×÷ϵͳÐèҪʹÓÃһЩֻÓÐÓ²¼þ²ÅÄÜÌṩµÄ¹¦ÄÜ¡£ÎªÁËÍêÕûµÄÁ˽â Linux £¬ÄãÐèÒªÁ˽âµ×²ãÓ²¼þµÄ»ù´¡ÖªÊ¶¡£±¾Õ¶ÔÓÚÏÖ´ú PC µÄÓ²¼þ½øÐÐÁË¡£

    1975 Äê 1 Ô¡° Popular Electronics ¡±ÔÓÖ¾·âÃæÉÏÓ¡³öÁË Altair 8080 µÄͼƬ£¬Ò»³¡¸ïÃü¿ªÊ¼ÁË¡£ Altair 8080 £¬¸úËæÔçÆÚµÄ¡° Star Trek epsode ¡±ÃüÃû£¬Ö»ÐèÒª $397 £¬¾Í¿ÉÓɸöÈ˵ç×Ó°®ºÃÕß×Ô¼º×é×°¡£ËüÓµÓÐ Intel 8080 ´¦ÀíÆ÷ºÍ 256 ×Ö½ÚÄڴ棬µ«ÊÇûÓÐÆÁÄ»ºÍ¼üÅÌ¡£ÒÔ½ñÌìµÄ±ê×¼À´ºâÁ¿£¬ËüÌ«¼òªÁË¡£ËüµÄ·¢Ã÷Õߣ¬ Ed Roberts £¬ÖÆÔìÁËÃû´Ê¡° personal computer ¡°À´ÃüÃûËûµÄ·¢Ã÷£¬µ«ÏÖÔÚ£¬ PC Õâ¸öÃû´ÊÒѾ­ÓÃÀ´ÃüÃû¼¸ºõËùÓÐÄã¿ÉÒÔ²»ÒÀ¿¿°ïÖú¾Í¿ÉÒÔ×Ô¼ºÔËÐÐÆðÀ´µÄ¼ÆËã»ú¡£ÓÃÕâ¸ö¶¨Ò壬ÉõÖÁһЩʮ·ÖÇ¿´óµÄ Alpha AXP ϵͳҲÊÇ PC ¡£

    °®ºÃÕßÃÇ¿´µ½ÁË Altair µÄDZÁ¦£¬¿ªÊ¼ÎªËüдÈí¼þ£¬ÖÆÔìÓ²¼þ¡£¶ÔÓÚÕâЩÔçÆÚµÄÏÈÇýÀ´½²£¬Ëü´ú±í×Å×ÔÓÉ£º´Ó±»ÉñÖ°ÈËÔ±¿ØÖƺÍÔËÐеĴóÐÍÅú´¦ÀíµÄÖ÷»úϵͳÖÐÌÓÍѳöÀ´µÄ×ÔÓÉ¡£Äã¿ÉÒÔÔÚ×Ô¼º¼ÒÀïÉõÖÁ³ø×ÀÉÏÓµÓмÆËã»ú£¬ÕâʹѧԺµÄÍËѧÉúΪ´Ë×ÅÃÔ²¢Í¨Ïü´ïµ©¡£Óë´Ëͬʱ³öÏÖ´óÁ¿Ó²¼þ£¬ÔÚÒ»¶¨³Ì¶ÈÉϸ÷×Ô²»Í¬£¬¶øÈí¼þר¼ÒÔòÀÖÓÚΪÕâЩлúÆ÷׫дÈí¼þ¡£Óзí´ÌÒâζµÄÊÇ£¬ IBM ÔÚ 1981 Äê·¢²¼ÁË IBM PC ²¢ÓÚ 1982 ÄêÔçÆÚ¹©»õ£¬´Ó´Ë¶¨ÒåÁËÏÖ´ú PC µÄÄ£ÐÍ¡£ËüÓµÓÐ Intel 8088 ´¦ÀíÆ÷£¬ 64K Äڴ棨¿ÉÒÔÀ©³äµ½ 256K £©£¬Á½¸öÈíÇýºÍÒ»¸ö 80x25 µÄ²Êɫͼ¿¨ (CGA) £¬ÓýñÌìµÄ±ê×¼ºâÁ¿£¬Ëü¹¦Äܲ»ËãºÜÇ¿£¬µ«ÊÇËüÏúÊ۵IJ»´í¡£ 1983 Ä꣬½ô½Ó×ÅÍÆ³öµÄ IBM PC-XT £¬ÔòÓµÓÐÒ»¸öºÀ»ªµÄ 10M Ó²ÅÌ¡£²»¾Ã´óÅú¹«Ë¾Èç Compaq ¿ªÊ¼ÖÆÔì IBM PC µÄ¸´ÖÆÆ·£¬ PC µÄ½á¹¹³ÉΪÁËÊÂʵµÄ±ê×¼¡£Õâ¸öÊÂʵµÄ±ê׼ʹ´óÅúÓ²¼þ¹«Ë¾¿ÉÒÔÔÚÕâ¸ö²»¶ÏÔö³¤µÄÊг¡ÉÏÒ»Æð¾ºÕù£¬·´¹ýÀ´£¬¿ÉÒÔ¶ôÖÆ¼Û¸ñ£¬ÈÃÓû§ÂúÒâ¡£ÏÖ´ú PC ³ÐÏ®ÁËÔçÆÚ PC µÄÐí¶àϵͳÌåÏµÌØÕ÷¡£ÉõÖÁ»ùÓÚ×îÇ¿´óµÄ Intel Pentium Pro µÄϵͳҲ¿ÉÒÔÔËÐÐ Intel 8086 µÄѰַģʽ¡£µ± Linus Torvalds ¿ªÊ¼¿ª·¢ºóÀ´µÄ Linux ʱ£¬ËûÑ¡ÔñÁ˵±Ê±×î³£¼ûºÍ¼Û¸ñ×îºÏÀíµÄÓ²¼þƽ̨£ºÒ»Ì¨ Intel 80386 PC ¡£

    ´Ó PC µÄÍâÃæ¿´£¬×îÃ÷ÏԵIJ¿¼þ¾ÍÊÇ»úÏä¡¢¼üÅÌ¡¢Êó±êºÍÏÔʾÆ÷¡£ÔÚ»úÏäµÄÇ°ÃæÓÐһЩ°´Å¥£¬Ò»¸öСÆÁÄ»ÏÔʾһЩÊý×Ö£¬»¹ÓÐÒ»¸öÈíÇý¡£ÏÖÔڵĴó¶àÊýϵͳ»¹ÓÐÒ»¸ö CD-ROM ÆÚ¡¢Çý¶¯Æ÷¡£Èç¹ûÄãÐèÒª±£»¤ÄãµÄÊý¾Ý£¬ÄÇô»¹»áÓÐÒ»¸ö±¸·ÝÓõĴŴø»ú¡£ÕâЩÉ豸һÂɱ»¿´×÷ÍâÉè¡£

    ËäÈ» CPU ¹ÜÀíÕû¸öϵͳ£¬µ«Ëü²¢²»ÊÇΨһµÄÖÇÄÜÉ豸¡£ËùÓеÄÍâÉè¿ØÖÆÆ÷£¬ÀýÈç IDE ¿ØÖÆÆ÷£¬Ò²¶¼ÓµÓÐÒ»¶¨³Ì¶ÈµÄÖÇÄÜ¡£ÔÚ PC ÄÚ²¿£¨Í¼ 1.1 £©£¬Äã¿ÉÒÔ¿´µ½Ò»¸öÖ÷°å£¬°üÀ¨ CPU »ò΢´¦ÀíÆ÷¡¢ÄÚ´æºÍһЩ ISA »ò PCI ÍâÉè¿ØÖÆ¿¨µÄ²Ûλ¡£ÆäÖÐһЩ¿ØÖÆÆ÷£¬Èç IDE ´ÅÅÌ¿ØÖÆÆ÷¿ÉÄÜÄÚÖÃÔÚϵͳÖ÷°åÉÏ¡£ ¡¡

CPU

    CPU£¬»òÕß˵΢´¦ÀíÆ÷£¬ÊÇËùÓмÆËã»úϵͳµÄÐÄÔࡣ΢´¦ÀíÆ÷½øÐÐÊýѧÔËË㣬Âß¼­²Ù×÷²¢´ÓÄÚ´æÖжÁȡָÁî²¢Ö´ÐÐÖ¸Á½ø¶ø¿ØÖÆÊý¾ÝÁ÷Ïò¡£¼ÆËã»ú·¢Õ¹µÄÔçÆÚ£¬Î¢´¦ÀíÆ÷µÄ¸÷ÖÖ¹¦ÄÜÄ£¿éÊÇÓÉÏ໥·ÖÀ루²¢ÇҳߴçÉÏÊ®·Ö¾Þ´ó£©µÄµ¥Ôª¹¹³É¡£ÕâÒ²ÊÇÃû´Ê¡°ÖÐÑë´¦Àíµ¥Ôª¡±µÄÆðÔ´¡£ÏÖ´úµÄ΢´¦ÀíÆ÷½«ÕâЩ¹¦ÄÜÄ£¿é¼¯ÖÐÔÚÒ»¿é·Ç³£Ð¡µÄ¹è¾§Æ¬ÖÆÔìµÄ¼¯³Éµç·ÉÏ¡£ÔÚ±¾Ê飬Ãû´Ê CPU ¡¢Î¢´¦ÀíÆ÷ºÍ´¦ÀíÆ÷½»ÌæÊ¹Óá£

    ΢´¦ÀíÆ÷´¦Àí¶þ½øÖÆÊý¾Ý£ºÕâЩÊý¾ÝÓÉ 1 ºÍ 0 ×é³É¡£ÕâЩ 1 ºÍ 0 ¶ÔÓ¦µçÆø¿ª¹ØµÄ¿ª»ò¹Ø¡£¾ÍºÃÏñ 42 ´ú±í 4 ¸ö 10 ºÍ 2 ¸öµ¥Ôª£¬¶þ½øÖÆÊý×ÖÓÉһϵÁдú±í 2 µÄÃÝÊýµÄÊý×Ö×é³É¡£ÕâÀÃÝÊýÒâζ×ÅÒ»¸öÊý×ÖÓÃ×ÔÉíÏà³ËµÄ´ÎÊý¡£ 10 µÄÒ»´ÎÃÝÊÇ 10 £¬ 10 µÄ 2 ´ÎÃÝÊÇ 10x10 £¬ 10 µÄ 3 ´ÎÃÝÊÇ 10x10x10 £¬ÒÀ´ËÀàÍÆ¡£¶þ½øÖÆ 0001 ÊÇÊ®½øÖÆ 1 £¬¶þ½øÖÆÊý 0010 ÊÇÊ®½øÖÆ 2 £¬¶þ½øÖÆ 0011 ÊÇÊ®½øÖÆ 3 £¬¶þ½øÖÆ 0100 ÊÇÊ®½øÖÆ 4 £¬µÈµÈ¡£ËùÒÔ£¬Ê®½øÖÆ 42 ÊǶþ½øÖÆ 101010 »òÕߣ¨ 2+8+32 »ò 21+23+25 £©¡£ÔÚ¼ÆËã»ú³ÌÐò³ýÁËʹÓöþ½øÖƱíʾÊý×ÖÖ®Í⣬ÁíÒ»ÖÖ»ùÊý£¬ 16 ½øÖÆ£¬Ò²¾­³£Óõ½¡£ÔÚÕâÖÖ½øÖÆÖУ¬Ã¿Ò»Î»Êý×Ö±íʾ 16 µÄÃÝÊý¡£ÒòΪʮ½øÖÆÊý×ÖÖ»ÊÇ´Ó 0 µ½ 9 £¬ÔÚÊ®Áù½øÖÆÖÐ 10 µ½ 15 ·Ö±ðÓÃ×Öĸ A £¬ B £¬ C £¬ D £¬ E £¬ F ±íʾ¡£ÀýÈ磬ʮÁù½øÖÆµÄ E ÊÇÊ®½øÖÆµÄ 14 £¬¶øÊ®Áù½øÖÆµÄ 2A ÊÇÊ®½øÖÆµÄ 42 £¨ 2 ¸ö 16+10 £©¡£Óà C ÓïÑԵıíʾ·¨£¨±¾ÊéһֱʹÓã©£¬Ê®Áù½øÖÆÊý×ÖʹÓÃǰ׺¡° 0x ¡±£ºÊ®Áù½øÖÆµÄ 2A д×ö 0x2A ¡£

 

    ΢´¦ÀíÆ÷¿ÉÒÔÖ´ÐÐËãÊõÔËËãÈç¼Ó¡¢³ËºÍ³ý£¬Ò²¿ÉÒÔÖ´ÐÐÂß¼­²Ù×÷ÀýÈç¡° X ÊÇ·ñ´óÓÚ Y ¡±¡£

    ´¦ÀíÆ÷µÄÖ´ÐÐÓÉÍⲿʱÖÓ¿ØÖÆ¡£Õâ¸öʱÖÓ£¬¼´ÏµÍ³Ê±ÖÓ£¬¶Ô´¦ÀíÆ÷²úÉúÎȶ¨µÄʱÖÓÂö³å£¬ÔÚÿһ¸öʱÖÓÂö³åÀ´¦ÀíÆ÷Ö´ÐÐһЩ¹¤×÷¡£ÀýÈ磬´¦ÀíÆ÷¿ÉÒÔÔÚÿһ¸öʱÖÓÂö³åÀïÖ´ÐÐÒ»ÌõÖ¸Áî¡£´¦ÀíÆ÷µÄËÙ¶ÈÓÃϵͳʱÖӵįµÂÊÀ´ÃèÊö¡£Ò»¸ö 100Mhz µÄ´¦ÀíÆ÷ÿÃëÖÓ½ÓÊܵ½ 100 £¬ 000 £¬ 000 ´ÎʱÖÓÂö³å¡£ÓÃʱÖÓÆµÂÊÀ´ÃèÊö CPU µÄÄÜÁ¦ÊÇÒ»ÖÖÎó½â£¬ÒòΪ²»Í¬µÄ´¦ÀíÆ÷ÔÚÿһ´ÎʱÖÓÂö³åÖÐÖ´ÐеŤ×÷Á¿²»Í¬¡£ËäÈ»Èç´Ë£¬Èç¹ûËùÓеÄÌõ¼þͬµÈ£¬Ô½¿ìµÄʱÖÓÆµÂʱíʾ´¦ÀíÆ÷µÄÄÜÁ¦Ô½Ç¿¡£´¦ÀíÆ÷Ö´ÐеÄÖ¸Áî·Ç³£¼òµ¥£¬ÀýÈ磺¡°°ÑÄÚ´æÎ»Öà X µÄÄÚÈݶÁµ½¼Ä´æÆ÷ Y ÖС°¡£¼Ä´æÆ÷ÊÇ΢´¦ÀíÆ÷µÄÄÚ²¿´æ´¢¿Õ¼ä£¬ÓÃÀ´´æ´¢Êý¾Ý²¢½øÐвÙ×÷¡£Ö´ÐеIJÙ×÷¿ÉÄÜʹ´¦ÀíÆ÷Í£Ö¹µ±Ç°²Ù×÷¶ø×ªÈ¥Ö´ÐÐÄÚ´æÖÐÆäËûµØ·½µÄÖ¸Áî¡£ÕýÊÇÕâЩ΢СµÄÖ¸ÁºÏÔÚÒ»Æð£¬¸³ÓèÏÖ´úµÄ΢´¦ÀíÆ÷¼¸ºõÎÞÏÞµÄÄÜÁ¦£¬ÒòΪËüÿÃë¿ÉÒÔÖ´ÐÐÊý°ÙÍòÉõÖÁÊýÊ®ÒÚµÄÖ¸Áî¡£

    Ö´ÐÐÖ¸Áîʱ±ØÐë´ÓÄÚ´æÖÐÌáȡָÁָÁî×ÔÉíÒ²¿ÉÄÜÒýÓÃÄÚ´æÖеÄÊý¾Ý£¬ÕâЩÊý¾ÝÒ²±ØÐëÌáÈ¡µ½ÄÚ´æÖв¢ÔÚÐèÒªµÄʱºò±£´æµ½ÄÚ´æÖÐÈ¥¡£

    Ò»¸ö΢´¦ÀíÆ÷ÄÚ²¿¼Ä´æÆ÷µÄ´óС¡¢ÊýÁ¿ºÍÀàÐÍÍêÈ«¾ö¶¨ÓÚËüµÄÀàÐÍ¡£Ò»¸ö Intel 80486 ´¦ÀíÆ÷ºÍÒ»¸ö Alpha AXP ´¦ÀíÆ÷µÄ¼Ä´æÆ÷×éÍêÈ«²»Í¬¡£ÁíÍ⣬ Intel ÊÇ 32 λ¿í¶ø Alpha AXP ÊÇ 64 λ¿í¡£µ«ÊÇ£¬Ò»°ãÀ´½²£¬ËùÓÐÌØ¶¨µÄ´¦ÀíÆ÷¶¼»áÓÐһЩͨÓÃÄ¿µÄµÄ¼Ä´æÆ÷ºÍÉÙÁ¿×¨ÓõļĴæÆ÷¡£´ó¶àÊý´¦ÀíÆ÷ÓµÓÐÒÔÏÂÌØÊâÓÃ;µÄרÓõļĴæÆ÷£º

Program Counter £¨ PC £©³ÌÐò¼ÆÊýÆ÷

    Õâ¸ö¼Ä´æÆ÷¼Ç¼ÁËÏÂÒ»ÌõÒªÖ´ÐеÄÖ¸ÁîµÄµØÖ·¡£ PC µÄÄÚÈÝÔÚÿ´ÎȡָÁîµÄʱºò×Ô¶¯Ôö¼Ó¡£

Stack Pointer £¨ SP £©¶ÑÕ»Ö¸Õë

    ´¦ÀíÆ÷±ØÐëÄܹ»´æÈ¡ÓÃÓÚÁÙʱ´æ´¢Êý¾ÝµÄ´óÈÝÁ¿µÄÍⲿ¶ÁÐ´Ëæ»ú´æÈ¡Äڴ棨 RAM £©¡£¶ÑÕ»ÊÇÒ»ÖÖÓÃÓÚÔÚÍⲿÄÚ´æÖдæ·ÅºÍ»Ö¸´ÁÙʱÊý¾ÝµÄ·½·¨¡£Í¨³££¬´¦ÀíÆ÷ÌṩÁËÌØÊâµÄÖ¸ÁîÓÃÓÚ½«Êý¾ÝѹÔÚ¶ÑÕ»ÖУ¬²¢ÔÚÒÔºóÐèÒªÊÇÈ¡³öÀ´¡£¶ÑջʹÓà LIFO £¨ºó½øÏȳö£©µÄ·½Ê½¡£»»¾ä»°Ëµ£¬Èç¹ûÄãѹÈëÁ½¸öÖµ x ºÍ y µ½¶ÑÕ»ÖУ¬È»ºó´Ó¶ÑÕ»Öе¯³öÒ»¸öÖµ£¬ÄÇôÄã»áµÃµ½ y µÄÖµ¡£

    һЩ´¦ÀíÆ÷µÄ¶ÑÕ»ÏòÄÚ´æ¶¥²¿Ôö³¤£¬¶øÁíһЩÏòÄÚ´æµÄµ×²¿Ôö³¤¡£»¹ÓÐһЩ´¦ÀíÆ÷Á½ÖÖ·½Ê½¶¼¿ÉÒÔÖ§³Ö£¬ÀýÈ磺 ARM ¡£

Processor Status £¨ PS £©

    Ö¸Áî¿ÉÄܲúÉú½á¹û¡£ÀýÈ磺¡° X ¼Ä´æÆ÷µÄÄÚÈÝÊÇ·ñ´óÓÚ Y ¼Ä´æÆ÷µÄÄÚÈÝ£¿¡°¿ÉÄܲúÉúÕæ»ò¼ÙµÄ½á¹û¡£ PS ¼Ä´æÆ÷±£ÁôÕâЩ½á¹ûÒÔ¼°´¦ÀíÆ÷µ±Ç°×´Ì¬µÄÆäËûÐÅÏ¢¡£¶àÊý´¦ÀíÆ÷ÖÁÉÙÓÐÁ½ÖÖģʽ£º kernel £¨ºËÐÄ̬£©ºÍ user £¨Óû§Ì¬£©£¬ PS ¼Ä´æÆ÷»á¼Í¼Äܹ»È·¶¨µ±Ç°Ä£Ê½µÄÄÇЩÐÅÏ¢¡£

Memory( ÄÚ´æ )

    ËùÓÐϵͳ¶¼¾ßÓзּ¶µÄÄÚ´æ½á¹¹£¬ÓÉλÓÚ²»Í¬¼¶±ðµÄËٶȺÍÈÝÁ¿²»Í¬µÄÄÚ´æ×é³É¡£

    ×î¿ìµÄÄÚ´æÊǸßËÙ»º´æ´æ´¢Æ÷£¬¾ÍÏóËüµÄÃû×Ö°µÊ¾µÄÒ»Ñù - ÓÃÓÚÁÙʱ´æ·Å»ò»º´æÖ÷ÄÚ´æµÄÄÚÈÝ¡£ÕâÖÖÄÚ´æ·Ç³£¿ìµ«ÊDZȽϰº¹ó£¬Òò´Ë¶àÊý´¦ÀíÆ÷оƬÉÏÄÚÖÃÓÐÉÙÁ¿µÄ¸ßËÙ»º³å´æ´¢Æ÷£¬¶ø´ó¶àÊý¸ßËÙ»º´æ´æ´¢Æ÷·ÅÔÚϵͳÖ÷°åÉÏ¡£Ò»Ð©´¦ÀíÆ÷ÓÃÒ»¿é»º´æÄÚ´æÍ¬Ê±»º´æÖ¸ÁîºÍÊý¾Ý£¬¶øÁíһЩ´¦ÀíÆ÷ÓÐÁ½¿é»º´æÄÚ´æ - Ò»¸öÓÃÓÚÖ¸ÁÁíÒ»¸öÓÃÓÚÊý¾Ý¡£ Alpha AXP ´¦ÀíÆ÷ÓÐÁ½¸öÄÚÖõÄÄÚ´æ¸ßËÙ»º´æ´æ´¢Æ÷£ºÒ»¸öÓÃÓÚÊý¾Ý£¨ D-Cache £©£¬ÁíÒ»¸öÓÃÓÚÖ¸Á I-Cache £©¡£ËüµÄÍⲿ¸ßËÙ»º³å´æ´¢Æ÷£¨»ò B-Cache £©½«Á½Õß»ìÔÚÒ»Æð¡£

    ×îºóÒ»ÖÖÄÚ´æÊÇÖ÷ÄÚ´æ¡£Ïà¶ÔÓÚÍⲿ¸ßËÙ»º´æ´æ´¢Æ÷¶øÑÔËٶȷdz£Âý£¬¶ÔÓÚ CPU ÄÚÖõĸßËÙ»º´æ´æ´¢Æ÷£¬Ö÷ÄÚ´æ¼òÖ±ÊÇÔÚÅÀ¡£

    ¸ßËÙ»º´æ´æ´¢Æ÷ºÍÖ÷ÄÚ´æ±ØÐë±£³Öͬ²½£¨Ò»Ö£©¡£»»¾ä»°Ëµ£¬Èç¹ûÖ÷ÄÚ´æÖеÄÒ»¸ö×Ö±£´æÔÚ¸ßËÙ»º´æ´æ´¢Æ÷µÄÒ»¸ö»ò¶à¸öλÖã¬ÄÇôϵͳ±ØÐë±£Ö¤¸ßËÙ»º´æ´æ´¢Æ÷ºÍÖ÷ÄÚ´æµÄÄÚÈÝÒ»Ñù¡£Ê¹¸ßËÙ»º³å´æ´¢Æ÷ͬ²½µÄ¹¤×÷Ò»²¿·ÖÊÇÓÉÓ²¼þÍê³É£¬ÁíÒ»²¿·ÖÔòÊÇÓɲÙ×÷ϵͳÍê³ÉµÄ¡£¶ÔÓÚÆäËüһЩϵͳµÄÖ÷ÒªÈÎÎñ£¬Ó²¼þºÍÈí¼þÒ²±ØÐë½ôÃÜÅäºÏ¡£

Buses £¨×ÜÏߣ©

    ϵͳ°åµÄ¸÷¸ö×é³É²¿·ÖÓɱ»³ÆÎª×ÜÏßµÄÁ¬½Óϵͳ»¥Á¬ÔÚÒ»Æð¡£ÏµÍ³×ÜÏß·ÖΪÈýÖÖÂß¼­¹¦ÄÜ£ºµØÖ·×ÜÏß¡¢Êý¾Ý×ÜÏߺͿØÖÆ×ÜÏß¡£µØÖ·×ÜÏßÖ¸¶¨ÁËÊý¾Ý´«ÊäµÄÄÚ´æÎ»Ö㨵ØÖ·£©£¬Êý¾Ý×ÜÏß±£´æÁË´«ÊäµÄÊý¾Ý¡£Êý¾Ý×ÜÏßÊÇË«ÏòµÄ£¬ËüÔÊÐí CPU ¶ÁÈ¡£¬Ò²ÔÊÐí CPU д¡£¿ØÖÆ×ÜÏß°üº¬Á˸÷ÖÖÐźÅÏßÓÃÓÚÔÚϵͳÖз¢ËÍʱÖӺͿØÖÆÐźš£ÓÐÐí¶àÖÖ²»Í¬µÄ×ÜÏßÀàÐÍ£¬ ISA ºÍ PCI ×ÜÏßÊÇϵͳÓÃÓÚÁ¬½ÓÍâÉèµÄ³£Ó÷½Ê½¡£

Controllers and Peripherals £¨¿ØÖÆÆ÷ºÍÍâÉ裩
    ÍâÉèָʵÔÚµÄÉ豸£¬ÈçÓÉϵͳ°å»òϵͳ°å²å¿¨ÉϵĿØÖÆÐ¾Æ¬Ëù¿ØÖƵÄͼÐ層ò´ÅÅÌ¡£ IDE ¿ØÖÆÐ¾Æ¬¿ØÖÆ IDE ´ÅÅÌ£¬¶ø SCSI ¿ØÖÆÐ¾Æ¬¿ØÖÆ SCSI ´ÅÅÌ¡£ÕâЩ¿ØÖÆÆ÷ͨ¹ý²»Í¬µÄ×ÜÏßÁ¬½Óµ½ CPU ²¢Ï໥Á¬½Ó¡£ÏÖÔÚÖÆÔìµÄ´ó¶àÊýϵͳ¶¼ÊÇÓà PCI »ò ISA ×ÜÏß½«ÏµÍ³µÄÖ÷Òª²¿¼þÁ¬½ÓÔÚÒ»Æð¡£¿ØÖÆÆ÷±¾ÉíÒ²ÊÇÏó CPU Ò»ÑùµÄ´¦ÀíÆ÷£¬ËüÃÇ¿ÉÒÔ¿´×÷ CPU µÄÖÇÄÜÖúÊÖ£¬ CPU ÓµÓÐϵͳµÄ×î¸ß¿ØÖÆÈ¨¡£

    ËùÓеĿØÖÆÆ÷¶¼ÊDz»Í¬µÄ£¬µ«ÊÇͨ³£ËüÃǶ¼ÓÐÓÃÓÚ¿ØÖÆËüÃǵļĴæÆ÷¡£ CPU ÉÏÔËÐеÄÈí¼þ±ØÐëÄܹ»¶ÁдÕâЩ¿ØÖƼĴæÆ÷¡£Ò»¸ö¼Ä´æÆ÷¿ÉÄܰüº¬ÃèÊö´íÎóµÄ״̬Â룬ÁíÒ»¸ö¼Ä´æÆ÷¿ÉÄÜÓÃÓÚ¿ØÖÆÓÃ;£¬¸Ä±ä¿ØÖÆÆ÷µÄģʽ¡£Ò»¸ö×ÜÏßÉϵÄÿһ¸ö¿ØÖÆÆ÷¶¼¿ÉÒԷֱ𱻠CPU Ѱַ£¬ÕâÑùÈí¼þÉ豸Çý¶¯³ÌÐò¾Í¿ÉÒÔ¶ÁдËüµÄ¼Ä´æÆ÷½ø¶ø¿ØÖÆËü¡£ IDE µçÀÂÊÇÒ»¸öºÃÀý×Ó£¬Ëü¸øÁËÄã·Ö±ð´æÈ¡×ÜÏßÉÏÿһ¸öÇý¶¯Æ÷µÄÄÜÁ¦¡£ÁíÒ»¸öºÃÀý×ÓÊÇ PCI ×ÜÏߣ¬ÔÊÐíÿһ¸öÉ豸£¨ÈçͼÐ﨣©±»¶ÀÁ¢´æÈ¡¡£

Address Spaces £¨Ñ°Ö·¿Õ¼ä£©
    Á¬½Ó CPU ºÍÖ÷ÄÚ´æµÄϵͳ×ÜÏßÒÔ¼°Á¬½Ó CPU ºÍϵͳӲ¼þÍâÉèµÄ×ÜÏßÊÇ·ÖÀëµÄ¡£Ó²¼þÍâÉèËùÓµÓеÄÄÚ´æ¿Õ¼ä³ÆÎª I/O ¿Õ¼ä¡£ I/O ¿Õ¼ä±¾Éí¿ÉÒÔÔÙ½øÒ»²½»®·Ö£¬µ«ÊÇÎÒÃÇÏÖÔÚÏȲ»ÌÖÂÛ¡£ CPU ¿ÉÒÔ·ÃÎÊϵͳÄÚ´æ¿Õ¼äºÍ I/O ¿Õ¼ä£¬¶ø¿ØÖÆÆ÷Ö»ÄÜͨ¹ý CPU ¼ä½Ó·ÃÎÊϵͳÄÚ´æ¡£´ÓÉ豸µÄ½Ç¶ÈÀ´¿´£¬±ÈÈçÈíÇý¿ØÖÆÆ÷£¬ËüÖ»ÄÜ¿´µ½ËüµÄ¿ØÖƼĴæÆ÷ËùÔڵĵØÖ·¿Õ¼ä£¨ ISA £©£¬¶ø·ÇϵͳÄÚ´æ¡£Ò»¸ö CPU Óò»Í¬µÄÖ¸ÁîÈ¥·ÃÎÊÄÚ´æºÍ I/O ¿Õ¼ä¡£ÀýÈ磬¿ÉÄÜÓÐÒ»ÌõÖ¸ÁîÊÇ¡°´Ó I/O µØÖ· 0x3f0 ¶Áȡһ¸ö×Ö½Úµ½ X ¼Ä´æÆ÷¡°¡£ÕâÒ²ÊÇ CPU ͨ¹ý¶ÁдϵͳӲ¼þÍâÉè´¦ÓÚ I/O µØÖ·¿Õ¼äµÄ¼Ä´æÆ÷´Ó¶ø¿ØÖÆÍâÉèµÄ·½·¨¡£ÔÚµØÖ·¿Õ¼äÖУ¬ÆÕͨÍâÉ裨Èç IDE ¿ØÖÆÆ÷£¬´®Ðж˿ڣ¬ÈíÇý¿ØÖÆÆ÷µÈµÈ£©µÄ¼Ä´æÆ÷ÔÚ PC ÍâÉèµÄ¶àÄê·¢Õ¹ÖÐÒѾ­³ÉÁ˶¨Àý¡£ I/O ¿Õ¼äµÄµØÖ· 0x3f0 ÕýÊÇ´®Ðпڣ¨ COM1 £©µÄ¿ØÖƼĴæÆ÷µÄµØÖ·¡£

    ÓÐʱ¿ØÖÆÆ÷ÐèÒªÖ±½Ó´ÓϵͳÄÚ´æ¶ÁÈ¡´óÁ¿Äڴ棬»òÖ±½Óд´óÁ¿Êý¾Ýµ½ÏµÍ³ÄÚ´æÖÐÈ¥¡£±ÈÈ罫Óû§Êý¾Ýдµ½Ó²ÅÌÉÏÈ¥¡£ÔÚÕâÖÖÇé¿öÏ£¬Ê¹ÓÃÖ±½ÓÄÚ´æ´æÈ¡£¨ DMA £©¿ØÖÆÆ÷£¬ÔÊÐíÓ²¼þÉ豸ֱ½Ó´æÈ¡ÏµÍ³Äڴ棬µ±È»£¬ÕâÖÖ´æÈ¡±ØÐëÔÚ CPU µÄÑϸñ¿ØÖƺͼà¹ÜϽøÐС£

Timer( ʱÖÓ )

    ËùÓвÙ×÷ϵͳÐèÒªÖªµÀʱ¼ä£¬ÏÖ´ú PC °üÀ¨Ò»¸öÌØÊâµÄÍâÉ裬½Ð×öʵʱʱÖÓ£¨ RTC £©¡£ËüÌṩÁËÁ½Ñù¶«Î÷£º¿É¿¿µÄÈÕÆÚºÍ¾«È·µÄʱ¼ä¼ä¸ô¡£ RTC ÓÐ×Ô¼ºµÄµç³Ø£¬ËùÒÔ¼´Ê¹ PC ûÓмӵ磬ËüÈÔÔÚÔËÐС£ÕâÒ²ÊÇΪʲô PC ×ÜÊÇ¡°ÖªµÀ¡±ÕýÈ·µÄÈÕÆÚºÍʱ¼ä¡£Ê±¼ä¼ä¸ô¼ÆÊ±ÔÊÐí²Ù×÷ϵͳ¾«È·µØµ÷¶È»ù±¾¹¤×÷¡£


 

[ÏÂÒ»Ò³]


Chapter 2

Software Basic( Èí¼þ»ù´¡ )

    ³ÌÐòÊÇÓÃÓÚÖ´ÐÐÌØ¶¨ÈÎÎñµÄ¼ÆËã»úÖ¸Áî×éºÏ¡£³ÌÐò¿ÉÒÔÓûã±àÓïÑÔ£¬Ò»Öַdz£µÍ¼¶µÄ¼ÆËã»úÓïÑÔÀ´±àд£¬Ò²¿ÉÒÔʹÓúͻúÆ÷Î޹صĸ߼¶ÓïÑÔ£¬±ÈÈç C ÓïÑÔ±àд¡£²Ù×÷ϵͳÊÇÒ»¸öÌØÊâµÄ³ÌÐò£¬ÔÊÐíÓû§Í¨¹ýËüÔËÐÐÓ¦ÓóÌÐò£¬±ÈÈçµç×Ó±íºÍÎÄ×Ö´¦ÀíµÈµÈ¡£±¾Õ½éÉÜÁË»ù±¾µÄ±à³ÌÔ­Àí£¬²¢¼ò½é²Ù×÷ϵͳµÄÄ¿µÄºÍ¹¦ÄÜ¡£

2.1 Computer Languages( ¼ÆËã»úÓïÑÔ )

2.1.1. »ã±àÓïÑÔ

    CPU ´ÓÄÚ´æÖжÁÈ¡ºÍÖ´ÐеÄÖ¸Áî¶ÔÓÚÈËÀàÀ´½²ÎÞ·¨Àí½â¡£ËüÃÇÊÇ»úÆ÷´úÂ룬¾«È·µÄ¸æËß¼ÆËã»úÒª×öʲô¡£±ÈÈçÊ®Áù½øÖÆÊý 0x89E5 £¬ÊÇ Intel 80486 µÄÖ¸Á½«¼Ä´æÆ÷ ESP µÄÄÚÈÝ¿½±´µ½¼Ä´æÆ÷ EBP ÖС£ÔçÆÚ¼ÆËã»úÖÐ×î³õµÄÈí¼þ¹¤¾ßÖ®Ò»ÊÇ»ã±à³ÌÐò£¬Ëü¶ÁÈëÈËÀà¿ÉÒÔÔĶÁµÄÔ´Îļþ£¬½«Æä×°Åä³É»úÆ÷´úÂë¡£»ã±àÓïÑÔÃ÷È·µØ´¦Àí¶Ô¼Ä´æÆ÷ºÍ¶ÔÊý¾ÝµÄ²Ù×÷£¬¶øÕâÖÖ²Ù×÷¶ÔÓÚÌØ¶¨µÄ΢´¦ÀíÆ÷¶øÑÔÊÇÌØÊâµÄ¡£ Intel X86 ΢´¦ÀíÆ÷µÄ»ã±àÓïÑÔºÍ Alpha AXP ΢´¦ÀíÆ÷µÄ»ã±àÓïÑÔÍêÈ«²»Í¬¡£ÒÔÏ Alpha AXP »ã±à´úÂëÑÝʾÁ˳ÌÐò¿ÉÒÔÖ´ÐеIJÙ×÷ÀàÐÍ£º

Ldr r16, (r15) ; µÚÒ»ÐÐ

Ldr r17, 4(r15) ; µÚ¶þÐÐ

Beq r16,r17,100; µÚÈýÐÐ

Str r17, (r15); µÚËÄÐÐ

100: ; µÚÎåÐÐ

    µÚÒ»ÌõÓï¾ä£¨µÚÒ»ÐУ©½«¼Ä´æÆ÷ 15 Ö¸¶¨µÄµØÖ·ÖеÄÄÚÈݼÓÔØµ½¼Ä´æÆ÷ 16 ÖС£µÚ¶þÌõÖ¸Á½ô½Ó×ŵÄÄÚ´æÖеÄÄÚÈݼÓÔØµ½¼Ä´æÆ÷ 17 ÖС£µÚÈýÐбȽϼĴæÆ÷ 16 ºÍ¼Ä´æÆ÷ 17 £¬Èç¹ûÏàµÈ£¬·ÖÖ§µ½±êºÅ 100 £¬·ñÔò£¬¼ÌÐøÖ´ÐеÚËÄÐУ¬½«¼Ä´æÆ÷ 17 µÄÄÚÈÝ´æµ½ÄÚ´æÖС£Èç¹ûÄÚ´æÖеÄÊý¾ÝÏàͬ£¬¾Í²»±Ø´æ´¢Êý¾Ý¡£±àд»ã±à¼¶µÄ³ÌÐòÐèÒª¼¼ÇɶøÇÒÊ®·ÖÈß³¤£¬ÈÝÒ׳ö´í¡£ Linux ϵͳµÄºËÐĺÜÉÙµÄÒ»²¿·ÖÊÇÓûã±àÓïÑÔ±àд£¬¶øÕâЩ²¿·ÖÖ®ËùÒÔʹÓûã±àÓïÑÔÖ»ÊÇΪÁËÌá¸ßЧÂÊ£¬²¢ÇҺ;ßÌåµÄ΢´¦ÀíÆ÷Ïà¹Ø¡£

2.1.2 The C Programming Language and Compiler (C ÓïÑԺͱàÒëÆ÷ )

    ʹÓûã±àÓïÑÔ±àд´óÐͳÌÐòÊ®·ÖÀ§ÄÑ£¬ÏûºÄʱ¼ä£¬ÈÝÒ׳ö´í¶øÇÒÉú³ÉµÄ³ÌÐò²»ÄÜÒÆÖ²£¬Ö»ÄÜÊø¸¿ÔÚÌØ¶¨µÄ´¦ÀíÆ÷¼Ò×å¡£¸üºÃµÄÑ¡ÔñÊÇʹÓúͻúÆ÷Î޹صÄÓïÑÔ£¬ÀýÈç C ¡£ C ÔÊÐíÄãÓÃÂß¼­Ëã·¨ÃèÊö³ÌÐòºÍÒª´¦ÀíµÄÊý¾Ý¡£±»³ÆÎª±àÒë³ÌÐò£¨ compiler £©µÄÌØÊâ³ÌÐò¶ÁÈë C ³ÌÐò£¬²¢½«Ëüת»»Îª»ã±àÓïÑÔ£¬½ø¶ø²úÉú»úÆ÷Ïà¹ØµÄ´úÂë¡£ºÃµÄ±àÒëÆ÷Éú³ÉµÄ»ã±àÖ¸Áî¿ÉÒԺͺõĻã±à³ÌÐòÔ±±àдµÄ³ÌÐòЧÂʽӽü¡£´ó²¿·Ö Linux ºËÐÄÊÇÓà C ÓïÑÔ±àдµÄ¡£ÒÔÏ嵀 C Ƭ¶Ï£º

if (x != y)

x = y;

    Ö´ÐÐÁ˺ÍÇ°ÃæÊ¾ÀýÖлã±à´úÂëÍêȫһÑùµÄ²Ù×÷¡£Èç¹û±äÁ¿ x µÄÄÚÈݺͱäÁ¿ y µÄÄÚÈݲ»Ò»Ñù£¬±äÁ¿ y µÄÄÚÈݱ»¿½±´µ½±äÁ¿ x ¡£ C ´úÂëÓÃÀý³Ì£¨ routine £©½øÐÐ×éºÏ£¬Ã¿Ò»¸öÀý³ÌÖ´ÐÐÒ»ÏîÈÎÎñ¡£Àý³Ì¿ÉÒÔ·µ»Ø C ËùÖ§³ÖµÄÈÎÒâµÄÊýÖµ»òÊý¾ÝÀàÐÍ¡£´óÐͳÌÐò±ÈÈç Linux ºËÐÄ·Ö±ðÓÉÐí¶àµÄ C ÓïÑÔÄ£¿é×é³É£¬Ã¿Ò»¸öÄ£¿éÓÐ×Ô¼ºµÄÀý³ÌºÍÊý¾Ý½á¹¹¡£ÕâЩ C Ô´´úÂëÄ£¿é¹²Í¬¹¹³ÉÁËÂß¼­¹¦ÄܱÈÈçÎļþϵͳµÄ´¦Àí´úÂë¡£

   C Ö§³Ö¶àÖÖÀàÐ͵ıäÁ¿¡£Ò»¸ö±äÁ¿ÊÇÄÚ´æÖеÄÌØ¶¨Î»Ö㬿ÉÓ÷ûºÅÃûÒýÓá£ÉÏÊöµÄ C Ƭ¶ÏÖУ¬ x ºÍ y ÒýÓÃÁËÄÚ´æÖеÄλÖᣳÌÐòÔ±²»ÐèÒª¹ØÐıäÁ¿ÔÚÄÚ´æÖеľßÌåλÖã¬ÕâÊÇÁ¬½Ó³ÌÐò£¨ÏÂÊö£©±ØÐë´¦ÀíµÄ¡£Ò»Ð©±äÁ¿°üº¬²»Í¬µÄÊý¾ÝÀýÈçÕûÊý¡¢¸¡µãÊýµÈºÍÁíһЩÔò°üº¬Ö¸Õë¡£

    Ö¸ÕëÊǰüº¬ÆäËüÊý¾ÝÔÚÄÚ´æÖеĵØÖ·µÄ±äÁ¿¡£¼ÙÉèÒ»¸ö±äÁ¿ x £¬Î»ÓÚÄÚ´æµØÖ· 0x80010000 £¬ Äã¿ÉÄÜÓÐÒ»¸öÖ¸Õë px £¬Ö¸Ïò x ¡£ Px ¿ÉÄÜλÓÚµØÖ· 0x80010030 ¡£ Px µÄÖµÔòÊDZäÁ¿ x µÄµØÖ·£¬ 0x80010000 ¡£

C ÔÊÐíÄ㽫Ïà¹ØµÄ±äÁ¿¼¯ºÏ³ÉΪ½á¹¹¡£ÀýÈ磺

Struct {

Int I;

Char b;

} my_struct;

ÊÇÒ»¸ö½Ð×ö my_struct µÄÊý¾Ý½á¹¹£¬°üÀ¨Á½¸öÔªËØ£ºÒ»¸öÕûÊý£¨ 32 룩 I ºÍÒ»¸ö×Ö·û£¨ 8 λÊý¾Ý£© b ¡£

2.1.3 Linkers £¨Á¬½Ó³ÌÐò£©

    Á¬½Ó³ÌÐò½«¼¸¸öÄ¿±êÄ£¿éºÍ¿âÎļþÁ¬½ÓÔÚÒ»Æð³ÉΪһ¸öµ¥¶ÀµÄÍêÕû³ÌÐò¡£Ä¿±êÄ£¿éÊÇ»ã±à³ÌÐò»ò±àÒë³ÌÐòµÄ»úÆ÷ÂëÊä³ö£¬Ëü°üÀ¨»úÆ÷Âë¡¢Êý¾ÝºÍ¹©Á¬½Ó³ÌÐòʹÓõÄÁ¬½ÓÐÅÏ¢¡£±ÈÈ磺һ¸öÄ¿±êÄ£¿é¿ÉÄܰüÀ¨³ÌÐòµÄËùÓÐÊý¾Ý¿â¹¦ÄÜ£¬¶øÁíÒ»¸öÄ¿±êÄ£¿éÔò°üÀ¨´¦ÀíÃüÁîÐвÎÊýµÄº¯Êý¡£Á¬½Ó³ÌÐòÈ·¶¨Ä¿±êÄ£¿éÖ®¼äµÄÒýÓùØÏµ£¬¼´È·¶¨Ò»¸öÄ£¿éËùÒýÓõÄÀý³ÌºÍÊý¾ÝÔÚÁíÒ»¸öÄ£¿éÖеÄʵ¼ÊλÖᣠLinux ºËÐÄÊÇÓɶà¸öÄ¿±êÄ£¿éÁ¬½Ó¶ø³ÉµÄ¶ÀÁ¢µÄ´ó³ÌÐò¡£

2.2 What is an Operating System £¨Ê²Ã´ÊDzÙ×÷ϵͳ£¿£©

    ûÓÐÈí¼þ£¬¼ÆËã»úÖ»ÊÇÒ»¶Ñ·¢Èȵĵç×ÓÔª¼þ¡£Èç¹û˵Ӳ¼þÊǼÆËã»úµÄÐÄÔ࣬ÔòÈí¼þ¾ÍÊÇËüµÄÁé»ê¡£²Ù×÷ϵͳÊÇÔÊÐíÓû§ÔËÐÐÓ¦ÓóÌÐòµÄÒ»×éϵͳ³ÌÐò¡£²Ù×÷ϵͳ½«ÏµÍ³µÄÓ²¼þ³éÏ󣬳ÊÏÖÔÚÓû§ºÍÓ¦ÓóÌÐò֮ǰµÄÊÇÒ»¸öÐéÄâµÄ»úÆ÷¡£ÊÇÈí¼þÔì¾ÍÁ˼ÆËã»úϵͳµÄÌØµã¡£´ó¶àÊý PC ¿ÉÒÔÔËÐÐÒ»µ½¶à¸ö²Ù×÷ϵͳ£¬¶øÃ¿Ò»¸ö²Ù×÷ϵͳ´ÓÍâ¹ÛºÍ¸Ð¾õÉ϶¼´ó²»Ïàͬ¡£ Linux Óɲ»Í¬¹¦ÄܵIJ¿·Ö¹¹³É£¬ÕâЩ²¿·Ö×ÜÌå×éºÏ¹¹³ÉÁË Linux ²Ù×÷ϵͳ¡£ Linux ×îÃ÷ÏԵIJ¿·Ö¾ÍÊÇ Kernel ×ÔÉí£¬µ«ÊÇÈç¹ûûÓÐ shell »ò libraries Ò»ÑùûÓÐÓô¦¡£

    ΪÁËÁ˽âʲôÊDzÙ×÷ϵͳ£¬¿´Ò»¿´ÔÚÄãÊäÈë×î¼òµ¥µÄÃüÁîʱ·¢ÉúÁËʲô£º

$ls

Mail c images perl

Docs tcl

$

    ÕâÀïµÄ $ ÊǵǼµÄ shell Êä³öµÄÌáʾ·û£¨´ËÀýÊÇ bash £©£º±íʾ shell ÔڵȺòÄ㣨Óû§£©ÊäÈëÃüÁî¡£ÊäÈë ls Òý·¢¼üÅÌÇý¶¯³ÌÐòʶ±ðÊäÈëµÄ×Ö·û£¬¼üÅÌÇý¶¯³ÌÐò½«Ê¶±ðµÄ×Ö·û´«µÝ¸ø shell È¥´¦Àí¡£ shell ÏȲéÕÒͬÃûµÄ¿ÉÖ´ÐÐÓ³Ïó£¬ËüÕÒµ½ÁË /bin/ls, È»ºóµ÷ÓúËÐÄ·þÎñ½« ls Ö´ÐгÌÐò¼ÓÔØµ½ÐéÄâÄÚ´æÖв¢¿ªÊ¼Ö´ÐС£ ls Ö´ÐгÌÐòͨ¹ýÖ´ÐкËÐĵÄÎļþ×ÓϵͳµÄϵͳµ÷ÓòéÕÒÎļþ¡£Îļþϵͳ¿ÉÄÜʹÓûº´æµÄÎļþϵͳÐÅÏ¢»òͨ¹ý´ÅÅÌÉ豸Çý¶¯³ÌÐò´Ó´ÅÅÌÉ϶ÁÈ¡ÎļþÐÅÏ¢ , Ò²¿ÉÄÜÊÇͨ¹ýÍøÂçÉ豸Çý¶¯³ÌÐòͬԶ³ÌÖ÷»ú½»»»ÐÅÏ¢¶ø¶ÁÈ¡±¾ÏµÍ³Ëù·ÃÎʵÄÔ¶³ÌÎļþµÄÏêϸÐÅÏ¢£¨Îļþϵͳ¿ÉÒÔͨ¹ý NFS ÍøÂçÎļþϵͳԶ³Ì°²×°£©¡£²»¹ÜÎļþÐÅÏ¢ÊÇÈçºÎµÃµ½µÄ£¬ ls ¶¼½«ÐÅÏ¢Êä³ö£¬Í¨¹ýÏÔʾÇý¶¯³ÌÐòÏÔʾÔÚÆÁÄ»ÉÏ¡£

    ÒÔÉϵĹý³Ì¿´ÆðÀ´Ï൱¸´ÔÓ£¬µ«ÊÇËü˵Ã÷Á˼´Ê¹ÊÇ×î¼òµ¥µÄÃüÁîÒ²ÊDzÙ×÷ϵͳ¸÷¸ö¹¦ÄÜÄ£¿éÖ®¼ä¹²Í¬Ð­×÷µÄ½á¹û£¬Ö»ÓÐÕâÑù²ÅÄÜÌṩ¸øÄ㣨Óû§£©Ò»¸öÍêÕûµÄϵͳÊÓͼ¡£

2.2.1 Memory management £¨ÄÚ´æ¹ÜÀí£©

    Èç¹ûÓµÓÐÎÞÏÞµÄ×ÊÔ´£¬ÀýÈçÄڴ棬ÄÇô²Ù×÷ϵͳËù±ØÐë×öµÄºÜ¶àÊÂÇé¿ÉÄܶ¼ÊǶàÓàµÄ¡£ËùÓвÙ×÷ϵͳµÄÒ»¸ö»ù±¾¼¼ÇɾÍÊÇÈÃÉÙÁ¿µÄÎïÀíÄڴ湤×÷ÆðÀ´ºÃÏñÓÐÏ൱¶àµÄÄÚ´æ¡£ÕâÖÖ±íÃæ¿´ÆðÀ´µÄ´óÄÚ´æ½Ð×öÐéÄâÄڴ棬¾ÍÊǵ±Èí¼þÔËÐеÄʱºòÈÃËüÏàÐÅËüÓµÓкܶàÄڴ档ϵͳ½«ÄÚ´æ·ÖΪÈÝÒ×´¦ÀíµÄÒ³£¬ÔÚϵͳÔËÐÐʱ½«ÕâЩҳ½»»»µ½Ó²ÅÌÉÏ¡£¶øÓ¦ÓÃÈí¼þ²¢²»ÖªµÀ£¬ÒòΪ²Ù×÷ϵͳ»¹Ê¹ÓÃÁËÁíÒ»Ïî¼¼Êõ£º¶à½ø³Ì¡£

2.2.2 Processes ( ½ø³Ì )

    ½ø³Ì¿ÉÒÔ¿´×÷Ò»¸öÔÚÖ´ÐеijÌÐò£¬Ã¿Ò»¸ö½ø³Ì¶¼ÊÇÕýÔÚÔËÐеÄÌØ¶¨µÄ³ÌÐòµÄ¶ÀÁ¢ÊµÌå¡£Èç¹ûÄã¹Û²ìÒ»ÏÂÄãµÄ Linux ϵͳ£¬Äã»á·¢ÏÖÓÐºÜ¶à½ø³ÌÔÚÔËÐС£ÀýÈ磺ÔÚÎÒµÄϵͳÉÏÊäÈë ps ÏÔʾÁËÒÔϽø³Ì£º

$ ps

PID TTY STAT TIME COMMAND

158 pRe 1 0:00 -bash

174 pRe 1 0:00 sh /usr/X11R6/bin/startx

175 pRe 1 0:00 xinit /usr/X11R6/lib/X11/xinit/xinitrc --

178 pRe 1 N 0:00 bowman

182 pRe 1 N 0:01 rxvt -geometry 120x35 -fg white -bg black

184 pRe 1 < 0:00 xclock -bg grey -geometry -1500-1500 -padding 0

185 pRe 1 < 0:00 xload -bg grey -geometry -0-0 -label xload

187 pp6 1 9:26 /bin/bash

202 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black

203 ppc 2 0:00 /bin/bash

1796 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black

1797 v06 1 0:00 /bin/bash

3056 pp6 3 < 0:02 emacs intro/introduction.tex

3270 pp6 3 0:00 ps

$

    Èç¹ûÎÒµÄϵͳӵÓжà¸ö CPU ÄÇôÿ¸ö½ø³Ì¿ÉÄÜ£¨ÖÁÉÙÔÚÀíÂÛÉÏÈç´Ë£©¶¼ÔÚ²»Í¬µÄ CPU ÉÏÔËÐС£²»ÐÒµÄÊÇ£¬Ö»ÓÐÒ»¸ö£¬ËùÒÔ²Ù×÷ϵͳÓÖʹÓü¼ÇÉ£¬ÔÚ¶Ìʱ¼äÄÚÒÀ´ÎÔËÐÐÿһ¸ö½ø³Ì¡£Õâ¸öʱ¼ä¶Î½Ð×öʱ¼äƬ¡£ÕâÖÖ¼¼ÇɽÐ×ö¶à½ø³Ì»òµ÷¶È£¬ËüÆÛÆ­ÁËÿһ¸ö½ø³Ì£¬ºÃÏñËüÃÇÊÇΨһµÄ½ø³Ì¡£½ø³ÌÏ໥֮¼äÊܵ½±£»¤£¬ËùÒÔÈç¹ûÒ»¸ö½ø³Ì±ÀÀ£»ò²»Äܹ¤×÷£¬²»»áÓ°ÏìÆäËû½ø³Ì¡£²Ù×÷ϵͳͨ¹ý¸øÃ¿Ò»¸ö½ø³ÌÒ»¸ö¶ÀÁ¢µÄµØÖ·¿Õ¼äÀ´ÊµÏÖ±£»¤£¬½ø³ÌÖ»ÄÜ·ÃÎÊËü×Ô¼ºµÄµØÖ·¿Õ¼ä¡£

2.2.3 Device Drivers £¨É豸Çý¶¯³ÌÐò£©

    É豸Çý¶¯³ÌÐò×é³ÉÁË Linux ºËÐĵÄÖ÷Òª²¿·Ö¡£Ïó²Ù×÷ϵͳµÄÆäËû²¿·ÖÒ»Ñù£¬ËüÃÇÔÚÒ»¸ö¸ßÓÅÏȼ¶µÄ»·¾³Ï¹¤×÷£¬Èç¹û·¢Éú´íÎ󣬿ÉÄÜ»áÒý·¢ÑÏÖØÎÊÌâ¡£É豸Çý¶¯³ÌÐò¿ØÖÆÁ˲Ù×÷ϵͳºÍËü¿ØÖƵÄÓ²¼þÉ豸֮¼äµÄ½»»¥¡£±ÈÈ磺ÎļþϵͳÏò IDE ´ÅÅÌдÊý¾Ý¿éÊÇʹÓÃͨÓÿéÉ豸½Ó¿Ú¡£Çý¶¯³ÌÐò¿ØÖÆÏ¸½Ú£¬²¢´¦ÀíºÍÉ豸Ïà¹ØµÄ²¿·Ö¡£É豸Çý¶¯³ÌÐòºÍËüÇý¶¯µÄ¾ßÌåµÄ¿ØÖÆÆ÷оƬÏà¹Ø£¬ËùÒÔ£¬Èç¹ûÄãµÄϵͳÓÐÒ»¸ö NCR810 µÄ SCSI ¿ØÖÆÆ÷£¬ÄÇôÄãÐèÒª NCR810 µÄÇý¶¯³ÌÐò¡£

2.2.4 The Filesystems £¨Îļþϵͳ£©

    Ïó Unix Ò»Ñù£¬ÔÚ Linux Àϵͳ¶Ô¶ÀÁ¢µÄÎļþϵͳ²»ÊÇÓÃÉ豸±êʾ·ûÀ´´æÈ¡£¨±ÈÈçÇý¶¯Æ÷±àºÅ»òÇý¶¯Æ÷Ãû³Æ£©£¬¶øÊÇÁ¬½Ó³ÉΪһ¸öÊ÷Ðͽṹ¡£ Linux ÔÚ°²×°ÐµÄÎļþϵͳʱ£¬°ÑËü°²×°µ½Ö¸¶¨µÄ°²×°Ä¿Â¼£¬±ÈÈç /mnt/cdrom £¬´Ó¶øºÏ²¢µ½Õâ¸öµ¥Ò»µÄÎļþϵͳÊ÷ÉÏ¡£ Linux µÄÒ»¸öÖØÒªÌØÕ÷ÊÇËüÖ§³Ö¶àÖÖ²»Í¬µÄÎļþϵͳ¡£ÕâʹËü·Ç³£Áé»î¶øÇÒ¿ÉÒÔºÍÆäËû²Ù×÷ϵͳÁ¼ºÃ¹²´æ¡£ Linux ×î³£ÓõÄÎļþϵͳÊÇ EXT2 £¬´ó¶àÊý Linux ·¢²¼°æ¶¼Ö§³Ö¡£

    Îļþϵͳ½«´æ·ÅÔÚϵͳӲÅÌÉϵÄÎļþºÍĿ¼ÓÿÉÒÔÀí½âµÄͳһµÄÐÎʽÌṩ¸øÓû§£¬ÈÃÓû§²»±Ø¿¼ÂÇÎļþϵͳµÄÀàÐÍ»òµ×²ãÎïÀíÉ豸µÄÌØÐÔ¡£ Linux ͸Ã÷µÄÖ§³Ö¶àÖÖÎļþϵͳ£¨Èç MS-DOS ºÍ EXT2 £©£¬½«ËùÓа²×°µÄÎļþºÍÎļþϵͳ¼¯ºÏ³ÉΪһ¸öÐéÄâµÄÎļþϵͳ¡£ËùÒÔ£¬Óû§ºÍ½ø³Ìͨ³£²»ÐèҪȷÇÐÖªµÀËùʹÓõÄÎļþËùÔÚµÄÎļþϵͳµÄÀàÐÍ£¬ÓþÍÊÇÁË¡£

    ¿éÉ豸Çý¶¯³ÌÐòÑÚ¸ÇÁËÎïÀí¿éÉ豸ÀàÐ͵ÄÇø±ð£¨Èç IDE ºÍ SCSI £©¡£¶ÔÓÚÎļþϵͳÀ´½²£¬ÎïÀíÉ豸¾ÍÊÇÏßÐÔµÄÊý¾Ý¿éµÄ¼¯ºÏ¡£²»Í¬É豸µÄ¿é´óС¿ÉÄܲ»Í¬£¬ÈçÈíÇýÒ»°ãÊÇ 512 ×Ö½Ú£¬¶ø IDE É豸ͨ³£ÊÇ 1024 ×Ö½Ú£¬Í¬Ñù£¬¶ÔÓÚϵͳµÄÓû§£¬ÕâÐ©Çø±ðÓÖ±»Ñڸǡ£ EXT2 Îļþϵͳ²»¹ÜËüÓÃʲôÉ豸£¬¿´ÆðÀ´¶¼ÊÇÒ»ÑùµÄ¡£

2.3 Kernet Data Structures £¨ºËÐÄÊý¾Ý½á¹¹£©

    ²Ù×÷ϵͳ±ØÐë¼Í¼¹ØÓÚϵͳµ±Ç°×´Ì¬µÄÐí¶àÐÅÏ¢¡£Èç¹ûϵͳÖз¢ÉúÁËÊÂÇ飬ÕâЩÊý¾Ý½á¹¹¾Í±ØÐëÏàÓ¦¸Ä±äÒÔ·´Ó³µ±Ç°µÄʵ¼ÊÇé¿ö¡£ÀýÈ磺Óû§µÇ¼µ½ÏµÍ³ÖеÄʱºò£¬ÐèÒª´´½¨Ò»¸öеĽø³Ì¡£ºËÐıØÐëÏàÓ¦µØ´´½¨±íʾ´Ëнø³ÌµÄÊý¾Ý½á¹¹£¬²¢ºÍ±íʾϵͳÖÐÆäËû½ø³ÌµÄÊý¾Ý½á¹¹ÁªÏµÔÚÒ»Æð¡£

    ÕâÑùµÄÊý¾Ý½á¹¹¶àÊýÔÚÎïÀíÄÚ´æÖУ¬¶øÇÒÖ»ÄÜÓɺËÐĺÍËüµÄ×Óϵͳ·ÃÎÊ¡£Êý¾Ý½á¹¹°üÀ¨Êý¾ÝºÍÖ¸Õ루ÆäËûÊý¾Ý½á¹¹»òÀý³ÌµÄµØÖ·£©¡£Õ§Ò»¿´£¬ Linux ºËÐÄËùÓõÄÊý¾Ý½á¹¹¿ÉÄܷdz£»ìÂÒ¡£Æäʵ£¬Ã¿Ò»¸öÊý¾Ý½á¹¹¶¼ÓÐÆäÄ¿µÄ£¬ËäÈ»ÓÐЩÊý¾Ý½á¹¹ÔÚ¶à¸öµÄ×ÓϵͳÖж¼»áÓõ½£¬µ«ÊÇʵ¼ÊÉÏËüÃDZȵÚÒ»´Î¿´µ½Ê±µÄ¸Ð¾õÒª¼òµ¥µÄ¶à¡£

    Àí½â Linux ºËÐĵĹؼüÔÚÓÚÀí½âËüµÄÊý¾Ý½á¹¹ºÍºËÐÄ´¦ÀíÕâЩÊý¾Ý½á¹¹ËùÓõ½µÄ´óÁ¿µÄº¯Êý¡£±¾ÊéÒÔÊý¾Ý½á¹¹Îª»ù´¡ÃèÊö Linux ºËÐÄ¡£ÂÛ¼°Ã¿Ò»¸öºËÐÄ×ÓϵͳµÄËã·¨£¬´¦ÀíµÄ·½Ê½ºÍËüÃǶԺËÐÄÊý¾Ý½á¹¹µÄʹÓá£

2.3.1 Linked Lists £¨Á¬½Ó±í£©

    Linux ʹÓÃÒ»ÖÖÈí¼þ¹¤³Ì¼¼Êõ½«ËüµÄÊý¾Ý½á¹¹Á¬½ÓÔÚÒ»Æð¡£¶àÊýÇé¿öÏÂËüʹÓÃÁ´±íÊý¾Ý½á¹¹¡£Èç¹ûÿһ¸öÊý¾Ý½á¹¹ÃèÊöÒ»¸öÎïÌå»òÕß·¢ÉúµÄʼþµÄµ¥Ò»µÄʵÀý£¬±ÈÈçÒ»¸ö½ø³Ì»òÒ»¸öÍøÂçÉ豸£¬ºËÐıØÐëÄܹ»ÕÒ³öËùÓеÄʵÀý¡£ÔÚÁ´±íÖУ¬¸ùÖ¸Õë°üÀ¨µÚÒ»¸öÊý¾Ý½á¹¹»òµ¥ÔªµÄµØÖ·£¬ÁбíÖеÄÿһ¸öÊý¾Ý½á¹¹°üº¬Ö¸ÏòÁбíÏÂÒ»¸öÔªËØµÄÖ¸Õë¡£×îºóÔªËØµÄÏÂÒ»¸öÖ¸Õë¿ÉÄÜʹ 0 »ò NULL £¬±íʾÕâÊÇÁбíµÄ½áβ¡£ÔÚË«ÏòÁ´±í½á¹¹ÖУ¬Ã¿Ò»¸öÔªËØ²»½ö°üÀ¨ÁбíÖÐÏÂÒ»¸öÔªËØµÄÖ¸Õ룬»¹°üÀ¨ÁбíÖÐǰһ¸öÔªËØµÄÖ¸Õ롣ʹÓÃË«ÏòÁ´±í¿ÉÒԱȽÏÈÝÒ×µÄÔÚÁбíÖмäÔö¼Ó»òɾ³ýÔªËØ£¬µ«ÊÇÕâÐèÒª¸ü¶àµÄÄÚ´æ´æÈ¡¡£ÕâÊǵäÐ͵IJÙ×÷ϵͳµÄÁ½ÄÑÇé¿ö£ºÄÚ´æ´æÈ¡Êý»¹ÊÇ CPU µÄÖÜÆÚÊý¡£

2.3.2 Hash Tables

    Á´½Ó±íÊdz£ÓõÄÊý¾Ý½á¹¹£¬µ«ÊÇÓÎÀúÁ´½Ó±íµÄЧÂÊ¿ÉÄܲ¢²»¸ß¡£Èç¹ûÄãҪѰÕÒÖ¸¶¨µÄÔªËØ£¬ ¿ÉÄܱØÐë²éÕÒÍêÕû¸ö±í²ÅÄÜÕÒµ½¡£ Linux ʹÓÃÁíÒ»ÖÖ¼¼Êõ£º Hashing À´½â¾öÕâÖÖ¾ÖÏÞ¡£ Hash table ÊÇÖ¸ÕëµÄÊý×é»òÕß˵ÏòÁ¿±í¡£Êý×é»òÏòÁ¿±íÊÇÔÚÄÚ´æÖÐÒÀ´Î´æ·ÅµÄ¶ÔÏó¡£Êé¼Ü¿ÉÒÔ˵ÊÇÊéµÄÊý×é¡£Êý×éÓÃË÷ÒýÀ´·ÃÎÊ£¬Ë÷ÒýÊÇÊý×éÖÐµÄÆ«ÒÆÁ¿¡£ÔÙÀ´¿´Êé¼ÜµÄÀý×Ó£¬Äã¿ÉÒÔʹÓÃÔÚÊé¼ÜÉϵÄλÖÃÀ´ÃèÊöÿһ±¾Ê飺±ÈÈçµÚ 5 ±¾Êé¡£

    Hash table ÊÇÒ»¸öÖ¸ÏòÊý¾Ý½á¹¹µÄÖ¸ÕëµÄÊý×飬ËüµÄË÷ÒýÀ´Ô´ÓÚÊý¾Ý½á¹¹ÖеÄÐÅÏ¢¡£Èç¹ûÄãÓÃÒ»¸öÊý¾Ý½á¹¹À´ÃèÊöÒ»¸ö´åׯµÄÈ˿ڣ¬Äã¿ÉÒÔÓÃÄêÁä×÷ΪË÷Òý¡£ÒªÕÒ³öÒ»¸öÖ¸¶¨µÄÈ˵ÄÊý¾Ý£¬Äã¿ÉÒÔÓÃËûµÄÄêÁä×÷ΪË÷ÒýÔÚÈË¿ÚÉ¢ÁбíÖвéÕÒ£¬Í¨¹ýÖ¸ÕëÕÒµ½°üÀ¨ÏêϸÐÅÏ¢µÄÊý¾Ý½á¹¹¡£²»ÐÒµÄÊÇ£¬Ò»¸ö´åׯÖпÉÄܺܶàÈËÄêÁäÏàͬ£¬ËùÒÔÉ¢ÁбíµÄÖ¸ÕëÖ¸ÏòÁíÒ»¸öÁ´±íÊý¾Ý½á¹¹£¬Ã¿Ò»¸öÔªËØÃèÊöͬÁäÈË¡£¼´Ê¹ÕâÑù£¬²éÕÒÕâЩ½ÏСµÄÁ´±íÈÔÈ»±È²éÕÒËùÓеÄÊý¾Ý½á¹¹Òª¿ì¡£

    Hash table ¿ÉÓÃÓÚ¼ÓËÙ³£ÓõÄÊý¾Ý½á¹¹µÄ·ÃÎÊ£¬ÔÚ Linux Àï³£Óà hash table À´ÊµÏÖ»º³å¡£»º³åÊÇÐèÒª¿ìËÙ´æÈ¡µÄÐÅÏ¢£¬ÊÇÈ«²¿¿ÉÓÃÐÅÏ¢µÄÒ»¸ö×Ó¼¯¡£Êý¾Ý½á¹¹±»·ÅÔÚ»º³åÇø²¢±£ÁôÔÚÄÇÀÒòΪºËÐľ­³£·ÃÎÊÕâЩ½á¹¹¡£Ê¹Óûº³åÇøÒ²Óи±×÷Óã¬ÒòΪʹÓÃÆðÀ´±È¼òµ¥Á´±í»òÕßÉ¢Áбí¸ü¼Ó¸´ÔÓ¡£Èç¹ûÊý¾Ý½á¹¹¿ÉÒÔÔÚ»º³åÇøÕÒµ½£¨Õâ½Ð×ö»º³åÃüÖУ©£¬ÄÇôһÇкÜÍêÃÀ¡£µ«ÊÇÈç¹ûÊý¾Ý½á¹¹²»ÔÚ»º³åÇøÖУ¬ÄÇô±ØÐë²éÕÒËùÓõÄÏà¹ØµÄÊý¾Ý½á¹¹£¬Èç¹ûÕÒµ½£¬ÄÇô¾Í¼Óµ½»º³åÇøÖС£Ôö¼ÓеÄÊý¾Ý½á¹¹µ½»º³åÇøÖпÉÄÜÐèÒª·ÏÆúÒ»¸ö¾ÉµÄ»º³åÈë¿Ú¡£ Linux ±ØÐë¾ö¶¨·ÏÆúÄÇÒ»¸öÊý¾Ý½á¹¹£¬·çÏÕÔÚÓÚ·ÏÆúµÄ¿ÉÄÜʹ Linux ÏÂÒ»¸öÒª·ÃÎʵÄÊý¾Ý½á¹¹¡£

2.3.3 Abstract Interfaces £¨³éÏó½Ó¿Ú£©

    Linux ºËÐľ­³£½«ËüµÄ½Ó¿Ú³éÏ󻯡£½Ó¿ÚÊÇÒÔÌØ¶¨·½Ê½¹¤×÷µÄһϵÁÐÀý³ÌºÍÊý¾Ý½á¹¹¡£±ÈÈ磺ËùÓеÄÍøÂçÉ豸Çý¶¯³ÌÐò¶¼±ØÐëÌá¹©ÌØ¶¨µÄÀý³ÌÀ´´¦ÀíÌØ¶¨µÄÊý¾Ý½á¹¹¡£ÓóéÏó½Ó¿ÚµÄ·½Ê½¿ÉÒÔÓÃͨÓõĴúÂë²ãÀ´Ê¹ÓõײãÌØÊâ´úÂëÌṩµÄ·þÎñ£¨½Ó¿Ú£©¡£ÀýÈçÍøÂç²ãÊÇͨÓõ쬶øËüÓɵײã·ûºÏ±ê×¼½Ó¿ÚµÄͬÉ豸Ïà¹ØµÄ´úÂëÌṩ֧³Ö¡£

    ͨ³£ÕâЩµ×²ãÔÚÆô¶¯Ê±Ïò¸ßÒ»²ãµÇ¼Ç¡£Õâ¸öµÇ¼Ç¹ý³Ì³£Í¨¹ýÔÚÁ´½Ó±íÖÐÔö¼ÓÒ»¸öÊý¾Ý½á¹¹À´ÊµÏÖ¡£ÀýÈ磬ÿһ¸öÁ¬½áµ½ºËÐĵÄÎļþϵͳÔÚºËÐÄÆô¶¯Ê±½øÐеǼǣ¨»òÕßÈç¹ûÄãʹÓÃÄ£¿é£¬ÔÚÎļþϵͳµÚÒ»´ÎʹÓÃʱÏòºËÐĵǼǣ©¡£Äã¿ÉÒԲ鿴Îļþ /proc/filesystems À´¼ì²éÄÇЩÎļþϵͳ½øÐÐÁ˵Ǽǡ£µÇ¼ÇËùÓõÄÊý¾Ý½á¹¹Í¨³£°üÀ¨Ö¸Ïòº¯ÊýµÄÖ¸Õë¡£ÕâÊÇÖ´ÐÐÌØ¶¨ÈÎÎñµÄÈí¼þº¯ÊýµÄµØÖ·¡£ÔÙÒ»´ÎÓÃÎļþϵͳµÇ¼ÇµÄÀý×Ó£¬Ã¿Ò»¸öÎļþϵͳµÇ¼Çʱ´«µÝ¸ø Linux ºËÐĵÄÊý¾Ý½á¹¹¶¼°üÀ¨Ò»¸öºÍ¾ßÌåÎļþϵͳÏà¹ØµÄÀý³ÌµØÖ·£¬ÔÚ°²×°Îļþϵͳʱ±ØÐëµ÷Óá£


 

[ÏÂÒ»Ò³]


 

Chapter 3

Memory Management £¨ÄÚ´æ¹ÜÀí£©

    ÄÚ´æ¹ÜÀí×ÓϵͳÊDzÙ×÷ϵͳµÄÖØÒª²¿·Ö¡£´Ó¼ÆËã»ú·¢Õ¹ÔçÆÚ¿ªÊ¼£¬¾Í´æÔÚ¶ÔÓÚ´óÓÚϵͳÖÐÎïÀíÄÜÁ¦µÄÄÚ´æÐèÒª¡£ÎªÁ˿˷þÕâÖÖÏÞÖÆ£¬¿ª·¢ÁËÐí¶àÖÖ²ßÂÔ£¬ÆäÖÐ×î³É¹¦µÄ¾ÍÊÇÐéÄâÄÚ´æ¡£ÐéÄâÄÚ´æÍ¨¹ýÔÚ¾ºÕù½ø³ÌÖ®¼ä¹²ÏíÄÚ´æµÄ·½Ê½Ê¹ÏµÍ³ÏÔµÃÓµÓбÈʵ¼Ê¸ü¶àµÄÄÚ´æ¡£

    ÐéÄâÄÚ´æ²»½ö½öÈÃÄãµÄ¼ÆËã»úÄÚ´æÏԵøü¶à£¬ÄÚ´æ¹ÜÀí×Óϵͳ»¹Ìṩ£º

    Large Address Spaces £¨¾Þ´óµÄµØÖ·¿Õ¼ä£©²Ù×÷ϵͳʹϵͳÏÔµÃÓµÓбÈʵ¼Ê¸ü´óÁ¿µÄÄÚ´æ¡£ÐéÄâÄÚ´æ¿ÉÒÔ±ÈϵͳÖеÄÎïÀíÄÚ´æ´óÐí¶à±¶¡£

    < Protection £¨±£»¤£©ÏµÍ³ÖеÄÿһ¸ö½ø³Ì¶¼ÓÐ×Ô¼ºµÄÐéÄâµØÖ·¿Õ¼ä¡£ÕâЩÐéÄâµÄµØÖ·¿Õ¼äÊÇÏ໥ÍêÈ«·ÖÀëµÄ£¬ËùÒÔÔËÐÐÒ»¸öÓ¦ÓóÌÐòµÄ½ø³Ì²»»áÓ°ÏìÁíÍâµÄ½ø³Ì¡£ÁíÍ⣬Ӳ¼þµÄÐéÄâÄÚ´æ»úÖÆÔÊÐí¶ÔÄÚ´æÇøÐ´±£»¤¡£Õâ¿ÉÒÔ·ÀÖ¹´úÂëºÍÊý¾Ý±»¶ñÒâµÄ³ÌÐò¸²¸Ç¡£

    < Memory Mapping £¨ÄÚ´æÓ³É䣩ÄÚ´æÓ³ÉäÓÃÀ´½«Ó³ÏñºÍÊý¾ÝÓ³Éäµ½½ø³ÌµÄµØÖ·¿Õ¼ä¡£ÓÃÄÚ´æÓ³É䣬ÎļþµÄÄÚÈݱ»Ö±½ÓÁ¬½áµ½½ø³ÌµÄÐéÄâµØÖ·¿Õ¼ä¡£

    < Fair Physics Memory Allocation £¨¹«Æ½·ÖÅäÎïÀíÄڴ棩ÄÚ´æ¹ÜÀí×ÓϵͳÔÊÐíϵͳÖÐÿһ¸öÔËÐÐÖеĽø³Ì¹«Æ½µØ¹²ÏíϵͳµÄÎïÀíÄÚ´æ

    Shared Virtual Memory £¨¹²ÏíÐéÄâÄڴ棩ËäÈ»ÐéÄâÄÚ´æÔÊÐí½ø³ÌÓµÓзÖÀ루ÐéÄ⣩µÄµØÖ·¿Õ¼ä£¬ÓÐʱÄãÒ²ÐèÒª½ø³ÌÖ®¼ä¹²ÏíÄÚ´æ¡£ÀýÈ磬ϵͳÖпÉÄÜÓжà¸ö½ø³ÌÔËÐÐÃüÁî½âÊͳÌÐò < bash ¡£ËäÈ»¿ÉÒÔÔÚÿһ¸ö½ø³ÌµÄÐéÄâµØÖ·¿Õ¼ä¶¼ÓµÓÐÒ»·Ý bash µÄ¿½±´£¬¸üºÃµÄÊÇÔÚÎïÀíÄÚ´æÖÐÖ»ÓµÓÐÒ»·Ý¿½±´£¬ËùÓÐÔËÐÐ bash µÄ½ø³Ì¹²Ïí´úÂë¡£¶¯Ì¬Á¬½Ó¿âÊǶà¸ö½ø³Ì¹²ÏíÖ´ÐдúÂëµÄÁíÒ»¸ö³£¼ûÀý×Ó¡£¹²ÏíÄÚ´æÒ²¿ÉÒÔÓÃÓÚ½ø³Ì¼äͨѶ < (IPC) »úÖÆ£¬Á½¸ö»ò¶à¸ö½ø³Ì¿ÉÒÔͨ¹ý¹²Í¬ÓµÓеÄÄÚ´æ½»»»ÐÅÏ¢¡£ Linux ϵͳ֧³Öϵͳ V µÄ¹²ÏíÄÚ´æ IPC »úÖÆ¡£

3.1 An Abstract Model of Virtual Memory £¨ÐéÄâÄÚ´æµÄ³éÏóÄ£ÐÍ£©

    ÔÚ¿¼ÂÇ Linux Ö§³ÖÐéÄâÄÚ´æµÄ·½·¨Ö®Ç°£¬×îºÃÏÈ¿¼ÂÇÒ»¸ö³éÏóµÄÄ£ÐÍ£¬ÒÔÃⱻ̫¶àµÄϸ½Ú¸ãÂÒ¡£

    ÔÚ½ø³ÌÖ´ÐгÌÐòµÄʱºò£¬Ëü´ÓÄÚ´æÖжÁȡָÁî²¢½øÐнâÂë¡£½âÂëÖ¸ÁîÒ²ÐíÐèÒª¶ÁÈ¡»òÕß´æ´¢ÄÚ´æÌض¨Î»ÖõÄÄÚÈÝ£¬È»ºó½ø³ÌÖ´ÐÐÖ¸Áî²¢×ªÒÆµ½³ÌÐòÖеÄÏÂÒ»ÌõÖ¸Áî¡£½ø³Ì²»¹ÜÊǶÁȡָÁÊÇ´æÈ¡Êý¾Ý¶¼Òª·ÃÎÊÄÚ´æ¡£

    ÔÚÒ»¸öÐéÄâÄÚ´æÏµÍ³ÖУ¬ËùÓеĵØÖ·¶¼ÊÇÐéÄâµØÖ·¶ø·ÇÎïÀíµØÖ·¡£´¦ÀíÆ÷ͨ¹ý²Ù×÷ϵͳ±£´æµÄÒ»×éÐÅÏ¢½«ÐéÄâµØÖ·×ª»»ÎªÎïÀíµØÖ·¡£

    ΪÁËÈÃÕâÖÖת»»¸ü¼òµ¥£¬½«ÐéÄâÄÚ´æºÍÎïÀíÄÚ´æ·ÖΪÊʵ±´óСµÄ¿é£¬½Ð×öÒ³£¨ < page £©¡£Ò³µÄ´óСһÑù¡££¨µ±È»¿ÉÒÔ²»Ò»Ñù£¬µ«ÊÇÕâÑùÒ»À´ÏµÍ³¹ÜÀíÆðÀ´±È½ÏÀ§ÄÑ£©¡£ Linux ÔÚ Alpha AXP ϵͳÉÏʹÓà 8K ×Ö½ÚµÄÒ³£¬¶øÔÚ Intel x86 ϵͳÉÏʹÓà 4K ×Ö½ÚµÄÒ³¡£Ã¿Ò»Ò³¶¼¸³ÓèÒ»¸öΨһ±àºÅ£º page frame number(PFN Ò³±àºÅ ) ¡£ÔÚÕâÖÖ·ÖҳģÐÍÏ£¬ÐéÄâµØÖ·ÓÉÁ½²¿·Ö×é³É£ºÐéÄâÒ³ºÅºÍÒ³ÄÚÆ«ÒÆÁ¿¡£¼ÙÈçÒ³´óСÊÇ < 4K £¬ÔòÐéÄâµØÖ·µÄλ < 11 µ½ < 0 °üÀ¨Ò³ÄÚÆ«ÒÆÁ¿£¬Î» < 12 ºÍÒÔÉϵÄλÊÇÒ³±àºÅ¡£Ã¿Ò»´Î´¦ÀíÆ÷Óöµ½ÐéÄâµØÖ·£¬Ëü±ØÐëÌáÈ¡³öÆ«ÒÆºÍÐéÄâÒ³±àºÅ¡£´¦ÀíÆ÷±ØÐ뽫ÐéÄâÒ³±àºÅת»»µ½ÎïÀíµÄÒ³£¬²¢·ÃÎÊÎïÀíÒ³µÄÕýÈ·Æ«ÒÆ´¦¡£Îª´Ë£¬´¦ÀíÆ÷ʹÓÃÁËÒ³±í£¨ < page tables £©¡£

    ͼ 3.1 ÏÔʾÁËÁ½¸ö½ø³ÌµÄÐéÄâµØÖ·¿Õ¼ä£¬½ø³Ì X ºÍ½ø³Ì Y £¬Ã¿Ò»¸ö½ø³ÌÓµÓÐ×Ô¼ºµÄÒ³±í¡£ÕâЩҳ±í½«Ã¿Ò»¸ö½ø³ÌµÄÐéÄâÒ³Ó³Éäµ½ÄÚ´æµÄÎïÀíÒ³ÉÏ¡£Í¼ÖÐÏÔʾ½ø³Ì < X µÄÐéÄâÒ³ºÅ < 0 Ó³Éäµ½ÎïÀíÒ³ºÅ < 1 £¬¶ø½ø³Ì < Y µÄÐéÄâÒ³±àºÅ < 1 Ó³Éäµ½ÎïÀíÒ³ºÅ < 4 ¡£ÀíÂÛÉÏÒ³±íÿһ¸öÌõÄ¿°üÀ¨ÒÔÏÂÐÅÏ¢£º

    ÓÐЧ±êÖ¾ ±íʾҳ±í±¾ÌõÄ¿ÊÇ·ñÓÐЧ

    ±¾Ò³±íÌõÄ¿ÃèÊöµÄÎïÀíÒ³±àºÅ

    ·ÃÎÊ¿ØÖÆÐÅÏ¢ ÃèÊö±¾Ò³ÈçºÎʹÓãºÊÇ·ñ¿ÉÒÔд£¿ÊÇ·ñ°üÀ¨Ö´ÐдúÂ룿

    Ò³±íͨ¹ýÐéÄâÒ³±êºÅ×÷ÎªÆ«ÒÆÀ´·ÃÎÊ¡£ÐéÄâÒ³±àºÅ 5 ÊDZíÖÐµÄµÚ 6 ¸öÔªËØ£¨ 0 ÊǵÚÒ»¸öÔªËØ£©

    Òª½«ÐéÄâµØÖ·×ª»»µ½ÎïÀíµØÖ·£¬´¦ÀíÆ÷Ê×ÏÈÕÒ³öÐéÄâµØÖ·µÄÒ³±àºÅºÍÒ³ÄÚÆ«ÒÆÁ¿¡£Ê¹Óà < 2 µÄÃݴεÄÒ³³ß´ç£¬¿ÉÒÔÓÃÑÚÂë»òÒÆÎ»¼òµ¥µØ´¦Àí¡£ÔÙÒ»´Î¿´Í¼ 3.1 £¬¼ÙÉèÒ³´óСÊÇ 0x2000 £¨Ê®½øÖÆ 8192 £©£¬½ø³Ì Y µÄÐéÄâµØÖ·¿Õ¼äµÄµØÖ·ÊÇ 0x2194 £¬´¦ÀíÆ÷½«»á°ÑµØÖ·×ª»»ÎªÐéÄâÒ³±àºÅ 1 Ä򵀮«ÒÆÁ¿ 0x194 ¡£

    ´¦ÀíÆ÷ʹÓÃÐéÄâÒ³±àºÅ×÷ΪË÷ÒýÔÚ½ø³ÌµÄÒ³±íÖÐÕÒµ½ËüµÄÒ³±íµÄÌõÄ¿¡£Èç¹û¸ÃÌõÄ¿ÓÐЧ£¬´¦ÀíÆ÷´Ó¸ÃÌõĿȡ³öÎïÀíµÄÒ³±àºÅ¡£Èç¹û±¾ÌõÄ¿ÎÞЧ£¬¾ÍÊǽø³Ì·ÃÎÊÁËËüµÄÐéÄâÄÚ´æÖв»´æÔÚµÄÇøÓò¡£ÔÚÕâÖÖÇé¿öÏ£¬´¦ÀíÆ÷ÎÞ·¨½âÊ͵ØÖ·£¬±ØÐ뽫¿ØÖÆÈ¨´«µÝ¸ø²Ù×÷ϵͳÀ´´¦Àí¡£

    ´¦ÀíÆ÷¾ßÌåÈçºÎ֪ͨ²Ù×÷ϵͳ½ø³ÌÔÚ·ÃÎÊÎÞ·¨×ª»»µÄÎÞЧµÄÐéÄâµØÖ·£¬Õâ¸ö·½Ê½ÊǺʹ¦ÀíÆ÷Ïà¹ØµÄ¡£´¦ÀíÆ÷½«ÕâÖÖÐÅÏ¢£¨ < page fault £©½øÐд«µÝ£¬²Ù×÷ϵͳµÃµ½Í¨Öª£¬ÐéÄâµØÖ·³ö´í£¬ÒÔ¼°³ö´íµÄÔ­Òò¡£

    ¼ÙÉèÕâÊÇÒ»¸öÓÐЧµÄÒ³±íÌõÄ¿£¬´¦ÀíÆ÷È¡³öÎïÀíÒ³ºÅ²¢³ËÒÔÒ³´óС£¬µÃµ½ÁËÎïÀíÄÚ´æÖб¾Ò³µÄ»ù´¡µØÖ·¡£×îºó£¬´¦ÀíÆ÷¼ÓÉÏËüÐèÒªµÄÖ¸Áî»òÊý¾ÝµÄÆ«ÒÆÁ¿¡£

    ÔÙÓÃÉÏÊöÀý×Ó£¬½ø³Ì Y µÄÐéÄâÒ³±àºÅ 1 Ó³Éäµ½ÁËÎïÀíÒ³±àºÅ 4 £¨ÆðʼÓÚ 0x8000 £¬ 4x 0x2000 £©£¬¼ÓÉÏÆ«ÒÆ 0x194 £¬µÃµ½ÁË×îÖÕµÄÎïÀíµØÖ· 0x8194 ¡£

    ͨ¹ýÕâÖÖ·½Ê½½«ÐéÄâµØÖ·Ó³Éäµ½ÎïÀíµØÖ·£¬ÐéÄâÄÚ´æ¿ÉÒÔÓÃÈÎÒâ˳ÐòÓ³É䵽ϵͳµÄÎïÀíÄÚ´æÖС£ÀýÈ磬ͼ < 3.1 ÖУ¬ÐéÄâÄÚ´æ < X µÄÐéÄâÒ³±àºÅÓ³Éäµ½ÁËÎïÀíÒ³±àºÅ < 1 ¶øÐéÄâÒ³±àºÅ < 7 ËäÈ»ÔÚÐéÄâÄÚ´æÖбÈÐéÄâÒ³ < 0 Òª¸ß£¬È´Ó³Éäµ½ÁËÎïÀíÒ³±àºÅ < 0 ¡£ÕâÒ²ÑÝʾÁËÐéÄâÄÚ´æµÄÒ»¸öÓÐȤµÄ¸±²úÆ·£ºÐéÄâÄÚ´æÒ³²»±Ø°´Ö¸¶¨Ë³ÐòÓ³Éäµ½ÎïÀíÄÚ´æÖС£

3.1.1 Demand Paging

    ÒòΪÎïÀíÄÚ´æ±ÈÐéÄâÄÚ´æÉٵö࣬²Ù×÷ϵͳ±ØÐë±ÜÃâÎÞЧÂʵØÊ¹ÓÃÎïÀíÄÚ´æ¡£½ÚÊ¡ÎïÀíÄÚ´æµÄÒ»ÖÖ·½·¨ÊÇÖ»¼ÓÔØÖ´ÐгÌÐòÕýÔÚʹÓõÄÐéÄâÒ³¡£ÀýÈ磺һ¸öÊý¾Ý¿â³ÌÐò¿ÉÄÜÕýÔÚÊý¾Ý¿âÉÏÔËÐÐÒ»¸ö²éѯ¡£ÔÚÕâÖÖÇé¿öÏ£¬²¢·ÇËùÓеÄÊý¾Ý±ØÐë·Åµ½ÄÚ´æÖУ¬¶øÖ»ÐèÒªÕý±»¼ì²éµÄÊý¾Ý¼Ç¼¡£Èç¹ûÕâÊǸö²éÕÒÐ͵IJéѯ£¬ÄÇô¼ÓÔØ³ÌÐòÖÐÔö¼Ó¼Ç¼µÄ´úÂë¾ÍûʲôÒâÒå¡£ÕâÖÖ½øÐзÃÎÊʱ²Å¼ÓÔØÐéÄâÒ³µÄ¼¼Êõ½Ð×ö < demand paging ¡£

    µ±Ò»¸ö½ø³ÌÊÔͼ·ÃÎʵ±Ç°²»ÔÚÄÚ´æÖеÄÐéÄâµØÖ·µÄʱºò´¦ÀíÆ÷ÎÞ·¨ÕÒµ½ÒýÓõÄÐéÄâÒ³¶ÔÓ¦µÄÒ³±íÌõÄ¿¡£ÀýÈ磺ͼ < 3.1 Öнø³Ì < X µÄÒ³±íÖÐûÓÐÐéÄâÒ³ 2 µÄÌõÄ¿£¬ËùÒÔÈç¹û½ø³Ì < X ÊÔͼ´ÓÐéÄâÒ³ < 2 ÖеĵØÖ·¶Áȡʱ£¬´¦ÀíÆ÷ÎÞ·¨½«µØÖ·×ª»»ÎªÎïÀíµØÖ·¡£Õâʱ´¦ÀíÆ÷֪ͨ²Ù×÷ϵͳ·¢Éú page fault ¡£

    Èç¹û³ö´íµÄÐéÄâµØÖ·ÎÞЧÒâζ׎ø³ÌÊÔͼ·ÃÎÊËü²»Ó¦¸Ã·ÃÎʵÄÐéÄâµØÖ·¡£Ò²ÐíÊdzÌÐò³ö´í£¬ÀýÈçÏòÄÚ´æÖÐÈÎÒâµØÖ·Ð´¡£ÕâÖÖÇé¿öÏ£¬²Ù×÷ϵͳ»áÖжÏËü£¬´Ó¶ø±£»¤ÏµÍ³ÖÐÆäËûµÄ½ø³Ì¡£

    Èç¹û³ö´íµÄÐéÄâµØÖ·ÓÐЧµ«ÊÇËüËùÔÚµÄÒ³µ±Ç°²»ÔÚÄÚ´æÖУ¬²Ù×÷ϵͳ±ØÐë´Ó´ÅÅÌÓ³ÏñÖн«ÏàÓ¦µÄÒ³¼ÓÔØµ½ÄÚ´æÖС£Ïà¶ÔÀ´½²´ÅÅÌ´æÈ¡ÐèÒª½Ï³¤Ê±¼ä£¬ËùÒÔ½ø³Ì±ØÐëµÈ´ýÖ±µ½¸ÃÒ³±»È¡µ½ÄÚ´æÖС£Èç¹ûµ±Ç°ÓÐÆäËûϵͳ¿ÉÒÔÔËÐУ¬²Ù×÷ϵͳ½«Ñ¡ÔñÆäÖÐÒ»¸öÔËÐС£È¡µ½µÄÒ³±»Ð´µ½Ò»¸ö¿ÕÏеÄÒ³Ãæ£¬²¢½«Ò»¸öÓÐЧµÄÐéÄâÒ³ÌõÄ¿¼Óµ½½ø³ÌµÄÒ³±íÖС£È»ºóÕâ¸ö½ø³ÌÖØÐÂÔËÐз¢ÉúÄÚ´æ´íÎóµÄµØ·½µÄ»úÆ÷Ö¸Áî¡£ÕâÒ»´ÎÐéÄâÄÚ´æ´æÈ¡½øÐÐʱ£¬´¦ÀíÆ÷Äܹ»½«ÐéÄâµØÖ·×ª»»µ½ÎïÀíµØÖ·£¬ËùÒÔ½ø³ÌµÃÒÔ¼ÌÐøÔËÐС£

    Linux ʹÓà < demand paging ¼¼Êõ½«¿ÉÖ´ÐÐÓ³Ïñ¼ÓÔØµ½½ø³ÌµÄÐéÄâÄÚ´æÖС£µ±Ò»¸öÃüÁîÖ´ÐÐʱ£¬°üº¬ËüµÄÎļþ±»´ò¿ª£¬ËüµÄÄÚÈݱ»Ó³Éäµ½½ø³ÌµÄÐéÄâÄÚ´æÖС£Õâ¸ö¹ý³ÌÊÇͨ¹ýÐÞ¸ÄÃèÊö½ø³ÌÄÚ´æÓ³ÉäµÄÊý¾Ý½á¹¹À´ÊµÏÖ£¬Ò²½Ð×öÄÚ´æÓ³É䣨 < memory mapping £©¡£µ«ÊÇ£¬Êµ¼ÊÉÏÖ»ÓÐÓ³ÏñµÄµÚÒ»²¿·ÖÕæÕý·ÅÔÚÁËÎïÀíÄÚ´æÖС£Ó³ÏñµÄÆäÓಿ·ÖÈÔ¾ÉÔÚ´ÅÅÌÉÏ¡£µ±Ó³ÏñÖ´ÐÐʱ£¬Ëü²úÉú < page fault £¬ < Linux ʹÓýø³ÌµÄÄÚ´æÓ³Ïñ±íÀ´È·¶¨Ó³ÏñµÄÄÇÒ»²¿·ÖÐèÒª¼ÓÔØµ½ÄÚ´æÖÐÖ´ÐС£

3.1.2 Swapping £¨½»»»£©

    Èç¹û½ø³ÌÐèÒª½«ÐéÄâÒ³·Åµ½ÎïÀíÄÚ´æÖжø´ËʱÒѾ­Ã»ÓпÕÏеÄÎïÀíÒ³£¬²Ù×÷ϵͳ±ØÐë·ÏÆúÎïÀí¿Õ¼äÖеÄÁíÒ»Ò³£¬Îª¸ÃÒ³Èóö¿Õ¼ä¡£

    Èç¹ûÎïÀíÄÚ´æÖÐÐèÒª·ÏÆúµÄÒ³À´×Ô´ÅÅÌÉϵÄÓ³Ïñ»òÕßÊý¾ÝÎļþ£¬¶øÇÒûÓб»Ð´¹ýËùÒÔ²»ÐèÒª´æ´¢£¬Ôò¸ÃÒ³±»·ÏÆú¡£Èç¹û½ø³ÌÓÖÐèÒª¸ÃÒ³£¬Ëü¿ÉÒÔ´ÓÓ³Ïñ»òÊý¾ÝÎļþÖÐÔٴμÓÔØµ½ÄÚ´æÖС£

    µ«ÊÇ£¬Èç¹û¸ÃÒ³ÒѾ­±»¸Ä±ä£¬²Ù×÷ϵͳ±ØÐë±£ÁôËüµÄÄÚÈÝÒÔ±ãÒÔºó½øÐзÃÎÊ¡£ÕâÖÖÒ²½Ð×ö < dirty page £¬µ±Ëü´ÓÎïÀíÄÚ´æÖÐ·ÏÆúʱ£¬±»´æµ½Ò»ÖÖ½Ð×ö½»»»ÎļþµÄÌØÊâÎļþÖС£ÒòΪ·ÃÎʽ»»»ÎļþµÄËٶȺͷÃÎÊ´¦ÀíÆ÷ÒÔ¼°ÎïÀíÄÚ´æµÄËÙ¶ÈÏà±ÈºÜÂý£¬²Ù×÷ϵͳ±ØÐëÅжÏÊǽ«Êý¾Ýҳдµ½´ÅÅÌÉÏ»¹Êǽ«ËüÃDZ£ÁôÔÚÄÚ´æÖÐÒÔ±ãÏ´ηÃÎÊ¡£

    Èç¹û¾ö¶¨ÄÄЩҳÐèÒª·ÏÆú»òÕß½»»»µÄË㷨ЧÂʲ»¸ß£¬Ôò»á·¢Éúµßô¤£¨ < thrashing £©¡£Õâʱ£¬Ò³²»¶ÏµØ±»Ð´µ½´ÅÅÌÉÏ£¬ÓÖ±»¶Á»Ø£¬²Ù×÷ϵͳ¹ýÓÚ·±Ã¦¶øÎÞ·¨Ö´ÐÐʵ¼ÊµÄ¹¤×÷¡£ÀýÈçÔÚͼ < 3.1 ÖУ¬Èç¹ûÎïÀíÒ³ºÅ < 1 ¾­³£±»·ÃÎÊ£¬ÄÇô¾Í²»Òª½«Ëü½»»»µ½Ó²ÅÌÉÏ¡£½ø³ÌÕýÔÚʹÓõÄÒ²½Ð×ö¹¤×÷¼¯ (working set) ¡£ÓÐЧµÄ½»»»·½°¸Ó¦¸Ã±£Ö¤ËùÓнø³ÌµÄ¹¤×÷¼¯¶¼ÔÚÎïÀíÄÚ´æÖС£

    Linux ʹÓà < LRU £¨ Least Recently Used ×î½ü×îÉÙʹÓ㩵ÄÒ³Ãæ¼¼ÊõÀ´¹«Æ½µØÑ¡ÔñÐèÒª´ÓϵͳÖÐ·ÏÆúµÄÒ³Ãæ¡£ÕâÖÖ·½°¸½«ÏµÍ³ÖеÄÿһҳ¶¼¸³ÓèÒ»¸öÄêÁ䣬Õâ¸öÄêÁäÔÚÒ³Ãæ´æÈ¡Ê±¸Ä±ä¡£Ò³Ãæ·ÃÎÊÔ½¶à£¬Äê¼ÍÔ½ÇᣬԽÉÙ·ÃÎÊ£¬Äê¼ÍÔ½ÀÏÔ½³Â¾É¡£³Â¾ÉµÄÒ³ÃæÊǽ»»»µÄºÃºòÑ¡¡£

3.1.3 Shared Vitual Memory £¨¹²ÏíÐéÄâÄڴ棩

    ÐéÄâÄÚ´æÊ¹¶à¸ö½ø³Ì¿ÉÒÔ·½±ãµØ¹²ÏíÄÚ´æ¡£ËùÓеÄÄÚ´æ·ÃÎʶ¼ÊÇͨ¹ýÒ³±í£¬Ã¿Ò»¸ö½ø³Ì¶¼ÓÐ×Ô¼ºµÄÒ³±í¡£¶ÔÓÚÁ½¸ö¹²ÏíÒ»¸öÎïÀíÄÚ´æÒ³µÄ½ø³Ì£¬Õâ¸öÎïÀíÒ³±àºÅ±ØÐë³öÏÖÔÚÁ½¸ö½ø³ÌµÄÒ³±íÖС£

    ͼ 3.1 ÏÔʾÁËÁ½¸ö¹²ÏíÎïÀíÒ³ºÅ 4 µÄ½ø³Ì¡£¶ÔÓÚ½ø³Ì X ÐéÄâÒ³ºÅÊÇ 4 £¬¶ø¶ÔÓÚ½ø³Ì Y ÐéÄâÒ³ºÅÊÇ 6 ¡£ÕâÒ²±íÃ÷Á˹²ÏíÒ³µÄÒ»¸öÓÐȤµÄµØ·½£º¹²ÏíµÄÎïÀíÒ³²»±Ø´æÔÚ¹²ÏíËüµÄ½ø³ÌµÄÐéÄâÄÚ´æ¿Õ¼äµÄͬһ¸öµØ·½¡£

3.1.4 Physical and Vitual Addressing Modes £¨ÎïÀíºÍÐéÄâѰַģʽ£©

    ¶ÔÓÚ²Ù×÷ϵͳ±¾Éí¶øÑÔ£¬ÔËÐÐÔÚÐéÄâÄÚ´æÖÐûÓÐʲôÒâÒå¡£Èç¹û²Ù×÷ϵͳ±ØÐëά»¤×ÔÉíµÄÒ³±í£¬Õ⽫»áÊÇÒ»³¡Ø¬ÃΡ£´ó¶àÊý¶àÓÃ;µÄ´¦ÀíÆ÷ͬʱ֧³ÖÎïÀíµØÖ·Ä£Ê½ºÍÐéÄâµØÖ·Ä£Ê½¡£ÎïÀíѰַģʽ²»ÐèÒªÒ³±í£¬´¦ÀíÆ÷ÔÚÕâÖÖģʽϲ»ÐèÒª½øÐÐÈκεØÖ·×ª»»¡£ < Linux ºËÐÄÔËÐÐÔÚÎïÀíµØÖ·Ä£Ê½¡£

    Alpha AXP ´¦ÀíÆ÷ûÓÐÌØÊâµÄÎïÀíѰַģʽ¡£Ëü½«ÄÚ´æ¿Õ¼ä·ÖΪ¼¸¸öÇø£¬½«ÆäÖÐÁ½¸öÖ¸¶¨ÎªÎïÀíÓ³ÉäµØÖ·Çø¡£ºËÐĵĵØÖ·¿Õ¼ä½Ð×ö < KSEG µØÖ·¿Õ¼ä£¬°üÀ¨´Ó < 0xfffffc0000000000 ÏòÉϵÄËùÓеØÖ·¡£ÎªÁËÖ´ÐÐÁ¬½ÓÔÚ KSEG µÄ´úÂ루ºËÐÄ´úÂ룩»òÕß·ÃÎÊÄÇÀïµÄÊý¾Ý£¬´úÂë±ØÐëÔÚºËÐÄִ̬ÐС£ Alpha É쵀 Linux ºËÐÄÁ¬½Óµ½´ÓµØÖ· 0xfffffc0000310000 Ö´ÐС£

3.1.5 Access Control £¨·ÃÎÊ¿ØÖÆ£© ¡¡

    Ò³±íÌõĿҲ°üÀ¨·ÃÎÊ¿ØÖÆÐÅÏ¢¡£µ±´¦ÀíÆ÷ʹÓÃÒ³±íÌõÄ¿½«½ø³ÌµÄÐéÄâµØÖ·Ó³Éäµ½ÎïÀíµØÖ·µÄʱºò£¬ËüºÜÈÝÒ×ÀûÓ÷ÃÎÊ¿ØÖÆÐÅÏ¢¿ØÖƽø³Ì²»ÒªÓò»ÔÊÐíµÄ·½Ê½½øÐзÃÎÊ¡£

    ÓкܶàÔ­ÒòÄãÏ£ÍûÏÞÖÆ¶ÔÓÚÄÚ´æÇøÓòµÄ·ÃÎÊ¡£Ò»Ð©Äڴ棬±ÈÈç°üº¬Ö´ÐдúÂ룬±¾ÖÊÉÏÊÇÖ»¶ÁµÄ´úÂ룬²Ù×÷ϵͳӦ¸Ã½ûÖ¹½ø³ÌдËüµÄÖ´ÐдúÂë¡£·´¹ýÀ´£¬°üÀ¨Êý¾ÝµÄÒ³¿ÉÒÔд£¬µ«ÊÇÈç¹ûÊÔͼִÐÐÕâ¶ÎÄÚ´æÓ¦¸Ãʧ°Ü¡£´ó¶àÊý´¦ÀíÆ÷ÓÐÁ½ÖÖÖ´ÐÐ״̬£ººËÐÄ̬ºÍÓû§Ì¬¡£Ä㲻ϣÍûÓû§Ö±½ÓÖ´ÐкËÐÄ̬µÄ´úÂë»òÕß´æÈ¡ºËÐÄÊý¾Ý½á¹¹£¬³ý·Ç´¦ÀíÆ÷ÔËÐÐÔÚºËÐÄ̬¡£

    ·ÃÎÊ¿ØÖÆÐÅÏ¢·ÅÔÚ PTE £¨ page table entry £©ÖУ¬¶øÇҺ;ßÌå´¦ÀíÆ÷Ïà¹Ø¡£Í¼ 3.2 ÏÔʾÁË Alpha AXP µÄ PTE ¡£¸÷¸öλÒâÒåÈçÏ£º

V ÓÐЧ£¬Õâ¸ö < PTE ÊÇ·ñÓÐЧ

FOE ¡° < Fault on Execute ¡± < ÊÔͼִÐб¾Ò³´úÂëʱ£¬´¦ÀíÆ÷ÊÇ·ñÒª±¨¸æ < page fault £¬²¢½«¿ØÖÆÈ¨´«µÝ¸ø²Ù×÷ϵͳ¡£

£Æ£Ï£×¡¡¡° Fault on Write¡± ÈçÉÏ£¬ÔÚÊÔͼд±¾Ò³Ê±²úÉú page fault

FOR ¡° < fault on read ¡± ÈçÉÏ£¬ÔÚÊÔͼ¶Á±¾Ò³Ê±²úÉú page fault

ASM µØÖ·¿Õ¼äÆ¥Åä¡£ÓÃÓÚ²Ù×÷ϵͳÇå³ýת»»»º³åÇøÖеIJ¿·ÖÌõÄ¿

KRE ºËÐÄ̬µÄ´úÂë¿ÉÒÔ¶Á±¾Ò³

URE Óû§Ì¬µÄ´úÂë¿ÉÒÔ¶Á±¾Ò³

GII ¼ä¸ôÒò×Ó£¬ÓÃÓÚ½«Ò»Õû¿éÓ³Éäµ½Ò»¸öת»»»º³åÌõÄ¿¶ø·Ç¶à¸ö¡£

KWE ºËÐÄ̬µÄ´úÂë¿ÉÒÔд±¾Ò³

UWE Óû§Ì¬µÄ´úÂë¿ÉÒÔд±¾Ò³

Page frame number ¶ÔÓÚ V λÓÐЧµÄ PTE £¬°üÀ¨Á˱¾ PTE µÄÎïÀíÒ³±àºÅ£»¶ÔÓÚÎÞЧµÄ PTE £¬Èç¹û²»ÊÇ 0 £¬°üÀ¨Á˱¾Ò³ÊÇ·ñÔÚ½»»»ÎļþµÄÐÅÏ¢¡£

ÒÔÏÂÁ½Î»ÓÉ Linux ¶¨Ò岢ʹÓÃ

_PAGE_DIRTY Èç¹ûÉèÖ㬱¾Ò³ÐèҪдµ½½»»»ÎļþÖС£

_PAGE_ACCESSED Linux ʹÓ㬱êÖ¾Ò»Ò³ÒѾ­·ÃÎʹý

3.2 Caches £¨¸ßËÙ»º´æ£©

    Èç¹ûÄãÓÃÒÔÉÏÀíÂÛÄ£ÐÍÀ´ÊµÏÖÒ»¸öϵͳ£¬Ëü¿ÉÒÔ¹¤×÷£¬µ«ÊDz»»áÌ«¸ßЧÂÊ¡£²Ù×÷ϵͳºÍ´¦ÀíÆ÷µÄÉè¼ÆÊ¦¶¼¾¡Á¦ÈÃϵͳÐÔÄܸü¸ß¡£³ýÁËʹÓøü¿ìµÄ´¦ÀíÆ÷¡¢ÄÚ´æµÈ£¬×îºÃµÄ·½·¨ÊÇά»¤ÓÐÓÃÐÅÏ¢ºÍÊý¾ÝµÄ¸ßËÙ»º´æ£¬Õâ»áʹһЩ²Ù×÷¸ü¿ì¡£ < Linux ʹÓÃÁËһϵÁк͸ßËÙ»º´æÏà¹ØµÄÄÚ´æ¹ÜÀí¼¼Êõ£º

    Buffer Cache £º Buffer cache °üº¬ÁËÓÃÓÚ¿éÉ豸Çý¶¯³ÌÐòµÄÊý¾Ý»º³åÇø¡£ÕâЩ»º³åÇø´óС¹Ì¶¨£¨ÀýÈç 512 ×Ö½Ú£©£¬°üÀ¨´Ó¿éÉ豸¶Á³öµÄÊý¾Ý»òÕßҪдµ½¿éÉ豸µÄÊý¾Ý¡£¿éÉ豸ÊÇÖ»ÄÜͨ¹ý¶Áд¹Ì¶¨´óСµÄÊý¾Ý¿éÀ´·ÃÎʵÄÉ豸¡£ËùÓеÄÓ²Å̶¼ÊÇ¿éÉ豸¡£¿éÉ豸ÓÃÉ豸±êʶ·ûºÍÒª·ÃÎʵÄÊý¾Ý¿é±àºÅ×÷ΪË÷Òý£¬ÓÃÀ´¿ìËÙ¶¨Î»Êý¾Ý¿é¡£¿éÉ豸ֻÄÜͨ¹ý < buffer cache ´æÈ¡¡£Èç¹ûÊý¾Ý¿ÉÒÔÔÚ < buffer cache ÖÐÕÒµ½£¬ÄǾͲ»ÐèÒª´ÓÎïÀí¿éÉ豸ÈçÓ²ÅÌÉ϶ÁÈ¡£¬´Ó¶øÊ¹·ÃÎʼӿ졣

²Î¼û fs/buffer.c

    Page Cache ÓÃÀ´¼Ó¿ì¶Ô´ÅÅÌÉÏÓ³ÏñºÍÊý¾ÝµÄ·ÃÎÊ¡£ËüÓÃÓÚ»º´æÎļþµÄÂß¼­ÄÚÈÝ£¬Ò»´ÎÒ»Ò³£¬²¢Í¨¹ýÎļþºÍÎļþÄ򵀮«ÒÆÀ´·ÃÎÊ¡£µ±Êý¾ÝÒ³´Ó´ÅÅ̶Áµ½ÄÚ´æÖÐʱ£¬±»»º´æµ½ < page cache ÖС£

²Î¼û mm/filemap.c

    Swap Cache Ö»Óи͝¹ýµÄ£¨»òÔà dirty £©Ò³²Å´æÔÚ½»»»ÎļþÖС£Ö»ÒªËüÃÇдµ½½»»»ÎļþÖ®ºóûÓÐÔÙ´ÎÐ޸ģ¬ÏÂÒ»´ÎÕâЩҳÐèÒª½»»»³öÀ´µÄʱºò£¬¾Í²»ÐèÒªÔÙдµ½½»»»ÎļþÖУ¬ÒòΪ¸ÃÒ³ÒѾ­ÔÚ½»»»ÎļþÖÐÁË£¬Ö±½Ó·ÏÆú¸ÃÒ³¾Í¿ÉÒÔÁË¡£ÔÚÒ»¸ö½»»»±È½ÏÀ÷º¦µÄϵͳ£¬Õâ»á½ÚÊ¡Ðí¶à²»±ØÒªºÍ¸ß´ú¼ÛµÄ´ÅÅ̲Ù×÷¡£

²Î¼û mm/swap_state.c mm/swapfile.c

    Hardware Cache: Ó²¼þ¸ßËÙ»º´æµÄ³£¼ûµÄʵÏÖ·½·¨ÊÇÔÚ´¦ÀíÆ÷ÀïÃæ£º PTE µÄ¸ßËÙ»º´æ¡£ÕâÖÖÇé¿öÏ£¬´¦ÀíÆ÷²»ÐèÒª×ÜÊÇÖ±½Ó¶ÁÒ³±í£¬¶øÔÚÐèҪʱ°Ñҳת»»±í·ÅÔÚ»º´æÇøÀï¡£ < CPU ÀïÓÐת»»±í»º³åÇø < (TLB Translation Look-aside Buffers) £¬·ÅÖÃÁËϵͳÖÐÒ»¸ö»ò¶à¸ö½ø³ÌµÄÒ³±íÌõÄ¿µÄ»º´æµÄ¿½±´¡£

    µ±ÒýÓÃÐéÄâµØÖ·Ê±£¬´¦ÀíÇøÊÔͼÔÚ TLB ÖÐѰÕÒ¡£Èç¹ûÕÒµ½ÁË£¬Ëü¾ÍÖ±½Ó½«ÐéÄâµØÖ·×ª»»µ½ÎïÀíµØÖ·£¬½ø¶ø¶ÔÊý¾ÝÖ´ÐÐÕýÈ·µÄ²Ù×÷¡£Èç¹ûÕÒ²»µ½£¬Ëü¾ÍÐèÒª²Ù×÷ϵͳµÄ°ïÖú¡£ËüÓÃÐźÅ֪ͨ²Ù×÷ϵͳ£¬·¢ÉúÁË < TLB missing ¡£Ò»¸öºÍϵͳÏà¹ØµÄ»úÖÆ½«Õâ¸öÒ쳣תµ½²Ù×÷ϵͳÏàÓ¦µÄ´úÂëÀ´´¦Àí¡£²Ù×÷ϵͳΪÕâ¸öµØÖ·Ó³ÉäÉú³ÉÐ嵀 < TLB ÌõÄ¿¡£µ±Òì³£Çå³ýÖ®ºó£¬´¦ÀíÆ÷Ôٴγ¢ÊÔת»»ÐéÄâµØÖ·£¬ÕâÒ»´Î½«»á³É¹¦ÒòΪ TLB ÖиõØÖ·ÓÐÁËÒ»¸öÓÐЧµÄÌõÄ¿¡£

    ¸ßËÙ»º´æµÄ¸±×÷Ó㨲»¹ÜÊÇÓ²¼þ»òÆäËû·½Ê½µÄ£©ÔÚÓÚ Linux ±ØÐ뻨´óÁ¿Ê±¼äºÍ¿Õ¼äÀ´Î¬»¤ÕâЩ¸ßËÙ»º´æÇø£¬Èç¹ûÕâЩ¸ßËÙ»º´æÇø±ÀÀ££¬ÏµÍ³Ò²»á±ÀÀ£¡£

3.3 Linux Page Tables £¨ Linux Ò³±í£© ¡¡

    Linux ¼Ù¶¨ÁËÈý¼¶Ò³±í¡£·ÃÎʵÄÿһ¸öÒ³±í°üÀ¨ÁËÏÂÒ»¼¶Ò³±íµÄÒ³±àºÅ¡£Í¼ 3.3 ÏÔʾÁËÒ»¸öÐéÄâµØÖ·ÈçºÎ·ÖΪһϵÁÐ×ֶΣºÃ¿Ò»¸ö×Ö¶ÎÌṩÁËÔÚÒ»¸öÒ³±íÖÐµÄÆ«ÒÆÁ¿¡£ÎªÁ˽«ÐéÄâµØÖ·×ª»»ÎªÎïÀíµØÖ·£¬´¦ÀíÆ÷±ØÐëÈ¡µÃÿһ¼¶×ֶεÄÄÚÈÝ£¬×ª»»Îª°üÀ¨¸ÃÒ³±íµÄÎïÀíÒ³Ä򵀮«ÒÆ£¬È»ºó¶ÁÈ¡ÏÂÒ»¼¶Ò³±íµÄÒ³±àºÅ¡£Öظ´Èý´ÎÖ±µ½°üÀ¨ÐéÄâµØÖ·µÄÎïÀíµØÖ·µÄÒ³±àºÅÕÒµ½ÎªÖ¹¡£È»ºóÓÃÐéÄâµØÖ·ÖеÄ×îºóÒ»¸ö×ֶΣº×Ö½ÚÆ«ÒÆÁ¿£¬ÔÚÒ³ÄÚ²éÕÒÊý¾Ý¡£

    Linux ÔËÐеÄÿһ¸öƽ̨¶¼±ØÐëÌṩת»»ºê£¬ÈúËÐÄ´¦ÀíÌØ¶¨½ø³ÌµÄÒ³±í¡£ÕâÑù£¬ºËÐIJ»ÐèÒªÖªµÀÒ³±íÌõÄ¿µÄ¾ßÌå½á¹¹»òÕßÈçºÎ×éÖ¯¡£Í¨¹ýÕâÖÖ·½Ê½£¬ < Linux ³É¹¦µØÊ¹ÓÃÁËÏàͬµÄÒ³±í´¦Àí³ÌÐòÓÃÓÚ < Alpha ºÍ Intel x86 ´¦ÀíÆ÷£¬ÆäÖÐ < Alpha ʹÓÃÈý¼¶Ò³±í£¬¶ø < Intel ʹÓöþ¼¶Ò³±í¡£

²Î¼û include/asm/pgtable.h

3.4 Page Allocation and Deallocation ( Ò³µÄ·ÖÅäºÍ»ØÊÕ )

    ϵͳÖжÔÓÚÎïÀíÒ³ÓдóÁ¿µÄÐèÇó¡£ÀýÈ磬µ±³ÌÐòÓ³Ïñ¼ÓÔØµ½ÄÚ´æÖеÄʱºò£¬²Ù×÷ϵͳÐèÒª·ÖÅäÒ³¡£µ±³ÌÐò½áÊøÖ´Ðв¢Ð¶ÔØÊ±ÐèÒªÊÍ·ÅÕâЩҳ¡£ÁíÍâΪÁË´æ·ÅºËÐÄÏà¹ØµÄÊý¾Ý½á¹¹±ÈÈçÒ³±í×ÔÉí£¬Ò²ÐèÒªÎïÀíÒ³¡£ÕâÖÖÓÃÓÚ·ÖÅäºÍ»ØÊÕÒ³µÄ»úÖÆºÍÊý¾Ý½á¹¹¶ÔÓÚά»¤ÐéÄâÄÚ´æ×ÓϵͳµÄЧÂÊÒ²ÐíÊÇ×îÖØÒªµÄ¡£

    ϵͳÖеÄËùÓеÄÎïÀíÒ³¶¼Ê¹Óà mem_map Êý¾Ý½á¹¹À´ÃèÊö¡£ÕâÊÇÒ»¸ö mem_map_t ½á¹¹µÄÁ´±í£¬ÔÚÆô¶¯Ê±½øÐгõʼ»¯¡£Ã¿Ò»¸ö mem_map_t £¨ÈÝÒ×»ìÏýµÄÊÇÕâ¸ö½á¹¹Ò²±»³ÆÎª page ½á¹¹£©½á¹¹ÃèÊöϵͳÖеÄÒ»¸öÎïÀíÒ³¡£ÖØÒªµÄ×ֶΣ¨ÖÁÉÙ¶ÔÓÚÄÚ´æ¹ÜÀí¶øÑÔ£©ÊÇ£º

²Î¼û include/linux/mm.h

count ±¾Ò³Óû§ÊýÄ¿¡£Èç¹û±¾Ò³Óɶà¸ö½ø³Ì¹²Ïí£¬¼ÆÊýÆ÷´óÓÚ 1 ¡£

Age ÃèÊö±¾Ò³µÄÄêÁä¡£ÓÃÓÚ¾ö¶¨±¾Ò³ÊÇ·ñ¿ÉÒÔ·ÏÆú»ò½»»»³öÈ¥¡£

Map_nr mem_map_t ÃèÊöµÄÎïÀíÒ³±àºÅ¡£

    Ò³·ÖÅä´úÂëʹÓà free_area ÏòÁ¿À´²éÕÒ¿ÕÏеÄÒ³¡£Õû¸ö»º³å¹ÜÀí·½°¸ÓÃÕâÖÖ»úÖÆÀ´Ö§³Ö¡£Ö»ÒªÓÃÁËÕâÖÖ´úÂ룬´¦ÀíÆ÷ʹÓõÄÒ³µÄ´óСºÍÎïÀíÒ³µÄ»úÖÆ¾Í¿ÉÒÔÎ޹ء£

    ÿһ¸ö free_area µ¥Ôª°üÀ¨Ò³¿éµÄÐÅÏ¢¡£Êý×éÖеĵÚÒ»¸öµ¥ÔªÃèÊöÁ˵¥Ò³£¬ÏÂÒ»¸öÊÇ 2 Ò³´óСµÄ¿é£¬ÏÂÒ»¸öÊÇ 4 Ò³´óСµÄ¿é£¬ÒÔ´ËÀàÍÆ£¬ÒÀ´ÎÏòÉ϶¼ÊÇ 2 µÄ±¶Êý¡£Õâ¸öÁ´±íµ¥ÔªÓÃ×÷¶ÓÁеĿªÍ·£¬ÓÐÖ¸Ïò mem_map Êý×éÖÐÒ³µÄÊý¾Ý½á¹¹µÄÖ¸Õë¡£¿ÕÏеÄÒ³¿éÔÚÕâÀïÅŶӡ£ Map ÊÇÒ»¸ö¸ú×ÙÕâô´óСµÄÒ³µÄ·ÖÅä×éµÄλͼ¡£Èç¹ûÒ³¿éÖÐµÄµÚ < N ¿é¿ÕÏУ¬ÔòλͼÖÐµÄµÚ < N λÖÃλ¡£

    ͼ 3.4 ÏÔʾÁË free_area ½á¹¹¡£µ¥Ôª 0 ÓÐÒ»¸ö¿ÕÏÐÒ³£¨Ò³±àºÅ 0 £©£¬µ¥Ôª 2 ÓÐ 2 ¸ö 4 Ò³µÄ¿ÕÏп飬µÚÒ»¸öÆðʼÓÚÒ³±àºÅ 4 £¬µÚ¶þ¸öÆðʼÓÚÒ³±àºÅ 56 ¡£

3.4.1 Page Allocation ( Ò³·ÖÅä )


²Î¼û mm/page_alloc.c get_free_pages()

    Linux ʹÓà < Buddy Ëã·¨ÓÐЧµØ·ÖÅäºÍ»ØÊÕÒ³¿é¡£Ò³·ÖÅä´úÂëÊÔͼ·ÖÅäÒ»¸öÓÉÒ»¸ö»ò¶à¸öÎïÀíÒ³×é³ÉµÄ¿é¡£Ò³·ÖÅäʹÓà < 2 µÄÃÝÊý´óСµÄ¿é¡£ÕâÒâζ×Å¿ÉÒÔ·ÖÅä < 1 Ò³´óС£¬ < 2 Ò³´óС£¬ < 4 Ò³´óСµÄ¿é£¬ÒÀ´ËÀàÍÆ¡£Ö»ÒªÏµÍ³ÓÐÂú×ãÐèÒªµÄ×ã¹»µÄ¿ÕÏÐÒ³£¨ nr_free_pages > min_free_pages £©£¬·ÖÅä´úÂë¾Í»áÔÚ < free_area ÖвéÕÒÂú×ãÐèÒª´óСµÄÒ»¸öÒ³¿é¡£ Free_area ÖеÄÿһ¸öµ¥Ôª¶¼ÓÐÃèÊö×ÔÉí´óСµÄÒ³¿éµÄÕ¼ÓúͿÕÏÐÇé¿öµÄλͼ¡£ÀýÈ磬Êý×éÖÐµÄµÚ < 2 ¸öµ¥ÔªÓµÓÐÃèÊö < 4 Ò³´óСµÄ¿éµÄ¿ÕÏкÍÕ¼ÓõķÖÅäͼ¡£

    Õâ¸öËã·¨Ê×ÏÈÕÒËüÇëÇó´óСµÄÄÚ´æÒ³¿é¡£Ëü¸ú×Ù free_area Êý¾Ý½á¹¹ÖÐµÄ list µ¥Ôª¶ÓÁÐÖеĿÕÏÐÒ³µÄÁ´±í¡£Èç¹ûÇëÇó´óСµÄÒ³¿éûÓпÕÏУ¬¾ÍÕÒÏÂÒ»¸ö³ß´çµÄ¿é£¨ < 2 ±¶ÓÚÇëÇóµÄ´óС£©¡£¼ÌÐøÕâÒ»¹ý³ÌÒ»Ö±µ½±éÀúÁËËùÓÐµÄ free_area »òÕßÕÒµ½ÁË¿ÕÏÐÒ³¿é¡£Èç¹ûÕÒµ½µÄÒ³¿é´óÓÚÇëÇóµÄÒ³¿é£¬Ôò¸Ã¿é½«±»·Ö¿ª³ÉΪºÏÊÊ´óСµÄ¿é¡£ÒòΪËùÓеĿ鶼ÊÇ < 2 µÄÃݴεÄÒ³Êý×é³É£¬ËùÒÔÕâ¸ö·Ö¸îµÄ¹ý³Ì±È½Ï¼òµ¥£¬ÄãÖ»ÐèÒª½«Ëüƽ·Ö¾Í¿ÉÒÔÁË¡£¿ÕÏеĿéÔò·Åµ½Êʵ±µÄ¶ÓÁУ¬¶ø·ÖÅäµÄÒ³¿éÔò·µ»Ø¸øµ÷ÓÃÕß¡£

    ÀýÈçÔÚͼ 3.4 ÖУ¬Èç¹ûÇëÇó 2 Ò³µÄÊý¾Ý¿é£¬µÚÒ»¸ö 4 Ò³¿é£¨ÆðʼÓÚÒ³±àºÅ 4 £©½«»á±»·ÖΪÁ½¸ö 2 Ò³¿é¡£ÆðʼÓÚÒ³ºÅ 4 µÄµÚÒ»¸ö 2 Ò³¿é½«»á±»·µ»Ø¸øµ÷ÓÃÕߣ¬¶øµÚ¶þ¸ö 2 Ò³¿é£¨ÆðʼÓÚÒ³ºÅ 6 £©½«»áÅÅÔÚ free_area Êý×éÖеĵ¥Ôª 1 ÖÐ 2 Ò³¿ÕÏпéµÄ¶ÓÁÐÖС£

3.4.2 Page Deallocation £¨Ò³»ØÊÕ£©

    ·ÖÅäÒ³¿éµÄ¹ý³ÌÖн«´óµÄÒ³¿é·ÖΪСµÄÒ³¿é£¬½«»áʹÄÚ´æ¸üΪÁãÉ¢¡£Ò³»ØÊյĴúÂëÖ»Òª¿ÉÄܾͰÑÒ³Áª³É´óµÄÒ³¿é¡£Æäʵҳ¿éµÄ´óСºÜÖØÒª£¨ < 2 µÄÃÝÊý£©£¬ÒòΪÕâÑù²ÅÄܺÜÈÝÒ×½«Ò³¿é×é³É´óµÄÒ³¿é¡£

    Ö»ÒªÒ»¸öÒ³¿é»ØÊÕ£¬¾Í¼ì²éËüµÄÏàÁÚ»òÒ»ÆðµÄͬÑù´óСµÄÒ³¿éÊÇ·ñ¿ÕÏС£Èç¹ûÊÇÕâÑù£¬¾Í°ÑËüºÍÐÂÊͷŵÄÒ³¿éÒ»Æð×é³ÉÒÔÒ»¸öеÄÏÂÒ»¸ö´óСµÄ¿ÕÏÐÒ³¿é¡£Ã¿Ò»´ÎÁ½¸öÄÚ´æÒ³¿é×éºÏ³ÉΪ¸ü´óµÄÒ³¿éʱ£¬Ò³»ØÊÕ´úÂë¶¼ÒªÊÔͼ½«Ò³¿éºÏ²¢³ÉΪ¸ü´óµÄ¿é¡£ÕâÑù£¬¿ÕÏеÄÒ³¿é¾Í»á¾¡¿ÉÄܵĴó¡£

    ÀýÈ磬ÔÚͼ 3.4 £¬Èç¹ûÒ³ºÅ 1 ÊÍ·Å£¬ÄÇôËü»áºÍÒѾ­¿ÕÏеÄÒ³ºÅ 0 Ò»Æð×éºÏ²¢·ÅÔÚ free_area µÄµ¥Ôª 1 ÖпÕÏÐµÄ 2 Ò³¿é¶ÓÁÐÖС£

3.5 Memory Mapping £¨ÄÚ´æÓ³É䣩

    µ±Ò»¸öÓ³ÏñÖ´ÐÐʱ£¬Ö´ÐÐÓ³ÏñµÄÄÚÈݱØÐë·ÅÔÚ½ø³ÌµÄÐéÄâµØÖ·¿Õ¼äÖС£¶ÔÓÚÖ´ÐÐÓ³ÏñÁ¬½Óµ½µÄÈÎÒâ¹²Ïí¿â£¬Çé¿öÒ²ÊÇÒ»Ñù¡£Ö´ÐÐÎļþʵ¼Ê²¢Ã»Óзŵ½ÎïÀíÄڴ棬¶øÖ»ÊDZ»Á¬½Óµ½½ø³ÌµÄÐéÄâÄÚ´æ¡£ÕâÑù£¬Ö»ÒªÔËÐгÌÐòÒýÓÃÁËÓ³ÏñµÄ²¿·Ö£¬Õⲿ·ÖÓ³Ïñ¾Í´ÓÖ´ÐÐÎļþÖмÓÔØµ½ÄÚ´æÖС£ÕâÖÖÓ³ÏñºÍ½ø³ÌÐéÄâµØÖ·¿Õ¼äµÄÁ¬½Ó½Ð×öÄÚ´æÓ³Éä¡£

    ÿһ¸ö½ø³ÌµÄÐéÄâÄÚ´æÓÃÒ»¸ö mm_struct Êý¾Ý½á¹¹±íʾ¡£Õâ°üÀ¨µ±Ç°Ö´ÐеÄÓ³ÏñµÄÐÅÏ¢£¨ÀýÈç bash £©ºÍÖ¸ÏòÒ»×é vm_area_struct ½á¹¹µÄÖ¸Õ롣ÿһ¸ö < vm_area_struct µÄÊý¾Ý½á¹¹¶¼ÃèÊöÁËÄÚ´æÇøÓòµÄÆðʼ¡¢½ø³Ì¶ÔÓÚÄÚ´æÇøÓòµÄ·ÃÎÊȨÏ޺ͶÔÓÚÕâ¶ÎÄÚ´æµÄ²Ù×÷¡£ÕâЩ²Ù×÷ÊÇÒ»×éÀý³Ì£¬ < Linux ÓÃÓÚ¹ÜÀíÕâ¶ÎÐéÄâÄÚ´æ¡£ÀýÈçÆäÖÐÒ»ÖÖÐéÄâÄÚ´æ²Ù×÷¾ÍÊǵ±½ø³ÌÊÔͼ·ÃÎÊÕâ¶ÎÐéÄâÄÚ´æÊ±·¢ÏÖ£¨Í¨¹ý page fault £©ÄÚ´æ²»ÔÚÎïÀíÄÚ´æÖÐËù±ØÐëÖ´ÐеÄÕýÈ·²Ù×÷£¬Õâ¸ö²Ù×÷½Ð×ö¡¡ nopage ²Ù×÷¡£ Linux ÇëÇó°ÑÖ´ÐÐÓ³ÏñµÄÒ³¼ÓÔØµ½ÄÚ´æÖеÄʱºòÓõ½ nopage ²Ù×÷¡£

    µ±Ò»¸öÖ´ÐÐÓ³ÏñÓ³Éäµ½½ø³ÌµÄÐéÄâµØÖ·¿Õ¼äʱ£¬²úÉúÒ»×é < vm_area_struct Êý¾Ý½á¹¹¡£Ã¿Ò»¸ö < vm_area_struct ½á¹¹±íʾִÐÐÓ³ÏñµÄÒ»²¿·Ö£ºÖ´ÐдúÂë¡¢³õʼ»¯Êý¾Ý£¨±äÁ¿£©¡¢Î´³õʼ»¯Êý¾ÝµÈµÈ¡£ < Linux Ö§³ÖһϵÁбê×¼µÄÐéÄâÄÚ´æ²Ù×÷£¬µ± < vm_area_struct Êý¾Ý½á¹¹´´½¨Ê±£¬Ò»×éÕýÈ·µÄÐéÄâÄÚ´æ²Ù×÷¾ÍºÍËüÃǹØÁªÔÚÒ»Æð¡£

3.6 Demand Paging

    Ö»ÒªÖ´ÐÐÓ³ÏñÓ³Éäµ½½ø³ÌµÄÐéÄâÄÚ´æÖУ¬Ëü¾Í¿ÉÒÔ¿ªÊ¼ÔËÐС£ÒòΪֻÓÐÓ³ÏñµÄ×ʼµÄ²¿·ÖÊÇ·ÅÔÚÎïÀíÄÚ´æÖУ¬ºÜ¿ì¾Í»á·ÃÎʵ½»¹Ã»ÓзÅÔÚÎïÀíÄÚ´æµÄÐéÄâ¿Õ¼äÇø¡£µ±½ø³Ì·ÃÎÊûÓÐÓÐЧҳ±íÌõÄ¿µÄÐéÄâµØÖ·µÄʱºò£¬´¦ÀíÆ÷Ïò < Linux ±¨¸æ page fault ¡£ Page fault ÃèÊöÁË·¢Éú page fault µÄÐéÄâµØÖ·ºÍÄÚ´æ·ÃÎÊÀàÐÍ¡£

    Linux ±ØÐëÕÒµ½ < page fault ·¢ÉúµÄ¿Õ¼äÇøËù¶ÔÓ¦µÄ < vm_area_struct Êý¾Ý½á¹¹£¨Óà < Adelson-Velskii and Landis AVL Ê÷ÐͽṹÁ¬½ÓÔÚÒ»Æð£©¡£Èç¹ûÕÒ²»µ½Õâ¸öÐéÄâµØÖ·¶ÔÓ¦µÄ vm_area_struct ½á¹¹£¬ËµÃ÷½ø³Ì·ÃÎÊÁË·Ç·¨µÄÐéÄâµØÖ·¡£ < Linux ½«Ïò¸Ã½ø³Ì·¢Ðźţ¬·¢ËÍÒ»¸ö < SIGSEGV Ðźţ¬Èç¹û½ø³ÌûÓд¦ÀíÕâ¸öÐźţ¬Ëü¾Í»áÍ˳ö¡£

²Î¼û handle_mm_fault() in mm/memory.c

    Linux È»ºó¼ì²é < page faul µÄÀàÐͺ͸ÃÐéÄâÄÚ´æÇøËùÔÊÐíµÄ·ÃÎÊÀàÐÍ¡£Èç¹û½ø³ÌÓ÷Ƿ¨µÄ·½Ê½·ÃÎÊÄڴ棬±ÈÈçдһ¸öËüÖ»¿ÉÒÔ¶ÁµÄÇøÓò£¬Ò²»á·¢³öÄÚ´æ´íµÄÐźš£

    ÏÖÔÚ Linux È·¶¨ page fault ÊǺϷ¨µÄ£¬Ëü±ØÐë½øÐд¦Àí¡£ Linux ±ØÐëÇø·ÖÔÚ½»»»ÎļþºÍ´ÅÅÌÓ³ÏñÖеÄÒ³£¬ËüÓ÷¢Éú page fault µÄÐéÄâµØÖ·µÄÒ³±íÌõÄ¿À´È·¶¨¡£

²Î¼û do_no_page() in mm/memory.c

    Èç¹û¸ÃÒ³µÄÒ³±íÌõÄ¿ÊÇÎÞЧµÄµ«·Ç¿Õ£¬´ËÒ³ÊÇÔÚ½»»»ÎļþÖС£¶ÔÓÚ Alpha AXP Ò³±íÌõÄ¿À´½²£¬ÓÐЧλÖÃ뵫ÊÇ < PFN Óò·Ç¿Õ¡£ÕâÖÖÇé¿öÏ < PFN Óò´æ·ÅÁË´ËÒ³ÔÚ½»»»Îļþ£¨ÒÔ¼°ÄÇÒ»¸ö½»»»Îļþ£©ÖеÄλÖá£Ò³ÔÚ½»»»ÎļþÖÐÈçºÎ´¦ÀíÔÚ±¾ÕºóÃæÌÖÂÛ¡£

    ²¢·ÇËùÓÐµÄ vm_area_struct Êý¾Ý½á¹¹¶¼ÓÐÒ»ÕûÌ×ÐéÄâÄÚ´æ²Ù×÷£¬¶øÇÒÄÇЩÓÐÌØÊâµÄÄÚ´æ²Ù×÷µÄÒ²¿ÉÄÜûÓÐ < nopang ²Ù×÷¡£ÒòΪȱʡÇé¿öÏ£¬¶ÔÓÚ < nopage ²Ù×÷£¬ < Linux »á·ÖÅäÒ»¸öеÄÎïÀíÒ³²¢´´½¨ÓÐЧµÄÒ³±íÌõÄ¿¡£Èç¹ûÕâÒ»¶ÎÐéÄâÄÚ´æÓÐÌØÊâµÄ nopage ²Ù×÷£¬ Linux »áµ÷ÓÃÕâ¸öÌØÊâµÄ´úÂë¡£

    ͨ³£µÄ Linux nopage ²Ù×÷ÓÃÓÚ¶ÔÖ´ÐÐÓ³ÏñµÄÄÚ´æÓ³É䣬²¢Ê¹Óà page cache ½«ÇëÇóµÄÓ³ÏñÒ³¼ÓÔØµ½ÎïÀíÄÚ´æÖС£ËäÈ»ÔÚÇëÇóµÄÒ³µ÷ÈëµÄÎïÀíÄÚ´æÖÐÒԺ󣬽ø³ÌµÄÒ³±íµÃµ½¸üУ¬µ«ÊÇÒ²ÐíÐèÒª±ØÒªµÄÓ²¼þ¶¯×÷À´¸üÐÂÕâЩÌõÄ¿£¬ÌرðÊÇÈç¹û´¦ÀíÆ÷ʹÓÃÁË < TLB ¡£¼ÈÈ» page fault µÃµ½ÁË´¦Àí£¬¾Í¿ÉÒÔÈÓÔÚÒ»±ß£¬½ø³ÌÔÚÒýÆðÐéÄâÄÚ´æ·ÃÎÊ´íÎóµÄÖ¸ÁîÄÇÀïÖØÐÂÔËÐС£

²Î¼û mm/filemap.c ÖÐ filemap_nopage()

3.7 The Linux Page Cache

    Linux µÄ < page cache µÄ×÷ÓÃÊǼÓËÙ¶ÔÓÚ´ÅÅÌÎļþµÄ·ÃÎÊ¡£ÄÚ´æÓ³ÉäÎļþÿһ´Î¶ÁÈëÒ»Ò³£¬ÕâЩҳ±»´æ·ÅÔÚ page cache ÖС£Í¼ < 3.6 ÏÔʾÁË page cache £¬°üÀ¨Ò»¸öÖ¸Ïò < mem_map_t Êý¾Ý½á¹¹µÄÖ¸ÕëÏòÁ¿£º < page_hash_table ¡£ < Linux ÖеÄÿһ¸öÎļþ¶¼ÓÃÒ»¸ö < VFS inode µÄÊý¾Ý½á¹¹±êʾ£¨ÔÚµÚ < 9 ÕÂÃèÊö£©£¬Ã¿Ò»¸ö VFS I ½Úµã¶¼ÊÇΨһµÄ²¢¿ÉÒÔÍêȫȷ¶¨Î¨Ò»µÄÒ»¸öÎļþ¡£Ò³±íµÄË÷ÒýÈ¡×Ô VFS µÄ I ½ÚµãºÅºÍÎļþÖÐµÄÆ«ÒÆ¡£

²Î¼û linux/pagemap.h

    µ±Ò»Ò³µÄÊý¾Ý´ÓÄÚ´æÓ³ÉäÎļþÖжÁ³ö£¬ÀýÈçµ± demand paging ʱÐèÒª·Åµ½ÄÚ´æÖеÄʱºò£¬´Ëҳͨ¹ý < page cache ÖжÁ³ö¡£Èç¹û´ËÒ³ÔÚ»º´æÖУ¬¾Í·µ»ØÒ»¸öÖ¸Ïò mem_map_t Êý¾Ý½á¹¹µÄÖ¸Õë¸ø page fault µÄ´¦Àí´úÂë¡£·ñÔò£¬´ËÒ³±ØÐë´Ó´æ·Å´ËÎļþµÄÎļþϵͳÖмÓÔØµ½ÄÚ´æÖС£ < Linux ·ÖÅäÎïÀíÄÚ´æ²¢´Ó´ÅÅÌÎļþÖжÁ³ö¸ÃÒ³¡£Èç¹û¿ÉÄÜ£¬ Linux »áÆô¶¯¶ÔÎļþÏÂÒ»Ò³µÄ¶Á¡£ÕâÖÖµ¥Ò³µÄ³¬Ç°¶ÁÒâζ×ÅÈç¹û½ø³Ì´ÓÎļþÖÐ˳Ðò¶ÁÊý¾ÝµÄ»°£¬ÏÂÒ»Ò³Êý¾Ý½«»áÔÚÄÚ´æÖеȴý¡£

    µ±³ÌÐòÓ³Ïñ¶ÁÈ¡ºÍÖ´ÐеÄʱºò page cache ²»¶ÏÔö³¤¡£Èç¹ûÒ³²»ÔÚÐèÒª£¬½«´Ó»º´æÖÐɾ³ý¡£±ÈÈç²»ÔÙ±»Èκνø³ÌʹÓõÄÓ³Ïñ¡£µ± < Linux ʹÓÃÄÚ´æµÄʱºò£¬ÎïÀíÒ³¿ÉÄܲ»¶Ï¼õÉÙ£¬Õâʱ Linux ¿ÉÒÔ¼õС page cache ¡£

3.8 Swapping out and Discarding Pages £¨½»»»³öÈ¥ºÍ·ÏÆúÒ³£©

    µ±ÎïÀíÄÚ´æÈ±·¦µÄʱºò£¬ Linux ÄÚ´æ¹ÜÀí×Óϵͳ±ØÐëÊÔͼÊÍ·ÅÎïÀíÒ³¡£Õâ¸öÈÎÎñÂäÔÚºËÐĽ»»»½ø³ÌÉÏ£¨ < kswapd £©¡£ºËÐĽ»»»ÊØ»¤½ø³ÌÊÇÒ»ÖÖÌØÊâÀàÐ͵Ľø³Ì£¬Ò»¸öºËÐÄÏ̡߳£ºËÐÄÏß³ÌÊÇûÓÐÐéÄâÄÚ´æµÄ½ø³Ì£¬ÒÔºËÐÄ̬ÔËÐÐÔÚÎïÀíµØÖ·¿Õ¼ä¡£ºËÐĽ»»»ÊØ»¤½ø³ÌÃû×ÖÓÐÒ»µã²»Ç¡µ±£¬ÒòΪËü²»½ö½öÊǽ«Ò³½»»»µ½ÏµÍ³½»»»ÎļþÉÏ¡£ËüµÄÈÎÎñÊDZ£Ö¤ÏµÍ³ÓÐ×ã¹»µÄ¿ÕÏÐÒ³£¬Ê¹ÄÚ´æ¹ÜÀíϵͳÓÐЧµØÔËÐС£

    ºËÐĽ»»»ÊØ»¤½ø³Ì£¨ kswapd £©ÔÚÆô¶¯Ê±ÓɺËÐÄµÄ init ½ø³ÌÆô¶¯£¬²¢µÈ´ýºËÐĵĽ»»»¼ÆÊ±Æ÷µ½ÆÚ¡£Ã¿Ò»´Î¼ÆÊ±Æ÷µ½ÆÚ£¬½»»»½ø³Ì¼ì²éϵͳÖеĿÕÏÐÒ³ÊýÊÇ·ñÌ«ÉÙ¡£ËüʹÓÃÁ½¸ö±äÁ¿£º < free_pages_high ºÍ < free_pages_low À´¾ö¶¨ÊÇ·ñÊÍ·ÅһЩҳ¡£Ö»ÒªÏµÍ³ÖеĿÕÏÐÒ³Êý±£³ÖÔÚ free_pages_high Ö®ÉÏ£¬½»»»½ø³Ìʲô¶¼²»×ö¡£ËüÖØÐÂ˯ÃßÖ±µ½ËüµÄ¼ÆÊ±Æ÷ÏÂÒ»´Îµ½ÆÚ¡£ÎªÁË×öÕâÖÖ¼ì²é£¬½»»»½ø³ÌÒª¿¼ÂÇÕýÔÚÏò½»»»ÎļþÖÐдµÄÒ³Êý£¬Óà < nr_async_pages À´¼ÆÊý£ºÃ¿Ò»´ÎÒ»Ò³Åŵ½¶ÓÁÐÖеȴýдµ½½»»»ÎļþÖеÄʱºòÔö¼Ó£¬Ð´ÍêµÄʱºò¼õÉÙ¡£ < Free_page_low ºÍ < free_page_high ÊÇϵͳÆô¶¯Ê±¼äÉèÖõģ¬ºÍϵͳÖеÄÎïÀíÒ³ÊýÏà¹Ø¡£Èç¹ûϵͳÖеĿÕÏÐÒ³ÊýСÓÚ < free_pages_high »òÕß±È < free_page_low »¹µÍ£¬ºËÐĽ»»»½ø³Ì»á³¢ÊÔÈýÖÖ·½·¨À´¼õÉÙϵͳʹÓõÄÎïÀíÒ³Êý£º

²Î¼û mm/vmscan.c ÖÐµÄ kswapd()

¼õÉÙ buffer cache ºÍ page cache µÄ´óС

½«ÏµÍ³ V µÄ¹²ÏíÄÚ´æÒ³½»»»³öÈ¥

½»»»ºÍ·ÏÆúÒ³

    Èç¹ûϵͳÖеĿÕÏÐÒ³ÊýµÍÓÚ free_pages_low £¬ºËÐĽ»»»½ø³Ì½«ÊÔͼÔÚÏÂÒ»´ÎÔËÐÐǰÊÍ·Å 6 Ò³¡£·ñÔòÊÔͼÊÍ·Å 3 Ò³¡£ÒÔÉϵÄÿһÖÖ·½·¨¶¼Òª±»³¢ÊÔÖ±µ½ÊÍ·ÅÁË×ã¹»µÄÒ³¡£ºËÐĽ»»»½ø³Ì¼Ç¼ÁËËüÉÏÒ»´ÎʹÓõÄÊÍ·ÅÎïÀíÒ³µÄ·½·¨¡£Ã¿Ò»´ÎÔËÐÐʱËü¶¼»áÊ×Ïȳ¢ÊÔÉÏÒ»´Î³É¹¦µÄ·½·¨À´ÊÍ·ÅÒ³¡£

    ÊÍ·ÅÁË×ã¹»µÄÒ³Ö®ºó£¬½»»»½ø³ÌÓÖÒ»´Î˯Ãߣ¬Ö±µ½ËüµÄ¼ÆÊ±Æ÷ÓÖÒ»´Î¹ýÆÚ¡£Èç¹ûºËÐĽ»»»½ø³ÌÊÍ·ÅÒ³µÄÔ­ÒòÊÇϵͳ¿ÕÏÐÒ³µÄÊýÁ¿ÉÙÓÚ < free_pages_low £¬Ëüֻ˯Ã߯½Ê±µÄÒ»°ëʱ¼ä¡£Ö»Òª¿ÕÏÐÒ³Êý´óÓÚ free_pages_low £¬½»»»½ø³Ì¾Í»Ö¸´Ô­À´µÄʱ¼ä¼ä¸ô½øÐмì²é¡£

3.8.1 Reducing the size of the Page and Buffer Caches

    page ºÍ < buffer cache ÖеÄÒ³ÊÇÊͷŵ½ < free_area ÏòÁ¿ÖеĺÃÑ¡Ôñ¡£ < Page Cache £¬°üº¬ÁËÄÚ´æÓ³ÉäÎļþµÄÒ³£¬¿ÉÄÜÓв»±ØÒªµÄÊý¾Ý£¬Õ¼È¥ÁËϵͳµÄÄڴ档ͬÑù£¬ Buffer Cache £¬°üÀ¨ÁË´ÓÎïÀíÉ豸¶Á»òÏòÎïÀíÉ豸дµÄÊý¾Ý£¬Ò²¿ÉÄܰüº¬ÁËÎÞÓõĻº³å¡£µ±ÏµÍ³ÖеÄÎïÀíÒ³½«ÒªºÄ¾¡µÄʱºò£¬·ÏÆúÕâЩ»º´æÇøÖеÄÒ³Ïà¶Ô±È½ÏÈÝÒ×£¬ÒòΪËü²»ÐèÒªÏòÎïÀíÉ豸д£¨²»Ïó½«Ò³´ÓÄÚ´æÖн»»»³öÈ¥£©¡£·ÏÆúÕâЩҳ²»»á²úÉú¶àÉÙÓк¦µÄ¸±×÷Óã¬Ö»²»¹ýʹ·ÃÎÊÎïÀíÉ豸ºÍÄÚ´æÓ³ÉäÎļþʱÂýÒ»µã¡£ËäÈ»Èç´Ë£¬Èç¹û¹«Æ½µØ·ÏÆúÕâЩ»º´æÇøÖеÄÒ³£¬ËùÓеĽø³ÌÊܵ½µÄÓ°Ïì¾ÍÊÇÆ½µÈµÄ¡£

    ÿһ´Îµ±ºËÐĽ»»»½ø³ÌÒªËõСÕâЩ»º´æÇøÊ±£¬ËüÒª¼ì²é mem_map ҳʸÁ¿ÖеÄÒ³¿é£¬¿´ÊÇ·ñ¿ÉÒÔ´ÓÎïÀíÄÚ´æÖÐ·ÏÆú¡£Èç¹ûϵͳ¿ÕÏÐҳ̫µÍ£¨±È½ÏΣÏÕʱ£©¶øºËÐĽ»»»½ø³Ì½»»»±È½ÏÀ÷º¦£¬Õâ¸ö¼ì²éµÄÒ³¿é´óС¾Í»á¸ü´óһЩ¡£Ò³¿éµÄ´óС½øÐÐÑ­»·¼ì²é£ºÃ¿Ò»´ÎÊÔͼ¼õÉÙÄÚ´æÓ³Éäʱ¶¼ÓÃÒ»¸ö²»Í¬µÄÒ³¿é´óС¡£Õâ½Ð×ö < clock Ëã·¨£¬¾ÍÏóÖÓµÄʱÕë¡£Õû¸ö < mem_map Ò³ÏòÁ¿¶¼±»¼ì²é£¬Ã¿´ÎһЩҳ¡£

²Î¼û mm/filemap.c shrink_map()

    ¼ì²éµÄÿһҳ¶¼ÒªÅжϻº´æÔÚ page cache »òÕß buffer cache ÖС£×¢Òâ¹²ÏíÒ³µÄ·ÏÆúÕâʱ²»¿¼ÂÇ£¬Ò»Ò³²»»áͬʱÔÚÁ½¸ö»º´æÖС£Èç¹û¸ÃÒ³²»ÔÚÕâÁ½¸ö»º³åÇøÖУ¬Ôò < mem_map Ò³ÏòÁ¿±íµÄÏÂÒ»Ò³±»¼ì²é¡£

    »º´æÔÚ buffer cache¡¡ch ÖеÄÒ³£¨»òÕß˵ҳÖеĻº³åÇø±»»º´æ£©Ê¹»º³åÇøµÄ·ÖÅäºÍÊͷŸüÓÐЧ¡£ËõСÄÚ´æÓ³ÉäµÄ´úÂëÊÔͼÊͷŰüº¬¼ì²é¹ýµÄÒ³µÄ»º³åÇø¡£Èç¹û»º³åÇøÊÍ·ÅÁË£¬Ôò°üº¬»º³åÇøµÄÒ³Ò²±»ÊÍ·ÅÁË¡£Èç¹û¼ì²éµÄÒ³ÊÇÔÚ < Linux µÄ page cache ÖУ¬Ëü½«´Ó page cache ÖÐɾ³ý²¢ÊÍ·Å¡£

²Î¼û fs/buffer.c free_buffer()

    Èç¹ûÕâ´Î³¢ÊÔÊÍ·ÅÁË×ã¹»µÄÒ³£¬ºËÐĽ»»»½ø³Ì¾Í»á¼ÌÐøµÈ´ýÖ±µ½ÏÂÒ»´Î±»ÖÜÆÚÐԵػ½ÐÑ¡£ÒòΪÊͷŵÄÒ³²»ÊôÓÚÈκνø³ÌµÄÐéÄâÄڴ棨ֻÊÇ»º´æµÄÒ³£©£¬Òò´Ë²»ÐèÒª¸üнø³ÌµÄÒ³±í¡£Èç¹û·ÏÆúµÄ»º´æÒ³ÈÔÈ»²»¹»£¬½»»»½ø³Ì»áÊÔͼ½»»»³öһЩ¹²ÏíÒ³¡£

3.8.2 Swapping Out System V Shared Memory Pages £¨½»»»³öϵͳ V µÄ¹²ÏíÄÚ´æÒ³£©

    ϵͳ V µÄ¹²ÏíÄÚ´æÊÇÒ»ÖÖ½ø³Ì¼äͨѶµÄ»úÖÆ£¬Í¨¹ýÁ½¸ö»ò¶à¸ö½ø³Ì¹²ÏíÐéÄâÄÚ´æ½»»»ÐÅÏ¢¡£½ø³Ì¼äÈçºÎ¹²ÏíÄÚ´æÔÚµÚ < 5 ÕÂÏêϸÌÖÂÛ¡£ÏÖÔÚÖ»Òª½²½²Ã¿Ò»¿éϵͳ < V ¹²ÏíÄÚ´æ¶¼ÓÃÒ»¸ö < shmid_ds µÄÊý¾Ý½á¹¹ÃèÊö¾Í×ã¹»ÁË¡£Ëü°üÀ¨Ò»¸öÖ¸Ïò vm_area_struct Á´±íÊý¾Ý½á¹¹µÄÖ¸Õ룬ÓÃÓÚ¹²Ïí´ËÄÚ´æµÄÿһ¸ö½ø³Ì¡£ < Vm_area_struct Êý¾Ý½á¹¹ÃèÊöÁ˴˹²ÏíÄÚ´æÔÚÿһ¸ö½ø³ÌÖеÄλÖá£Õâ¸öϵͳ V µÄÄÚ´æÖеÄÿһ¸ö vm_area_struct ½á¹¹¶¼Óà vm_next_shared ºÍ vm_prev_shared Ö¸ÕëÁ¬½ÓÔÚÒ»Æð¡£Ã¿Ò»¸ö shmid_ds Êý¾Ý½á¹¹¶¼ÓÐÒ»¸öÒ³±íÌõÄ¿µÄÁ´±í£¬Ã¿Ò»¸öÌõÄ¿¶¼ÃèÊöÒ»¸ö¹²ÏíµÄÐéÄâÒ³ºÍÎïÀíÒ³µÄ¶ÔÓ¦¹ØÏµ¡£

    ºËÐĽ»»»½ø³Ì½«ÏµÍ³ V µÄ¹²ÏíÄÚ´æÒ³½»»»³öȥʱҲÓà clock Ëã·¨¡£Ëüÿһ´ÎÔËÐж¼¼Ç¼ÁËÉÏÒ»´Î½»»»³öÈ¥ÁËÄÇÒ»¿é¹²ÏíÄÚ´æµÄÄÇÒ»Ò³¡£ËüÓÃÁ½¸öË÷ÒýÀ´¼Ç¼£ºµÚÒ»¸öÊÇ < shmid_ds Êý¾Ý½á¹¹Êý×éÖеÄË÷Òý£¬µÚ¶þ¸öÊÇÕâ¿é¹²ÏíÄÚ´æÇøµÄÒ³±íÁ´ÖеÄË÷Òý¡£ÕâÑù¿ÉÒÔ¹²ÏíÄÚ´æÇøµÄÎþÉü±È½Ï¹«Æ½¡£

²Î¼û ipc/shm.c shm_swap()

    ÒòΪһ¸öÖ¸¶¨µÄϵͳ V ¹²ÏíÄÚ´æµÄÐéÄâÒ³¶ÔÓ¦µÄÎïÀíÒ³ºÅ°üº¬ÔÚÿһ¸ö¹²ÏíÕâ¿éÐéÄâÄÚ´æµÄ½ø³ÌµÄÒ³±íÖУ¬ËùÒÔºËÐĽ»»»½ø³Ì±ØÐëÐÞ¸ÄËùÓеĽø³ÌµÄÒ³±íÀ´ÌåÏÖ´ËÒ³ÒѾ­²»ÔÚÄÚ´æ¶øÔÚ½»»»ÎļþÖС£¶ÔÓÚÿһ¸ö½»»»³öÈ¥µÄ¹²ÏíÒ³£¬½»»»½ø³Ì±ØÐëÕÒµ½ÔÚÿһ¸ö¹²Ïí½ø³ÌµÄÒ³±íÖжÔÓ¦µÄ´ËÒ³µÄÌõÄ¿£¨Í¨¹ý²éÕÒÿһ¸ö < vm_area_struct Ö¸Õ룩Èç¹ûÔÚÒ»¸ö½ø³ÌÒ³±íÖд˹²ÏíÄÚ´æÒ³µÄÌõÄ¿ÓÐЧ£¬½»»»½ø³ÌÒª°ÑËü±äΪÎÞЧ£¬²¢ÇÒ±ê¼ÇÊǽ»»»Ò³£¬Í¬Ê±½«´Ë¹²ÏíÒ³µÄÔÚÓÃÊý¼õ < 1 ¡£½»»»³öÈ¥µÄϵͳ < V ¹²ÏíÒ³±íµÄ¸ñʽ°üÀ¨Ò»¸öÔÚ < shmid_ds Êý¾Ý½á¹¹×éÖеÄË÷ÒýºÍÔڴ˹²ÏíÄÚ´æÇøÖÐÒ³±íÌõÄ¿µÄË÷Òý¡£

    Èç¹ûËùÓй²ÏíµÄÄÚ´æ¶¼Ð޸Ĺý£¬Ò³µÄÔÚÓÃÊý±äΪ 0 £¬Õâ¸ö¹²ÏíÒ³¾Í¿ÉÒÔдµ½½»»»ÎļþÖС£Õâ¸öϵͳ V ¹²ÏíÄÚ´æÇøµÄ shmid_ds Êý¾Ý½á¹¹Ö¸ÏòµÄÒ³±íÖдËÒ³µÄÌõÄ¿½«»á»»³É½»»»³öµÄÒ³±íÌõÄ¿¡£½»»»³öµÄÒ³±íÌõÄ¿ÎÞЧµ«Êǰüº¬Ò»¸öÖ¸Ïò´ò¿ªµÄ½»»»ÎļþµÄË÷ÒýºÍ´ËÒ³ÔÚ´ËÎļþÄ򵀮«ÒÆÁ¿¡£Õâ¸öÐÅÏ¢ÓÃÓÚ½«´ËÒ³ÔÙÈ¡»ØÎïÀíÄÚ´æÖС£

3.3 Swapping Out and Discarding Pages

    ½»»»½ø³ÌÂÖÁ÷¼ì²éϵͳÖеÄÿһ¸ö½ø³ÌÊÇ·ñ¿ÉÒÔÓÃÓÚ½»»»¡£ºÃµÄºòÑ¡ÊÇ¿ÉÒÔ½»»»µÄ½ø³Ì£¨ÓÐһЩ²»ÐУ©²¢ÇÒÓпÉÒÔ´ÓÄÚ´æÖн»»»³öÈ¥»ò·ÏÆúµÄÒ»¸ö»ò¶à¸öÒ³¡£Ö»ÓÐÆäËû·½·¨¶¼²»ÐеÄʱºò²Å»á°ÑÒ³´ÓÎïÀíÄÚ´æ½»»»µ½ÏµÍ³½»»»ÎļþÖС£

²Î¼û mm/vmscan.c swap_out()

    À´×ÔÓÚÓ³ÏñÎļþµÄÖ´ÐÐÓ³ÏñµÄ´ó²¿·ÖÄÚÈÝ¿ÉÒÔ´ÓÎļþÖÐÖØÐ¶Á³öÀ´¡£ÀýÈ磺һ¸öÓ³ÏñµÄÖ´ÐÐÖ¸Áî²»»á±»×ÔÉí¸Ä±ä£¬ËùÒÔ²»ÐèҪдµ½½»»»ÎļþÖС£ÕâЩҳֻÊDZ»¼òµ¥µØ·ÏÆú¡£Èç¹ûÔٴα»½ø³ÌÒýÓ㬿ÉÒÔ´ÓÖ´ÐÐÓ³ÏñÔٴμÓÔØµ½ÄÚ´æÖС£

    Ò»µ©Òª½»»»µÄ½ø³ÌÈ·¶¨ÏÂÀ´£¬½»»»½ø³Ì¾Í²é¿´ËüµÄËùÓÐÐéÄâÄÚ´æÇøÓò£¬Ñ°ÕÒûÓй²Ïí»òËø¶¨µÄÇøÓò¡£ < Linux ²»»á°ÑÑ¡¶¨½ø³ÌµÄËùÓпÉÒÔ½»»»³öÈ¥µÄÒ³¶¼½»»»³öÈ¥£¬¶øÖ»ÊÇÈ¥µôÉÙÁ¿µÄÒ³¡£Èç¹ûÒ³ÔÚÄÚ´æÖÐËø¶¨£¬Ôò²»Äܱ»½»»»»ò·ÏÆú¡£

    ²Î¼û mm/vmscan.c swap_out_vme() ¸ú×Ù½ø³Ì mm_struct ÖÐÅÅÁÐµÄ vm_area_struct ½á¹¹ÖÐµÄ vm_next¡¡vm_nex Ö¸Õë¡£

    Linux µÄ½»»»Ë㷨ʹÓÃÁËÒ³µÄÄêÁ䡣ÿһ¸öÒ³¶¼ÓÐÒ»¸ö¼ÆÊýÆ÷£¨·ÅÔÚ mem_map_t Êý¾Ý½á¹¹ÖУ©£¬¸æËߺËÐĽ»»»½ø³Ì´ËÒ³ÊÇ·ñÖµµÃ½»»»³öÈ¥¡£Ò³²»ÓÃʱ±äÀÏ£¬·ÃÎÊʱ¸üС£½»»»½ø³ÌÖ»½»»»ÀϵÄÒ³¡£È±Ê¡µØ£¬Ò³µÚÒ»´Î·ÖÅäʱÄêÁ丳ֵΪ < 3 ¡£Ã¿Ò»´Î·ÃÎÊ£¬ËüµÄÄêÁä¾ÍÔö¼Ó < 3 £¬Ö±µ½ < 20 ¡£Ã¿Ò»´Îϵͳ½»»»½ø³ÌÔËÐÐʱËü½«Ò³µÄÄêÁä¼õ < 1 ʹҳ±äÀÏ¡£Õâ¸öȱʡµÄÐÐΪ¿ÉÒÔ¸ü¸Ä£¬ËùÒÔÕâЩÐÅÏ¢£¨ºÍÆäËûÏà¹ØÐÅÏ¢£©¶¼´æ·ÅÔÚ < swap_control Êý¾Ý½á¹¹ÖС£

    Èç¹ûҳ̫ÀÏ ( ÄêÁä age = 0) £¬½»»»½ø³Ì»á½øÒ»²½´¦Àí¡£ÔàÒ³¿ÉÒÔ½»»»³öÈ¥£¬ Linux ÔÚÃèÊö´ËÒ³µÄ PTE ÖÐÓÃÒ»¸öºÍÌåϵ½á¹¹Ïà¹ØµÄλÀ´ÃèÊöÕâÖÖÒ³£¨¼ûͼ 3.2 £©¡£µ«ÊÇ£¬²¢·ÇËùÓеÄÔàÒ³¶¼ÐèҪдµ½½»»»Îļþ¡£Ã¿Ò»¸ö½ø³ÌµÄÐéÄâÄÚ´æÇøÓò¶¼¿ÉÒÔÓµÓÐ×Ô¼ºµÄ½»»»²Ù×÷£¨ÓÉ < vm_area_struct ÖÐµÄ < vm_ops Ö¸Õëָʾ£©£¬Èç¹ûÕâÑù£¬½»»»½ø³Ì»áÓÃËüµÄÕâÖÖ·½Ê½¡£·ñÔò£¬½»»»½ø³Ì»á´Ó½»»»ÎļþÖзÖÅäÒ»Ò³£¬²¢°Ñ´Ëҳдµ½¸ÃÎļþÖС£

    ´ËÒ³µÄÒ³±íÌõÄ¿»áÓÃÒ»¸öÎÞЧµÄÌõÄ¿Ìæ»»£¬µ«ÊǰüÀ¨ÁË´ËÒ³ÔÚ½»»»ÎļþµÄÐÅÏ¢£º´ËÒ³ËùÔÚÎļþÄ򵀮«ÒƺÍËùÓõĽ»»»Îļþ¡£²»¹Üʲô·½Ê½½»»»£¬Ô­À´µÄÎïÀíÒ³±»·Å»Øµ½ < free_area ÖØÊÍ·Å¡£¸É¾»£¨»ò²»ÔࣩµÄÒ³¿ÉÒÔ±»·ÏÆú£¬·Å»Øµ½ free_area ÖÐÖØÓá£

    Èç¹û½»»»»ò·ÏÆúÁË×ã¹»µÄ¿É½»»»½ø³ÌµÄÒ³£¬½»»»½ø³ÌÖØÐÂ˯Ãß¡£ÏÂÒ»´Î»½ÐÑʱËü»á¿¼ÂÇϵͳÖеÄÏÂÒ»¸ö½ø³Ì¡£ÕâÑù£¬½»»»½ø³ÌÇáҧȥÿһ¸ö½ø³ÌµÄÎïÀíÒ³£¬Ö±µ½ÏµÍ³ÖØÐ´ﵽƽºâ¡£ÕâÖÖ×ö·¨±È½»»»³öÕû¸ö½ø³Ì¸ü¹«Æ½¡£

3.9 The Swap Cache £¨½»»»»º´æ£©

    µ±°ÑÒ³½»»»µ½½»»»Îļþʱ£¬ Linux »á±ÜÃâд²»±ØÒªÐ´µÄÒ³¡£ÓÐʱ¿ÉÄÜÒ»¸öҳͬʱ´æÔÚÓÚ½»»»ÎļþºÍÎïÀíÄÚ´æÖС£Õâ·¢ÉúÓÚÒ»Ò³±»½»»»³öÄÚ´æÈ»ºóÔÚ½ø³ÌÒª·ÃÎÊʱÓÖ±»µ÷ÈëÄÚ´æµÄÇé¿öÏ¡£Ö»ÒªÄÚ´æÖеÄҳûÓб»Ð´¹ý£¬½»»»ÎļþÖеĿ½±´¾Í¼ÌÐøÓÐЧ¡£

    Linux Óà < swap cache À´¼Ç¼ÕâЩҳ¡£½»»»»º´æÊÇÒ»¸öÒ³±íÌõÄ¿»òÕßϵͳÎïÀíÒ³µÄÁ´±í¡£Ò»¸ö½»»»Ò³ÓÐÒ»¸öÒ³±íÌõÄ¿£¬ÃèÊöʹÓõĽ»»»ÎļþºÍËüÔÚ½»»»ÎļþÖеÄλÖá£Èç¹û½»»»»º´æÌõÄ¿·Ç < 0 £¬±íʾÔÚ½»»»ÎļþÖеÄһҳûÓб»¸Ä¶¯¡£Èç¹û´ËÒ³ºóÀ´±»¸Ä¶¯ÁË£¨±»Ð´£©£¬ËüµÄÌõÄ¿¾Í´Ó½»»»»º´æÖÐɾ³ý£©

    µ± Linux ÐèÒª½»»»Ò»¸öÎïÀíÒ³µ½½»»»ÎļþµÄʱºò£¬Ëü²é¿´½»»»»º´æ£¬Èç¹ûÓдËÒ³µÄÓÐЧÌõÄ¿£¬Ëü²»ÐèÒª°Ñ´Ëҳдµ½½»»»Îļþ¡£ÒòΪÄÚ´æÖеĴËÒ³´ÓÉϴζÁµ½½»»»ÎļþÖ®ºóûÓб»Ð޸Ĺý¡£

    ½»»»»º´æÖеÄÌõÄ¿ÊÇÔø¾­½»»»³öÈ¥µÄÒ³±íÌõÄ¿¡£ËüÃDZ»±ê¼ÇΪÎÞЧ£¬µ«Êǰüº¬ÁËÔÊÐí < Linux ÕÒµ½ÕýÈ·½»»»ÎļþºÍ½»»»ÎļþÖÐÕýÈ·Ò³µÄÐÅÏ¢¡£

3.10 Swapping Page In £¨½»»»½ø£©

    ±£´æÔÚ½»»»ÎļþÖеÄÔàÒ³¿ÉÄÜÓÖÐèÒª·ÃÎÊ¡£ÀýÈ磺µ±Ó¦ÓóÌÐòÒªÏòÐéÄâÄÚ´æÖÐдÊý¾Ý£¬¶ø´ËÒ³¶ÔÓ¦µÄÎïÀíÒ³½»»»µ½Á˽»»»Îļþʱ¡£·ÃÎʲ»ÔÚÎïÀíÄÚ´æµÄÐéÄâÄÚ´æÒ³»áÒý·¢ < page fault ¡£ < Page fault ÊÇ´¦ÀíÆ÷֪ͨ²Ù×÷ϵͳËü²»Äܽ«ÐéÄâÄÚ´æ×ª»»µ½ÎïÀíÄÚ´æµÄÐźš£ÒòΪ½»»»³öÈ¥ºóÐéÄâÄÚ´æÖÐÃèÊö´ËÒ³µÄÒ³±íÌõÄ¿±»±ê¼ÇΪÎÞЧ¡£´¦ÀíÆ÷ÎÞ·¨´¦ÀíÐéÄâµØÖ·µ½ÎïÀíµØÖ·µÄת»»£¬½«¿ØÖÆ×ª»Øµ½²Ù×÷ϵͳ£¬¸æËßËü·¢Éú´íÎóµÄÐéÄâµØÖ·ºÍ´íÎóµÄÔ­Òò¡£Õâ¸öÐÅÏ¢µÄ¸ñʽºÍ´¦ÀíÆ÷ÈçºÎ°Ñ¿ØÖÆ×ª»Øµ½²Ù×÷ϵͳÊǺʹ¦ÀíÆ÷ÀàÐÍÏà¹ØµÄ¡£´¦ÀíÆ÷Ïà¹ØµÄ < page faule ´¦Àí´úÂë±ØÐ붨λÃèÊö°üÀ¨³ö´íÐéÄâµØÖ·µÄÐéÄâÄÚ´æÇøµÄ vm_area_struct µÄÊý¾Ý½á¹¹¡£Ëüͨ¹ý²éÕҸýø³ÌµÄ < vm_area_struct Êý¾Ý½á¹¹£¬Ö±µ½ÕÒµ½°üº¬Á˳ö´íµÄÐéÄâµØÖ·µÄÄÇÒ»¸ö¡£ÕâÊǶÔʱ¼äÒªÇó·Ç³£ÑϸñµÄ´úÂ룬ËùÒÔÒ»¸ö½ø³ÌµÄ < vm_area_struct Êý¾Ý½á¹¹°´ÕÕÌØ¶¨µÄ·½Ê½ÅÅÁУ¬Ê¹ÕâÖÖ²éÕÒ»¨·Ñʱ¼ä¾¡Á¿ÉÙ¡£

²Î¼û arch/i386/mm/fault.c do_page_fault()

    Ö´ÐÐÁ˺ÏÊʵĺʹ¦ÀíÆ÷Ïà¹ØµÄ¶¯×÷²¢ÕÒµ½Á˰üÀ¨´íÎ󣨷¢Éú£©µÄÐéÄâµØÖ·µÄÓÐЧµÄÐéÄâÄڴ棬 < page fault µÄ´¦Àí¹ý³ÌÓÖ³ÉΪͨÓõ쬲¢¿ÉÓÃÓÚ Linux ÄÜÔËÐеÄËùÓд¦ÀíÆ÷¡£Í¨ÓÃµÄ page fault ´¦Àí´úÂë²éÕÒ´íÎóÐéÄâµØÖ·µÄÒ³±íÌõÄ¿¡£Èç¹ûËüÕÒµ½µÄÒ³±íÌõÄ¿Êǽ»»»³öÈ¥µÄÒ³£¬ < Linux ±ØÐë°Ñ´ËÒ³½»»»»ØÎïÀíÄÚ´æ¡£½»»»³öÈ¥µÄÒ³µÄÒ³±íÌõÄ¿µÄ¸ñʽºÍ´¦ÀíÆ÷Ïà¹Ø£¬µ«ÊÇËùÓеĴ¦ÀíÆ÷¶¼½«ÕâЩҳ±êΪÎÞЧ²¢ÔÚÒ³±íÌõÄ¿ÖзŽøÁËÔÚ½»»»ÎļþÖж¨Î»Ò³µÄ±ØÒªÐÅÏ¢¡£ < Linux ʹÓÃÕâÖÖÐÅÏ¢°Ñ´ËÒ³µ÷»Øµ½ÎïÀíÄÚ´æÖС£

²Î¼û mm/memory.c do_no_page()

    Õâʱ£¬ Linux ÖªµÀÁË´íÎ󣨷¢Éú£©µÄÐéÄâµØÖ·ºÍ¹ØÓÚ´ËÒ³½»»»µ½ÄÄÀïÈ¥µÄÒ³±íÌõÄ¿¡£ < Vm_area_struct Êý¾Ý½á¹¹¿ÉÄܰüÀ¨Ò»¸öÀý³ÌµÄÖ¸Õ룬ÓÃÓÚ°ÑÕâ¿éÐéÄâÄÚ´æÖеÄÒ³½»»»»Øµ½ÎïÀíÄÚ´æÖС£ÕâÊÇ < swapin ²Ù×÷¡£Èç¹ûÕâ¿éÄÚ´æÖÐÓÐ < swapin ²Ù×÷£¬ < Linux »áʹÓÃËü¡£Æäʵ£¬½»»»³öÈ¥µÄϵͳ < V µÄ¹²ÏíÄÚ´æÖ®ËùÒÔÐèÒªÌØÊâµÄ´¦ÀíÒòΪ½»»»µÄϵͳ V µÄ¹²ÏíÄÚ´æÒ³µÄ¸ñʽºÍÆÕͨ½»»»Ò³µÄ²»Í¬¡£Èç¹ûûÓÐ swapin ²Ù×÷£¬ Linux ¼Ù¶¨ÕâÊÇÒ»¸öÆÕͨҳ£¬²»ÐèÒªÌØÊâµÄ´¦Àí¡£Ëü·ÖÅäÒ»¿é¿ÕÏеÄÎïÀíÒ³²¢½«½»»»³öÈ¥µÄÒ³´Ó½»»»ÎļþÖжÁ½øÀ´¡£¹ØÓÚ´Ó½»»»ÎļþÄÄÀºÍÄÄÒ»¸ö½»»»Îļþ£©µÄÐÅϢȡ×ÔÎÞЧµÄÒ³±íÌõÄ¿¡£

²Î¼û mm/page_alloc.c swap_in()

    Èç¹ûÒýÆð page fault µÄ·ÃÎʲ»ÊÇд·ÃÎÊ£¬Ò³¾ÍÁôÔÚ½»»»»º´æÖУ¬ËüµÄÒ³±íÌõÄ¿±ê¼ÇΪ²»¿Éд¡£Èç¹ûºóÀ´´ËÒ³ÓÖ±»Ð´£¬»á²úÉúÁíÒ»¸ö < page fault £¬Õâʱ£¬´ËÒ³±»±ê־ΪÔàÒ³£¬¶øËüµÄÌõĿҲ´Ó½»»»»º´æÖÐɾ³ý¡£Èç¹û´ËҳûÓб»Ð޸ĶøÓÖÐèÒª½»»»³öÀ´£¬ < Linux ¾Í¿ÉÒÔ±ÜÃ⽫´Ëҳдµ½½»»»Îļþ£¬ÒòΪ´ËÒ³ÒѾ­ÔÚ½»»»ÎļþÖÐÁË¡£

    Èç¹û½«´ËÒ³´Ó½»»»Îļþµ÷»ØµÄ·ÃÎÊÊÇд·ÃÎÊ£¬Õâ¸öÒ³¾Í´Ó½»»»»º´æÖÐɾ³ý£¬´ËÒ³µÄÒ³±íÌõĿҳ±ê¼ÇΪÔàÒ³ºÍ¿Éд¡£


 

[ÏÂÒ»Ò³]


 

Chapter 4 Processes £¨½ø³Ì£©

    ±¾ÕÂÃèÊö½ø³ÌÊÇʲôÒÔ¼° Linux ÈçºÎ´´½¨¡¢¹ÜÀíºÍɾ³ýϵͳÖеĽø³Ì¡£

    ½ø³ÌÖ´ÐвÙ×÷ϵͳÖеÄÈÎÎñ¡£³ÌÐòÊÇ´æ·ÅÔÚ´ÅÅÌÉϵİüÀ¨Ò»ÏµÁлúÆ÷´úÂëÖ¸ÁîºÍÊý¾ÝµÄ¿ÉÖ´ÐеÄÓ³Ïñ£¬Òò´Ë£¬ÊÇÒ»¸ö±»¶¯µÄʵÌå¡£½ø³Ì¿ÉÒÔ¿´×÷ÊÇÒ»¸öÖ´ÐÐÖеļÆËã»ú³ÌÐò¡£ËüÊǶ¯Ì¬µÄʵÌ壬ÔÚ´¦ÀíÆ÷Ö´ÐлúÆ÷´úÂëÖ¸Áîʱ²»¶Ï¸Ä±ä¡£´¦Àí³ÌÐòµÄÖ¸ÁîºÍÊý¾Ý£¬½ø³ÌÒ²°üÀ¨³ÌÐò¼ÆÊýÆ÷ºÍÆäËû CPU µÄ¼Ä´æÆ÷ÒÔ¼°°üÀ¨ÁÙʱÊý¾Ý£¨ÀýÈçÀý³Ì²ÎÊý¡¢·µ»ØµØÖ·ºÍ±£´æµÄ±äÁ¿£©µÄ¶ÑÕ»¡£µ±Ç°Ö´ÐеijÌÐò£¬»òÕß˵½ø³Ì£¬°üÀ¨Î¢´¦ÀíÆ÷ÖÐËùÓеĵ±Ç°µÄ»î¶¯¡£ Linux ÊÇÒ»¸ö¶à½ø³ÌµÄ²Ù×÷ϵͳ¡£½ø³ÌÊÇ·ÖÀëµÄÈÎÎñ£¬ÓµÓи÷×ÔµÄȨÀûºÍÔðÈΡ£Èç¹ûÒ»¸ö½ø³Ì±ÀÀ££¬Ëü²»Ó¦¸ÃÈÃϵͳÖеÄÁíÒ»¸ö½ø³Ì±ÀÀ£¡£Ã¿Ò»¸ö¶ÀÁ¢µÄ½ø³ÌÔËÐÐÔÚ×Ô¼ºµÄÐéÄâµØÖ·¿Õ¼ä£¬³ýÁËͨ¹ý°²È«µÄºËÐĹÜÀíµÄ»úÖÆÖ®ÍâÎÞ·¨Ó°ÏìÆäËûµÄ½ø³Ì¡£

    ÔÚÒ»¸ö½ø³ÌµÄÉúÃüÖÜÆÚÖÐËü»áʹÓÃÐí¶àϵͳ×ÊÔ´¡£Ëü»áÓÃϵͳµÄ CPU Ö´ÐÐËüµÄÖ¸ÁÓÃϵͳµÄÎïÀíÄÚ´æÀ´´æ´¢ËüºÍËüµÄÊý¾Ý¡£Ëü»á´ò¿ªºÍʹÓÃÎļþϵͳÖеÄÎļþ£¬»áÖ±½Ó»òÕß¼ä½ÓʹÓÃϵͳµÄÎïÀíÉ豸¡£ Linux ±ØÐë¸ú×Ù½ø³Ì±¾ÉíºÍËüʹÓõÄϵͳ×ÊÔ´ÒÔ±ã¹ÜÀí¹«Æ½µØ¹ÜÀí¸Ã½ø³ÌºÍϵͳÖÐµÄÆäËû½ø³Ì¡£Èç¹ûÒ»¸ö½ø³Ì¶ÀÕ¼ÁËϵͳµÄ´ó²¿·ÖÎïÀíÄÚ´æºÍ CPU £¬¶ÔÓÚÆäËû½ø³Ì¾ÍÊDz»¹«Æ½µÄ¡£

    ϵͳÖÐ×¹óµÄ×ÊÔ´¾ÍÊÇ CPU ¡£Í¨³£ÏµÍ³Ö»ÓÐÒ»¸ö¡£ Linux ÊÇÒ»¸ö¶à½ø³ÌµÄ²Ù×÷ϵͳ¡£ËüµÄÄ¿±êÊÇÈýø³ÌÒ»Ö±ÔÚϵͳµÄÿһ¸ö CPU ÉÏÔËÐУ¬³ä·ÖÀûÓà CPU ¡£Èç¹û½ø³ÌÊý¶àÓÚ CPU £¨¶àÊýÊÇÕâÑù£©£¬ÆäÓàµÄ½ø³Ì±ØÐëµÈµ½ CPU ±»ÊͷŲÅÄÜÔËÐС£¶à½ø³ÌÊÇÒ»¸ö¼òµ¥µÄ˼Ï룺һ¸ö½ø³ÌÒ»Ö±ÔËÐУ¬Ö±µ½Ëü±ØÐëµÈ´ý£¬Í¨³£ÊǵȴýһЩϵͳ×ÊÔ´£¬µÈÓµÓÐÁË×ÊÔ´£¬Ëü²Å¿ÉÒÔ¼ÌÐøÔËÐС£ÔÚÒ»¸öµ¥½ø³ÌµÄϵͳ£¬±ÈÈç DOS £¬ CPU ±»¼òµ¥µØÉèΪ¿ÕÏУ¬ÕâÑùµÈ´ýµÄʱ¼ä¾Í»á±»ÀË·Ñ¡£ÔÚÒ»¸ö¶à½ø³ÌµÄϵͳÖУ¬Í¬Ò»Ê±¿ÌÐí¶à½ø³ÌÔÚÄÚ´æÖС£µ±Ò»¸ö½ø³Ì±ØÐëµÈ´ýʱ²Ù×÷ϵͳ½« CPU ´ÓÕâ¸ö½ø³ÌÄÃ×ߣ¬²¢½«Ëü½»¸øÁíÒ»¸ö¸üÐèÒªµÄ½ø³Ì¡£Êǵ÷¶È³ÌÐòÑ¡ÔñÁË

    ÏÂÒ»´Î×îºÏÊʵĽø³Ì¡£ Linux ʹÓÃÁËһϵÁеĵ÷¶È·½°¸À´±£Ö¤¹«Æ½¡£

    Linux Ö§³ÖÐí¶à²»Í¬µÄ¿ÉÖ´ÐÐÎļþ¸ñʽ£¬ ELF ÊÇÆäÖÐÖ®Ò»£¬ Java ÊÇÁíÒ»¸ö¡£ Linux ±ØÐë͸Ã÷µØ¹ÜÀíÕâЩÎļþ£¬ÒòΪ½ø³ÌʹÓÃϵͳµÄ¹²ÏíµÄ¿â¡£

4.1 Linux Processes £¨ Linux µÄ½ø³Ì£©

    Linux ÖУ¬Ã¿Ò»¸ö½ø³ÌÓÃÒ»¸ö task_struct £¨ÔÚ Linux ÖÐ task ºÍ process »¥Ó㩵ÄÊý¾Ý½á¹¹À´±íʾ£¬ÓÃÀ´¹ÜÀíϵͳÖеĽø³Ì¡£ Task ÏòÁ¿±íÊÇÖ¸ÏòϵͳÖÐÿһ¸ö task_struct Êý¾Ý½á¹¹µÄÖ¸ÕëµÄÊý×é¡£ÕâÒâζ×ÅϵͳÖÐ×î´ó½ø³ÌÊýÊÜ task ÏòÁ¿±íµÄÏÞÖÆ£¬È±Ê¡ÊÇ 512 ¡£µ±ÐµĽø³Ì´´½¨µÄʱºò£¬´ÓϵͳÄÚ´æÖзÖÅäÒ»¸öÐ嵀 task_struct £¬²¢Ôö¼Óµ½ task ÏòÁ¿±íÖС£ÎªÁ˸üÈÝÒײéÕÒ£¬Óà current Ö¸ÕëÖ¸Ïòµ±Ç°ÔËÐеĽø³Ì¡£

²Î¼û include/linux/sched.h

    ³ýÁËÆÕͨ½ø³Ì£¬ Linux Ò²Ö§³Öʵʱ½ø³Ì¡£ÕâЩ½ø³Ì±ØÐë¶ÔÓÚÍâ½çʼþѸËÙ·´Ó¦£¨Òò´Ë½Ð×ö¡°ÊµÊ±¡±£©£¬µ÷¶È³ÌÐò±ØÐëºÍÆÕͨÓû§½ø³ÌÇø·Ö¶Ô´ý¡£ËäÈ» task_struct Êý¾Ý½á¹¹Ê®·Ö¾Þ´ó¡¢¸´ÔÓ£¬µ«ÊÇËüµÄÓò¿ÉÒÔ·ÖΪÒÔÏµĹ¦ÄÜ£º

    State ½ø³ÌÖ´ÐÐʱËü¸ù¾ÝÇé¿ö¸Ä±ä״̬ (state) ¡£ Linux ½ø³ÌʹÓÃÒÔÏÂ״̬£º£¨ÕâÀ冀ôÁË SWAPPING £¬ÒòΪ¿´À´Ã»Óõ½£©

    Running ½ø³ÌÔÚÔËÐÐ ( ÊÇϵͳµÄµ±Ç°½ø³Ì ) »òÕß×¼±¸ÔËÐУ¨µÈ´ý±»°²Åŵ½ÏµÍ³µÄÒ»¸ö CPU ÉÏ£©

    Waiting ½ø³ÌÔڵȴýÒ»¸öʼþ»ò×ÊÔ´¡£ Linux Çø·ÖÁ½ÖÖÀàÐ͵ĵȴý½ø³Ì£º¿ÉÖжϺͲ»¿ÉÖжϵģ¨ interruptible and uninterruptible £©¡£¿ÉÖжϵĵȴý½ø³Ì¿ÉÒÔ±»ÐźÅÖжϣ¬¶ø²»¿ÉÖжϵĵȴý½ø³ÌÖ±½ÓµÈ´ýÓ²¼þÌõ¼þ£¬²»Äܱ»ÈκÎÇé¿öÖжϡ£

    Stopped ½ø³ÌÍ£Ö¹ÁË£¬Í¨³£ÊǽÓÊÕµ½ÁËÒ»¸öÐźš£ÕýÔÚµ÷ÊԵĽø³Ì¿ÉÒÔÔÚֹͣ״̬¡£

    Zombie ÖÕÖ¹µÄ½ø³Ì£¬ÒòΪijÖÖÔ­Òò£¬ÔÚ task ÏòÁ¿±íÖØÈξÉÓÐÒ»¸ö task_struct Êý¾Ý½á¹¹µÄÌõÄ¿¡£¾ÍÏëÌýÆðÀ´Ò»Ñù£¬ÊÇÒ»¸öËÀÍöµÄ½ø³Ì¡£

    Scheduling Information µ÷¶ÈÕßÐèÒªÕâ¸öÐÅÏ¢ÓÃÓÚ¹«Æ½µØ¾ö¶¨ÏµÍ³ÖеĽø³ÌÄÄÒ»¸ö¸üÓ¦¸ÃÔËÐС£

    Identifiers ϵͳÖеÄÿһ¸ö½ø³Ì¶¼ÓÐÒ»¸ö½ø³Ì±êʶ·û¡£½ø³Ì±êʶ·û²»ÊÇ task ÏòÁ¿±íÖеÄË÷Òý£¬¶øÖ»ÊÇÒ»¸öÊý×Ö¡£Ã¿Ò»¸ö½ø³ÌÒ²¶¼ÓÐÓû§ºÍ×飨 user and group £©µÄ±êʶ·û¡£ÓÃÀ´¿ØÖƽø³Ì¶ÔÓÚϵͳÖÐÎļþºÍÉ豸µÄ·ÃÎÊ¡£

    Inter-Process Communication Linux Ö§³Ö´«Í³µÄ UNIX-IPC »úÖÆ£¬¼´Ðźţ¬¹ÜµÀºÍÐźŵƣ¨ semaphores £©£¬Ò²Ö§³Öϵͳ V µÄ IPC »úÖÆ£¬¼´¹²ÏíÄÚ´æ¡¢ÐźŵƺÍÏûÏ¢¶ÓÁС£¹ØÓÚ Linux Ö§³ÖµÄ IPC »úÖÆÔÚµÚ 5 ÕÂÖÐÃèÊö¡£

    Links ÔÚ Linux ϵͳÖУ¬Ã»ÓÐÒ»¸ö½ø³ÌÊÇºÍÆäËû½ø³ÌÍêÈ«Î޹صġ£ÏµÍ³ÖеÄÿһ¸ö½ø³Ì£¬³ýÁ˳õʼµÄ½ø³ÌÖ®Í⣬¶¼ÓÐÒ»¸ö¸¸½ø³Ì¡£Ð½ø³Ì²»ÊÇ´´½¨µÄ£¬¶øÊÇ¿½±´£¬»òÕß˵´Óǰһ¸ö½ø³Ì¿Ë¡µÄ£¨ cloned £©¡£Ã¿Ò»¸ö½ø³ÌµÄ task_struct Öж¼ÓÐÖ¸ÏòËüµÄ¸¸½ø³ÌºÍÐֵܽø³Ì£¨ÓµÓÐÏàͬµÄ¸¸½ø³ÌµÄ½ø³Ì£©ÒÔ¼°ËüµÄ×Ó½ø³ÌµÄµÄÖ¸Õë¡£ÔÚ Linux ϵͳÖÐÄã¿ÉÒÔÓà pstree ÃüÁî¿´µ½ÕýÔÚÔËÐеĽø³ÌµÄ¼ÒÍ¥¹ØÏµ¡£

init(1)-+-crond(98)

|-emacs(387)

|-gpm(146)

|-inetd(110)

|-kerneld(18)

|-kflushd(2)

|-klogd(87)

|-kswapd(3)

|-login(160)---bash(192)---emacs(225)

|-lpd(121)

|-mingetty(161)

|-mingetty(162)

|-mingetty(163)

|-mingetty(164)

|-login(403)---bash(404)---pstree(594)

|-sendmail(134)

|-syslogd(78)

`-update(166)

    ÁíÍâϵͳÖеÄËùÓеĽø³ÌÐÅÏ¢»¹´æ·ÅÔÚÒ»¸ö task_struct Êý¾Ý½á¹¹µÄË«ÏòÁ´±íÖУ¬¸ùÊÇ init ½ø³Ì¡£Õâ¸ö±íÈà Linux ¿ÉÒԲ鵽ϵͳÖеÄËùÓеĽø³Ì¡£ËüÐèÒªÕâ¸ö±íÒÔÌṩ¶ÔÓÚ ps »òÕß kill µÈÃüÁîµÄÖ§³Ö¡£

    Times and Timers ÔÚÒ»¸ö½ø³ÌµÄÉúÃüÖÜÆÚÖУ¬ºËÐijýÁ˸ú×ÙËüʹÓÃµÄ CPU ʱ¼ä»¹¼Ç¼ËüµÄÆäËûʱ¼ä¡£Ã¿Ò»¸öʱ¼äƬ£¨ clock tick £©£¬ºËÐĸüРjiffies Öе±Ç°½ø³ÌÔÚϵͳºÍÓû§Ì¬Ëù»¨µÄʱ¼ä×ۺϡ£ Linux Ò²Ö§³Ö½ø³ÌÖ¸¶¨µÄʱ¼ä¼ä¸ôµÄ¼ÆÊýÆ÷¡£½ø³Ì¿ÉÒÔʹÓÃϵͳµ÷Óý¨Á¢¼ÆÊ±Æ÷£¬ÔÚ¼ÆÊ±Æ÷µ½ÆÚµÄʱºò·¢ËÍÐźŸø×Ô¼º¡£ÕâÖÖ¼ÆÊ±Æ÷¿ÉÒÔÊÇÒ»´ÎÐԵģ¬Ò²¿ÉÊÇÖÜÆÚÐԵġ£

    File system ½ø³Ì¿ÉÒÔ¸ù¾ÝÐèÒª´ò¿ª»òÕ߹رÕÎļþ£¬½ø³ÌµÄ task_struct ½á¹¹´æ·ÅÁËÿһ¸ö´ò¿ªµÄÎļþÃèÊö·ûµÄÖ¸ÕëºÍÖ¸ÏòÁ½¸ö VFS I ½Úµã£¨ inode £©µÄÖ¸Õ롣ÿһ¸ö VFS I ½ÚµãΨһÃèÊöÒ»¸öÎļþϵͳÖеÄÒ»¸öÎļþ»òĿ¼£¬Ò²ÌṩÁ˶ÔÓڵײãÎļþϵͳµÄͨÓýӿڡ£ Linux ÏÂÈçºÎÖ§³ÖÎļþϵͳÔÚµÚ 9 ÕÂÖÐÃèÊö¡£µÚÒ»¸ö I ½ÚµãÊǸýø³ÌµÄ¸ù£¨ËüµÄÖ÷Ŀ¼£©£¬µÚ¶þ¸öÊÇËüµÄµ±Ç°»òÕß˵ pwd Ŀ¼¡£ Pwd È¡×Ô Unix ÃüÁӡ³ö¹¤×÷Ŀ¼¡£ÕâÁ½¸ö VFS ½Úµã±¾ÉíÓмÆÊý×ֶΣ¬Ëæ×ÅÒ»¸ö»ò¶à¸ö½ø³ÌÒýÓÃËüÃǶøÔö³¤¡£Õâ¾ÍÊÇΪʲôÄã²»ÄÜɾ³ýÒ»¸ö½ø³ÌÉèΪ¹¤×÷Ŀ¼µÄĿ¼¡£

    Virtual memory ¶àÊý½ø³Ì¶¼ÓÐһЩÐéÄâÄڴ棨ºËÐÄÏ̺߳ͺËÐÄÊØ»¤½ø³ÌûÓУ©£¬ Linux ºËÐıØÐëÖªµÀÕâЩÐéÄâÄÚ´æÊÇÈçºÎÓ³É䵽ϵͳµÄÎïÀíÄÚ´æÖеġ£

    Processor Specific Context ½ø³Ì¿ÉÒÔ¿´×÷ÊÇϵͳµ±Ç°×´Ì¬µÄ×ܺ͡£Ö»Òª½ø³ÌÔËÐУ¬Ëü¾ÍҪʹÓô¦ÀíÆ÷µÄ¼Ä´æÆ÷¡¢¶ÑÕ»µÈµÈ¡£µ±Ò»¸ö½ø³ÌÔÝÍ£µÄʱºò£¬ÕâЩ½ø³ÌµÄÉÏÏÂÎÄ¡¢ºÍ CPU Ïà¹ØµÄÉÏÏÂÎıØÐë±£´æµ½½ø³ÌµÄ task_struct ½á¹¹ÖС£µ±µ÷¶ÈÕßÖØÐÂÆô¶¯Õâ¸ö½ø³ÌµÄʱºò£¬ËüµÄÉÏÏÂÎľʹÓÕâÀï»Ö¸´¡£

4.2 Identifiers £¨±êʶ£©

    Linux £¬ÏóËùÓÐµÄ Unix £¬Ê¹ÓÃÓû§ºÍ×é±êʶ·ûÀ´¼ì²é¶ÔÓÚϵͳÖеÄÎļþºÍÓ³ÏñµÄ·ÃÎÊȨÏÞ¡£ Linux ϵͳÖÐËùÓеÄÎļþ¶¼ÓÐËùÓÐȨºÍÐí¿É£¬ÕâЩÐí¿ÉÃèÊöÁËϵͳ¶ÔÓÚ¸ÃÎļþ»òĿ¼ӵÓÐʲôÑùµÄȨÏÞ¡£»ù±¾µÄȨÏÞÊǶÁ¡¢Ð´ºÍÖ´ÐУ¬²¢·ÖÅäÁË 3 ×éÓû§£ºÎļþÊôÖ÷¡¢ÊôÓÚÌØ¶¨×éµÄ½ø³ÌºÍϵͳÖÐµÄÆäËû½ø³Ì¡£Ã¿Ò»×éÓû§¶¼¿ÉÒÔÓµÓв»Í¬µÄȨÏÞ£¬ÀýÈçÒ»¸öÎļþ¿ÉÒÔÈÃËüµÄÊôÖ÷¶Áд£¬ËüµÄ×é¶Á£¬¶øÏµÍ³ÖÐµÄÆäËû½ø³Ì²»ÄÜ·ÃÎÊ¡£

    Linux ʹÓÃ×éÀ´¸øÒ»×éÓû§¸³Óè¶ÔÎļþ»òÕßĿ¼µÄȨÏÞ£¬¶ø²»ÊǶÔϵͳÖеĵ¥¸öÓû§»òÕß½ø³Ì¸³ÓèȨÏÞ¡£±ÈÈçÄã¿ÉÒÔΪһ¸öÈí¼þÏîÄ¿ÖеÄËùÓÐÓû§´´½¨Ò»¸ö×飬ʹµÃÖ»ÓÐËûÃDzÅÄܹ»¶ÁдÏîÄ¿µÄÔ´´úÂë¡£Ò»¸ö½ø³Ì¿ÉÒÔÊôÓÚ¼¸¸ö×飨ȱʡÊÇ 32 ¸ö£©£¬ÕâЩ×é·ÅÔÚÿһ¸ö½ø³ÌµÄ task_struct ½á¹¹ÖÐµÄ groups ÏòÁ¿±íÖС£Ö»Òª½ø³ÌËùÊôµÄÆäÖÐÒ»¸ö×é¶ÔÓÚÒ»¸öÎļþÓзÃÎÊȨÏÞ£¬ÔòÕâ¸ö½ø³Ì¾ÍÓÖ¶ÔÓÚÕâ¸öÎļþµÄÊʵ±µÄ×éȨÏÞ¡£

Ò»¸ö½ø³ÌµÄ task_struct ÖÐÓÐ 4 ¶Ô½ø³ÌºÍ×é±êʶ·û¡£

Uid,gid ¸Ã½ø³ÌÔËÐÐÖÐËùʹÓõÄÓû§µÄ±êʶ·ûºÍ×éµÄ±êʶ·û

    Effective uid and gid һЩ³ÌÐò°ÑÖ´Ðнø³ÌµÄ uid ºÍ gid ¸Ä±äΪËüÃÇ×Ô¼ºµÄ£¨ÔÚ VFS I ½ÚµãÖ´ÐÐÓ³ÏñµÄÊôÐÔÖУ©¡£ÕâЩ³ÌÐò½Ð×ö setuid ³ÌÐò¡£ÕâÖÖ·½Ê½ÓÐÓã¬ÒòΪËü¿ÉÒÔÏÞÖÆ¶ÔÓÚ·þÎñµÄ·ÃÎÊ£¬ÌرðÊÇÄÇЩÓÃÆäËûÈ˵ķ½Ê½ÔËÐеģ¬ÀýÈçÍøÂçÊØ»¤½ø³Ì¡£ÓÐЧµÄ uid ºÍ gid À´×Ô setuid ³ÌÐò£¬¶ø uid ºÍ gid ÈÔ¾ÉÊÇÔ­À´µÄ¡£ºËÐļì²éÌØÈ¨µÄʱºò¼ì²éÓÐЧ uid ºÍ gid ¡£

    File system uid and gid ͨ³£ºÍÓÐЧ uid ºÍ gid ÏàµÈ£¬¼ì²é¶ÔÓÚÎļþϵͳµÄ·ÃÎÊȨÏÞ¡£ÓÃÓÚͨ¹ý NFS °²×°µÄÎļþϵͳ¡£ÕâʱÓû§Ì¬µÄ NFS ·þÎñÆ÷ÐèÒªÏóÒ»¸öÌØÊâ½ø³ÌÒ»Ñù·ÃÎÊÎļþ¡£Ö»ÓÐÎļþϵͳ uid ºÍ gid ¸Ä±ä£¨¶ø·ÇÓÐЧ uid ºÍ gid £©¡£Õâ±ÜÃâÁ˶ñÒâÓû§Ïò NFS µÄ·þÎñ³ÌÐò·¢ËÍ Kill Ðźš£ Kill ÓÃÒ»¸öÌØ±ðµÄÓÐЧ uid ºÍ gid ·¢Ë͸ø½ø³Ì¡£

    Saved uid and gid ÕâÊÇ POSIX ±ê×¼µÄÒªÇó£¬ÈóÌÐò¿ÉÒÔͨ¹ýϵͳµ÷ÓÃ¸Ä±ä½ø³ÌµÄ uid ºÍ gid ¡£ÓÃÓÚÔÚÔ­À´µÄ uid ºÍ gid ¸Ä±äÖ®ºó´æ´¢ÕæÊµµÄ uid ºÍ gid ¡£

4.3 Scheduling £¨µ÷¶È£©

    ËùÓеĽø³Ì²¿·ÖÔËÐÐÓëÓû§Ì¬£¬²¿·ÖÔËÐÐÓÚϵͳ̬¡£µ×²ãµÄÓ²¼þÈçºÎÖ§³ÖÕâЩ״̬¸÷²»Ïàͬµ«ÊÇͨ³£ÓÐÒ»¸ö°²È«»úÖÆ´ÓÓû§Ì¬×ªÈëϵͳ̬²¢×ª»ØÀ´¡£Óû§Ì¬±Èϵͳ̬µÄȨÏÞµÍÁ˺ܶࡣÿһ´Î½ø³ÌÖ´ÐÐÒ»¸öϵͳµ÷Óã¬Ëü¶¼´ÓÓû§Ì¬Çл»µ½ÏµÍ³Ì¬²¢¼ÌÐøÖ´ÐС£ÕâʱÈúËÐÄÖ´ÐÐÕâ¸ö½ø³Ì¡£ Linux ÖУ¬½ø³Ì²»ÊÇ»¥ÏàÕù¶á³ÉΪµ±Ç°ÔËÐеĽø³Ì£¬ËüÃÇÎÞ·¨Í£Ö¹ÕýÔÚÔËÐÐµÄÆäËü½ø³ÌÈ»ºóÖ´ÐÐ×ÔÉí¡£Ã¿Ò»¸ö½ø³ÌÔÚËü±ØÐëµÈ´ýһЩϵͳʼþµÄʱºò»á·ÅÆú CPU ¡£ÀýÈ磬һ¸ö½ø³Ì¿ÉÄܲ»µÃ²»µÈ´ý´ÓÒ»¸öÎļþÖжÁȡһ¸ö×Ö·û¡£Õâ¸öµÈ´ý·¢ÉúÔÚϵͳ̬µÄϵͳµ÷ÓÃÖС£½ø³ÌʹÓÃÁ˿⺯Êý´ò¿ª²¢¶ÁÎļþ£¬¿âº¯ÊýÓÖÖ´ÐÐϵͳµ÷ÓôӴò¿ªµÄÎļþÖжÁÈë×Ö½Ú¡£Õâʱ£¬µÈºòµÄ½ø³Ì»á±»¹ÒÆð£¬ÁíÒ»¸ö¸ü¼ÓÖµµÃµÄ½ø³Ì½«»á±»Ñ¡ÔñÖ´ÐС£½ø³Ì¾­³£µ÷ÓÃϵͳµ÷Óã¬ËùÒÔ¾­³£ÐèÒªµÈ´ý¡£¼´Ê¹½ø³ÌÖ´Ðе½ÐèÒªµÈ´ýÒ²ÓпÉÄÜ»áÓÃÈ¥²»¾ùºâµÄ CPU ʼþ£¬ËùÒÔ Linux ʹÓÃÇÀÏÈʽµÄµ÷¶È¡£ÓÃÕâÖÖ·½°¸£¬Ã¿Ò»¸ö½ø³ÌÔÊÐíÔËÐÐÉÙÁ¿Ò»¶Îʱ¼ä£¬ 200 ºÁÃ룬µ±Õâ¸öʱ¼ä¹ýÈ¥£¬Ñ¡ÔñÁíÒ»¸ö½ø³ÌÔËÐУ¬Ô­À´µÄ½ø³ÌµÈ´ýÒ»¶Îʱ¼äÖ±µ½ËüÓÖÖØÐÂÔËÐС£Õâ¸öʱ¼ä¶Î½Ð×öʱ¼äƬ¡£

    ÐèÒªµ÷¶È³ÌÐòÑ¡ÔñϵͳÖÐËùÓпÉÒÔÔËÐеĽø³ÌÖÐ×îÖµµÃµÄ½ø³Ì¡£Ò»¸ö¿ÉÒÔÔËÐеĽø³ÌÊÇÒ»¸öÖ»µÈ´ý CPU µÄ½ø³Ì¡£ Linux ʹÓúÏÀí¶ø¼òµ¥µÄ»ùÓÚÓÅÏȼ¶µÄµ÷¶ÈËã·¨ÔÚϵͳµ±Ç°µÄ½ø³ÌÖнøÐÐÑ¡Ôñ¡£µ±ËüÑ¡ÔñÁË×¼±¸ÔËÐеÄнø³Ì£¬Ëü¾Í±£´æµ±Ç°½ø³ÌµÄ״̬¡¢ºÍ´¦ÀíÆ÷Ïà¹ØµÄ¼Ä´æÆ÷ºÍÆäËûÐèÒª±£´æµÄÉÏÏÂÎÄÐÅÏ¢µ½½ø³ÌµÄ task_struct Êý¾Ý½á¹¹ÖС£È»ºó»Ö¸´ÒªÔËÐеÄеĽø³ÌµÄ״̬£¨Óֺʹ¦ÀíÆ÷Ïà¹Ø£©£¬°ÑϵͳµÄ¿ØÖƽ»¸øÕâ¸ö½ø³Ì¡£ÎªÁ˹«Æ½µØÔÚϵͳÖÐËùÓпÉÒÔÔËÐУ¨ runnable £©µÄ½ø³ÌÖ®¼ä·ÖÅä CPU ʱ¼ä£¬µ÷¶È³ÌÐòÔÚÿһ¸ö½ø³ÌµÄ task_struct ½á¹¹Öб£´æÁËÐÅÏ¢£º

²Î¼û kernel/sched.c schedule()

    policy ½ø³ÌµÄµ÷¶È²ßÂÔ¡£ Linux ÓÐÁ½ÖÖÀàÐ͵Ľø³Ì£ºÆÕͨºÍʵʱ¡£ÊµÊ±½ø³Ì±ÈËùÓÐÆäËü½ø³ÌµÄÓÅÏȼ¶¸ß¡£Èç¹ûÓÐÒ»¸öʵʱµÄ½ø³Ì×¼±¸ÔËÐУ¬ÄÇôËü×ÜÊÇÏȱ»ÔËÐС£ÊµÊ±½ø³ÌÓÐÁ½ÖÖ²ßÂÔ£º»·»òÏȽøÏȳö£¨ round robin and first in first out £©¡£ÔÚ»·µÄµ÷¶È²ßÂÔÏ£¬Ã¿Ò»¸öʵʱ½ø³ÌÒÀ´ÎÔËÐУ¬¶øÔÚÏȽøÏȳöµÄ²ßÂÔÏ£¬Ã¿Ò»¸ö¿ÉÒÔÔËÐеĽø³Ì°´ÕÕËüÔÚµ÷¶È¶ÓÁÐÖеÄ˳ÐòÔËÐУ¬Õâ¸ö˳Ðò²»»á¸Ä±ä¡£

    Priority ½ø³ÌµÄµ÷¶ÈÓÅÏȼ¶¡£Ò²ÊÇËüÔÊÐíÔËÐеÄʱºò¿ÉÒÔʹÓõÄʱ¼äÁ¿£¨ jiffies £©¡£Äã¿ÉÒÔͨ¹ýϵͳµ÷ÓûòÕß renice ÃüÁîÀ´¸Ä±äÒ»¸ö½ø³ÌµÄÓÅÏȼ¶¡£

    Rt_priority Linux Ö§³Öʵʱ½ø³Ì¡£ÕâЩ½ø³Ì±ÈϵͳÖÐÆäËû·ÇʵʱµÄ½ø³ÌÓµÓиü¸ßµÄÓÅÏȼ¶¡£Õâ¸öÓòÔÊÐíµ÷¶È³ÌÐò¸³Óèÿһ¸öʵʱ½ø³ÌÒ»¸öÏà¶ÔµÄÓÅÏȼ¶¡£ÊµÊ±½ø³ÌµÄÓÅÏȼ¶¿ÉÒÔÓÃϵͳµ÷ÓÃÀ´ÐÞ¸Ä

    Coutner Õâʱ½ø³Ì¿ÉÒÔÔËÐеÄʱ¼äÁ¿£¨ jiffies £©¡£½ø³ÌÆô¶¯µÄʱºòµÈÓÚÓÅÏȼ¶£¨ priority £©£¬Ã¿Ò»´ÎʱÖÓÖÜÆÚµÝ¼õ¡£

    µ÷¶È³ÌÐò´ÓºËÐĵĶà¸öµØ·½ÔËÐС£Ëü¿ÉÒÔÔڰѵ±Ç°½ø³Ì·Åµ½µÈ´ý¶ÓÁÐÖ®ºóÔËÐУ¬Ò²¿ÉÒÔÔÚϵͳµ÷ÓÃÖ®ºó½ø³Ì´Óϵͳ̬·µ»Ø½ø³Ì̬֮ǰÔËÐС£ÐèÒªÔËÐе÷¶È³ÌÐòµÄÁíÒ»¸öÔ­ÒòÊÇϵͳʱÖӸպðѵ±Ç°½ø³ÌµÄ¼ÆÊýÆ÷ (counter) ÖóÉÁË 0 ¡£Ã¿Ò»´Îµ÷¶È³ÌÐòÔËÐÐËü×öÒÔϹ¤×÷£º

²Î¼û kernel/sched.c schedule()

kernel work µ÷¶È³ÌÐòÔËÐÐ bottom half handler ²¢´¦ÀíϵͳµÄµ÷¶ÈÈÎÎñ¶ÓÁС£ÕâЩÇáÁ¿¼¶µÄºËÐÄÏß³ÌÔÚµÚ 11 ÕÂÏêϸÃèÊö

Current pocess ÔÚÑ¡ÔñÁíÒ»¸ö½ø³Ì֮ǰ±ØÐë´¦Àíµ±Ç°½ø³Ì¡£

Èç¹ûµ±Ç°½ø³ÌµÄµ÷¶È²ßÂÔÊÇ»·ÔòËü·Åµ½ÔËÐжÓÁеÄ×îºó¡£

Èç¹ûÈÎÎñÊÇ¿ÉÖжϵĶøÇÒËüÉϴε÷¶ÈµÄʱºòÊÕµ½¹ýÒ»¸öÐźţ¬ËüµÄ״̬±äΪ RUNNING

Èç¹ûµ±Ç°½ø³Ì³¬Ê±£¬ËüµÄ״̬³ÉΪ RUNNING

Èç¹ûµ±Ç°½ø³ÌµÄ״̬Ϊ RUNNING Ôò±£³Ö´Ë״̬

²»ÊÇ RUNNING »òÕß INTERRUPTIBLE µÄ½ø³Ì±»´ÓÔËÐжÓÁÐÖÐɾ³ý¡£ÕâÒâζ×ŵ±µ÷¶È³ÌÐò²éÕÒ×îÖµµÃÔËÐеĽø³Ìʱ²»»á¿¼ÂÇÕâÑùµÄ½ø³Ì¡£

    Process Selection µ÷¶È³ÌÐò²é¿´ÔËÐжÓÁÐÖеĽø³Ì£¬²éÕÒ×îÖµµÃÔËÐеĽø³Ì¡£Èç¹ûÓÐʵʱµÄ½ø³Ì£¨¾ßÓÐʵʱµ÷¶È²ßÂÔ£©£¬¾Í»á±ÈÆÕͨ½ø³Ì¸üÖØÒ»Ð©¡£ÆÕͨ½ø³ÌµÄÖØÁ¿ÊÇËüµÄ counter £¬µ«ÊǶÔÓÚʵʱ½ø³ÌÔòÊÇ counter ¼Ó 1000 ¡£ÕâÒâζ×ÅÈç¹ûϵͳÖдæÔÚ¿ÉÔËÐеÄʵʱ½ø³Ì£¬¾Í×ÜÊÇÔÚÈÎºÎÆÕͨ¿ÉÔËÐеĽø³Ì֮ǰÔËÐС£µ±Ç°µÄ½ø³Ì£¬ÒòΪÓõôÁËһЩʱ¼äƬ£¨ËüµÄ counter ¼õÉÙÁË£©£¬ËùÒÔÈç¹ûϵͳÖÐÓÉÆäËûͬµÈÓÅÏȼ¶µÄ½ø³Ì£¬¾Í»á´¦ÓÚ²»ÀûµÄλÖãºÕâÒ²ÊÇÓ¦¸ÃµÄ¡£Èç¹û¼¸¸ö½ø³ÌÓÖͬÑùµÄÓÅÏȼ¶£¬×î½Ó½üÔËÐжÓÁÐǰ¶ÎµÄÄǸö¾Í±»Ñ¡ÖС£µ±Ç°½ø³Ì±»·Åµ½ÔËÐжÓÁеĺóÃæ¡£Èç¹ûÒ»¸öƽºâµÄϵͳ£¬ÓµÓдóÁ¿ÏàͬÓÅÏȼ¶µÄ½ø³Ì£¬ÄÇô»Ø°´ÕÕ˳ÐòÖ´ÐÐÕâЩ½ø³Ì¡£Õâ½Ð×ö»·Ð͵÷¶È²ßÂÔ¡£²»¹ý£¬ÒòΪ½ø³ÌÐèÒªµÈ´ý×ÊÔ´£¬ËüÃǵÄÔËÐÐ˳Ðò¿ÉÄÜ»á±ä»¯¡£

    Swap Processes Èç¹û×îÖµµÃÔËÐеĽø³Ì²»Êǵ±Ç°½ø³Ì£¬µ±Ç°½ø³Ì±ØÐë±»¹ÒÆð£¬ÔËÐÐеĽø³Ì¡£µ±Ò»¸ö½ø³ÌÔËÐеÄʱºòËüʹÓÃÁË CPU ºÍϵͳµÄ¼Ä´æÆ÷ºÍÎïÀíÄڴ档ÿһ´ÎËüµ÷ÓÃÀý³Ì¶¼Í¨¹ý¼Ä´æÆ÷»òÕß¶ÑÕ»´«µÝ²ÎÊý¡¢±£´æÊýÖµ±ÈÈçµ÷ÓÃÀý³ÌµÄ·µ»ØµØÖ·µÈ¡£Òò´Ë£¬µ±µ÷¶È³ÌÐòÔËÐеÄʱºòËüÔÚµ±Ç°½ø³ÌµÄÉÏÏÂÎÄÔËÐС£Ëü¿ÉÄÜÊÇÌØÈ¨Ä£Ê½£ººËÐÄ̬£¬µ«ÊÇËüÈÔ¾ÉÊǵ±Ç°ÔËÐеĽø³Ì¡£µ±Õâ¸ö½ø³ÌÒª¹ÒÆðʱ£¬ËüµÄËùÓлúÆ÷״̬£¬°üÀ¨³ÌÐò¼ÆÊýÆ÷ (PC) ºÍËùÓеĴ¦ÀíÆ÷¼Ä´æÆ÷£¬±ØÐë´æµ½½ø³ÌµÄ task_struct Êý¾Ý½á¹¹ÖС£È»ºó£¬±ØÐë¼ÓÔØÐ½ø³ÌµÄËùÓлúÆ÷״̬¡£ÕâÖÖ²Ù×÷ÒÀÀµÓÚϵͳ£¬²»Í¬µÄ CPU ²»»áÍêÈ«ÏàͬµØÊµÏÖ£¬²»¹ý¾­³£¶¼ÊÇͨ¹ýһЩӲ¼þµÄ°ïÖú¡£

    ½»»»³öÈ¥½ø³ÌµÄÉÏÏÂÎÄ·¢ÉúÔÚµ÷¶ÈµÄ×îºó¡£Ç°Ò»¸ö½ø³Ì´æ´¢µÄÉÏÏÂÎÄ£¬¾ÍÊǵ±Õâ¸ö½ø³ÌÔÚµ÷¶È½áÊøµÄʱºòϵͳµÄÓ²¼þÉÏÏÂÎĵĿìÕÕ¡£ÏàͬµÄ£¬µ±¼ÓÔØÐµĽø³ÌµÄÉÏÏÂÎÄʱ£¬ÈÔ¾ÉÊǵ÷¶È½áÊøÊ±µÄ¿ìÕÕ£¬°üÀ¨½ø³ÌµÄ³ÌÐò¼ÆÊýÆ÷ºÍ¼Ä´æÆ÷µÄÄÚÈÝ¡£

    Èç¹ûǰһ¸ö½ø³Ì»òÕßеĵ±Ç°½ø³ÌʹÓÃÐéÄâÄڴ棬ÔòϵͳµÄÒ³±íÐèÒª¸üС£Í¬Ñù£¬Õâ¸ö¶¯×÷ÊʺÏÌåϵ½á¹¹Ïà¹Ø¡£ Alpha AXP ´¦ÀíÆ÷£¬Ê¹Óà TLT £¨ Translation Look-aside Table £©»òÕß»º´æµÄÒ³±íÌõÄ¿£¬±ØÐëÇå³ýÊôÓÚǰһ¸ö½ø³ÌµÄ»º´æµÄÒ³±íÌõÄ¿¡£

4.3.1 Scheduling in Multiprocessor Systems £¨¶à´¦ÀíÆ÷ϵͳÖеĵ÷¶È£©

    ÔÚ Linux ÊÀ½çÖУ¬¶à CPU ϵͳ±È½ÏÉÙ£¬µ«ÊÇÒѾ­×öÁË´óÁ¿µÄ¹¤×÷ʹ Linux ³ÉΪһ¸ö SMP £¨¶Ô³Æ¶à´¦Àí£©µÄ²Ù×÷ϵͳ¡£Õâ¾ÍÊÇ£¬¿ÉÒÔÔÚϵͳÖÐµÄ CPU Ö®¼äƽºâ¸ºÔصÄÄÜÁ¦¡£¸ºÔؾùºâûÓбÈÔÚµ÷¶È³ÌÐòÖиüÖØÒªµÄÁË¡£

    ÔÚÒ»¸ö¶à´¦ÀíÆ÷µÄϵͳÖУ¬Ï£ÍûµÄÇé¿öÊÇ£ºËùÓеĴ¦ÀíÆ÷¶¼·±Ã¦µØÔËÐнø³Ì¡£Ã¿Ò»¸ö½ø³Ì¶¼¶ÀÁ¢µØÔËÐе÷¶È³ÌÐòÖ±µ½ËüµÄµ±Ç°µÄ½ø³ÌÓÃÍêʱ¼äƬ»òÕß²»µÃ²»µÈ´ýϵͳ×ÊÔ´¡£ SMP ϵͳÖеÚÒ»¸öÐèҪעÒâµÄÊÇϵͳÖпÉÄܲ»Ö¹Ò»¸ö¿ÕÏУ¨ idle £©½ø³Ì¡£ÔÚÒ»¸öµ¥´¦ÀíÆ÷µÄϵͳÖУ¬¿ÕÏнø³ÌÊÇ task ÏòÁ¿±íÖеĵÚÒ»¸öÈÎÎñ£¬ÔÚÒ»¸ö SMP ϵͳÖУ¬Ã¿Ò»¸ö CPU ¶¼ÓÐÒ»¸ö¿ÕÏеĽø³Ì£¬¶øÄã¿ÉÄÜÓв»Ö¹Ò»¸ö¿ÕÏÐ CPU ¡£ÁíÍ⣬ÿһ¸ö CPU ÓÐÒ»¸öµ±Ç°½ø³Ì£¬ËùÒÔ SMP ϵͳ±ØÐë¼Ç¼ÿһ¸ö´¦ÀíÆ÷µÄµ±Ç°ºÍ¿ÕÏнø³Ì¡£

    ÔÚÒ»¸ö SMP ϵͳÖУ¬Ã¿Ò»¸ö½ø³ÌµÄ task_struct ¶¼°üº¬½ø³Ìµ±Ç°ÔËÐеĴ¦ÀíÆ÷±àºÅ£¨ processor £©ºÍÉÏ´ÎÔËÐеĴ¦ÀíÆ÷±àºÅ£¨ last_processor £©¡£ÎªÊ²Ã´½ø³Ìÿһ´Î±»Ñ¡ÔñÔËÐÐʱ²»ÒªÔÚ²»Í¬µÄ CPU ÉÏÔËÐÐÊÇûʲôµÀÀíµÄ£¬µ«ÊÇ Linux ¿ÉÒÔʹÓà processor_mask °Ñ½ø³ÌÏÞÖÆÔÚÒ»¸ö»ò¶à¸ö CPU ÉÏ¡£Èç¹ûλ N ÖÃ룬Ôò¸Ã½ø³Ì¿ÉÒÔÔËÐÐÔÚ´¦ÀíÆ÷ N ÉÏ¡£µ±µ÷¶È³ÌÐòÑ¡ÔñÔËÐеĽø³ÌµÄʱºò£¬Ëü²»»á¿¼ÂÇ processor_mask ÏàӦλûÓÐÉèÖõĽø³Ì¡£µ÷¶È³ÌÐòÒ²»áÀûÓÃÉÏÒ»´ÎÔÚµ±Ç°´¦ÀíÆ÷ÔËÐеĽø³Ì£¬ÒòΪ°Ñ½ø³Ì×ªÒÆµ½ÁíÒ»¸ö´¦ÀíÆ÷ÉϾ­³£»áÓÐÐÔÄÜÉϵĿªÖ§¡£

4.4 Files £¨Îļþ£©

    ͼ 4.1 ÏÔʾÁËÃèÊöϵͳÿһ¸ö½ø³ÌÖеÄÓÃÓÚÃèÊöºÍÎļþϵͳÏà¹ØµÄÐÅÏ¢µÄÁ½¸öÊý¾Ý½á¹¹¡£µÚÒ»¸ö fs_struct °üÀ¨ÁËÕâ¸ö½ø³ÌµÄ VFS I ½ÚµãºÍËüµÄ umask ¡£ Umask ÊÇÐÂÎļþ´´½¨Ê±ºòµÄȱʡģʽ£¬¿ÉÒÔͨ¹ýϵͳµ÷Óøı䡣

²Î¼û include/linux/sched.h

    µÚ¶þ¸öÊý¾Ý½á¹¹£¬ files_struct £¬°üÀ¨Á˽ø³Ìµ±Ç°Ê¹ÓõÄËùÓÐÎļþµÄÐÅÏ¢¡£³ÌÐò´Ó±ê×¼ÊäÈë¶ÁÈ¡£¬Ïò±ê×¼Êä³öд£¬´íÎóÐÅÏ¢Êä³öµ½±ê×¼´íÎó¡£ÕâЩ¿ÉÒÔÊÇÎļþ£¬ÖÕ¶ËÊäÈë / Êä³ö»òÕßÊÀ¼ÍµÄÉ豸£¬µ«ÊÇ´Ó³ÌÐòµÄ½Ç¶ÈËüÃǶ¼±»¿´×÷ÊÇÎļþ¡£Ã¿Ò»¸öÎļþ¶¼ÓÐËüµÄÃèÊö·û£¬ files_struct °üÀ¨ÁËÖ¸Ïò 256 ¸ö file Êý¾Ý½á¹û£¬Ã¿Ò»¸öÃèÊö½ø³ÌÐÎÓõÄÎļþ¡£ F_mode ÓòÃèÊöÁËÎļþ´´½¨µÄģʽ£ºÖ»¶Á¡¢¶Áд»òÕßֻд¡£ F_pos ¼Ç¼ÁËÏÂÒ»´Î¶Áд²Ù×÷ÔÚÎļþÖеÄλÖᣠF_inode Ö¸ÏòÃèÊö¸ÃÎļþµÄ I ½Úµã£¬ f_ops ÊÇÖ¸ÏòÒ»×éÀý³ÌµØÖ·µÄÖ¸Õ룬ÿһ¸öµØÖ·¶¼ÊÇÒ»¸öÓÃÓÚ´¦ÀíÎļþµÄº¯Êý¡£ÀýÈçдÊý¾ÝµÄº¯Êý¡£ÕâÖÖ³éÏóµÄ½Ó¿Ú·Ç³£Ç¿´ó£¬Ê¹µÃ Linux ¿ÉÒÔÖ§³Ö´óÁ¿µÄÎļþÀàÐÍ¡£ÎÒÃÇ¿ÉÒÔ¿´µ½£¬ÔÚ Linux ÖÐ pipe Ò²ÊÇÓÃÕâÖÖ»úÖÆÊµÏֵġ£

    ÿһ´Î´ò¿ªÒ»¸öÎļþ£¬¾ÍʹÓà files_struct ÖеÄÒ»¸ö¿ÕÏÐµÄ file Ö¸ÕëÖ¸ÏòÕâ¸öÐ嵀 file ½á¹¹¡£ Linux ½ø³ÌÆô¶¯Ê±ÓÐ 3 ¸öÎļþÃèÊö·ûÒѾ­´ò¿ª¡£Õâ¾ÍÊDZê×¼ÊäÈë¡¢±ê×¼Êä³öºÍ±ê×¼´íÎó£¬Õâ¶¼ÊÇ´Ó´´½¨ËüÃǵĸ¸½ø³ÌÖм̳йýÀ´µÄ¡£¶ÔÓÚÎļþµÄ·ÃÎʶ¼ÊÇͨ¹ý±ê×¼µÄϵͳµ÷Óã¬ÐèÒª´«µÝ»ò·µ»ØÎļþÃèÊö·û¡£ÕâЩÃèÊö·ûÊǽø³ÌµÄ fd ÏòÁ¿±íÖеÄË÷Òý£¬ËùÒÔ±ê×¼ÊäÈë¡¢±ê×¼Êä³öºÍ±ê×¼´íÎóµÄÎļþÃèÊö·û·Ö±ðÊÇ 0 £¬ 1 ºÍ 2 ¡£¶ÔÓÚÎļþµÄËùÓзÃÎʶ¼ÊÇÀûÓà file Êý¾Ý½á¹¹ÖеÄÎļþ²Ù×÷Àý³ÌºÍËüµÄ VFS I ½ÚµãÒ»ÆðÀ´ÊµÏֵġ£

4.5 Virtual Memory £¨ÐéÄâÄڴ棩

    ½ø³ÌµÄÐéÄâÄÚ´æ°üÀ¨¶àÖÖÀ´Ô´µÄÖ´ÐдúÂëºÍÊý¾Ý¡£µÚÒ»ÖÖÊǼÓÔØµÄ³ÌÐòÓ³Ïñ£¬ÀýÈç ls ÃüÁî¡£Õâ¸öÃüÁÏóËùÓеÄÖ´ÐÐÓ³ÏñÒ»Ñù£¬ÓÉÖ´ÐдúÂëºÍÊý¾Ý×é³É¡£Ó³ÏñÎļþÖаüÀ¨½«Ö´ÐдúÂëºÍÏà¹ØµÄ³ÌÐòÊý¾Ý¼ÓÔØµ½½ø³ÌµØÐéÄâÄÚ´æÖÐËùÐèÒªµÄËùÓÐÐÅÏ¢¡£µÚ¶þÖÖ£¬½ø³Ì¿ÉÒÔÔÚ´¦Àí¹ý³ÌÖзÖÅ䣨ÐéÄ⣩Äڴ棬±ÈÈçÓÃÓÚ´æ·ÅËü¶ÁÈëµÄÎļþµÄÄÚÈÝ¡£Ð·ÖÅäµÄÐéÄâÄÚ´æÐèÒªÁ¬½Óµ½½ø³ÌÏÖ´æµÄÐéÄâÄÚ´æÖвÅÄÜʹÓᣵÚÈýÖУ¬ Linux ½ø³ÌʹÓÃͨÓôúÂë×é³ÉµÄ¿â£¬ÀýÈçÎļþ´¦Àí¡£Ã¿Ò»¸ö½ø³Ì¶¼°üÀ¨¿âµÄÒ»·Ý¿½±´Ã»ÓÐÒâÒ壬 Linux ʹÓù²Ïí¿â£¬¼¸¸öͬʱÔËÐеĽø³Ì¿ÉÒÔ¹²Óá£ÕâЩ¹²Ïí¿âÀï±ßµÄ´úÂëºÍÊý¾Ý±ØÐëÁ¬½Óµ½¸Ã½ø³ÌµÄÐéÄâµØÖ·¿Õ¼äºÍÆäËû¹²Ïí¸Ã¿âµÄ½ø³ÌµÄÐéÄâµØÖ·¿Õ¼ä¡£

    ÔÚÒ»¸öÌØ¶¨µÄʱ¼ä£¬½ø³Ì²»»áʹÓÃËüµÄÐéÄâÄÚ´æÖаüÀ¨µÄËùÓдúÂëºÍÊý¾Ý¡£Ëü¿ÉÄܰüÀ¨Ö¼ÔÚÌØ¶¨Çé¿öÏÂʹÓõĴúÂ룬±ÈÈç³õʼ»¯»òÕß´¦ÀíÌØ¶¨µÄʼþ¡£Ëü¿ÉÄÜÖ»ÊÇÓÃÁËËüµÄ¹²Ïí¿âÖÐÒ»²¿·ÖÀý³Ì¡£Èç¹û°ÑËùÓÐÕâЩ´úÂë¶¼¼ÓÔØµ½ÎïÀíÄÚ´æÖжø²»Ê¹ÓÃÖ»»áÊÇÀË·Ñ¡£°ÑÕâÖÖÀ˷ѺÍϵͳÖеĽø³ÌÊýÄ¿Ïà³Ë£¬ÏµÍ³µÄÔËÐÐЧÂÊ»áºÜµÍ¡£ Linux ¸ÄΪʹÓà demand paging ¼¼Êõ£¬½ø³ÌµÄÐéÄâÄÚ´æÖ»ÔÚ½ø³ÌÊÔͼʹÓõÄʱºò²Åµ÷ÈëÎïÀíÄÚ´æÖС£ËùÒÔ£¬ Linux ²»°Ñ´úÂëºÍÊý¾ÝÖ±½Ó¼ÓÔØµ½ÄÚ´æÖУ¬¶øÐ޸Ľø³ÌµÄÒ³±í£¬°ÑÕâЩÐéÄâÇøÓò±ê־Ϊ´æÔÚµ«ÊDz»ÔÚÄÚ´æÖС£µ±½ø³ÌÊÔͼ·ÃÎÊÕâЩ´úÂë»òÕßÊý¾Ý£¬ÏµÍ³Ó²¼þ»á²úÉúÒ»¸ö page fault £¬°Ñ¿ØÖÆ´«µÝ¸ø Linux ºËÐÄ´¦Àí¡£Òò´Ë£¬¶ÔÓÚ½ø³ÌµØÖ·¿Õ¼äµÄÿһ¸öÐéÄâÄÚ´æÇøÓò£¬ Linux ÐèÒªÖ±µ½Ëü´ÓÄÄÀïÀ´ºÍÈçºÎ°ÑËü·Åµ½ÄÚ´æÖУ¬ÕâÑù²Å¿ÉÒÔ´¦ÀíÕâЩ page fault ¡£

    Linux ºËÐÄÐèÒª¹ÜÀíËùÓеÄÕâЩÐéÄâÄÚ´æÇøÓò£¬Ã¿Ò»¸ö½ø³ÌµÄÐéÄâÄÚ´æµÄÄÚÈÝͨ¹ýÒ»¸öËüµÄ task_struct Ö¸ÏòµÄÒ»¸ö mm_struct¡¡mm_struc Êý¾Ý½á¹¹ÃèÊö¡£¸Ã½ø³ÌµÄ mm_struct Êý¾Ý½á¹¹Ò²°üÀ¨¼ÓÔØµÄÖ´ÐÐÓ³ÏñµÄÐÅÏ¢ºÍ½ø³ÌÒ³±íµÄÖ¸Õë¡£Ëü°üÀ¨ÁËÖ¸ÏòÒ»×é vm_area_struct Êý¾Ý½á¹¹µÄÖ¸Õ룬ÿһ¸ö¶¼±íʾ¸Ã½ø³ÌÖеÄÒ»¸öÐéÄâÄÚ´æÇøÓò¡£

    Õâ¸öÁ´½Ó±í°´ÕÕÐéÄâÄÚ´æË³ÐòÅÅÐò¡£Í¼ 4.2 ÏÔʾÁËÒ»¸ö¼òµ¥½ø³ÌµÄÐéÄâÄÚ´æ·Ö²¼ºÍ¹ÜÀíËüµÄºËÐÄÊý¾Ý½á¹¹¡£ÒòΪÕâЩÐéÄâÄÚ´æÇøÓòÀ´Ô´²»Í¬£¬ Linux ͨ¹ý vm_area_struct Ö¸ÏòÒ»×éÐéÄâÄÚ´æ´¦ÀíÀý³Ì£¨Í¨¹ý vm_ops £©µÄ·½Ê½³éÏóÁ˽ӿڡ£ÕâÑù½ø³ÌµÄËùÓÐÐéÄâÄÚ´æ¶¼¿ÉÒÔÓÃÒ»ÖÖÒ»Öµķ½Ê½´¦Àí£¬²»¹Üµ×²ã¹ÜÀíÕâ¿éÄÚ´æµÄ·þÎñÈçºÎ²»Í¬¡£ÀýÈ磬»áÓÐÒ»¸öͨÓõÄÀý³Ì£¬ÔÚ½ø³ÌÊÔͼ·ÃÎʲ»´æÔÚµÄÄÚ´æÊ±µ÷Óã¬Õâ¾ÍÊÇ page fault µÄ´¦Àí¡£

    µ± Linux Ϊһ¸ö½ø³Ì´´½¨ÐµÄÐéÄâÄÚ´æÇøÓòºÍ´¦Àí¶ÔÓÚ²»ÔÚϵͳÎïÀíÄÚ´æÖеÄÐéÄâÄÚ´æµÄÒýÓÃʱ£¬·´¸´ÒýÓýø³ÌµÄ vm_area_struct Êý¾Ý½á¹¹ÁÐ±í¡£ÕâÒâζ×ÅËü²éÕÒÕýÈ·µÄ vm_area_struct Êý¾Ý½á¹¹Ëù»¨µÄʼþ¶ÔÓÚϵͳµÄÐÔÄÜÊ®·ÖÖØÒª¡£ÎªÁ˼ÓËÙ·ÃÎÊ£¬ Linux Ò²°Ñ vm_area_struct Êý¾Ý½á¹¹·Åµ½Ò»¸ö AVL £¨ Adelson-Velskii and Landis £©Ê÷¡£¶ÔÕâ¸öÊ÷½øÐа²ÅÅʹµÃÿһ¸ö vm_area_struct £¨»ò½Úµã£©¶¼ÓжÔÏàÁÚµÄ vm_area_struct ½á¹¹µÄÒ»¸ö×óºÍÒ»¸öÓÒÖ¸Õë¡£×óÖ¸ÕëÖ¸ÏòÓµÓÐ½ÏµÍÆðʼÐéÄâµØÖ·µÄ½Úµã£¬ÓÒÖ¸ÕëÖ¸ÏòÒ»¸öÓµÓÐ½Ï¸ßÆðʼÐéÄâµØÖ·µÄ½Úµã¡£ÎªÁËÕÒµ½ÕýÈ·µÄ½Úµã£¬ Linux ´ÓÊ÷µÄ¸ù¿ªÊ¼£¬¸ú´Óÿһ¸ö½ÚµãµÄ×óºÍÓÒÖ¸Õ룬ֱµ½ÕÒµ½ÕýÈ·µÄ vm_area_struct ¡£µ±È»£¬ÔÚÕâ¸öÊ÷ÖмäÊͷŲ»ÐèҪʱ¼ä£¬¶ø²åÈëÐ嵀 vm_area_struct ÐèÒª¶îÍâµÄ´¦Àíʱ¼ä¡£

    µ±Ò»¸ö½ø³Ì·ÖÅäÐéÄâÄÚ´æµÄʱºò£¬ Linux ²¢²»Îª¸Ã½ø³Ì±£ÁôÎïÀíÄÚ´æ¡£Ëüͨ¹ýÒ»¸öÐ嵀 vm_area_struct Êý¾Ý½á¹¹À´ÃèÊöÕâ¿éÐéÄâÄڴ棬Á¬½Óµ½½ø³ÌµÄÐéÄâÄÚ´æÁбíÖС£µ±½ø³ÌÊÔͼдÕâ¸öеÄÐéÄâÄÚ´æÇøÓòµÄʱºò£¬ÏµÍ³»á·¢Éú page fault ¡£´¦ÀíÆ÷ÊÔͼ½âÂëÕâ¸öÐéÄâµØÖ·£¬µ«ÊÇûÓжÔÓ¦¸ÃÄÚ´æµÄÒ³±íÌõÄ¿£¬Ëü»á·ÅÆú²¢²úÉúÒ»¸ö page fault Òì³££¬Èà Linux ºËÐÄ´¦Àí¡£ Linux ¼ì²éÕâ¸öÒýÓõÄÐéÄâµØÖ·ÊDz»ÊÇÔÚ½ø³ÌµÄÐéÄâµØÖ·¿Õ¼ä£¬ Èç¹ûÊÇ£¬ Linux ´´½¨Êʵ±µÄ PTE ²¢Îª¸Ã½ø³Ì·ÖÅäÎïÀíÄÚ´æÒ³¡£Ò²ÐíÐèÒª´ÓÎļþϵͳ»òÕß½»»»´ÅÅÌÖмÓÔØÏàÓ¦µÄ´úÂë»òÕßÊý¾Ý£¬È»ºó½ø³Ì´ÓÒýÆð page fault µÄÖ¸ÁîÖØÐÂÔËÐУ¬ÒòΪÕâ´Î¸ÃÄÚ´æÊµ¼Ê´æÔÚ£¬¿ÉÒÔ¼ÌÐø¡£

4.6 Creating a Process £¨´´½¨Ò»¸ö½ø³Ì£©

    µ±ÏµÍ³Æô¶¯µÄʱºòËüÔËÐÐÔÚºËÐÄ̬£¬Õâʱ£¬Ö»ÓÐÒ»¸ö½ø³Ì£º³õʼ»¯½ø³Ì¡£ÏóËùÓÐÆäËû½ø³ÌÒ»Ñù£¬³õʼ½ø³ÌÓÐÒ»×éÓöÑÕ»¡¢¼Ä´æÆ÷µÈµÈ±íʾµÄ»úÆ÷״̬¡£µ±ÏµÍ³ÖÐµÄÆäËû½ø³Ì´´½¨ºÍÔËÐеÄʱºòÕâЩÐÅÏ¢´æÔÚ³õʼ½ø³ÌµÄ task_struct Êý¾Ý½á¹¹ÖС£ÔÚϵͳ³õʼ»¯½áÊøµÄʱºò£¬³õʼ½ø³ÌÆô¶¯Ò»¸öºËÐÄỊ̈߳¨½Ð×ö init £©È»ºóÖ´ÐпÕÏÐÑ­»·£¬Ê²Ã´Ò²²»×ö¡£µ±Ã»ÓÐʲô¿ÉÒÔ×öµÄʱºò£¬µ÷¶È³ÌÐò»áÔËÐÐÕâ¸ö¿ÕÏеĽø³Ì¡£Õâ¸ö¿ÕÏнø³ÌµÄ task_struct ÊÇΨһһ¸ö²»ÊǶ¯Ì¬·ÖÅä¶øÊÇÔÚºËÐÄÁ¬½ÓµÄʱºò¾²Ì¬¶¨ÒåµÄ£¬ÎªÁ˲»ÖÁÓÚ»ìÏý£¬½Ð×ö init_task ¡£

    Init ºËÐÄÏ̻߳ò½ø³ÌÓµÓнø³Ì±êʶ·û 1 £¬ÊÇϵͳµÄµÚÒ»¸öÕæÕýµÄ½ø³Ì¡£ËüÖ´ÐÐϵͳµÄһЩ³õʼ»¯µÄÉèÖ㨱ÈÈç´ò¿ªÏµÍ³¿ØÖÆËü£¬°²×°¸ùÎļþϵͳ£©£¬È»ºóÖ´ÐÐϵͳ³õʼ»¯³ÌÐò¡£ÒÀÀµÓÚÄãµÄϵͳ£¬¿ÉÄÜÊÇ /etc/init £¬ /bin/init »ò /sbin/init ÆäÖÐÖ®Ò»¡£ Init ³ÌÐòʹÓà /etc/inittab ×÷Ϊ½Å±¾Îļþ´´½¨ÏµÍ³ÖеÄнø³Ì¡£ÕâЩнø³Ì×ÔÉí¿ÉÄÜ´´½¨ÐµĽø³Ì¡£ÀýÈ磺 getty ½ø³Ì¿ÉÄÜ»áÔÚÓû§ÊÔͼµÇ¼µÄʱºò´´½¨Ò»¸ö login µÄ½ø³Ì¡£ÏµÍ³ÖеÄËùÓнø³Ì¶¼ÊÇ init ºËÐÄÏ̵߳ĺó´ú¡£

    еĽø³ÌµÄ´´½¨ÊÇͨ¹ý¿Ë¡¾ÉµÄ½ø³Ì£¬»òÕß˵¿Ë¡µ±Ç°µÄ½ø³ÌÀ´ÊµÏֵġ£Ò»¸öеÄÈÎÎñÊÇͨ¹ýϵͳµ÷Óô´½¨µÄ£¨ fork »ò clone £©£¬¿Ë¡·¢ÉúÔÚºËÐĵĺËÐÄ̬¡£ÔÚϵͳµ÷ÓõÄ×îºó£¬²úÉúÒ»¸öеĽø³Ì£¬µÈ´ýµ÷¶È³ÌÐòÑ¡ÔñËüÔËÐС£´ÓϵͳµÄÎïÀíÄÚ´æÖÐΪÕâ¸ö¿Ë¡½ø³ÌµÄ¶ÑÕ»£¨Óû§ºÍºËÐÄ£©·ÖÅäÒ»¸ö»ò¶à¸öÎïÀíµÄÒ³ÓÃÓÚÐ嵀 task_struct Êý¾Ý½á¹¹¡£Ò»¸ö½ø³Ì±êʶ·û½«»á´´½¨£¬ÔÚϵͳµÄ½ø³Ì±êʶ·û×éÖÐÊÇΨһµÄ¡£µ«ÊÇ£¬Ò²¿ÉÄܿˡµÄ½ø³Ì±£ÁôËüµÄ¸¸½ø³ÌµÄ½ø³Ì±êʶ·û¡£Ð嵀 task_struct ½øÈëÁË task ÏòÁ¿±íÖУ¬¾ÉµÄ£¨µ±Ç°µÄ£©½ø³ÌµÄ task_struct µÄÄÚÈÝ¿½±´µ½Á˿ˡµÄ task_struct ¡£

²Î¼û kernel/fork.c do_fork()

    ¿Ë¡½ø³ÌµÄʱºò£¬ Linux ÔÊÐíÁ½¸ö½ø³Ì¹²Ïí×ÊÔ´¶ø²»ÊÇÓµÓв»Í¬µÄ¿½±´¡£°üÀ¨½ø³ÌµÄÎļþ£¬ÐźŴ¦ÀíºÍÐéÄâÄÚ´æ¡£¹²ÏíÕâЩ×ÊÔ´µÄʱºò£¬ËüÃÇÏàÓ¦µÄ count ×Ö¶ÎÏàÓ¦Ôö¼õ£¬ÕâÑù Linux ²»»áÊÍ·ÅÕâЩ×ÊÔ´Ö±µ½Á½¸ö½ø³Ì¶¼Í£Ö¹Ê¹Óá£ÀýÈ磬Èç¹û¿Ë¡µÄ½ø³ÌÒª¹²ÏíÐéÄâÄڴ棬ËüµÄ task_struct »á°üÀ¨Ò»¸öÖ¸ÏòÔ­À´½ø³ÌµÄ mm_struct µÄÖ¸Õ룬 mm_struct µÄ count ÓòÔö¼Ó£¬±íʾµ±Ç°¹²ÏíËüµÄ½ø³ÌÊýÄ¿¡£

    ¿Ë¡һ¸ö½ø³ÌµÄÐéÄâÄÚ´æÒªÇóÏ൱µÄ¼¼Êõ¡£±ØÐë²úÉúÒ»×é vm_area_struct Êý¾Ý½á¹¹¡¢ÏàÓ¦µÄ mm_struct Êý¾Ý½á¹¹ºÍ¿Ë¡½ø³ÌµÄÒ³±í£¬ÕâʱûÓп½±´½ø³ÌµÄÐéÄâÄÚ´æ¡£Õâ»áÊÇÀ§ÄѺͺÄʱµÄÈÎÎñ£¬ÒòΪһ²¿·ÖÐéÄâÄÚ´æ¿ÉÄÜÔÚÎïÀíÄÚ´æÖжøÁíÒ»²¿·Ö¿ÉÄÜÔÚ½»»»ÎļþÖС£Ìæ´úµ×£¬ Linux ʹÓÃÁ˽Ð×ö¡° copy on write ¡±µÄ¼¼Êõ£¬¼´Ö»ÓÐÁ½¸ö½ø³ÌÖеÄÒ»¸öÊÔͼдµÄʱºò²Å¿½±´ÐéÄâÄÚ´æ¡£Èκβ»Ð´ÈëµÄÐéÄâÄڴ棬ÉõÖÁ¿ÉÄÜдµÄ£¬¶¼¿ÉÒÔÔÚÁ½¸ö½ø³ÌÖ®¼ä¹²Ïí¶þ²¿»áÓÐʲôº¦´¦¡£Ö»¶ÁµÄÄڴ棬ÀýÈçÖ´ÐдúÂ룬¿ÉÒÔ¹²Ïí¡£ÎªÁËʵÏÖ¡° copy on write ¡±£¬¿ÉдµÄÇøÓòµÄÒ³±íÌõÄ¿±ê¼ÇΪֻ¶Á£¬¶øÃèÊöËüµÄ vm_area_struct Êý¾Ý½á¹¹±ê¼ÇΪ¡° copy on write ¡±¡£µ±Ò»¸ö½ø³ÌÊÔͼдÏò×ÅÕâ¸öÐéÄâÄÚ´æµÄʱºò»á²úÉú page fault ¡£Õâʱ Linux ½«»áÖÆ×÷Õâ¿éÄÚ´æµÄÒ»·Ý¿½±´²¢´¦ÀíÁ½¸ö½ø³ÌµÄÒ³±íºÍÐéÄâÄÚ´æµÄÊý¾Ý½á¹¹¡£

Times and Timer £¨Ê±¼äºÍ¼ÆÊ±Æ÷£©

    ºËÐĸú×Ù½ø³ÌµÄ CPU ʱ¼äºÍÆäËûһЩʱ¼ä¡£Ã¿Ò»¸öʱÖÓÖÜÆÚ£¬ºËÐĸüе±Ç°½ø³ÌµÄ jiffies À´±íʾÔÚϵͳºÍÓû§Ì¬Ï»¨·ÑµÄʱ¼ä×ܺ͡£

    ³ýÁËÕâЩ¼ÇÕ˵ļÆÊ±Æ÷£¬ Linux »¹Ö§³Ö½ø³ÌÖ¸¶¨µÄ¼ä¸ô¼ÆÊ±Æ÷£¨ interval timer £©¡£½ø³Ì¿ÉÒÔʹÓÃÕâЩ¼ÆÊ±Æ÷ÔÚÕâЩ¼ÆÊ±Æ÷µ½ÆÚµÄʱºò·¢Ë͸ø×ÔÉíÐźš£Ö§³ÖÈýÖÖ¼ä¸ô¼ÆÊ±Æ÷£º

²Î¼û kernel/itimer.c

Real Õâ¸ö¼ÆÊ±Æ÷ʹÓÃʵʱ¼ÆÊ±£¬µ±¼ÆÊ±Æ÷µ½ÆÚ£¬·¢Ë͸ø½ø³ÌÒ»¸ö SIGALRM Ðźš£

Virtual Õâ¸ö¼ÆÊ±Æ÷Ö»ÔÚ½ø³ÌÔËÐеÄʱºò¼ÆÊ±£¬µ½ÆÚµÄʱºò£¬·¢Ë͸ø½ø³ÌÒ»¸ö SIGVTALARM Ðźš£

Profile ÔÚ½ø³ÌÔËÐеÄʱºòºÍϵͳ´ú±í½ø³ÌÖ´ÐеÄʱºò¶¼¼°Ê±¡£µ½ÆÚµÄʱºò£¬»á·¢ËÍ SIGPROF Ðźš£

    ¿ÉÒÔÔËÐÐÒ»¸ö»òÕßËùÓеļä¸ô¼ÆÊ±Æ÷£¬ Linux ÔÚ½ø³ÌµÄ task_struct Êý¾Ý½á¹¹ÖмǼËùÓеıØÒªÐÅÏ¢¡£¿ÉÒÔʹÓÃϵͳµ÷Óý¨Á¢ÕâЩ¼ä¸ô¼ÆÊ±Æ÷£¬Æô¶¯¡¢Í£Ö¹ËüÃÇ£¬¶ÁÈ¡µ±Ç°µÄÊýÖµ¡£ÐéÄâºÍ profile ¼ÆÊ±Æ÷µÄ´¦Àí·½Ê½Ïàͬ£ºÃ¿Ò»´ÎʱÖÓÖÜÆÚ£¬µ±Ç°½ø³ÌµÄ¼ÆÊ±Æ÷µÝ¼õ£¬Èç¹ûµ½ÆÚ£¬¾Í·¢³öÊʵ±µÄÐźÅ

²Î¼û kernel/sched.c do_it_virtual() £¬ do_it_prof()

    ʵʱ¼ä¸ô¼ÆÊ±Æ÷ÉÔ΢²»Í¬¡£ Linux ʹÓüÆÊ±Æ÷µÄ»úÖÆÔÚµÚ 11 ÕÂÃèÊö¡£Ã¿Ò»¸ö½ø³Ì¶¼ÓÐ×Ô¼ºµÄ timer_list Êý¾Ý½á¹¹£¬µ±Ê±Ê¹ÓÃʵʱ¼ÆÊ±Æ÷µÄʱºò£¬Ê¹ÓÃϵͳµÄ timer ±í¡£µ±Ëüµ½ÆÚµÄʱºò£¬¼ÆÊ±Æ÷ºó°ë²¿·Ö´¦Àí°ÑËü´Ó¶ÓÁÐÖÐɾ³ý²¢µ÷Óüä¸ô¼ÆÊ±Æ÷´¦Àí³ÌÐò¡£Ëü²úÉú SIGALRM ÐźŲ¢ÖØÆô¶¯¼ä¸ô¼ÆÊ±Æ÷£¬°ÑËü¼Ó»Øµ½ÏµÍ³¼ÆÊ±Æ÷¶ÓÁС£

²Î¼û£º kernel/iterm.c it_real_fn()

Executing Programs £¨Ö´ÐгÌÐò£©
    ÔÚ Linux ÖУ¬Ïó Unix Ò»Ñù£¬³ÌÐòºÍÃüÁîͨ³£Í¨¹ýÃüÁî½âÊÍÆ÷Ö´ÐС£ÃüÁî½âÊͳÌÐòÊÇºÍÆäËû½ø³ÌÒ»ÑùµÄÓû§½ø³Ì£¬½Ð×ö shell £¨ÏëÏóÒ»¸ö¼á¹û£¬°ÑºËÐÄ×÷ΪÖмä¿ÉʳµÄ²¿·Ö£¬¶ø shell °üΧ×ÅËü£¬Ìṩһ¸ö½Ó¿Ú£©¡£ Linux ÖÐÓÐÐí¶à shell £¬×î³£ÓõÄÊÇ sh ¡¢ bash ºÍ tcsh ¡£³ýÁËһЩÄÚ²¿ÃüÁîÖ®Í⣬±ÈÈç cd ºÍ pwd £¬ÃüÁîÊÇ¿ÉÖ´ÐеĶþ½øÖÆÎļþ¡£¶ÔÓÚÊäÈëµÄÿһ¸öÃüÁ shell ÔÚµ±Ç°½ø³ÌµÄËÑË÷·¾¶Ö¸¶¨µÄĿ¼ÖУ¨·ÅÔÚ PATH »·¾³±äÁ¿£©²éÕÒÆ¥ÅäµÄÃû×Ö¡£Èç¹ûÕÒµ½ÁËÎļþ£¬¾Í¼ÓÔØ²¢ÔËÐС£ Shell ÓÃÉÏÊöµÄ fork »úÖÆ¿Ë¡×ÔÉí£¬²¢ÔÚ×Ó½ø³ÌÖÐÓÃÕÒµ½µÄÖ´ÐÐÓ³ÏñÎļþµÄÄÚÈÝÌæ»»ËüÕýÔÚÖ´ÐеĶþ½øÖÆÓ³Ïñ£¨ shell £©¡£Í¨³£ shell µÈ´ýÃüÁî½áÊø£¬»òÕß˵×Ó½ø³ÌÍ˳ö¡£Äã¿ÉÒÔͨ¹ýÊäÈë control-Z ·¢ËÍÒ»¸ö SIGSTOP ÐźŸø×Ó½ø³Ì£¬°Ñ×Ó½ø³ÌÍ£Ö¹²¢·Åµ½ºǫ́£¬Èà shell ÖØÐÂÔËÐС£Äã¿ÉÒÔʹÓà shell ÃüÁî bg Èà shell Ïò×Ó½ø³Ì·¢ËÍ SIGCONT Ðźţ¬°Ñ×Ó½ø³Ì·Åµ½ºǫ́²¢ÖØÐÂÔËÐУ¬Ëü»á³ÖÐøÔËÐÐÖ±µ½Ëü½áÊø»òÕßÐèÒª´ÓÖÕ¶ËÊäÈë»òÊä³ö¡£

    Ö´ÐÐÎļþ¿ÉÒÔÓÉÐí¶à¸ñʽÉõÖÁ¿ÉÒÔÊÇÒ»¸ö½Å±¾Îļþ£¨ script file £©¡£½Å±¾Îļþ±ØÐëÓúÏÊʵĽâÊͳÌÐòʶ±ð²¢ÔËÐС£ÀýÈç /bin/sh ½âÊÍ shell script ¡£¿ÉÖ´ÐеÄÄ¿±êÎļþ°üÀ¨ÁËÖ´ÐдúÂëºÍÊý¾ÝÒÔ¼°×ã¹»µÄÆäËûÐÅÏ¢£¬Ê±µÄ²Ù×÷ϵͳ¿ÉÒÔ°ÑËüÃǼÓÔØµ½ÄÚ´æÖв¢Ö´ÐС£ Linux ÖÐ×î³£ÓõÄÄ¿±êÎļþÀàÐÍÊÇ ELF £¬¶øÀíÂÛÉÏ£¬ Linux Áé»îµ½×ãÒÔ´¦Àí¼¸ºõËùÓеÄÄ¿±êÎļþ¸ñʽ¡£

    ºÃÏñÎļþϵͳһÑù£¬ Linux ¿ÉÒÔÖ§³ÖµÄ¶þ½øÖƸñʽҲÊÇÔÚºËÐÄÁ¬½ÓµÄʱºòÖ±½Ó½¨Á¢ÔÚºËÐĵĻòÕßÊÇ¿ÉÒÔ×÷Ϊģ¿é¼ÓÔØµÄ¡£ºËÐı£´æÁËÖ§³ÖµÄ¶þ½øÖƸñʽ£¨¼ûͼ 4.3 £©µÄÁÐ±í£¬µ±ÊÔͼִÐÐÒ»¸öÎļþµÄʱºò£¬Ã¿Ò»¸ö¶þ½øÖƸñʽ¶¼±»³¢ÊÔ£¬Ö±µ½¿ÉÒÔ¹¤×÷¡£Í¨³££¬ Linux Ö§³ÖµÄ¶þ½øÖÆÎļþÊÇ a.out ºÍ ELF ¡£¿ÉÖ´ÐÐÎļþ²»ÐèÒªÍêÈ«¶ÁÈëÄڴ棬¶øÊ¹ÓýÐ×ö demand loading µÄ¼¼Êõ¡£µ±½ø³ÌʹÓÃÖ´ÐÐÓ³ÏñµÄÒ»²¿·ÖµÄʱºòËü²Å±»µ÷ÈëÄڴ棬δ±»Ê¹ÓõÄÓ³Ïñ¿ÉÒÔ´ÓÄÚ´æÖÐ·ÏÆú¡£

²Î¼û fs/exec.c do_execve()

ELF
   
ELF £¨ Executable and Linkable Format ¿ÉÖ´ÐпÉÁ¬½Ó¸ñʽ£©Ä¿±êÎļþ£¬ÓÉ Unix ϵͳʵÑéÊÒÉè¼Æ£¬ÏÖÔÚ³ÉΪ Linux ×î³£Óõĸñʽ¡£ËäÈ»ºÍÆäËûÄ¿±êÎļþ¸ñʽ±ÈÈç ECOFF ºÍ a.out Ïà±È£¬ÓÐÐÔÄÜÉϵÄÇá΢¿ªÖ§£¬ ELF ¸Ð¾õ¸üÁé»î¡£ ELF ¿ÉÖ´ÐÐÎļþ°üÀ¨¿ÉÖ´ÐдúÂ루ÓÐʱ½Ð×ö text £©ºÍÊý¾Ý£¨ data £©¡£Ö´ÐÐÓ³ÏñÖеıíÃèÊöÁ˳ÌÐòÓ¦¸ÃÈçºÎ·Åµ½½ø³ÌµÄÐéÄâÄÚ´æÖС£¾²Ì¬Á¬½ÓµÄÓ³ÏñÊÇÓÃÁ¬½Ó³ÌÐò£¨ ld £©»òÕßÁ¬½Ó±à¼­Æ÷´´½¨µÄ£¬µ¥Ò»µÄÓ³ÏñÖаüÀ¨ÁËÔËÐиÃÓ³ÏñËùÐèÒªµÄËùÓеĴúÂëºÍÊý¾Ý¡£Õâ¸öÓ³ÏñÒ²ÃèÊöÁ˸ÃÓ³ÏñÔÚÄÚ´æÖеIJ¼¾ÖºÍÒªÖ´ÐеĵÚÒ»²¿·Ö´úÂëÔÚÓ³ÏñÖеĵØÖ·¡£

    ͼ 4.4 ÏóÊÇÁ˾²Ì¬Á¬½ÓµÄ ELF ¿ÉÖ´ÐÐÓ³ÏñµÄ²¼¾Ö¡£ÕâÊǸö¼òµ¥µÄ C ³ÌÐò£¬´òÓ¡¡° hello world ¡±È»ºóÍ˳ö¡£Í·ÎļþÃèÊöÁËËüÊÇÒ»¸ö ELF Ó³Ïñ£¬ÓÐÁ½¸öÎïÀíÍ·£¨ e_phnum ÊÇ 2 £©£¬´ÓÓ³ÏñÎļþµÄ¿ªÍ·µÚ 52 ×Ö½Ú¿ªÊ¼£¨ e_phoff £©¡£µÚÒ»¸öÎïÀíÍ·ÃèÊöÓ³ÏñÖеÄÖ´ÐдúÂ룬ÔÚÐéÄâµØÖ· 0x8048000 £¬ÓÐ 65532 ×Ö½Ú¡£ÒòΪËüÊǾ²Ì¬Á¬½ÓµÄ£¬ËùÒÔ°üÀ¨Êä³ö¡° hello world ¡±µÄµ÷Óà printf £¨£©µÄËùÓеĿâ´úÂë¡£Ó³ÏñµÄÈë¿Ú£¬¼´³ÌÐòµÄµÚÒ»ÌõÖ¸Á²»ÊÇλÓÚÓ³ÏñµÄÆðʼλÖ㬶øÔÚÐéÄâµØÖ· 0x8048090 £¨ e_entry £©¡£´úÂë½ô½Ó×ÅÔÚµÚ¶þÎïÀíÍ·ºóÃæ¿ªÊ¼¡£Õâ¸öÎïÀíÍ·ÃèÊöÁ˳ÌÐòµÄÊý¾Ý£¬½«»á¼ÓÔØµ½ÐéÄâÄÚ´æµØÖ· 0x8059BB8 ¡£Õâ¿éÊý¾Ý¿ÉÒÔ¶Áд¡£Äã»á×¢Òâµ½ÎļþÖÐÊý¾ÝµÄ´óСÊÇ 2200 ×Ö½Ú£¨ p_filesz £©¶øÔÚÄÚ´æÖеĴóСÊÇ 4248 ×Ö½Ú¡£ÒòΪǰ 2200 ×Ö½Ú°üÀ¨Ô¤Ïȳõʼ»¯µÄÊý¾Ý£¬¶ø½Ó×ÅµÄ 2048 ×Ö½Ú°üÀ¨»á±»Ö´ÐдúÂë³õʼ»¯µÄÊý¾Ý¡£

²Î¼û include/linux/elf.h

    µ± Linux °Ñ ELF ¿ÉÖ´ÐÐÓ³Ïñ¼ÓÔØµ½½ø³ÌµÄÐéÄâµØÖ·¿Õ¼äµÄʱºò£¬Ëü²»ÊÇʵ¼ÊµÄ¼ÓÔØÓ³Ïñ¡£ËüÉèÖÃÐéÄâÄÚ´æÊý¾Ý½á¹¹£¬¼´½ø³ÌµÄ vm_area_struct ºÍËüµÄÒ³±í¡£µ±³ÌÐòÖ´ÐÐÁË page fault µÄʱºò£¬³ÌÐòµÄ´úÂëºÍÊý¾Ý»á±»·Åµ½ÎïÀíÄÚ´æÖС£Ã»ÓÐÓõ½µÄ³ÌÐò²¿·Ö½«²»»á±»·Åµ½ÄÚ´æÖС£Ò»µ© ELF ¶þ½øÖƸñʽ¼ÓÔØ³ÌÐòÂú×ãÌõ¼þ£¬Ó³ÏñÊÇÒ»¸öÓÐЧµÄ ELF ¿ÉÖ´ÐÐÓ³Ïñ£¬Ëü°Ñ½ø³ÌµÄµ±Ç°¿ÉÖ´ÐÐÓ³Ïñ´ÓËüµÄÐéÄâÄÚ´æÖÐÇå³ý¡£ÒòΪÕâ¸ö½ø³ÌÊǸö¿Ë¡µÄÓ³Ïñ£¨ËùÓеĽø³Ì¶¼ÊÇ£©£¬¾ÉµÄÓ³ÏñÊǸ¸½ø³ÌÖ´ÐеijÌÐòµÄÓ³Ïñ£¨ÀýÈçÃüÁî½âÊͳÌÐò shell bash £©¡£Çå³ý¾ÉµÄ¿ÉÖ´ÐÐÓ³Ïñ»á·ÏÆú¾ÉµÄÐéÄâÄÚ´æµÄÊý¾Ý½á¹¹£¬ÖØÖýø³ÌµÄÒ³±í¡£ËüÒ²»áÇå³ýÉèÖÃµÄÆäËûÐźŴ¦Àí³ÌÐò£¬¹Ø±Õ´ò¿ªµÄÎļþ¡£ÔÚÇå³ý¹ý³ÌµÄ×îºó£¬½ø³Ì×¼±¸ÔËÐÐеĿÉÖ´ÐÐÓ³Ïñ¡£²»¹Ü¿ÉÖ´ÐÐÓ³ÏñµÄ¸ñʽÈçºÎ£¬½ø³ÌµÄ mm_struct Öж¼ÒªÉèÖÃÏàͬµÄÐÅÏ¢¡£°üÀ¨Ö¸ÏòÓ³ÏñÖдúÂëºÍÊý¾ÝÆðʼµÄÖ¸Õë¡£ÕâЩÊýÖµ´Ó ELF ¿ÉÖ´ÐÐÓ³ÏñµÄÎïÀíÍ·ÖжÁÈ룬ËüÃÇÃèÊöµÄ²¿·ÖÒ²±»Ó³Éäµ½Á˽ø³ÌµÄÐéÄâµØÖ·¿Õ¼ä¡£ÕâÒ²·¢ÉúÔÚ½ø³ÌµÄ vm_area_struct Êý¾Ý½á¹¹½¨Á¢ºÍÒ³±íÐ޸ĵÄʱºò¡£ mm_struct Êý¾Ý½á¹¹ÖÐÒ²°üÀ¨Ö¸Õ룬ָÏò´«µÝ¸ø³ÌÐòµÄ²ÎÊýºÍ½ø³ÌµÄ»·¾³±äÁ¿¡£

ELF Shared Libraries £¨ ELF ¹²Ïí¿â£©

    ¶¯Ì¬Á¬½ÓµÄÓ³Ïñ£¬·´¹ýÀ´£¬²»°üº¬ÔËÐÐËùÐèµÄËùÓеĴúÂëºÍÊý¾Ý¡£ÆäÖÐһЩ·ÅÔÚ¹²Ïí¿â²¢ÔÚÔËÐеÄʱºòÁ¬½Óµ½Ó³ÏñÖС£µ±ÔËÐÐʱ¶¯Ì¬¿âÁ¬½Óµ½Ó³ÏñÖеÄʱºò£¬¶¯Ì¬Á¬½Ó³ÌÐò£¨ dynamic linker £©Ò²ÒªÊ¹Óà ELF ¹²Ïí¿âµÄ±í¡£ Linux ʹÓü¸¸ö¶¯Ì¬Á¬½Ó³ÌÐò£¬ ld.so.1 £¬ libc.so.1 ºÍ ld-linux.so.1 £¬¶¼ÔÚ /lib Ŀ¼Ï¡£ÕâЩ¿â°üÀ¨Í¨ÓõĴúÂ룬±ÈÈçÓïÑÔ×ÓÀý³Ì¡£Èç¹ûûÓж¯Ì¬Á¬½Ó£¬ËùÓеijÌÐò¶¼±ØÐëÓÐÕâЩ¿âµÄ¶ÀÁ¢¿½±´£¬ÐèÒª¸ü¶àµÄ´ÅÅ̿ռäºÍÐéÄâÄÚ´æ¡£ÔÚ¶¯Ì¬Á¬½ÓµÄÇé¿öÏ£¬ ELF Ó³ÏñµÄ±íÖаüÀ¨ÒýÓõÄËùÓпâÀý³ÌµÄÐÅÏ¢¡£ÕâЩÐÅϢָʾ¶¯Ì¬Á¬½Ó³ÌÐòÈçºÎ¶¨Î»¿âÀý³ÌÒÔ¼°ÈçºÎÁ¬½Óµ½³ÌÐòµÄµØÖ·¿Õ¼ä¡£

Scripts Files

    ½Å±¾ÎļþÊÇÐèÒª½âÊÍÆ÷²ÅÄÜÔËÐеĿÉÖ´ÐÐÎļþ¡£ Linux ÏÂÓдóÁ¿µÄ½âÊÍÆ÷£¬ÀýÈç wish ¡¢ perl ºÍÃüÁî½âÊͳÌÐò±ÈÈç tcsh ¡£ Linux ʹÓñê×¼µÄ Unix Ô¼¶¨£¬Ôڽű¾ÎļþµÄµÚÒ»ÐаüÀ¨½âÊͳÌÐòµÄÃû×Ö¡£ËùÒÔÒ»¸öµäÐ͵Ľű¾Îļþ¿ÉÄÜ¿ªÍ·ÊÇ£º

#!/usr/bin/wish

    ½Å±¾Îļþ¼ÓÔØÆ÷ÊÔͼÕÒ³öÎļþËùÓõĽâÊͳÌÐò¡£ËüÊÔͼ´ò¿ª½Å±¾ÎļþµÚÒ»ÐÐÖ¸¶¨µÄ¿ÉÖ´ÐÐÎļþ¡£Èç¹û¿ÉÒÔ´ò¿ª£¬¾ÍµÃµ½Ò»¸öÖ¸Ïò¸ÃÎļþµÄ VFS I ½ÚµãµÄÖ¸Õ룬ȻºóÖ´ÐÐËüÈ¥½âÊͽű¾Îļþ¡£½Å±¾ÎļþµÄÃû×Ö³ÉΪÁ˲ÎÊý 0 £¨µÚÒ»¸ö²ÎÊý£©£¬ËùÓÐµÄÆäËû²ÎÊý¶¼ÏòÉÏÒÆ¶¯Ò»Î»£¨Ô­À´µÄµÚÒ»¸ö²ÎÊý³ÉΪÁ˵ڶþ¸ö²ÎÊýµÈµÈ£©¡£¼ÓÔØ½âÊͳÌÐòºÍ Linux ¼ÓÔØÆäËû¿ÉÖ´ÐгÌÐòÒ»Ñù¡£ Linux ÒÀ´Î³¢ÊÔ¸÷ÖÖ¶þ½øÖƸñʽ£¬Ö±µ½¿ÉÒÔ¹¤×÷¡£ÕâÒâζ×ÅÀíÂÛÉÏÄã¿ÉÒ԰Ѽ¸ÖÖ½âÊͳÌÐòºÍ¶þ½øÖƸñʽ¶Ñ»ýÆðÀ´£¬Èà Linux µÄ¶þ½øÖƸñʽ´¦Àí³ÌÐò¸ü¼ÓÁé»î¡£

²Î¼û fs/binfmt_script.c do_load_script()


 

[ÏÂÒ»Ò³]


Chapter 5
Interprocess Communication Mechanisms £¨½ø³Ì¼äͨѶ»úÖÆ£©

    ½ø³ÌÖ®¼ä»¥ÏàͨѶ²¢ºÍºËÐÄͨѶ£¬Ð­µ÷ËüÃǵÄÐÐΪ¡£ Linux Ö§³ÖһЩ½ø³Ì¼äͨѶ£¨ IPC £©µÄ»úÖÆ¡£Ðźź͹ܵÀÊÇÆäÖеÄÁ½ÖÖ£¬ Linux »¹Ö§³Öϵͳ V IPC £¨ÓÃÊ״γöÏÖµÄ Unix µÄ°æ±¾ÃüÃû£©µÄ»úÖÆ¡£

5.1 Signals £¨Ðźţ©

    ÐźÅÊÇ Unix ϵͳÖÐʹÓõÄ×î¹ÅÀϵĽø³Ì¼äͨѶµÄ·½·¨Ö®Ò»¡£ÓÃÓÚÏòÒ»¸ö»ò¶à¸ö½ø³Ì·¢ËÍÒ첽ʼþµÄÐźš£ÐźſÉÒÔÓüüÅÌÖն˲úÉú£¬»òÕßͨ¹ýÒ»¸ö´íÎóÌõ¼þ²úÉú£¬±ÈÈç½ø³ÌÊÔͼ·ÃÎÊËüµÄÐéÄâÄÚ´æÖв»´æÔÚµÄλÖᣠShell ҲʹÓÃÐźÅÏòËüµÄ×Ó½ø³Ì·¢ËÍ×÷Òµ¿ØÖÆÐźš£

    ÓÐһЩÐźÅÓкËÐIJúÉú£¬ÁíһЩ¿ÉÒÔÓÉϵͳÖÐÆäËûÓÐȨÏ޵Ľø³Ì²úÉú¡£Äã¿ÉÒÔʹÓà kill ÃüÁ kill ¨Cl £©ÁгöÄãµÄϵͳµÄÐźż¯£¬ÔÚÎÒµÄ Linux 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 Linux ϵͳÉϱàºÅ²»Í¬¡£½ø³Ì¿ÉÒÔÑ¡ÔñºöÂÔ²úÉúµÄ´ó¶àÊýÐźţ¬ÓÐÁ½¸öÀýÍ⣺ SIGSTOP £¨Èýø³ÌÍ£Ö¹Ö´ÐУ©ºÍ SIGKILL £¨Èýø³ÌÍ˳ö£©²»¿ÉÒÔºöÂÔ£¬ËäÈ»½ø³Ì¿ÉÒÔÑ¡ÔñËüÈçºÎ´¦ÀíÐźš£½ø³Ì¿ÉÒÔ×èÈûÐźţ¬Èç¹ûËü²»×èÈûÐźţ¬Ëü¿ÉÒÔÑ¡Ôñ×Ô¼º´¦Àí»òÕßÈúËÐÄ´¦Àí¡£Èç¹ûºËÐÄ´¦Àí£¬½«»áÖ´ÐиÃÐźŵÄȱʡÐÐΪ¡£ÀýÈ磬½ø³Ì½ÓÊÕµ½ SIGFPE £¨¸¡µãÒâÍ⣩µÄȱʡ¶¯×÷ÊDzúÉú core ²¢Í˳ö¡£ÐźÅûÓйÌÓеÄÓÅÏȼ¶£¬Èç¹ûÒ»¸ö½ø³Ìͬʱ²úÉúÁËÁ½¸öÐźţ¬ËüÃÇ»áÒÔÈÎÒâ˳Ðò³öÏÖÔÚ½ø³ÌÖв¢°´ÈÎÒâ˳Ðò´¦Àí¡£ÁíÍ⣬ҲûÓлúÖÆ¿ÉÒÔ´¦ÀíͳһÖÖÀàµÄ¶à¸öÐźš£½ø³ÌÎÞ·¨ÖªµÀËü½ÓÊÕÁË 1 »¹ÊÇ 42 ¸ö SIGCONT Ðźš£

    Linux Óýø³ÌµÄ task_struct Öдæ·ÅµÄÐÅÏ¢À´ÊµÏÖÐźŻúÖÆ¡£Ö§³ÖµÄÐźÅÊÜÏÞÓÚ´¦ÀíÆ÷µÄ×Ö³¤¡£ 32 λ×Ö³¤µÄ´¦ÀíÆ÷¿ÉÒÔÓÐ 32 ÖÐÐźţ¬¶ø 64 λµÄ´¦ÀíÆ÷£¬±ÈÈç Alpha AXP ¿ÉÒÔÓжà´ï 64 ÖÖÐźš£µ±Ç°´ý´¦ÀíµÄÐźŷÅÔÚ signal Óò£¬ blocked Óò·Å×ÅÒª×èÈûµÄÐźÅÑÚÂë¡£³ýÁË SIGSTOP ºÍ SIGKILL £¬ËùÓеÄÐźŶ¼¿ÉÒÔ±»×èÈû¡£Èç¹û²úÉúÁËÒ»¸ö±»×èÈûµÄÐźţ¬ËüÒ»Ö±±£Áô´ý´¦Àí£¬Ö±µ½±»½â³ý×èÈû¡£ Linux Ò²±£´æÃ¿Ò»¸ö½ø³ÌÈçºÎ´¦ÀíÿһÖÖ¿ÉÄܵÄÐźŵÄÐÅÏ¢£¬ÕâЩÐÅÏ¢·ÅÔÚÒ»¸ö sigaction µÄÊý¾Ý½á¹¹Êý×éÖУ¬Ã¿Ò»¸ö½ø³ÌµÄ task_struct ¶¼ÓÐÖ¸ÕëÖ¸Ïò¶ÔÓ¦µÄÊý×é¡£Õâ¸öÊý×éÖаüÀ¨´¦ÀíÕâ¸öÐźŵÄÀý³ÌµÄµØÖ·£¬»òÕß°üÀ¨Ò»¸ö±êÖ¾£¬¸æËß Linux ¸Ã½ø³ÌÊÇÏ£ÍûºöÂÔÕâ¸öÐźŻ¹ÊÇÈúËÐÄ´¦Àí¡£½ø³Ìͨ¹ýÖ´ÐÐϵͳµ÷ÓøıäȱʡµÄÐźŴ¦Àí£¬ÕâЩµ÷ÓøıäÊʵ±µÄÐÅºÅµÄ sigaction ºÍ×èÈûµÄÑÚÂë¡£

    ²¢·ÇϵͳÖÐËùÓеĽø³Ì¶¼¿ÉÒÔÏòÆäËûÿһ¸ö½ø³Ì·¢ËÍÐźţ¬Ö»ÓкËÐĺͳ¬¼¶Óû§¿ÉÒÔ¡£ÆÕͨ½ø³ÌÖ»¿ÉÒÔÏòÓµÓÐÏàͬ uid ºÍ gid »òÕßÔÚÏàͬ½ø³Ì×éµÄ½ø³Ì·¢ËÍÐźš£Í¨¹ýÉèÖà task ¡ª¡ª struct µÄ signal ÖÐÊʵ±µÄλ²úÉúÐźš£Èç¹û½ø³Ì²»×èÈûÐźţ¬¶øÇÒÕýÔڵȴýµ«ÊÇ¿ÉÒÔÖжϣ¨×´Ì¬ÊÇ Interruptible £©£¬ÄÇôËüµÄ״̬±»¸ÄΪ Running ²¢È·ÈÏËüÔÚÔËÐжÓÁУ¬Í¨¹ýÕâÖÖ·½Ê½°ÑËü»½ÐÑ¡£ÕâÑùµ÷¶È³ÌÐòÔÚϵͳÏ´ε÷¶ÈµÄʱºò»á°ÑËüµ±×÷Ò»¸öÔËÐеĺòÑ¡¡£Èç¹ûÐèҪȱʡµÄ´¦Àí£¬ Linux ¿ÉÒÔÓÅ»¯ÐźŵĴ¦Àí¡£ÀýÈçÈç¹ûÐźŠSIGWINCH £¨ X window ¸Ä±ä½¹µã£©·¢Éú¶øÊ¹ÓÃȱʡµÄ´¦Àí³ÌÐò£¬Ôò²»ÐèÒª×öʲôÊÂÇé¡£

    ÐźŲúÉúµÄʱºò²»»áÁ¢¿Ì³öÏÖÔÚ½ø³ÌÖУ¬ËüÃDZØÐëµÈµ½½ø³ÌÏ´ÎÔËÐС£Ã¿Ò»´Î½ø³Ì´Óϵͳµ÷ÓÃÖÐÍ˳öµÄʱºò¶¼Òª¼ì²éËüµÄ signal ºÍ blocked Óò£¬Èç¹ûÓÐÈκÎûÓÐ×èÈûµÄÐźţ¬¾Í¿ÉÒÔ·¢ËÍ¡£Õâ¿´ÆðÀ´ºÃÏñ·Ç³£²»¿É¿¿£¬µ«ÊÇϵͳÖеÄÿһ¸ö½ø³Ì¶¼ÔÚµ÷ÓÃϵͳµ÷Ó㬱ÈÈçÏòÖÕ¶Ëдһ¸ö×Ö·ûµÄ¹ý³ÌÖС£Èç¹ûÔ¸Ò⣬½ø³Ì¿ÉÒÔÑ¡ÔñµÈ´ýÐźţ¬ËüÃÇ¹ÒÆðÔÚ Interruptible ״̬£¬Ö±µ½ÓÐÁËÒ»¸öÐźš£ Linux ÐźŴ¦Àí´úÂë¼ì²é sigaction ½á¹¹ÖÐÿһ¸öµ±Ç°Î´×èÈûµÄÐźš£

    Èç¹ûÐźŴ¦Àí³ÌÐòÉèÖÃΪȱʡ¶¯×÷£¬ÔòºËÐĻᴦÀíËü¡£ SIGSTOP ÐźŵÄȱʡ´¦ÀíÊǰѵ±Ç°½ø³ÌµÄ״̬¸ÄΪ Stopped £¬È»ºóÔËÐе÷¶È³ÌÐò£¬Ñ¡ÔñÒ»¸öеĽø³ÌÀ´ÔËÐС£ SIGFPE ÐźŵÄȱʡ¶¯×÷ÊÇÈõ±Ç°½ø³Ì²úÉú core £¨ core dump £©£¬ÈÃËüÍ˳ö¡£±äͨµØ£¬½ø³Ì¿ÉÒÔÖ¸¶¨×Ô¼ºµÄÐźŴ¦Àí³ÌÐò¡£ÕâÊÇÒ»¸öÀý³Ì£¬µ±ÐźŲúÉúµÄʱºòµ÷ÓöøÇÒ sigaction ½á¹¹°üÀ¨Õâ¸öÀý³ÌµÄµØÖ·¡£ Linux ±ØÐëµ÷Óýø³ÌµÄÐźŴ¦ÀíÀý³Ì£¬ÖÁÓÚ¾ßÌåÈçºÎ·¢ÉúÊǺʹ¦ÀíÆ÷Ïà¹Ø¡£µ«ÊÇ£¬ËùÓÐµÄ CPU ±ØÐë´¦ÀíµÄÊǵ±Ç°½ø³ÌÕýÔËÐÐÔÚºËÐÄ̬£¬²¢Õý×¼±¸·µ»Øµ½µ÷ÓúËÐÄ»òϵͳÀý³ÌµÄÓû§Ì¬µÄ½ø³Ì¡£½â¾öÕâ¸öÎÊÌâµÄ·½·¨ÊÇ´¦Àí¸Ã½ø³ÌµÄ¶ÑÕ»ºÍ¼Ä´æÆ÷¡£½ø³Ì³ÌÐò¼ÆÊýÆ÷ÉèΪËüµÄÐźŴ¦Àí³ÌÐòµÄµØÖ·£¬Àý³ÌµÄ²ÎÊý¼Óµ½µ÷Óýṹ»òÕßͨ¹ý¼Ä´æÆ÷´«µÝ¡£µ±½ø³Ì»Ö¸´ÔËÐеÄʱºòÏÔµÃÐźŴ¦Àí³ÌÐòÊÇÕý³£µÄµ÷Óá£

    Linux ÊÇ POSIX ¼æÈݵģ¬ËùÒÔ½ø³Ì¿ÉÒÔÖ¸¶¨µ÷ÓÃÌØ¶¨µÄÐźŴ¦Àí³ÌÐòµÄʱºòÒª×èÈûµÄÐźš£ÕâÒâζ×ÅÔÚµ÷Óýø³ÌµÄÐźŴ¦Àí³ÌÐòµÄʱºò¸Ä±ä blocked ÑÚÂë¡£ÐźŴ¦Àí³ÌÐò½áÊøµÄʱºò£¬ blocked ÑÚÂë±ØÐë»Ö¸´µ½ËüµÄ³õʼֵ¡£Òò´Ë£¬ Linux ÔÚÊÕµ½ÐźŵĽø³ÌµÄ¶ÑÕ»ÖÐÔö¼ÓÁ˶ÔÓÚÒ»¸öÕûÀíÀý³ÌµÄµ÷Óã¬°Ñ blocked ÑÚÂë»Ö¸´µ½³õʼֵ¡£ Linux Ò²ÓÅ»¯ÁËÕâÖÖÇé¿ö£ºÈç¹ûͬʱ¼¸¸öÐźŴ¦ÀíÀý³ÌÐèÒªµ÷ÓõÄʱºò£¬¾ÍÔÚËüÃǶѻýÔÚÒ»Æð£¬Ã¿´ÎÍ˳öÒ»¸ö´¦ÀíÀý³ÌµÄʱºò¾Íµ÷ÓÃÏÂÒ»¸ö£¬Ö±µ½×îºó²Åµ÷ÓÃÕûÀíÀý³Ì¡£

5.2 Pipes £¨¹ÜµÀ£©

ÆÕͨµÄ Linux shell ¶¼ÔÊÐíÖØ¶¨Ïò¡£ÀýÈ磺

$ ls | pr | lpr

    °ÑÁгöĿ¼ÎļþµÄÃüÁî ls µÄÊä³öͨ¹ý¹ÜµÀ½Óµ½ pr ÃüÁîµÄ±ê×¼ÊäÈëÉϽøÐзÖÒ³¡£×îºó£¬ pr ÃüÁîµÄ±ê×¼Êä³öͨ¹ý¹ÜµÀÁ¬½Óµ½ lpr ÃüÁîµÄ±ê×¼ÊäÈëÉÏ£¬ÔÚȱʡ´òÓ¡»úÉÏ´òÓ¡³ö½á¹û¡£¹ÜµÀÊǵ¥ÏòµÄ×Ö½ÚÁ÷£¬°ÑÒ»¸ö½ø³ÌµÄ±ê×¼Êä³öºÍÁíÒ»¸ö½ø³ÌµÄ±ê×¼ÊäÈëÁ¬½ÓÔÚÒ»Æð¡£Ã»ÓÐÒ»¸ö½ø³ÌÒâʶµ½ÕâÖÖÖØ¶¨Ïò£¬ºÍËüƽ³£Ò»Ñù¹¤×÷¡£ÊÇ shell ½¨Á¢Á˽ø³ÌÖ®¼äµÄÁÙʱ¹ÜµÀ¡£ÔÚ Linux ÖУ¬Ê¹ÓÃÖ¸Ïòͬһ¸öÁÙʱ VFS I ½Úµã£¨±¾ÉíÖ¸ÏòÄÚ´æÖеÄÒ»¸öÎïÀíÒ³£©µÄÁ½¸ö file Êý¾Ý½á¹¹À´ÊµÏֹܵÀ¡£Í¼ 5.1 ÏÔʾÁËÿһ¸ö file Êý¾Ý½á¹¹°üº¬Á˲»Í¬µÄÎļþ²Ù×÷Àý³ÌµÄÏòÁ¿±íµÄÖ¸Õ룺һ¸öÓÃÓÚд£¬ÁíÒ»¸ö´Ó¹ÜµÀÖжÁ¡£ÕâÑÚ¸ÇÁ˺ÍͨÓõĶÁдÆÕͨÎļþµÄϵͳµ÷ÓõIJ»Í¬¡£µ±Ð´½ø³ÌÏò¹ÜµÀÖÐдµÄʱºò£¬×Ö½Ú¿½±´µ½Á˹²ÏíµÄÊý¾ÝÒ³£¬µ±´Ó¹ÜµÀÖжÁµÄʱºò£¬×Ö½Ú´Ó¹²ÏíÒ³Öп½±´³öÀ´¡£ Linux ±ØÐëͬ²½¶ÔÓڹܵÀµÄ·ÃÎÊ¡£±ØÐë±£Ö¤¹ÜµÀµÄдºÍ¶Á²½µ÷Ò»Ö£¬ËüʹÓÃËø¡¢µÈ´ý¶ÓÁкÍÐźţ¨ locks £¬ wait queues and signals £©¡£

²Î¼û include/linux/inode_fs.h

    µ±Ð´½ø³ÌÏò¹ÜµÀдµÄʱºò£¬ËüʹÓñê×¼µÄ write ¿âº¯Êý¡£ÕâЩ¿âº¯Êý´«µÝµÄÎļþÃèÊö·ûÊǽø³ÌµÄ file Êý¾Ý½á¹¹×éÖеÄË÷Òý£¬Ã¿Ò»¸ö¶¼±íʾһ¸ö´ò¿ªµÄÎļþ£¬ÔÚÕâÖÖÇé¿öÏ£¬ÊÇ´ò¿ªµÄ¹ÜµÀ¡£ Linux ϵͳµ÷ÓÃʹÓÃÃèÊöÕâ¸ö¹ÜµÀµÄ file Êý¾Ý½á¹¹Ö¸ÏòµÄ write Àý³Ì¡£Õâ¸ö write Àý³ÌʹÓñíʾ¹ÜµÀµÄ VFS I ½Úµã´æ·ÅµÄÐÅÏ¢£¬À´¹ÜÀíдµÄÇëÇó¡£Èç¹ûÓÐ×ã¹»µÄ¿Õ¼ä°ÑËùÓеÄ×Ö½Ú¶¼Ð´µ¼¹Üµ½ÖУ¬Ö»Òª¹ÜµÀûÓб»¶Á½ø³ÌËø¶¨£¬ Linux Ϊд½ø³ÌÉÏËø£¬²¢°Ñ×Ö½Ú´Ó½ø³ÌµÄµØÖ·¿Õ¼ä¿½±´µ½¹²ÏíµÄÊý¾ÝÒ³¡£Èç¹û¹ÜµÀ±»¶Á½ø³ÌËø¶¨»òÕ߿ռ䲻¹»£¬µ±Ç°½ø³Ì˯Ãߣ¬²¢·ÅÔڹܵÀ I ½ÚµãµÄµÈ´ý¶ÓÁÐÖУ¬²¢µ÷Óõ÷¶È³ÌÐò£¬ÔËÐÐÁíÍâÒ»¸ö½ø³Ì¡£ËüÊÇ¿ÉÒÔÖжϵģ¬ËùÒÔËü¿ÉÒÔ½ÓÊÕÐźš£µ±¹ÜµÀÖÐÓÐÁË×ã¹»µÄ¿Õ¼äдÊý¾Ý»òÕßËø¶¨½â³ý£¬Ð´½ø³Ì¾Í»á±»¶Á½ø³Ì»½ÐÑ¡£µ±Êý¾ÝдÍêÖ®ºó£¬¹ÜµÀµÄ VFS I ½ÚµãËø¶¨½â³ý£¬¹ÜµÀ I ½ÚµãµÄµÈ´ý¶ÓÁÐÖеÄËùÓжÁ½ø³Ì¶¼»á±»»½ÐÑ¡£

²Î¼û fs/pipe.c pipe_write()

    ´Ó¹ÜµÀÖжÁÈ¡Êý¾ÝºÍдÊý¾Ý·Ç³£ÏàËÆ¡£½ø³ÌÔÊÐí½øÐзÇ×èÈûµÄ¶Á£¨ÒÀÀµÓÚËüÃÇ´ò¿ªÎļþ»òÕ߹ܵÀµÄģʽ£©£¬Õâʱ£¬Èç¹ûûÓÐÊý¾Ý¿É¶Á»òÕ߹ܵÀ±»Ëø¶¨£¬»á·µ»ØÒ»¸ö´íÎó¡£ÕâÒâζ׎ø³Ì»á¼ÌÐøÔËÐС£ÁíÒ»ÖÖ·½Ê½ÊÇÔڹܵÀµÄ I ½ÚµãµÄµÈ´ý¶ÓÁÐÖеȴý£¬Ö±µ½Ð´½ø³ÌÍê³É¡£Èç¹û¹ÜµÀµÄ½ø³Ì¶¼Íê³ÉÁ˲Ù×÷£¬¹ÜµÀµÄ I ½ÚµãºÍÏàÓ¦µÄ¹²ÏíÊý¾ÝÒ³±»·ÏÆú¡£

²Î¼û fs/pipe.c pipe_read()

    Linux Ò²¿ÉÒÔÖ§³ÖÃüÃû¹ÜµÀ£¬Ò²½Ð FIFO £¬ÒòΪ¹ÜµÀ¹¤×÷ÔÚÏÈÈëÏȳöµÄÔ­ÔòÏ¡£Ê×ÏÈдÈë¹ÜµÀµÄÊý¾ÝÊÇÊ×Ïȱ»¶Á³öµÄÊý¾Ý¡£²»Ïë¹ÜµÀ£¬ FIFO ²»ÊÇÁÙʱµÄ¶ÔÏó£¬ËüÃÇÊÇÎļþϵͳÖеÄʵÌ壬¿ÉÒÔÓà mkfifo ÃüÁî´´½¨¡£Ö»ÒªÓкÏÊʵķÃÎÊȨÏÞ£¬½ø³Ì¾Í¿ÉÒÔʹÓà FIFO ¡£ FIFO µÄ´ó¿ª·½Ê½ºÍ¹ÜµÀÉÔ΢²»Í¬¡£Ò»¸ö¹ÜµÀ£¨ËüµÄÁ½¸ö file Êý¾Ý½á¹¹£¬ VFS I ½ÚµãºÍ¹²ÏíµÄÊý¾ÝÒ³£©ÊÇÒ»´ÎÐÔ´´½¨µÄ£¬¶ø FIFO ÊÇÒѾ­´æÔÚ£¬¿ÉÒÔÓÉËüµÄÓû§´ò¿ªºÍ¹Ø±ÕµÄ¡£ Linux ±ØÐë´¦ÀíÔÚд½ø³Ì´ò¿ª FIFO ֮ǰ´ò¿ª FIFO ¶ÁµÄ½ø³Ì£¬ÒÔ¼°ÔÚд½ø³ÌдÊý¾Ý֮ǰ¶ÁµÄ½ø³Ì¡£³ýÁËÕâЩ£¬ FIFO ¼¸ºõºÍ¹ÜµÀµÄ´¦ÀíÍêȫһÑù£¬¶øÇÒËüÃÇʹÓÃÒ»ÑùµÄÊý¾Ý½á¹¹ºÍ²Ù×÷¡£

Sockets

×¢Òâ£ºÐ´ÍøÂçÆªµÄʱºò¼ÓÉÏÈ¥

1¡¢System V IPC mechanisms £¨ÏµÍ³ V IPC »úÖÆ£©
   
Linux Ö§³ÖÈýÖÖÊ״γöÏÖÔÚ Unix ϵͳ V £¨ 1983 £©µÄ½ø³Ì¼äͨѶµÄ»úÖÆ£ºÏûÏ¢¶ÓÁС¢Ðźŵƺ͹²ÏíÄڴ棨 message queues £¬ semaphores and shared memory £©¡£ÏµÍ³ V IPC »úÖÆ¹²ÏíͨÓõÄÈÏÖ¤·½Ê½¡£½ø³ÌÖ»ÄÜͨ¹ýϵͳµ÷Ó㬴«µÝÒ»¸öΨһµÄÒýÓñêʶ·ûµ½ºËÐÄÀ´·ÃÎÊÕâЩ×ÊÔ´¡£¶ÔÓÚϵͳ V IPC ¶ÔÏóµÄ·ÃÎʵļì²éʹÓ÷ÃÎÊÐí¿ÉȨ£¬ºÜÏó¶ÔÓÚÎļþ·ÃÎʵļì²é¡£¶ÔÓÚϵͳ V IPC ¶ÔÏóµÄ·ÃÎÊȨÏÞÓɶÔÏóµÄ´´½¨Õßͨ¹ýϵͳµ÷Óô´½¨¡£Ã¿Ò»ÖÖ»úÖÆ¶¼Ê¹ÓöÔÏóµÄÒýÓñêʶ·û×÷Ϊ×ÊÔ´±íµÄË÷Òý¡£Õâ²»ÊÇÖ±½ÓµÄË÷Òý£¬ÐèҪһЩ²Ù×÷À´²úÉúË÷Òý¡£

    ϵͳÖбí´ïϵͳ V IPC ¶ÔÏóµÄËùÓÐ Linux Êý¾Ý½á¹¹¶¼°üÀ¨Ò»¸ö ipc_perm µÄÊý¾Ý½á¹¹£¬°üÀ¨ÁË´´½¨½ø³ÌµÄÓû§ºÍ×é±êʶ·û£¬¶ÔÓÚÕâ¸ö¶ÔÏóµÄ·ÃÎÊģʽ£¨ÊôÖ÷¡¢×éºÍÆäËû£©ºÍ IPC ¶ÔÏóµÄ key ¡£ Key ÓÃ×÷¶¨Î»ÏµÍ³ V IPC ¶ÔÏóµÄÒýÓñêʶ·ûµÄ·½·¨¡£Ö§³ÖÁ½ÖÖ key £º¹«¿ªºÍËÄÓеġ£Èç¹û key Êǹ«¿ªµÄ , ÄÇôϵͳÖеÄÈκνø³Ì , ֻҪͨ¹ýÁËȨÏÞ¼ì²é , ¾Í¿ÉÒÔÕÒµ½¶ÔÓ¦µÄϵͳ V IPC ¶ÔÏóµÄÒýÓñêʶ·û¡£ÏµÍ³ V IPC ¶ÔÏó²»ÄÜʹÓà key ÒýÓ㬱ØÐëʹÓÃËüÃǵÄÒýÓñêʶ·û¡£

²Î¼û include/linux/ipc.h

2¡¢Message Queues £¨ÏûÏ¢¶ÓÁУ©
   
ÏûÏ¢¶ÓÁÐÔÊÐíÒ»¸ö»ò¶à¸ö½ø³ÌдÏûÏ¢£¬Ò»¸ö»ò¶à¸ö½ø³Ì¶ÁÈ¡ÏûÏ¢¡£ Linux ά»¤ÁËһϵÁÐÏûÏ¢¶ÓÁÐµÄ msgque ÏòÁ¿±í¡£ÆäÖеÄÿһ¸öµ¥Ôª¶¼Ö¸ÏòÒ»¸ö msqid_ds µÄÊý¾Ý½á¹¹£¬ÍêÕûÃèÊöÕâ¸öÏûÏ¢¶ÓÁС£µ±´´½¨ÏûÏ¢¶ÓÁеÄʱºò£¬´ÓϵͳÄÚ´æÖзÖÅäÒ»¸öÐ嵀 msqid_ds µÄÊý¾Ý½á¹¹²¢²åÈëµ½ÏòÁ¿±íÖÐ

    ÿһ¸ö msqid_ds Êý¾Ý½á¹¹¶¼°üÀ¨Ò»¸ö ipc_perm µÄÊý¾Ý½á¹¹ºÍ½øÈëÕâ¸ö¶ÓÁеÄÏûÏ¢µÄÖ¸Õë¡£ÁíÍ⣬ Linux ±£Áô¶ÓÁеĸĶ¯Ê±¼ä£¬ÀýÈçÉϴζÓÁÐдµÄʱ¼äµÈ¡£ Msqid_ds ¶ÓÁÐÒ²°üÀ¨Á½¸öµÈ´ý¶ÓÁУºÒ»¸öÓÃÓÚÏòÏûÏ¢¶ÓÁÐд£¬ÁíÒ»¸öÓÃÓÚ¶Á¡£

²Î¼û include/linux/msg.h

    ÿһ´ÎÒ»¸ö½ø³ÌÊÔͼÏòд¶ÓÁÐдÏûÏ¢£¬ËüµÄÓÐЧÓû§ºÍ×éµÄ±êʶ·û¾ÍÒªºÍ¶ÓÁÐµÄ ipc_perm Êý¾Ý½á¹¹µÄģʽ±È½Ï¡£Èç¹û½ø³Ì¿ÉÒÔÏëÕâ¸ö¶ÓÁÐд£¬ÔòÏûÏ¢»á´Ó½ø³ÌµÄµØÖ·¿Õ¼äдµ½ msg Êý¾Ý½á¹¹£¬·Åµ½ÏûÏ¢¶ÓÁеÄ×îºó¡£Ã¿Ò»¸öÏûÏ¢¶¼´øÓнø³Ì¼äÔ¼¶¨µÄ£¬Ó¦ÓóÌÐòÖ¸¶¨ÀàÐ͵ıê¼Ç¡£µ«ÊÇ£¬ÒòΪ Linux ÏÞÖÆÁË¿ÉÒÔдµÄÏûÏ¢µÄÊýÁ¿ºÍ³¤¶È£¬¿ÉÄÜ»áûÓпռäÈÝÄÉÏûÏ¢¡£Õâʱ£¬½ø³Ì»á±»·Åµ½ÏûÏ¢¶ÓÁеÄдµÈ´ý¶ÓÁУ¬È»ºóµ÷Óõ÷¶È³ÌÐòÑ¡ÔñÒ»¸öеĽø³ÌÔËÐС£µ±Ò»¸ö»ò¶à¸öÏûÏ¢´ÓÕâ¸öÏûÏ¢¶ÓÁÐÖжÁ³öÈ¥µÄʱºò»á±»»½ÐÑ¡£

    ´Ó¶ÓÁÐÖжÁÊÇÒ»¸öÏàËÆµÄ¹ý³Ì¡£½ø³ÌµÄ·ÃÎÊȨÏÞÒ»Ñù±»¼ì²é¡£Ò»¸ö¶Á½ø³Ì¿ÉÒÔÑ¡ÔñÊDz»¹ÜÏûÏ¢µÄÀàÐÍ´Ó¶ÓÁÐÖжÁÈ¡µÚÒ»ÌõÏûÏ¢»¹ÊÇÑ¡ÔñÌØÊâÀàÐ͵ÄÏûÏ¢¡£Èç¹ûûÓзûºÏÌõ¼þµÄÏûÏ¢£¬¶Á½ø³Ì»á±»¼Óµ½ÏûÏ¢¶ÓÁеĶÁµÈ´ý½ø³Ì£¬È»ºóÔËÐе÷¶È³ÌÐò¡£µ±Ò»¸öеÄÏûϢдµ½¶ÓÁеÄʱºò£¬Õâ¸ö½ø³Ì»á±»»½ÐÑ£¬¼ÌÐøÔËÐС£¡¡

3¡¢Semaphores £¨Ðźŵƣ©
    ÐźŵÆ×î¼òµ¥µÄÐÎʽ¾ÍÊÇÄÚ´æÖÐÒ»¸öλÖã¬ËüµÄȡֵ¿ÉÒÔÓɶà¸ö½ø³Ì¼ìÑéºÍÉèÖ᣼ìÑéºÍÉèÖõIJÙ×÷£¬ÖÁÉÙ¶ÔÓÚ¹ØÁªµÄÿһ¸ö½ø³ÌÀ´½²£¬ÊDz»¿ÉÖжϻòÕß˵ÓÐÔ­×ÓÐÔ£ºÖ»ÒªÆô¶¯¾Í²»ÄÜÖÐÖ¹¡£¼ìÑéºÍÉèÖòÙ×÷µÄ½á¹ûÊÇÐźŵƵ±Ç°ÖµºÍÉèÖÃÖµµÄºÍ£¬¿ÉÒÔÊÇÕý»òÕ߸º¡£¸ù¾Ý²âÊÔºÍÉèÖòÙ×÷µÄ½á¹û£¬Ò»¸ö½ø³Ì¿ÉÄܱØÐë˯ÃßÖ±µ½ÐźŵƵÄÖµ±»ÁíÒ»¸ö½ø³Ì¸Ä±ä¡£ÐźŵƿÉÒÔÓÃÓÚʵÏÖÖØÒªÇøÓò£¨ critical regions £©£¬¾ÍÊÇÖØÒªµÄ´úÂëÇø£¬Í¬Ò»Ê±¿ÌÖ»ÄÜÓÐÒ»¸ö½ø³ÌÔËÐС£

    ±ÈÈçÄãÓÐÐí¶àЭ×÷µÄ½ø³Ì´ÓÒ»¸öµ¥Ò»µÄÊý¾ÝÎļþ¶Áд¼Ç¼¡£Äã¿ÉÄÜÏ£Íû¶ÔÎļþµÄ·ÃÎʱØÐëÑϸñµØÐ­µ÷¡£Äã¿ÉÒÔʹÓÃÒ»¸öÐźŵƣ¬³õʼֵ 1 £¬ÔÚÎļþ²Ù×÷µÄ´úÂëÖУ¬¼ÓÈëÁ½¸öÐźŵƲÙ×÷£¬µÚÒ»¸ö¼ì²é²¢°ÑÐźŵƵÄÖµ¼õС£¬µÚ¶þ¸ö¼ì²é²¢Ôö¼ÓËü¡£·ÃÎÊÎļþµÄµÚÒ»¸ö½ø³ÌÊÔͼ¼õСÐźŵƵÄÊýÖµ£¬Èç¹û³É¹¦£¬ÐźŵƵÄȡֵ³ÉΪ 0 ¡£Õâ¸ö½ø³ÌÏÖÔÚ¿ÉÒÔ¼ÌÐøÔËÐв¢Ê¹ÓÃÊý¾ÝÎļþ¡£µ«ÊÇ£¬Èç¹ûÁíÒ»¸ö½ø³ÌÐèҪʹÓÃÕâ¸öÎļþ£¬ÏÖÔÚËüÊÔͼ¼õÉÙÐźŵƵÄÊýÖµ£¬Ëü»áʧ°ÜÒòΪ½á¹û»áÊÇ -1 ¡£Õâ¸ö½ø³Ì»á±»¹ÒÆðÖ±µ½µÚÒ»¸ö½ø³Ì´¦ÀíÍêÊý¾ÝÎļþ¡£µ±µÚÒ»¸ö½ø³Ì´¦ÀíÍêÊý¾ÝÎļþ£¬Ëü»áÔö¼ÓÐźŵƵÄÊýÖµ³ÉΪ 1 ¡£ÏÖÔڵȴý½ø³Ì»á±»»½ÐÑ£¬Õâ´ÎËü¼õСÐźŵƵij¢ÊÔ»á³É¹¦¡£

    ÿһ¸öϵͳ V IPC ÐźŵƶÔÏó¶¼ÃèÊöÁËÒ»¸öÐźŵÆÊý×飬 Linux ʹÓà semid_ds Êý¾Ý½á¹¹±í´ïËü¡£ÏµÍ³ÖÐËùÓÐµÄ semid_ds Êý¾Ý½á¹¹¶¼ÓÉ semary Ö¸ÕëÏòÁ¿±íÖ¸Ïò¡£Ã¿Ò»¸öÐźŵÆÊý×éÖж¼ÓÐ sem_nsems £¬Í¨¹ý sem_base Ö¸ÏòµÄÒ»¸ö sem Êý¾Ý½á¹¹À´ÃèÊö¡£ËùÓÐÔÊÐí²Ù×÷Ò»¸öϵͳ V IPC ÐźŵƶÔÏóµÄÐźŵÆÊý×éµÄ½ø³Ì¶¼¿ÉÒÔͨ¹ýϵͳµ÷ÓöÔËüÃDzÙ×÷¡£ÏµÍ³µ÷ÓÿÉÒÔÖ¸¶¨¶àÖÖ²Ù×÷£¬Ã¿Ò»ÖÖ²Ù×÷¶àÓÃÈý¸öÊäÈëÃèÊö£ºÐźŵÆË÷Òý¡¢²Ù×÷ÖµºÍÒ»×é±êÖ¾¡£ÐźŵÆË÷ÒýÊÇÐźŵÆÊý×éµÄË÷Òý£¬²Ù×÷ÖµÊÇÒªÔö¼Óµ½µ±Ç°ÐźŵÆÈ¡ÖµµÄÊýÖµ¡£Ê×ÏÈ£¬ Linux ¼ì²éËùÓеIJÙ×÷ÊÇ·ñ³É¹¦¡£Ö»ÓвÙ×÷Êý¼ÓÉÏÐźŵƵĵ±Ç°Öµ´óÓÚ 0 »òÕß²Ù×÷ÖµºÍÐźŵƵĵ±Ç°Öµ¶¼ÊÇ 0 £¬²Ù×÷²ÅËã³É¹¦¡£Èç¹ûÈÎÒâÐźŵƲÙ×÷ʧ°Ü£¬Ö»Òª²Ù×÷±ê¼Ç²»ÒªÇóϵͳµ÷ÓÃÎÞ×èÈû£¬ Linux »á¹ÒÆðÕâ¸ö½ø³Ì¡£Èç¹û½ø³ÌÒª¹ÒÆð£¬ Linux ±ØÐë±£´æÒª½øÐеÄÐźŵƲÙ×÷µÄ״̬²¢°Ñµ±Ç°½ø³Ì·Åµ½µÈ´ý¶ÓÁÐÖØ¡£Ëüͨ¹ýÔÚ¶ÑÕ»Öн¨Á¢Ò»¸ö sem_queue µÄÊý¾Ý½á¹¹²¢ÌîÂúËüÀ´ÊµÏÖÉÏÊö¹ý³Ì¡£Õâ¸öÐ嵀 sem_queue Êý¾Ý½á¹¹±»·Åµ½ÁËÕâ¸öÐźŵƶÔÏóµÄµÈ´ý¶ÓÁеĽáβ£¨Ê¹Óà sem_pending ºÍ sem_pending_last Ö¸Õ룩¡£µ±Ç°½ø³Ì±»·Åµ½ÁËÕâ¸ö sem_queue Êý¾Ý½á¹¹µÄµÈ´ý¶ÓÁÐÖУ¨ sleeper £©£¬µ÷Óõ÷¶È³ÌÐò£¬ÔËÐÐÁíÍâÒ»¸ö½ø³Ì¡£

²Î¼û include/linux/sem.h

    Èç¹ûËùÓеÄÐźŵƲÙ×÷¶¼³É¹¦£¬µ±Ç°µÄ½ø³Ì¾Í²»ÐèÒª±»¹ÒÆð¡£ Linux ¼ÌÐøÏòǰ²¢°ÑÕâЩ²Ù×÷Ó¦Óõ½ÐźŵÆÊý×éµÄºÏÊʵijÉÔ±ÉÏ¡£ÏÖÔÚ Linux ±ØÐë¼ì²éÈκÎ˯Ãß»òÕß¹ÒÆðµÄ½ø³Ì£¬ËüÃǵIJÙ×÷ÏÖÔÚ¿ÉÄÜ¿ÉÒÔʵʩ¡£ Linux ˳Ðò²éÕÒ²Ù×÷µÈ´ý¶ÓÁУ¨ sem_pending £©ÖеÄÿһ¸ö³ÉÔ±£¬¼ì²éÏÖÔÚËüµÄÐźŵƲÙ×÷ÊÇ·ñ¿ÉÒԳɹ¦¡£Èç¹û¿ÉÒÔËü¾Í°ÑÕâ¸ö sem_queue Êý¾Ý½á¹¹´Ó²Ù×÷µÈ´ý±íÖÐɾ³ý£¬²¢°ÑÕâÖÖÐźŵƲÙ×÷Ó¦Óõ½ÐźŵÆÊý×é¡£Ëü»½ÐÑ˯ÃߵĽø³Ì£¬ÈÃËüÔÚÏ´ε÷¶È³ÌÐòÔËÐеÄʱºò¿ÉÒÔ¼ÌÐøÔËÐС£ Linux ´ÓÍ·µ½Î²¼ì²éµÈ´ý¶ÓÁУ¬Ö±µ½²»ÄÜÖ´ÐÐÐźŵƲÙ×÷ÎÞ·¨»½ÐѸü¶àµÄ½ø³ÌΪֹ¡£

    ÔÚÐźŵƲÙ×÷ÖÐÓÐÒ»¸öÎÊÌ⣺ËÀËø£¨ deadlock £©¡£Õâ·¢ÉúÔÚÒ»¸ö½ø³Ì¸Ä±äÁËÐźŵƵÄÖµ½øÈëÒ»¸öÖØÒªÇøÓò£¨ critical region £©µ«ÊÇÒòΪ±ÀÀ£»òÕß±» kill ¶øÃ»ÓÐÀ뿪Õâ¸öÖØÒªÇøÓòµÄÇé¿öÏ¡£ Linux ͨ¹ýά»¤ÐźŵÆÊý×éµÄµ÷Õû±íÀ´±ÜÃâÕâÖÖÇé¿ö¡£¾ÍÊÇÈç¹ûʵʩÕâЩµ÷Õû£¬Ðźŵƾͻ᷵»ØÒ»¸ö½ø³ÌµÄÐźŵƲÙ×÷ǰµÄ״̬¡£ÕâЩµ÷Õû·ÅÔÚ sem_undo Êý¾Ý½á¹¹ÖУ¬ÅÅÔÚ sem_ds Êý¾Ý½á¹¹µÄ¶ÓÁÐÖУ¬Í¬Ê±ÅÅÔÚʹÓÃÕâЩÐźŵƵĽø³ÌµÄ task_struct Êý¾Ý½á¹¹µÄ¶ÓÁÐÖС£

    ÿһ¸ö¶ÀÁ¢µÄÐźŵƲÙ×÷¿ÉÄܶ¼ÐèҪά»¤Ò»¸öµ÷Õû¶¯×÷¡£ Linux ÖÁÉÙΪÿһ¸ö½ø³ÌµÄÿһ¸öÐźŵÆÊý×鶼ά»¤Ò»¸ö sem_undo µÄÊý¾Ý½á¹¹¡£Èç¹ûÇëÇóµÄ½ø³ÌûÓУ¬¾ÍÔÚÐèÒªµÄʱºòΪËü´´½¨Ò»¸ö¡£Õâ¸öÐ嵀 sem_undo Êý¾Ý½á¹¹Í¬Ê±ÔÚ½ø³ÌµÄ task_struct Êý¾Ý½á¹¹ºÍÐźŵƶÓÁÐµÄ semid_ds Êý¾Ý½á¹¹µÄ¶ÓÁÐÖÐÅŶӡ£¶ÔÐźŵƶÓÁÐÖеÄÐźŵÆÖ´ÐвÙ×÷µÄʱºò£¬ºÍÕâ¸ö²Ù×÷ÖµÏàµÖÏûµÄÖµ¼Óµ½Õâ¸ö½ø³ÌµÄ sem_undo Êý¾Ý½á¹¹µÄµ÷Õû¶ÓÁÐÕâ¸öÐźŵƵÄÌõÄ¿ÉÏ¡£ËùÒÔ£¬Èç¹û²Ù×÷ֵΪ 2 £¬ÄÇôÕâ¸ö¾ÍÔÚÕâ¸öÐźŵƵĵ÷ÕûÌõÄ¿ÉÏÔö¼Ó -2 ¡£

    µ±½ø³Ì±»É¾³ý£¬±ÈÈçÍ˳öµÄʱºò£¬ Linux ±éÀúËüµÄ sem_undo Êý¾Ý½á¹¹×飬²¢ÊµÊ©¶ÔÓÚÐźŵÆÊý×éµÄµ÷Õû¡£Èç¹ûɾ³ýÐźŵƣ¬ËüµÄ sem_undo Êý¾Ý½á¹¹ÈÔ¾ÉÍ£ÁôÔÚ½ø³ÌµÄ task_struct ¶ÓÁÐÖУ¬µ«ÊÇÏàÓ¦µÄÐźŵÆÊý×é±êʶ·û±ê¼ÇΪÎÞЧ¡£ÕâÖÖÇé¿öÏ£¬Çå³ýÐźŵƵĴúÂëÖ»ÊǼòµ¥µØ·ÏÆúÕâ¸ö sem_undo Êý¾Ý½á¹¹¡£


4¡¢Shared Memory £¨¹²ÏíÄڴ棩

    ¹²ÏíÄÚ´æÔÊÐíÒ»¸ö»ò¶à¸ö½ø³Ìͨ¹ýͬʱ³öÏÖÔÚËüÃǵÄÐéÄâµØÖ·¿Õ¼äµÄÄÚ´æÍ¨Ñ¶¡£Õâ¿éÐéÄâÄÚ´æµÄÒ³ÃæÔÚÿһ¸ö¹²Ïí½ø³ÌµÄÒ³±íÖж¼ÓÐÒ³±íÌõÄ¿ÒýÓᣵ«ÊDz»ÐèÒªÔÚËùÓнø³ÌµÄÐéÄâÄÚ´æ¶¼ÓÐÏàͬµÄµØÖ·¡£ÏóËùÓеÄϵͳ V IPC ¶ÔÏóÒ»Ñù£¬¶ÔÓÚ¹²ÏíÄÚ´æÇøÓòµÄ·ÃÎÊͨ¹ý key ¿ØÖÆ£¬²¢½øÐзÃÎÊȨÏÞ¼ì²é¡£ÄÚ´æ¹²ÏíÖ®ºó£¬¾Í²»ÔÙ¼ì²é½ø³ÌÈçºÎʹÓÃÕâ¿éÄÚ´æ¡£ËüÃDZØÐëÒÀÀµÓÚÆäËû»úÖÆ£¬±ÈÈçϵͳ V µÄÐźŵÆÀ´Í¬²½¶ÔÓÚÄÚ´æµÄ·ÃÎÊ¡£

    ÿһ¸öд´½¨µÄÄÚ´æÇøÓò¶¼ÓÃÒ»¸ö shmid_ds Êý¾Ý½á¹¹À´±í´ï¡£ÕâЩÊý¾Ý½á¹¹±£´æÔÚ shm_segs ÏòÁ¿±íÖС£ Shmid_ds Êý¾Ý½á¹¹ÃèÊöÁËÕâ¸ö¹²ÏíÄÚ´æÈ¡Óжà´ó¡¢¶àÉÙ¸ö½ø³ÌÔÚʹÓÃËüÒÔ¼°¹²ÏíÄÚ´æÈçºÎÓ³Éäµ½ËüÃǵĵØÖ·¿Õ¼ä¡£Óɹ²ÏíÄÚ´æµÄ´´½¨ÕßÀ´¿ØÖƶÔÓÚÕâ¿éÄÚ´æµÄ·ÃÎÊȨÏÞºÍËüµÄ key Êǹ«¿ª»ò˽ÓС£Èç¹ûÓÐ×ã¹»µÄȨÏÞËüÒ²¿ÉÒ԰ѹ²ÏíÄÚ´æËø¶¨ÔÚÎïÀíÄÚ´æÖС£

²Î¼û include/linux/sem.h

    ÿһ¸öÏ£Íû¹²ÏíÕâ¿éÄÚ´æµÄ½ø³Ì±ØÐëͨ¹ýϵͳµ÷ÓÃÕ³¸½£¨ attach £©µ½ÐéÄâÄÚ´æ¡£ÕâΪ¸Ã½ø³Ì´´½¨ÁËÒ»¸öеÄÃèÊöÕâ¿é¹²ÏíÄÚ´æµÄ vm_area_struct Êý¾Ý½á¹¹¡£½ø³Ì¿ÉÒÔÑ¡Ôñ¹²ÏíÄÚ´æÔÚËüµÄÐéÄâµØÖ·¿Õ¼äµÄλÖûòÕßÓÉ Linux Ñ¡ÔñÒ»¿é×ã¹»µÄµÄ¿ÕÏÐÇøÓò¡£

    Õâ¸öÐ嵀 vm_area_struct ½á¹¹·ÅÔÚÓÉ shmid_ds Ö¸ÏòµÄ vm_area_struct ÁбíÖС£Í¨¹ý vm_next_shared ºÍ vm_prev_shared °ÑËüÃÇÁ¬ÔÚÒ»Æð¡£ÐéÄâÄÚ´æÔÚÕ³¸½µÄʱºòÆäʵ²¢Ã»Óд´½¨£¬¶ø·¢ÉúÔÚµÚÒ»¸ö½ø³ÌÊÔͼ·ÃÎÊËüµÄʱºò¡£

    ÔÚÒ»¸ö½ø³ÌµÚÒ»´Î·ÃÎʹ²ÏíÐéÄâÄÚ´æµÄÆäÖÐÒ»Ò³µÄʱºò£¬·¢ÉúÒ»¸ö page fault ¡£µ± Linux ´¦ÀíÕâ¸ö page fault µÄʱºò£¬ËüÕÒµ½ÃèÊöËüµÄ vm_area_struct Êý¾Ý½á¹¹¡£ÕâÀï°üº¬ÁËÕâÀ๲ÏíÐéÄâÄÚ´æµÄ´¦ÀíÀý³ÌµÄÖ¸Õë¡£¹²ÏíÄÚ´æµÄ page fault ´¦Àí´úÂëÔÚÕâ¸ö shmid_ds µÄÒ³±íÌõÄ¿ÁбíÖвéÕÒ£¬¿´ÊÇ·ñ´æÔÚÕâ¸ö¹²ÏíÐéÄâÄÚ´æÒ³µÄÌõÄ¿¡£Èç¹û²»´æÔÚ£¬Ëü¾Í·ÖÅäÒ»¸öÎïÀíÒ³£¬²¢ÎªËü´´½¨Ò»¸öÒ³±íÌõÄ¿¡£Õâ¸öÌõÄ¿²»µ«½øÈ뵱ǰ½ø³ÌµÄÒ³±í£¬Ò²´æµ½Õâ¸ö shmid_ds ¡£ÕâÒâζ×ŵ±ÏÂÒ»¸ö½ø³ÌÊÔͼ·ÃÎÊÕâ¿éÄÚ´æ²¢µÃµ½Ò»¸ö page fault µÄʱºò£¬¹²ÏíÄÚ´æ´íÎó´¦Àí´úÂëÒ²»áÈÃÕâ¸ö½ø³ÌʹÓÃÕâ¸öд´½¨µÄÎïÀíÒ³¡£ËùÒÔ£¬ÊǵÚÒ»¸ö·ÃÎʹ²ÏíÄÚ´æÒ³µÄ½ø³ÌʹµÃÕâÒ»Ò³±»´´½¨£¬¶øËæºó·ÃÎÊµÄÆäËû½ø³ÌʹµÃ´ËÒ³±»¼Óµ½ËüÃǵÄÐéÄâµØÖ·¿Õ¼ä¡£

    µ±½ø³Ì²»ÔÙÐèÒª¹²ÏíÐéÄâÄÚ´æµÄʱºò£¬ËüÃÇ´ÓÖзÖÀ루 detach £©³öÀ´¡£Ö»ÒªÈÔ¾ÉÓÐÆäËû½ø³ÌÔÚʹÓÃÕâ¿éÄڴ棬ÕâÖÖ·ÖÀëÖ»ÊÇÓ°Ï쵱ǰµÄ½ø³Ì¡£ËüµÄ vm_area_struct ´Ó shmid_ds Êý¾Ý½á¹¹ÖÐɾ³ý£¬²¢ÊÍ·Å¡£µ±Ç°½ø³ÌµÄÒ³±íÒ²½øÐиüУ¬Ê¹Ëü¹²Ïí¹ýµÄÐéÄâÄÚ´æÇøÓòÎÞЧ¡£µ±¹²ÏíÕâ¿éÄÚ´æµÄ×îºóÒ»¸ö½ø³Ì´ÓÖзÖÀë³öµÄʱºò£¬¹²ÏíÄڴ浱ǰÔÚÎïÀíÄÚ´æÖеÄÒ³±»ÊÍ·Å£¬Õâ¿é¹²ÏíÄÚ´æµÄ shmid_ds Êý¾Ý½á¹¹Ò²±»ÊÍ·Å¡£

    Èç¹û¹²ÏíµÄÐéÄâÄÚ´æÃ»Óб»Ëø¶¨ÔÚÎïÀíÄÚ´æÖеϰ»á¸ü¼Ó¸´ÔÓ¡£ÔÚÕâÖÖÇé¿öÏ£¬¹²ÏíÄÚ´æµÄÒ³¿ÉÄÜÔÚϵͳ´óÁ¿Ê¹ÓÃÄÚ´æµÄʱºò½»»»µ½ÁËϵͳµÄ½»»»´ÅÅÌ¡£¹²ÏíÄÚ´æÈçºÎ½»»»³õºÍ½»»»ÈëÎïÀíÄÚ´æÔÚµÚ 3 ÕÂÖÐÓÐÃèÊö¡£

ÒÑÓÐ 0 λ¶Ô´ËÎÄÕ¸ÐÐËȤµÄÍøÓÑ·¢²¼ÁË¿´·¨¡¡   
ÎÒÀ´ÆÀÁ½¾ä µÇ¼ÓÊÏ䣺 ÃÜÂ룺
  ÄäÃû·¢±í
½ñÈÕÍÆ¼ö
¼¼ÊõÎÄ¿â(¹²ÓÐ 46430 ƪÎÄÕÂ)
²Ù×÷ϵͳ
°ì¹«Èí¼þ
ʵÓÃ֪ʶ
ÍøÂç¹ÜÀí
Èí¼þ¿ª·¢
WEB¿ª·¢
Èí¼þ¹¤³Ì
Êý¾Ý¿â
Éè¼ÆÔÚÏß
ÐÅÏ¢°²È«
ÐÐÒµÐÅÏ¢»¯
¹ÜÀíÐÅÏ¢»¯
ÖØµãÍÆ¼ö
µç×ÓÔÓÖ¾¶©ÔÄ
µã»÷µç×ÓÔÓÖ¾Ãû³Æ²é¿´Ñù¿¯
ÊäÈëE-mailµØÖ·¼´¿É¶©ÔÄ
E-mail