线程模型及常用线程库

      线程的概念分为两种,用户态线程核心态线程 。用户态线程指不在内核中实现线程,只在用户态中模拟出多线程,内核完全不知道。而核心态线程是由内核创建的。类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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值