用户级线程和系统级线程

来源:互联网 发布:老司机开车 知乎 编辑:程序博客网 时间:2024/04/30 09:06

在多线程操作系统中,各个系统的实现方式并不相同。在有的系统中实现了用户级线程,有的系统中实现了内核级线程

1.内核级线程:

(1)线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程。

(2)这些线程可以在全系统内进行资源的竞争。

(3)内核空间内为每一个内核支持线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在,并进行控制。

在一定程度上类似于进程,只是创建、调度的开销要比进程小。有的统计是1:10

2.用户级线程:

(1)用户级线程仅存在于用户空间。——>对比内核(3)

(2)内核并不能看到用户线程。——>重要的区别

(3)内核资源的分配仍然是按照进程进行分配的;各个用户线程只能在进程内进行资源竞争。

用户线程运行在一个中间系统上面。目前中间系统实现的方式有两种,即运行时系统(RuntimeSystem)和内核控制线程。

 “运行时系统”实质上时用于管理和控制线程的函数集合。包括创建、撤销、线程的同步和通信的函数以及调度的函数。这些函数都驻留在用户空间作为用户线程和内核之间的接口。用户线程不能使用系统调用,而是当线程需要系统资源时,将请求传送给运行时,由后者通过相应的系统调用来获取系统资源。

内核控制线程:

系统在分给进程几个轻型进程(LWP),LWP可以通过系统调用来获得内核提供的服务,而进程中的用户线程可通过复用来关联到LWP,从而得到内核的服务。

内核线程的优点:

(1)

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

缺点:

(1)由内核进行调度

用户进程的优点:

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

缺点:

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

===========================================

线程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread).后者又称为内核支持的线程或轻量级进程.

用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

 

内核线程:   由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。Windows   NT和2000/XP支持内核线程  
   
   
  用户线程:由应用进程利用线程库创建和管理,不以来于操作系统核心。不需要用户态/核心态切换,速度快。操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。

Windows NTOS/2支持内核线程。Linux 支持内核级的多线程

=========================================================

了解了一下,用户级线程和内核级线程。

用户级线程:

image

从这张图上面可以看出来,用户级线程的管理是由应用程序的进程来完成的,而不关内核的事。在内核看来还是只有进程的概念,所以线程的调度也就可以通过应用程序自己设定,不用核心态的特权。

但是也就是因为这样,在内核中没有线程的概念,如果一个线程进入内核,然后再系统调用的时候阻塞了,那么,核心只会把它作为整个进程阻塞了,也就是说这个进程中的所有线程都被阻塞了。

线程状态和进程状态是独立的(从何说起?不理解)

优点: 
  线程切换不调用核心 
  调度是应用程序特定的:可以选择最好的算法 
  ULT可运行在任何操作系统上(只需要线程库)

缺点: 
  大多数系统调用是阻塞的,因此核心阻塞进程,故进程中所有线程将被阻塞 
  核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上

内核级线程:

image

所有线程管理由核心完成 
没有线程库,但对核心线程工具提供API 
核心维护进程和线程的上下文 
线程之间的切换需要核心支持 
以线程为基础进行调度 
例子:Windows

优点: 
  对多处理器,核心可以同时调度同一进程的多个线程 
  阻塞是在线程一级完成 
  核心例程是多线程的 
缺点: 
  在同一进程内的线程切换调用内核,导致速度下降