`

线程模型及常用线程库

阅读更多

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

分享到:
评论

相关推荐

    多线程服务器的常用编程模型.zip

    Python的线程库为threading,但GIL(全局解释器锁)限制了多线程在CPU密集型任务上的表现;Go语言的goroutine和通道提供了轻量级线程和通信机制,简化了并发编程。 总的来说,理解和掌握多线程服务器的编程模型对于...

    多线程网络服务器的常用编程模型

    1. **单线程模型**:虽然名为“多线程”,但有些简单的服务器可能会采用单线程模型,通过非阻塞I/O(如IO复用技术,如select、poll、epoll)处理并发请求。这种方式可以避免线程切换带来的开销,但当连接数量增加时...

    嵌入式Linux应用程序开发第9章多线程编程

    当时采用的是 LinuxThread 线程库,它对应的线程模型是“一对一”线程模型,也就是一个用户级线程对应一个内核线程,而线程之间的管理在内核外的函数库中实现。 在 Linux 内核 2.6 之前的版本中,进程是最主要的...

    TCP-接收线程和发送线程

    在IT行业中,网络通信是至关...这个项目对于理解和实践网络编程以及多线程编程技巧非常有帮助,可以加深对TCP协议及多线程模型的理解。通过分析和学习此项目,开发者可以更好地设计和实现高并发、高性能的网络服务。

    linux 下线程库的使用

    pthread库是Linux中最常用的一种线程库,其核心API包括: - `pthread_create()`:用于创建新线程,传入线程函数指针和参数。 - `pthread_join()`:等待特定线程结束,获取其返回值。 - `pthread_exit()`:线程结束...

    C++多线程聊天程序

    1. **C++多线程库**: C++11及以后的标准引入了`<thread>`库,为多线程编程提供了标准支持。在这个聊天程序中,`std::thread`类用于创建新的线程。程序员可以传递一个函数或成员函数指针到`std::thread`构造函数,...

    VC单线程编程实例

    在Windows编程环境中,Visual C++(简称VC)是常用的开发工具,它支持多种编程模型,其中之一就是线程编程。线程允许程序同时执行多个任务,提高应用程序的响应速度和效率。"VC单线程编程实例"是针对初学者的一个...

    《嵌入式Linux应用程序开发详解》之多线程编程

    在实际开发中,需要根据具体情况选择合适的线程模型和线程库,例如 NPTL、LinuxThreads 等。同时,需要注意线程的同步问题,避免线程之间的竞争和死锁等问题。 此外, Linux 中的线程编程技术还需要考虑到多处理器...

    Linux多线程服务端编程:使用muduo C++网络库.pdf

    本文将详细介绍如何使用现代C++语言和muduo网络库在Linux平台上编写高性能的多线程TCP网络服务器,以及与此相关的各种编程模型、同步原语、进程间通信IPC机制、编程实践中的常见问题及其解决方案。 在Linux多线程...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    玩转多线程编程

    4. **NPTL (Native POSIX Thread Library)**:这是目前Linux上最常用的线程库之一,提供POSIX线程接口。NPTL使用的是M:N模型,其中M个用户空间线程可以映射到N个内核线程上,这为调度提供了更多的灵活性。 5. **...

    Qt多线程实例

    首先,我们要理解Qt中的线程模型。Qt提供两种主要的线程类:QThread和Qt Concurrent。QThread是基础的线程类,它允许程序员直接控制线程的生命周期。而Qt Concurrent库则提供了更高级别的抽象,使得在后台线程中运行...

    网络编程和多线程网络编程和多线程

    多线程技术则是网络编程中常用的优化手段,可以提高程序的并发性和效率。在这篇文章中,我们将深入探讨这两个主题,以及它们如何相互作用来构建高效、可扩展的网络应用程序。 一、网络编程基础 1. **TCP/IP协议栈**...

    Java线程 学习

    - **线程的优势**:使用线程可以提高用户界面的响应速度、充分利用多处理器系统、简化模型构建、实现异步处理等。 #### 三、线程在Java中的应用 - **事件驱动的用户界面**:在Java图形用户界面库(如AWT和Swing)中...

    多线程实例-摇奖机源码

    `Task`并行库则是.NET Framework 4.0及更高版本引入的,提供了更加高级和灵活的异步编程模型。虽然在这个摇奖机实例中可能没有直接使用到`ThreadPool`或`Task`,但了解这些概念对于提升多线程编程能力是非常有帮助的...

    浅谈Linux下的多线程编程.pdf

    Linux系统提供了多种API来支持多线程编程,其中最常用的是POSIX线程库(pthread)。pthread库提供了一套标准的函数接口,如`pthread_create`用于创建新线程,`pthread_join`用于等待线程结束,`pthread_mutex`系列...

    Go-golang-set-Go的线程安全的和非线程安全的高性能集

    Go的并发模型基于goroutine和channel,因此在多线程环境下,线程安全的数据结构尤为重要。`golang-set`库提供了一种实现,包括线程安全和非线程安全的高性能集,非常适合在Go的并发环境中使用。 首先,我们要理解...

Global site tag (gtag.js) - Google Analytics