当前位置: 技术问答>linux和unix
LINUX下有没有线程概念,和WIN下线程概念有什么不同,谢谢.
来源: 互联网 发布时间:2015-01-03
本文导语: LINUX下有没有线程概念,和WIN下线程概念有什么不同,谢谢. | 至今为止,Linux下还是没有“真正的线程”,有的只是一组共享内存/PID/执行环境的进程,这被称为1:1的线程模型,因为每个“线程”...
LINUX下有没有线程概念,和WIN下线程概念有什么不同,谢谢.
|
至今为止,Linux下还是没有“真正的线程”,有的只是一组共享内存/PID/执行环境的进程,这被称为1:1的线程模型,因为每个“线程”都要有一个核心调度单元与之对应(因为在OS核心中,进程这个概念并不是很清晰,所以权且称之为调度单元吧)。这样做最大的好处(也是Linus本人坚持这样做的原因)就是简单,但实际上“线程”基本变成了“进程”,要知道进程上下文切换的代价比较高(这也是多线程模型被引入的原因之一),所以在新城数量很多时,系统的线程表(实际上是进程表)会很大,切换的效率会急剧下降,造成执行效率较低。
另外还有两种线程模型,一种是m:1模型,也就是多个用户线程对应一个核心调度单元,换言之就是用户完全自己做调度,核心不为此提供任何支持,在早期Unix系统上,因为系统本身不支持多线程,多已出现了很多这样的库,这样做系统开销比较小,因为用户线程的切换完全不涉及进程上下文的切换,但是这样做最大的问题就是“线程”切换问题很多(基本类似于Windows3.1上的非占先式调度)
另一种是m:n模型,这种模型比较复杂,简单说就是内核准备n个调度单元,由这些调度单元轮换执行m个用户“线程”,这样做最大的好处就是调度由内核处理,而且由于切换的是“线程”,而不是“进程”,所以切换上下文时的开销较小,另外n的个数可以由系统决定,以充分利用硬件的多处理能力。
现代的Unix,大多数采用m:n模型(至少我不知道有什么例外),Linux在这里应该算是落后了(因为Linux内核不支持多个线程“打包”在一个进程里的概念,而是每个线程有自己的一个完整的tast_struct,所以我说它实际上就是一个进程),不过IBM在这方面作了很多工作,你可以到http://www-124.ibm.com/pthreads上下载一个NGPT包,它(通过一个内核补丁)实现了m:n模型,极大的提高了Linux下的线程效率(大约提高了一倍),不过要小心,安装这个东东会替换你的pthread库,很可能会让你现有的软件无法运行,你需要把它们重新编译。
BTW:别和我争论Linux下到底有没有“线程”,每个人对“线程”这个词的理解还是有区别的:)
另外还有两种线程模型,一种是m:1模型,也就是多个用户线程对应一个核心调度单元,换言之就是用户完全自己做调度,核心不为此提供任何支持,在早期Unix系统上,因为系统本身不支持多线程,多已出现了很多这样的库,这样做系统开销比较小,因为用户线程的切换完全不涉及进程上下文的切换,但是这样做最大的问题就是“线程”切换问题很多(基本类似于Windows3.1上的非占先式调度)
另一种是m:n模型,这种模型比较复杂,简单说就是内核准备n个调度单元,由这些调度单元轮换执行m个用户“线程”,这样做最大的好处就是调度由内核处理,而且由于切换的是“线程”,而不是“进程”,所以切换上下文时的开销较小,另外n的个数可以由系统决定,以充分利用硬件的多处理能力。
现代的Unix,大多数采用m:n模型(至少我不知道有什么例外),Linux在这里应该算是落后了(因为Linux内核不支持多个线程“打包”在一个进程里的概念,而是每个线程有自己的一个完整的tast_struct,所以我说它实际上就是一个进程),不过IBM在这方面作了很多工作,你可以到http://www-124.ibm.com/pthreads上下载一个NGPT包,它(通过一个内核补丁)实现了m:n模型,极大的提高了Linux下的线程效率(大约提高了一倍),不过要小心,安装这个东东会替换你的pthread库,很可能会让你现有的软件无法运行,你需要把它们重新编译。
BTW:别和我争论Linux下到底有没有“线程”,每个人对“线程”这个词的理解还是有区别的:)