zoukankan      html  css  js  c++  java
  • 操作系统--用户级线程和内核级线程

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

    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 NT和OS/2支持内核线程。Linux 支持内核级的多线程

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

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

    用户级线程:

    image

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

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

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

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

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

    内核级线程:

    image

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

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

  • 相关阅读:
    【DDD】领域驱动设计实践 —— 架构风格及架构实例
    【DDD】领域驱动设计精要
    Zynq UltraScale+ cross compiler
    Platform device/driver注册过程 (转)
    static inline extern等概念
    (int argc, char *argv[]) 指针数组
    linux man 1,2,3 命令
    指针左值错误
    arm ds5 编译选项
    在JTAG菊花链拓扑对设备编程
  • 原文地址:https://www.cnblogs.com/cane/p/3965482.html
Copyright © 2011-2022 走看看