免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chenzhanyiczy
打印 上一主题 下一主题

难题:内核线程讨论 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-02-11 19:47 |只看该作者

回复 #10 system888net 的帖子

那么这个流程在逻辑上可以看做是一个整体,只不过一段代码在用户态执行,一段代码在核心态执行.

论坛徽章:
0
12 [报告]
发表于 2009-02-11 19:53 |只看该作者
原帖由 chenzhanyiczy 于 2009-2-11 19:36 发表
我知道 内核线程只运行于内核态,只是不明白 进程怎样关联到内核线程?
进程的运行其实是通过内核线程实现的,但这个进程是怎样过度到内核线程的,让内核线程去执行代码?

过渡的方式一般来说就是通过系统调用陷入到内核态中,然后内核态中的函数可能会和某些内核线程打交道(比如使用它们提供的服务啊之类的)。

论坛徽章:
0
13 [报告]
发表于 2009-02-11 19:58 |只看该作者
原帖由 scutan 于 2009-2-11 19:53 发表

过渡的方式一般来说就是通过系统调用陷入到内核态中,然后内核态中的函数可能会和某些内核线程打交道(比如使用它们提供的服务啊之类的)。


好,另一种方式的讲法.

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
14 [报告]
发表于 2009-02-11 20:19 |只看该作者
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用户态线程退出后马上就销毁?

论坛徽章:
0
15 [报告]
发表于 2009-02-11 20:29 |只看该作者

回复 #14 chenzhanyiczy 的帖子

这个应该是和AIX的线程实现相关。对于Linux来说,内核线程是不能够通过用户态的程序来创建的。

论坛徽章:
0
16 [报告]
发表于 2009-02-11 21:35 |只看该作者
AIX我没用过,姑且拿linux下的来讨论下吧:

1、pthread_create创建的是用户态的线程,而非内核态的,内核线程是在内核中创建,一般用于周期性的提供服务,如周期性的回写磁盘等。
   你的ps命令看到的线程显示的状态是stop,意味着你的线程调用了exit类函数,或者return,应该说是执行完了最后一行代码。这个时候你线程的资源已经释放的差不多了,但是有一个还没释放,就是PCB块(linux下为8k)。
2、正确的使用多进程与多线程一般是,fork, exec, exit, wait, 其中fork和wait是父进程或者说是主线程需要做的。

综上,我认为,是你的主线程没有wait对应的子线程导致,与内核线程无关。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
17 [报告]
发表于 2009-02-11 21:51 |只看该作者
原帖由 scutan 于 2009-2-11 20:29 发表
这个应该是和AIX的线程实现相关。对于Linux来说,内核线程是不能够通过用户态的程序来创建的。



Aix 这里用的也是 Pthread 线程

对,内核线程是通过 内核来创建的,但说的是 用户态线程销毁后,相对应的内核线程 并没有销毁,这就比较奇怪

比如 创建了(pthread_create) 1000个用户态线程,假如采用的是1:1 的线程模式,那么将有 1000个内核线程 与之 对应,

那么当 这1000个用户态线程都销毁的时候, 可1000个内核线程并没有销毁,这就不知道是什么原因

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
18 [报告]
发表于 2009-02-11 22:00 |只看该作者
原帖由 samon_fu 于 2009-2-11 21:35 发表
AIX我没用过,姑且拿linux下的来讨论下吧:

1、pthread_create创建的是用户态的线程,而非内核态的,内核线程是在内核中创建,一般用于周期性的提供服务,如周期性的回写磁盘等。
   你的ps命令看到的线程显 ...


1.  这里的S并不是Stop,而是Sleep, 相关连接:http://publib.boulder.ibm.com/in ... /aixcmds5/topas.htm 的下面部分:

S
(-l and l flags) The state of the process or kernel thread :
For processes:

O
Nonexistent
A
Active
W
Swapped
I
Idle (waiting for startup)
Z
Canceled
T
Stopped
For kernel threads:

O
Nonexistent
R
Running
S
Sleeping
W
Swapped
Z
Canceled
T
Stopped


另外PCB块是什么来的?

2.  主线程已经 用了 pthread_join 来等待所有子线程的结束

论坛徽章:
0
19 [报告]
发表于 2009-02-12 04:03 |只看该作者
具体是否是STOP可能是我说的有问题。

你调用线程库里对应的线程等待接口,把对应的子线程都wait一下看看效果~~

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
20 [报告]
发表于 2009-02-12 09:20 |只看该作者
原帖由 samon_fu 于 2009-2-12 04:03 发表
具体是否是STOP可能是我说的有问题。

你调用线程库里对应的线程等待接口,把对应的子线程都wait一下看看效果~~


你说的等待接口说的是哪些?  pthread_join() 还是 pthread_delay_np 还是其他?

但好像这些都是针对 子线程的,等待的意义是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP