线程的实现方式之内核支持线程和用户级线程

  线程是OS进行独立调试、执行的基本单位,进程是系统进行资源分配的基本单位,一个进程可以包含若干个线程。无论是系统进程还是用户进程,进程的创建、撤消、以及要求系统设备完成的IO操作,都是利用系统调用而进入内核,再由内核中相应处理程序予以完成。进程的切换同样是在内核的支持下实现的。即不论什么样的进程,它们都是在OS内核的支持下运行的,是与内核紧密相关的。

1. 线程的分类

  线程根据其实现方式不同又可分为内核支持线程KST(Kernel Supported Threads)、用户级线程ULT(User Level Threads)、组合方式(ULT/KST)三种方式。

1.1 内核支持线程KST

  内核支持线程是驻留在内核空间中的内核对象。用户进程或者系统进程中的线程的创建、撤消、切换都是在内核空间中实现的,并由内核为其分配线程控制块进行管理。每个用户线程会被映射或者绑定到一个内核线程,形成一对一的线程对应关系,如上图所示,内核可以感知线程的存在,其调度是以线程为基本单位。

  内核支持线程的优点如下:

  • 在多处理器系统中,内核能够同时调度同一个进程中的多个线程并行执行;
  • 如果进程中一个线程被阻塞了,内核可以调度该进程中的其他线程占有处理器运行,也可以运行其它进程中的线程;
  • 内核本身可以使用多线程技术,以提高系统的执行和效率。

  缺点:

  • 对于用户级线程切换时,由于用户进程的线程是在用户态运行的,需要从用户态转到内核态进行,导致切换时开销较大。

1.2 用户级线程ULT

  用户级线程仅存在于用户空间中,对于这种线程的创建、撤消、线程之间的同步与通信等,无须利用系统调用来实现,也同样无须内核的运行,而是通过中间系统(线程库)在用户空间中来完成。由于不需要用户/内核态切换,线程切换速度比较快。但由于内核无法感知用户级线程的存在,其调度仍是以进程为单位进行的。当内核调度一个进程运行时,用户级线程库调度该进程的一个线程执行,如果时间片允许,进程的其他线程也可能被执行,该进程的多个线程共享该进程的运行时间片。如果一个线程需要进行i/o读写,该线程调用系统调用进入内核,在启动I/O设备后内核会把该进程值为阻塞态,并把CPU分配给其他进程。即使该进程的其他线程可以运行,内核也不会发现这一情况,在该进程的状态变为就绪之前内核不会调度该进程运行,因而属于该进程的线程都不可能运行,因而用户级线程的并行性会受到一定的限制。用户级线程是一种"多对一"的线程映。

  用户级线程的优点:

  • 线程不需要转换到内核空间。对一个进程而言,其所有线程的管理数据结构均在进程的用户空间中,管理线程切换的线程库也在用户地址空间中运行,节省了切换的开销和内核资源
  • 调度算法可以是进程专用的。在不干扰系统调度的情况下,不同的进程可以根据自身的需要,来选择不同的调度算法对自己的线程进行管理和调度,而与操作系统的低级调度算法无关
  • 用户级线程实现与OS平台无关,其属于用户程序的一部分,可以在不支持线程机制的操作系统平台上实现。

  缺点:

  • 系统调用阻塞问题。当线程因系统调用而被阻塞,进程内的所有线程都会阻塞(以进程为调度单位的原因)。
  • 在单纯的用户级线程实现方式中,多线程不能利用多处理进行多重处理的优点。内核每次分配给一个进程仅有一个CPU,进程中只有一个线程可以执行,在该线程放弃CPU之前,其它线程只能等待。

1.3 组合方式

  即将用户级线程和内核支持线程两种方式进行组合,在Solaris 中,用户创建的多个用户级线程被映射到一些内核线程上(多对多的线程映射),内核线程的数目可能少于用户级线程的数目,内核级线程的数目决定了该进程的并发度。

2. 线程实现方式

  无论是进程还是线程,都必须直接或者间接取得内核的支持。内核支持线程可以利用系统调用为其服务,线程控制简单,用户级线程须借助于某和形式的中间系统来取得内核的服务,做在对线程的控制上稍复杂些。

2.1 内核支持线程的实现

  在仅设置了内核支持线程的OS中,一种可能的线程控制方法是:系统在创建一个新进程时,便为它分配一个任务数据务PTDA(Per Task Data Area),其中包含若干个线程控制块TCB空间。在每一个TCB中可保存线程标识符、优先级、线程运行的CPU状态信息等。虽然这些信息与用户级线程TCB中的信息相同,但现在却是被保存在内核空间中。

2.2 用户线程的实现

  用户级线程是用户空间实现的,它们都运行在一个中间系统上,当前有两种方式实现的中间系统:运行时系统和内核控制线程。

2.2.1 运行时系统(Running System)

  所谓“运行时系统”,实质是用于管理和控制线程的函数集合,包括创建、撤销、线程的同步和通信的函数以及调度的函数。正因为这些函数,才能使用户线程与内核无关,所有函数都驻留在用户空间中,作为用户线程和内核之间的接口。在进行线程切换时,不需要转入核心态,而是由运行时系统中的线程切换来执行切换任务。由于用户线程不能使用系统调用,所以当线程需要系统资源时,将请求传送给运行时系统,由后者通过相应的系统调用来获取系统资源。

2.2.2 内核控制线程

  这种线程又称为轻型进程LWP(Light Weight Process)。每一进程可拥有多个LWP,同用户级线程一样,每个LWP都有自己的数据结构(如TCB),其中包括线程标识符、优先级、状态,另外还有栈和局部存储区等。它们可以共享进程所拥有的资源。LWP可通过系统调用来获得内核提供的服务,这样一个用户级线程运行时,只要将它们连接到一个LWP上,此时它便具有了内核支持线程的所有属性,这种线程实现方式就是组合方式。

  在一个系统中的用户线程数量可能很大,为了节省开销,不可能设置过多的LWP,而把这些LWP做成一个缓冲池,称为“线程池”。用户进程中的任一用户线程都可以连接到LWP池中的任何一个LWP上,为使每一用户级线程都利用LWP与内核通信,可以使多个用户级线程多路复用一个LWP,但只有当前连接到LWP上的线程才能与内核通信,其余进程或者阻塞,或者等待LWP。而每一个LWP都要连接到一个内核级线程上,这样,通过LWP可把用户级线程与内核线程连接起来,用户线程可通过LWP来访问内核,但内核所看到的总是多个LWP而看不到用户级线程,亦即,由LWP实现了内核与用户级线程之间的隔离,从而使用户级线程与内核无关。如下图所示。

  参考:教材《计算机操作系统》第三版 汤子瀛 P77

时间: 2024-10-17 04:41:38

线程的实现方式之内核支持线程和用户级线程的相关文章

线程的3种实现方式--内核级线程, 用户级线程和混合型线程

之前降解过内核线程.轻量级进程.用户线程三种线程概念解惑(线程≠轻量级进程), 但是一直对其中提到的线程的实现模型比较迷惑, 这次就花了点时间怎么学习了一下子 1 线程的3种实现方式 在传统的操作系统中,拥有资源和独立调度的基本单位都是进程.在引入线程的操作系统中,线程是独立调度的基本单位,进程是资源拥有的基本单位.在同一进程中,线程的切换不会引起进程切换.在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换 根据操作系统内核是否对线程可感知,可以把线程分为内

操作系统: 用户级线程和内核级线程

1 .内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态.切换完毕要从内核态返回用户态:可以很好的利用smp,即利用多核cpu.windows线程就是这样的. 2. 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的. 线程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread),后者又称为内核支持的线

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

转载于http://col1.blog.163.com/blog/static/1909775192012719114033352/ 1 .内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态.切换完毕要从内核态返回用户态:可以很好的利用smp,即利用多核cpu.windows线程就是这样的. 2. 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的. 线程的实现可以分

内核级线程(KLT)和用户级线程(ULT)

内核级线程(KLT)和用户级线程(ULT) tags: KLT ULT 内核级线程 用户级线程 引言:本文涉及到操作系统的内核模式和用户模式,如果不太懂的话,可以参看我的这篇文章内核模式和用户模式,其中简单的进行了介绍. 进程和线程 首先说一下线程对于进程的优势,这其实就是线程出现的意义. 进程是资源拥有的基本单位,进程切换需要保存进程状态,会造成资源的消耗.同一进程中的线程,共享进程获取的部分资源.在同一进程中,线程的切换不会引起进程切换,线程的切换需要的资源少于进程切换,可以提高效率. 内核

多线程 用户级线程和内核级线程 from C++多核高级编程

转 http://book.51cto.com/art/201006/206946.htm 6.1.1 用户级线程和内核级线程 2010-06-21 20:37 齐宁/董泽惠 译 清华大学出版社 字号:T | T <C++多核高级编程>第6章多线程,本章将介绍:什么是线程; 用于线程管理的pthread API;线程调度及优先级;线程竞争范围;扩展thread_object以封装线程属性功能.本节为大家介绍用户级线程和内核级线程. AD: 6.1.1  用户级线程和内核级线程 线程有3种实现模

用户级线程

线程的切换 在看进程切换前,我们先来看线程的切换吧. 这一篇主要说的是用户级线程的切换. 因为 进程的切换=资源切换+指令执行序列切换. 将资源和指令序列分开看,如果只是从一个执行指令序列切换到另一个执行指令序列,那么这就是线程的切换. 线程保留了并发(一个cpu上交替的执行多个程序)的优点,避免了进程切换代价,不需要切资源(映射表),只是切执行指令序列.线程切换的实质就是映射表不变而PC指针变. 用户级线程的切换 一个网页浏览器 一个线程用来从服务器接收数据 一个线程用来显示文本 开始实现这个

操作系统--内核支持线程和用户级线程

内核支持线程(Kernel Supported threads)KST OS中的所有进程(用户和内核)都是依靠内核完成的.KST也是如此,它的创建,阻塞,撤销,切换都是在内核空间实现. 优点: 内核可以同时调度同一进程中的多个线程并行执行 一个线程被阻塞了,内核可以调度随便一个进程中的其他线程占用处理器 采用多线程技术,可以提高西永的执行速度 用户级线程ULT 在用户空间实现,它的创建,阻塞,撤销,切换都无需内核的支持-->用户级线程与内核无关.所以内核完全不知道用户级线程的存在,也就不能看到用

操作系统--用户级线程和内核级线程

在多线程操作系统中,各个系统的实现方式并不相同.在有的系统中实现了用户级线程,有的系统中实现了内核级线程 1.内核级线程: (1)线程的创建.撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程. (2)这些线程可以在全系统内进行资源的竞争. (3)内核空间内为每一个内核支持线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在,并进行控制. 在一定程度上类似于进程,只是创建.调度的开销要比进程小.有的统计是1:10 2.用户级线程: (1)用户级线程仅存在于用户

内核级线程与用户级线程

这两天在写这篇blog的时候,顺带复习操作系统的资料,遇到了一个之前没有弄明白的问题,就是关于内核级线程与用户级线程.在查阅了一些资料之后,发表一下我个人简介. 线程已经在许多系统中实现,到那时各个操作系统实现方式不完全相同. 比如在有的系统中,特倍是一些数据库管理系统如IBM的infomix系统,所实现的用户级线程(UserLevel Threads ,ULT):而另一些系统如(Mac os的前身Macintosh和OS/2操作系统)所实现的是内核支持线程 ( Kernel Supported