- 论坛徽章:
- 1
|
ok,其实这些都是由于一个问题引出的
这样吧,我举个例子,大家讨论讨论
系统: Aix 5.3
程序: test3 (pthread_create() 创建了10 用户态线程)
运行: bash-2.00$ test3
查看该test3中的线程,用下列命令:
ps -emo THREAD | grep test3
USER PID PPID TID S CP PRI SC WCHAN F TT BND COMMAND
bssdev 934214 926102 - A 549 60 2 f100070f10812c40 200001 pts/3 - test3
- - - 1089551 R 62 91 0 - 400010 - - -
- - - 1183781 R 44 82 0 - 400010 - - -
- - - 1188093 R 57 88 0 - 400010 - - -
- - - 1216909 R 54 87 0 - 400010 - - -
- - - 1229139 S 0 60 1 f100070f10812c40 8410410 - - -
- - - 1290729 R 47 83 0 - 400010 - - -
- - - 1139453 R 62 91 0 - 400010 - - -
- - - 1159737 R 61 90 0 - 400010 - - -
- - - 1249867 S 0 60 1 - 2400400 - - -
- - - 1127371 R 50 85 0 - 400010 - - -
- - - 1344427 R 50 85 0 - 400010 - - -
- - - 1352545 R 62 91 0 - 400010 - - -
可以看到确实创建了10个内核线程,每一个pthread_create创建的线程对应一个内核线程 (到这里,理解都没有问题)
注意:这里显示的线程是内核线程
10个用户态线程(pthread_create创建的)都运行完后(线程都是正确的退出),主线程sleep()一段时间,在ps -emo THREAD | grep test3,如下:
bssdev 934214 926102 - A 99 60 11 * 200001 pts/3 - test3
- - - 1089551 S 0 60 1 f100070f10010a40 8c10400 - - -
- - - 1183781 S 0 60 1 f100070f10012140 8c10400 - - -
- - - 1188093 S 0 60 1 f100070f10012240 8c10400 - - -
- - - 1216909 S 0 60 1 f100070f10812940 8c10400 - - -
- - - 1229139 R 99 109 0 - 400010 - - -
- - - 1290729 S 0 60 1 f100070f10813b40 8c10400 - - -
- - - 1139453 S 0 60 1 f100070f11011640 8c10400 - - -
- - - 1159737 S 0 60 1 f100070f11011b40 8c10400 - - -
- - - 1249867 S 0 60 1 - 2400400 - - -
- - - 1127371 S 0 60 1 f100070f11811340 8c10400 - - -
- - - 1344427 S 0 60 1 f100070f11814840 8c10400 - - -
- - - 1352545 S 0 60 1 f100070f11814a40 8c10400 - - -
问题:
1. 按理来说,10个用户态线程(pthread_create创建的)都已经退出了,那么上面显示的10个内核线程的状态都应该Z(即取消)才是,而不是S(睡眠)。但显示的怎么会是S ???
难道是 10个内核线程 都 "嫁接" 在这个进程里面,为了后面再次创建用户态线程时用,而不是l用户态线程退出后马上就销毁? |
|