当前位置: 技术问答>linux和unix
哪位大牛可以介绍一下Linux2.6.xx以上版本内核是如何实现线程的吗?
来源: 互联网 发布时间:2017-01-03
本文导语: 我想知道一下Linux2.6.xx版本的线程实现机制。 在网上找了两篇文章: http://www.ibm.com/developerworks/cn/linux/l-threading.html#author http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 这两篇文章似乎有点历史悠久了。 我在2.6.32版...
我想知道一下Linux2.6.xx版本的线程实现机制。
在网上找了两篇文章:
http://www.ibm.com/developerworks/cn/linux/l-threading.html#author
http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/
这两篇文章似乎有点历史悠久了。
我在2.6.32版本下测试的发现,在同一个进程中的线程的pid是一样的了。
而在《unix环境高级编程》他说道在Linux环境下同一个进程中的线程的pid不一样。
但是它采用的内核版本是2.4.22。
Linux现在的内核版本线程实现机制是在内核级别得到支持吗?采用的是NPTL吗?
早期的LinuxThreads是在用户态实现的。
在网上找了两篇文章:
http://www.ibm.com/developerworks/cn/linux/l-threading.html#author
http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/
这两篇文章似乎有点历史悠久了。
我在2.6.32版本下测试的发现,在同一个进程中的线程的pid是一样的了。
而在《unix环境高级编程》他说道在Linux环境下同一个进程中的线程的pid不一样。
但是它采用的内核版本是2.4.22。
Linux现在的内核版本线程实现机制是在内核级别得到支持吗?采用的是NPTL吗?
早期的LinuxThreads是在用户态实现的。
|
linux-2.6.36
int sys_fork(struct pt_regs *regs)
{
return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}
int sys_fork(struct pt_regs *regs)
{
return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}
|
《unix环境高级编程》应该是2003年之前出的,那时候2.6还没有
现在Linux的线程实际上就是个轻量进程,和进程函数的底层调用一样的,进程是fork,线程是clone,底层都是do_fork,参数不同而已(如果没记错的话,很久之前看的)
所以,相对来说Linux线程的上下文开销要比Windows的大一些
现在Linux的线程实际上就是个轻量进程,和进程函数的底层调用一样的,进程是fork,线程是clone,底层都是do_fork,参数不同而已(如果没记错的话,很久之前看的)
所以,相对来说Linux线程的上下文开销要比Windows的大一些
|
stace跟踪一个创建线程的程序,你会发现clone系统调用.
|
2.6以后就支持本地线程了,不再使用LinuxThreads
这是2.6之后的重大改进
这是2.6之后的重大改进