`
isiqi
  • 浏览: 16855674 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

用户态多线程实现的基本原理

 
阅读更多

本文参考了用户态非抢占式线程库实现 一文以及GNU Pth 。前者是一种用户态线程库的简单实现,属于一个很好的demo,后者就是大家熟知的Pthread的用户态实现,比较完善。

Keywords: User-Space MultiThreading, Pth

所谓多线程,简单讲就是能够让几个不同的代码片段轮流执行。内核实现多线程的方法比较直观,在每次时钟中断到来时或者用户调用syscall陷入内核时进行上下文切换即可。用户态切换线程要解决两个问题:

1、时机,即何时切换线程?

2、方法,即怎样切换上下文?

为了决定切换时机,需要确定所设计的线程库是可剥夺(preemptive)的还是不可剥夺(non-preemptive)的。一般,用户态线程库都选择使用不可剥夺的设计方案,这么做的好处是将控制权交给用户,而用户最了解何时需要放弃执行权。这么做减少了系统切换次数,实现了最高的CPU利用率,非常适合用于科学计算环境。但是,另一方面这么做也存在缺点:其它线程的响应速度变慢,他们必须等到当前CPU放弃执行权后才能被执行。能不能将用户线程设计成可剥夺的呢?这应该也是可行的。每个用户线程运行一段时间后会被迫暂停执行,被动地将控制权交回给调度器。怎样才能“被迫暂停执行”?这是方法问题,下面就要讲到。

对于不可剥夺方式,需要用户编写程序的时候主动调用诸如thread_yeild(), thread_wai()之类的函数,这些函数会将当前用户线程的执行上下文保存起来,然后让调度器选择一个新的用户线程投入执行。底层操作系统提供了一些列的机制支持上下文的获得和切换,如setjmp,longjmp,getcontext,swapcontext等。用户态非抢占式线程库实现 一文使用了前面两个函数,GNU Pth 使用了后面两个函数。可剥夺方式的实现需要更多的操作系统支持,如可以利用alarm函数周期性地产生用户态中断,每次中断到来的时候线程库进行线程切换。

单纯的用户态线程库一般都是基于一个单线程进程实现的,一旦用户线程阻塞,这个进程就被阻塞,进而导致整个用户态线程组得不到CPU。基于单进程实现的用户态线程库在SMP/多CPU环境下性能很差,多出来的核无法被线程库利用,这跟当前的微处理器架构发展趋势十分不符。为了解决这个问题,可以考虑使用一种混合结构:在少量内核线程的基础上实现大量的用户线程。

最后思考一个问题:为什么用户态线程库比内核态线程库具有更高的性能呢?其实用户态线程库同样离不开进入内核态这一过程,以getcontext,swapcontex实现方式为例,getcontext要进出一次内核,swapcontex又要进出一次内核,而内核线程切换则只需要一次时钟中断,只进出内核一次即可。这么说来,用户态线程库的性能应该劣于内核态线程库。但是,注意到每次时钟中断所做的工作远远不止上下文切换这么简单,这应该是用户态线程库更优的原因吧。基于这个分析,如果应用需要创建的线程数并不多,二者应该性能相当。但是,一旦线程数巨大且切换频繁,用户态线程库的优势就能体现出来了。

分享到:
评论

相关推荐

    多线程实现源代码(简单)

    通过分析这个压缩包中的"多线程实现源代码",我们可以深入理解多线程的工作原理,学习如何创建和管理线程,以及如何避免和解决多线程环境下可能出现的问题。这将对提升编程技能和优化程序性能具有重要价值。

    多线程游戏坦克大战

    本文将深入探讨这款游戏中的核心知识点,包括多线程原理、游戏逻辑设计以及相关工具的使用。 首先,我们要了解多线程在游戏开发中的重要性。在坦克大战这类实时性要求高的游戏中,多线程能够使得游戏的渲染、用户...

    vb6实现安全多线程的ActiveX组件(1.0.0.2)

    VB6的多线程实现通常需要借助于ActiveX控件,因为VB6的标准库中没有内置的多线程支持。MT32.dll作为一个ActiveX组件,能够无缝集成到VB6项目中,允许开发者创建并管理多个并发执行的任务,从而提升程序的响应速度。 ...

    C#多线程系列教程

    通过理解和掌握多线程的基本原理和编程技巧,开发者可以设计出更加高效、稳定的多线程应用程序。无论是对于初学者还是经验丰富的开发人员,深入学习和实践多线程技术都是提升编程技能、解决复杂问题的有效途径。希望...

    多线程访问网页

    在IT领域,多线程是一种常见的编程技术,特别是在网络访问和数据处理中。...开发者需要理解多线程的原理,掌握各种实现方式,并能根据具体场景选择合适的优化策略,以实现高效、稳定的多线程程序。

    Linux多线程(free)

    此外,多线程在处理多任务时可以实现更好的并行性,尤其在现代多核处理器中,每个核心可以同时执行不同的线程,进一步提升性能。 在Linux系统中,内核提供了两种线程模型:用户级线程(User-Level Threads, ULTs)...

    Windows环境下的多线程编程原理与应用

    本知识点将深入探讨Windows多线程编程的基本原理、应用以及实现方法。 首先,理解多线程的概念是至关重要的。在单线程程序中,代码按照顺序执行;而在多线程程序中,可以同时执行多个任务,每个任务被称为一个线程...

    VB多线程实例 - VBThread2

    VBThread2是一个专门用于VB多线程操作的实例,它帮助开发者突破VB6原生环境对多线程支持的局限性,实现更高效能的应用程序。 在VB6中,由于其内建的线程模型并不像现代.NET框架那样强大,开发者需要依赖第三方库或...

    MFC Opengl多线程框架

    MFC OpenGL多线程框架结合了这两个技术,允许开发者在同一个应用程序中同时处理图形渲染和其他计算任务,从而提升性能和用户体验。 在MFC中整合OpenGL,通常需要创建一个OpenGL窗口,通过`CWnd`或其子类的`OnPaint`...

    C#多线程(.pdf)

    - 改善用户体验: 在图形用户界面应用程序中,多线程可以让界面响应更及时,即使正在进行耗时的操作也不会导致界面冻结。 - **劣势**: - 内存占用增加: 每个线程都需要一定的内存空间,因此随着线程数量的增加,...

    东半球最好的多线程讲义

    "为什么"部分可能讨论了使用多线程的原因,如提高资源利用率,实现并发操作,以及提升用户体验等。 讲义可能会详细讲解以下知识点: 1. **线程基础**:介绍线程的概念,包括线程的生命周期(新建、就绪、运行、...

    面向对象与多线程综合实验报告

    - 学习多态性的基本原理及其实现方式; - 掌握抽象类与接口的使用方法。 #### 系统功能与描述 该实验项目是一个档案管理系统,主要功能包括用户登录验证、不同角色用户的权限管理、档案浏览与下载等功能。具体...

    vb.net多线程例子

    下面将详细解释多线程的基本原理以及如何在VB.NET中实现。 首先,我们需要理解什么是线程。线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程。主线程通常负责应用程序的UI交互,而额外创建的线程则...

    多线程编程 入门版本 可以熟悉很多线程方面

    在IT行业中,多线程编程是一项至关重要的技能,特别是在现代计算环境中,为了提高程序的执行效率和用户体验,多线程已经成为软件开发的标准实践之一。本文将深入探讨多线程编程的基础概念,帮助初学者理解这一复杂的...

    易语言 单线程 改多线程 项目实战 教程.zip

    通过学习这门教程,开发者不仅可以掌握易语言的多线程编程技术,还能进一步理解并发编程原理,为编写高效、稳定的多线程应用程序打下坚实的基础。在实践中,将理论知识与具体项目相结合,有助于提升个人的编程技能和...

    windows环境下的多线程编程原理与应用

    本篇文章将深入探讨多线程编程的基本概念、实现原理以及在Windows平台上的实际应用。 首先,我们要理解什么是线程。线程是操作系统内核调度的基本单位,一个进程中可以包含一个或多个线程。每个线程都有自己的程序...

    powerbuilder多线程示例

    综上所述,"powerbuilder多线程示例"不仅涵盖了多线程的基本原理,还可能包含了一些实战经验和高级技巧。通过学习和实践这个示例,开发者可以更好地理解和掌握PowerBuilder中的多线程编程,从而编写出更加高效和稳定...

    编写多线程的 Java 应用程序

    Java Thread API 提供了在Java应用程序中实现多线程的能力,从而允许程序在处理后台任务的同时保持用户界面的响应性。Alex Roetter的文章深入探讨了Java的多线程概念,包括可能遇到的问题以及如何解决这些问题。 ...

Global site tag (gtag.js) - Google Analytics