首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

线程模型及惯用线程库

2012-07-23 
线程模型及常用线程库????? 线程的概念分为两种,用户态线程和核心态线程。用户态线程指不在内核中实现线程,

线程模型及常用线程库

????? 线程的概念分为两种,用户态线程和核心态线程。用户态线程指不在内核中实现线程,只在用户态中模拟出多线程,内核完全不知道。而核心态线程是由内核创建的。类Unix系统中一般通过修改进程的实现方式来完成,可以使用不完全的进程创建方式创建共享数据空间的进程,在 Linux下这种系统调用为clone(),而在FreeBSD下它为rfork()。

  在许多类Unix系统中,如Linux、FreeBSD、 Solaris等,进程一直都是操作系统内核调用的最小单位。程序开发也都采用多进程模型。后来引入了线程这一概念,由于这些系统本身不存在线程这一概念,那么出现以下几种常见的线程模型:


?????N∶1用户线程模型 :N条用户线程只由一条内核进程/线程调度,即以用户态线程实现。内核不干涉线程的任何生命活动,用户态线程工作在“进程竞争范围”。因此,线程的创建、删除和环境切换都很高效。但是缺点同样明显,因为一个进程同一时间只能在一个CPU中执行。所以在SMP中,无论系统有多少CPU,同一进程中的所有线程都只能由一个CPU去执行。另外,如果其中某条线程执行了一个“阻塞”操作,比如read和write,那么整个进程中的其它线程都会被阻塞,这也违背了线程的概念。
?????目前,采用这种模型的线程库大概有,FreeBSD下的libc_r,libkse好像还有GNU的libpth(这个不太清楚)


?????1∶1 核心线程模型 :1条用户线程对应一条内核进程/线程来调度,即以核心态线程实现。应用程序创建的每一个线程都由一个核心线程直接管理,内核将每一个核心线程都调度到系统CPU上。
所有线程都工作在“系统竞争范围”。这种方式也是现在大多线程库采用的模式。它完全克服了N:1模型的缺点,但较之在线程的创建、删除、切换的代价更昂贵。
?????目前,采用这种模型的线程库大概有,FreeBSD下的libthr,Linux下的LinuxThreads,NPTL。


?????N∶M 混合线程模型 :即N∶1和1∶1模型的组合形式,支持用户态线程和核心态线程同时存在。在创建线程时可以指明这个线程应该工作在哪一种模式。
这个模型比较灵活和强大,并且在实现N∶1模型中,加入了算法来克服这个模型会被阻塞的缺点。但是这种模型也较复杂。
?????目前,solaris提供了这种模型。Linux下可选的NGPT(已不再维护,NPTL已成为Linux下默认的线程库)


参考文献:《C++网络编程,卷1》
  Linux自从2.4以后就把线程库从原来的 LinuxThreads升级成NPTL。LinuxThreads需要一条管理线程来维护所有线程,NPTL把这些工作交给了内核,大幅提升了线程的效率。并且更好地兼容了POSIX标准。
  FreeBSD在6.0之前对线程的支持非常差,效率低。7.0开始libthr成为默认的线程库,不知道会不会有明显改善。
  在线程方面做得比较好的操作系统有 Windows NT/2000和SUN Solaris,对于Windows NT/2000,它们本身就是以线程为基础进行任务调度的,性能较好比较正常。SUN Solaris的线程实现则提供了另一个很好的参考平台,在Solaris中,采用了N∶M 混合线程模型,使用多个进程运行更多的线程,因此可以综合利用多处理器的优点和在进程内部切换线程的优点。

PS:
进程竞争范围(process contention scope):各个线程在同一进程中竞争“被调度的CPU时间”(但不直接和其他进程中的线程竞争)。
系统竞争范围(system contention scope):线程直接和“系统范围”内的其他线程竞争,无论它们和什么进程关联。
POSIX - 支持可移植操作系统接口标准(Portable Operating System Interface Standard)。


参考地址:http://blog.sina.com.cn/s/blog_43adf9fb0100a1t7.html

热点排行