`
cloudeagle_bupt
  • 浏览: 537601 次
文章分类
社区版块
存档分类
最新评论

用户级线程和内核级线程

 
阅读更多


转自http://col1.blog.163.com/blog/static/1909775192012719114033352/

1 .内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态;可以很好的利用smp,即利用多核cpu。windows线程就是这样的。

2. 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的。

线程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread),后者又称为内核支持的线程或轻量级进程。在多线程操作系统中,各个系统的实现方式并不相同,在有的系统中实现了用户级线程,有的系统中实现了内核级线程。

用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。

内核线程:由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。Windows NT和2000/XP支持内核线程。

用户线程运行在一个中间系统上面。目前中间系统实现的方式有两种,即运行时系统(Runtime System)和内核控制线程。“运行时系统”实质上是用于管理和控制线程的函数集合,包括创建、撤销、线程的同步和通信的函数以及调度的函数。这些函数都驻留在用户空间作为用户线程和内核之间的接口。用户线程不能使用系统调用,而是当线程需要系统资源时,将请求传送给运行时,由后者通过相应的系统调用来获取系统资源。内核控制线程:系统在分给进程几个轻型进程(LWP),LWP可以通过系统调用来获得内核提供的服务,而进程中的用户线程可通过复用来关联到LWP,从而得到内核的服务。

以下是用户级线程和内核级线程的区别:

(1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。

(2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。

(3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。

(4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。

(5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

内核线程的优点:

(1)当有多个处理机时,一个进程的多个线程可以同时执行。

缺点:

(1)由内核进行调度。

用户进程的优点:

(1) 线程的调度不需要内核直接参与,控制简单。

(2) 可以在不支持线程的操作系统中实现。

(3) 创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多。

(4) 允许每个进程定制自己的调度算法,线程管理比较灵活。

(5) 线程能够利用的表空间和堆栈空间比内核级线程多。

(6) 同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。另外,页面失效也会产生同样的问题。

缺点:

(1)资源调度按照进程进行,多个处理机下,同一个进程中的线程只能在同一个处理机下分时复用


linux上主流的线程实现机制:

转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/


1.NPTL

NPTL的设计目标归纳可归纳为以下几点:

  • POSIX兼容性

  • SMP结构的利用

  • 低启动开销

  • 低链接开销(即不使用线程的程序不应当受线程库的影响)

  • 与LinuxThreads应用的二进制兼容性

  • 软硬件的可扩展能力

  • 多体系结构支持

  • NUMA支持

  • 与C++集成

在技术实现上,NPTL仍然采用1:1的线程模型,并配合glibc和最新的Linux Kernel2.5.x开发版在信号处理、线程同步、存储管理等多方面进行了优化。和LinuxThreads不同,NPTL没有使用管理线程,核心线程的管理直接放在核内进行,这也带了性能的优化。

主要是因为核心的问题,NPTL仍然不是100%POSIX兼容的,但就性能而言相对LinuxThreads已经有很大程度上的改进了。

2.NGPT

IBM的开放源码项目NGPT在2003年1月10日推出了稳定的2.2.0版,但相关的文档工作还差很多。就目前所知,NGPT是基于GNU Pth(GNU Portable Threads)项目而实现的M:N模型,而GNU Pth是一个经典的用户级线程库实现。

按照2003年3月NGPT官方网站上的通知,NGPT考虑到NPTL日益广泛地为人所接受,为避免不同的线程库版本引起的混乱,今后将不再进行进一步开发,而今进行支持性的维护工作。也就是说,NGPT已经放弃与NPTL竞争下一代Linux POSIX线程库标准。

3.其他高效线程机制

此处不能不提到Scheduler Activations。这个1991年在ACM上发表的多线程内核结构影响了很多多线程内核的设计,其中包括Mach3.0、NetBSD和商业版本Digital Unix(现在叫Compaq True64 Unix)。它的实质是在使用用户级线程调度的同时,尽可能地减少用户级对核心的系统调用请求,而后者往往是运行开销的重要来源。采用这种结构的线程机制,实际上是结合了用户级线程的灵活高效和核心级线程的实用性,因此,包括Linux、FreeBSD在内的多个开放源码操作系统设计社区都在进行相关研究,力图在本系统中实现Scheduler Activations。

分享到:
评论

相关推荐

    哈工大操作系统-L11内核级线程1

    1.和用户级相比,核心级线程有什么不同 2.内核级线程如何切换 3.用户级线程和内核级线程的对比 1.和用户级相比,核心级线程有什么不同 2.内核级线程如何切换

    系统线程(内核线程)和用户线程区别 - 简书.pdf

    系统线程(内核线程)和用户线程区别 - 简书.pdf

    Linux下的LWP(轻量级进程)、进程、线程、用户级线程、内核线程

    本文主要讲解了Linux下的LWP(轻量级进程)、...、线程、用户级线程、内核线程的概念、区别与联系、优缺点、发展等相关内容。 本文来自于CSDN,由火龙果软件Linda编辑、推荐。 再看正文之前我要先强调一下几点: 1.Li

    c++多线程 Linux版本

    1.线程的基础 进程是资源管理的最小单位,线程是程序执行最小单位。 每个进程有自己的数据段,代码段和堆栈段。线程通常叫做轻型的...线程按照其调度者可分为用户级线程和内核级线程两种 用户级线程:主要解决的是上

    线程和内核对象的同步

    线程和内核对象的同步,详细的讲解了4种内核对象的同步过程,以及他们之间的差别

    哈工大操作系统实验8——内核级线程

    哈工大操作系统实验8——内核级线程。本次的实验仅完成了用户态的实现。内核级要实现实在困难,耗费巨大精力也不见得能有好的成效,而且重要的是内核级仅占一个。

    内核线程和用户线程的区别1

    2.1 线程的户级线程实现式 2.2 户级线程的特点 2.3 户级线程的优点 2.4 户线程的缺点 3.1 线程的内核级线程实现 3.2 内核线程的特点 3.3

    哈工大 操作系统 实验8 内核级线程

    11级本人自写的作业, 于实验八截至后第一天上传; 没采用轻量级风格的线程, 而是仿造windows solaris的风格. 应该好使, 欢迎讨论, 联系方式在下载包内.

    多线程设计

    多核程序设计,多线程, 0 进程 1 多线程的概念 2 用户级线程和内核级线程 3 多线程的映射模型 4 线程的生命周期 5 线程的同步

    线程与内核对象的同步

    将要介绍如何使用内核对象来实现线程的同步

    linux内核级线程研究

    linux内核级线程的研究 pdf格式 有一定参考价值

    哈工大操作系统-L10用户级线程1

    1.线程的引出 2.如何实现用户级线程的切换 3.引出内核级线程 1.线程的引出 2.如何实现用户级线程的切换 3.引出内核级线程

    线程和内核对象的同步.pdf

    线程和内核对象的同步.pdf

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    ---------------------------------------------------Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    易语言查看内核线程

    易语言查看内核线程源码,查看内核线程,EnumThread,EnumDrivers,getdata_int,getdata_str,ZwQuerySystemInformation

    windows线程与内核调度

    详细介绍了windows内核与线程的概念,并提供调度算法

    Linux内核线程编程方法

    内核线程实际上是内核进程,只是大家的地址空间是内核空间,所以内核线程间的切换没有真正意义上的地址空间切换。

    linux多线程及网络编程

    根据运行环境的调度者的身份,线程可分为内核线程和用户线程。内核线程,在有的系统上称为LWP(Light Weight Process,轻量级线程),运行在内核空间,由内核调度;用户线程运行在用户空间,由线程库来调度。当进程的...

    C++多核高级编程

    用户级线程和内核级线程:线程有三种实现模型:用户级或应用程序级,内核级,用户级和内核级混合线程。他们之间主要的区别在于他们的模式以及要指派给处理器的线程的能力。用户模式下,线程驻留在用户空间,是执行...

Global site tag (gtag.js) - Google Analytics