在连续打了几天的游戏、看了几天的小视频以及聊完了几个交友软件后,我又想开始学习了。这个社会诱惑太多。

概念

在学习线程的实现方式之前需要先了解几个概念

  • 用户线程
  • 内核线程
  • 轻量级进程

    用户线程(UT)

    用户线程是应用程序自己实现的一套线程管理的逻辑。所有的线程管理操作都是用户程序自己控制的。

  • 从操作系统方面看:操作系统只提供了1条线程(内核线程)。这条线程不停的切换用户线程去使用这个操作系统提供的这条线程

image.png

  • 用户空间可以认为是Java中的main()方法在运行,创建了好多Thread
  • 内核空间看到这个运行的main()方法,就是一个进程
  • 当CPU切换到这个进程,此进程就可以执行
  • 进程自己维护着自己的线程,负责它们的切换

    内核线程(KLT)

    内核线程是真正意义上的线程了,由操作系统内核负责管理
    image.png

  • 可以无需看用户空间部分

  • 操作系统管理线程控制块,调度着每个内核线程

    轻量级进程

    轻量级进程是用户线程和内核线程之间的桥梁。是内核线程的高级接口

  • LWP由内核管理

  • 一个应用程序对应一个进程,一个进程对应多个LWP
  • 从操作系统角度:一个进程有多少个LWP就有多少个线程
  • 从应用程序角度:1个LWP可以被多个线程公用

    用户线程和内核线程三种关系

    操作系统只认识内核线程,于是用户线程想要执行需要先转成内核线程,内核线程就给用户线程提供了一个同一的方式,就是让用户线程将自己打扮成LWP,这样就可以了。
    因此,应用程序可能会每一个用户线程都作为LWP,或者所有的用户线程公用1个LWP,或者有一些用户线程用这个LWP,另一些用户线程用那一个LWP

    1:1

    1个用户线程对应1个LWP
  • 优点
    • 真正意义上的并行
  • 缺点

    • 开销大,需要用户态->内核态转变

      N:1

      多个用户线程共用1个LWP,即应用程序自己管理线程调度
  • 优点

    • 切换效率高
  • 缺点

    • 一个进程就一个内核线程在跑,多用户线程公用,一时间只能利用一个CPU
    • 如果某个用户线程发送系统调用时阻塞,内核线程阻塞了,用户线程谁都跑不了

      N:M

      一波用户线程用A号LWP,另一波用B号LWP

    • 没有缺点

image.png