ÌØ±ðÊÇÔÚ·þÎñÆ÷Ó¦ÓᢸßÐÔÄܼÆËãÒÔ¼°ÊµÊ±ÏµÍ³µÈÁìÓò£¬¸ßЧµØ¹ÜÀí²¢·¢ÈÎÎñ¶ÔÓÚϵͳÕûÌåÐÔÄܵÄÓ°ÏìÖÁ¹ØÖØÒª
Linux ²Ù×÷ϵͳ£¬Æ¾½èÆäÇ¿´óµÄÄں˻úÖÆºÍ·á¸»µÄϵͳµ÷Óýӿڣ¬Îª¿ª·¢ÕßÌṩÁËÁé»îÇÒ¸ßЧµÄÏ̹߳ÜÀí»úÖÆ
±¾ÎĽ«ÉîÈë̽ÌÖ Linux Ïß³ÌÀàµÄʵÏÖÔÀí¡¢Ê¹Ó÷½·¨ºÍ×î¼Ñʵ¼ù£¬°ïÖú¶ÁÕßÕÆÎÕÕâÒ»¹¹½¨¸ßЧ²¢·¢Ó¦ÓõĻùʯ
Ò»¡¢Linux Ï̸߳ÅÊö Linux ÖеÄỊ̈߳¬Ó봫ͳÒâÒåÉϵĽø³Ì²»Í¬£¬ËüÊǽø³ÌÄÚµÄÒ»ÌõÖ´Ðз¾¶£¬¹²Ïí½ø³ÌµÄ×ÊÔ´£¨ÈçµØÖ·¿Õ¼ä¡¢ÎļþÃèÊö·ûµÈ£©£¬µ«ÓµÓжÀÁ¢µÄÕ»¿Õ¼äºÍÏ߳̿ØÖÆ¿é
ÕâÖÖÉè¼ÆÊ¹µÃÏ̼߳äͨÐźÍÊý¾Ý¹²Ïí±äµÃ¸ßЧ£¬Í¬Ê±¼õÉÙÁËÉÏÏÂÎÄÇл»µÄ¿ªÏú£¬ÒòΪÏß³ÌÇл»²»ÐèÒªÇл»Õû¸ö½ø³ÌµÄ»·¾³
Linux Ï̵߳ÄʵÏÖ»ùÓÚÄں˼¶Ị̈߳¨Kernel-Level Threads, KLT£©Ä£ÐÍ£¬µ«ÓëһЩÆäËû²Ù×÷ϵͳ£¨Èç Windows µÄÓû§¼¶Ïß³Ì+Äں˵÷¶ÈÄ£ÐÍ£©²»Í¬µÄÊÇ£¬Linux µÄÏß³ÌÍêÈ«ÓÉÄں˹ÜÀí£¬Ã¿¸öÏ̶߳¼ÊÇÒ»¸ö¶ÀÁ¢µÄµ÷¶ÈʵÌ壬¿ÉÒÔÖ±½Ó±»Äں˵ĵ÷¶ÈÆ÷µ÷¶ÈÖ´ÐÐ
ÕâÖÖÄ£ÐÍÌṩÁËÁ¼ºÃµÄ²¢·¢ÐÔºÍÏìÓ¦ÐÔ£¬µ«Ò²¿ÉÄÜÒòΪ×ÊÔ´¾ºÕùµ¼ÖÂÉÏÏÂÎÄÇл»Æµ·±£¬Ó°ÏìÐÔÄÜ
¶þ¡¢Linux Ïß³ÌÀàµÄʵÏÖÔÀí Linux Ï̵߳ÄʵÏÖÒÀÀµÓÚ¼¸¸öºËÐÄ×é¼þ£ºÏ߳̿ØÖƿ飨task_struct£©¡¢Ï̵߳÷¶ÈÆ÷¡¢Í¬²½»úÖÆ£¨È绥³âËø¡¢Ìõ¼þ±äÁ¿£©ÒÔ¼°Ï߳̿⣨Èç POSIX Ï߳̿â pthreads£©
1.Ï߳̿ØÖƿ飨task_struct£©£º ÔÚ Linux ÄÚºËÖУ¬Ã¿¸öÏ̶߳¼¶ÔÓ¦Ò»¸ö`task_struct`½á¹¹Ì壬Ëü°üº¬ÁËÏ̵߳ÄËùÓÐ״̬ÐÅÏ¢£¬Èç¼Ä´æÆ÷Öµ¡¢µ÷¶ÈÐÅÏ¢¡¢ÄÚ´æ¹ÜÀíÐÅÏ¢µÈ
`task_struct` ͨ¹ýÒ»¸öË«ÏòÁ´±í×éÖ¯ÔÚÒ»Æð£¬ÐγÉÁ˽ø³Ì£¨»òÏß³Ì×飩µÄ²ã´Î½á¹¹
2.Ï̵߳÷¶ÈÆ÷£º Linux µÄµ÷¶ÈÆ÷¸ºÔð¾ö¶¨ºÎʱºÎµØÔËÐÐÄĸöÏß³Ì
Ëü»ùÓÚʱ¼äƬÂÖת£¨Round-Robin£©»òÓÅÏȼ¶µ÷¶È²ßÂÔ£¬È·±£ËùÓÐÏ̶߳¼Äܹ«Æ½µØ»ñµÃ CPU ×ÊÔ´
µ÷¶ÈÆ÷»á¸ù¾ÝÏ̵߳ÄÓÅÏȼ¶¡¢ÔËÐÐ״̬£¨ÈçÔËÐС¢¾ÍÐ÷¡¢×èÈû£©ÒÔ¼°ÏµÍ³¸ºÔصÈÒòËØ×ö³ö¾ö²ß
3.ͬ²½»úÖÆ£º ΪÁ˱£Ö¤Ï̼߳äÊý¾ÝµÄÒ»ÖÂÐÔºÍÕýÈ·ÐÔ£¬Linux ÌṩÁ˶àÖÖͬ²½»úÖÆ£¬°üÀ¨»¥³âËø£¨mutex£©¡¢¶ÁÐ´Ëø£¨rwlock£©¡¢ÐźÅÁ¿£¨semaphore£©¡¢Ìõ¼þ±äÁ¿£¨condition variable£©µÈ
ÕâЩ»úÖÆ°ïÖú¿ª·¢Õß±ÜÃ⾺̬Ìõ¼þ£¨race condition£©ºÍËÀËø£¨deadlock£©µÈÎÊÌâ
4.Ï߳̿⣺ POSIX Ï߳̿⣨pthreads£©ÊÇ Linux ÉÏ×î³£ÓõÄÏ߳̿âÖ®Ò»£¬ËüÌṩÁËÒ»Ì×±ê×¼µÄ API£¬ÓÃÓÚÏ̵߳Ĵ´½¨¡¢ÖÕÖ¹¡¢Í¬²½¡¢È¡ÏûµÈ²Ù×÷
pthreads ¿âµÄʵÏÖͨ³£·ÖΪÓû§¼¶ºÍÄں˼¶Á½²¿·Ö£¬Óû§¼¶²¿·Ö¸ºÔðÏ̵߳Ĵ´½¨ºÍ¹ÜÀí£¬¶øÄں˼¶²¿·ÖÔòͨ¹ýϵͳµ÷ÓÃÓëÄں˽øÐн»»¥
Èý¡¢Linux Ïß³ÌÀàµÄʹÓà ÔÚ Linux ÏÂʹÓÃỊ̈߳¬×îÖ±½ÓµÄ·½Ê½ÊÇͨ¹ý POSIX Ï߳̿⣨pthreads£©
ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄʾÀý£¬Õ¹Ê¾ÁËÈçºÎ´´½¨¡¢Í¬²½ºÍÖÕÖ¹Ïß³Ì
include ÔÚ `main` º¯ÊýÖУ¬ÎÒÃÇ´´½¨ÁËÁ½¸öỊ̈߳¬Ã¿¸öÏ̶߳¼Ö´ÐÐ`thread_function` ʹÓà `pthread_create` º¯Êý´´½¨Ị̈߳¬`pthread_join` º¯ÊýµÈ´ýÏß³ÌÍê³É
ËÄ¡¢×î¼Ñʵ¼ù
1.ºÏÀíʹÓÃËø£º
ËäÈ»ËøÄÜÓÐЧ½â¾öÏ̼߳äµÄͬ²½ÎÊÌ⣬µ«¹ý¶ÈʹÓÃËø»áµ¼ÖÂÐÔÄÜϽµºÍËÀËø·çÏÕ Ó¦¿¼ÂÇʹÓÃÎÞËøÊý¾Ý½á¹¹»ò¶ÁÐ´ËøµÈ¸üϸÁ£¶ÈµÄͬ²½»úÖÆ£¬ÒÔ¼õÉÙËø¾ºÕù
2.±ÜÃâæµÈ´ý£º
æµÈ´ý£¨busy waiting£©ÊÇÖ¸Ï̲߳»¶Ï¼ì²éij¸öÌõ¼þÊÇ·ñÂú×㣬¶ø²»ÊÍ·Å CPU ×ÊÔ´ Õâ»áµ¼Ö CPU ÀûÓÃÂʸߵ«Ð§ÂʵÍÏ ӦʹÓÃÌõ¼þ±äÁ¿¡¢ÐźÅÁ¿µÈ»úÖÆÊµÏÖʼþÇý¶¯µÄµÈ´ý
3.×¢ÒâḬ̈߳²È«£º
ÔÚ±àд¶àÏ̳߳ÌÐòʱ£¬ÒªÈ·±£È«¾Ö±äÁ¿ºÍ¹²Ïí×ÊÔ´µÄ·ÃÎÊÊÇḬ̈߳²È«µÄ Õâͨ³£Éæ¼°µ½Ê¹ÓÃÊʵ±µÄͬ²½»úÖÆÀ´±£»¤ÕâЩ×ÊÔ´
4.ºÏÀíʹÓÃÏ̳߳أº
¶ÔÓÚÐèÒª´óÁ¿¶ÌÉúÃüÖÜÆÚÏ̵߳ÄÓ¦Óã¬Ê¹ÓÃÏ̳߳ؿÉÒÔÏÔÖø¼õÉÙÏ̵߳Ĵ´½¨ºÍÏú»Ù¿ªÏú£¬Ìá¸ßϵͳÐÔÄÜ
5.µ÷ÊԺͲâÊÔ£º
¶àÏ̳߳ÌÐòµÄµ÷ÊԱȵ¥Ï̳߳ÌÐò¸´Ôӵö࣬ÒòΪ´æÔÚ¾ºÌ¬Ìõ¼þ¡¢ËÀËøµÈÎÊÌâ ӦʹÓÃרÃŵĵ÷ÊÔ¹¤¾ß£¨Èç gdb¡¢Valgrind µÄ Helgrind ¹¤¾ß£©ºÍ²âÊÔ²ßÂÔ£¨Èçµ¥Ôª²âÊÔ¡¢Ñ¹Á¦²âÊÔ£©À´È·±£³ÌÐòµÄÕýÈ·ÐÔ
Îå¡¢½áÓï
Linux Ïß³ÌÀàΪ¿ª·¢ÕßÌṩÁËÇ¿´óµÄ²¢·¢±à³ÌÄÜÁ¦£¬ÊÇʵÏÖ¸ßЧ²¢·¢Ó¦ÓõĻù´¡ ͨ¹ýÉîÈëÀí½â Linux Ï̵߳ÄʵÏÖÔÀíºÍʹÓ÷½·¨£¬½áºÏ×î¼Ñʵ¼ù£¬¿ª·¢Õß¿ÉÒÔ¹¹½¨³ö¸ßÐÔÄÜ¡¢¸ß¿É¿¿ÐԵIJ¢·¢ÏµÍ³ Ëæ×ż¼ÊõµÄ²»¶Ï½ø²½£¬Linux Ï̻߳úÖÆÒ²ÔÚ²»¶ÏÍêÉÆ£¬ÎªÎ´À´µÄ²¢·¢±à³ÌÌṩÁ˸ü¶àµÄ¿ÉÄÜÐÔºÍÌôÕ½ ×÷Ϊ¿ª·¢Õߣ¬ÎÒÃÇÓ¦³ÖÐøÑ§Ï°£¬½ô¸ú¼¼Êõ·¢Õ¹µÄ²½·¥£¬²»¶ÏÌáÉý×Ô¼ºµÄ²¢·¢±à³ÌÄÜÁ¦