用户线程和内核线程(粗浅理解)

781 阅读4分钟

线程分类

  • 用户级线程(ULT):用户空间创建的线程,比如播放器进程在用户空间会创建多个用户线程,这些线程的创建,销毁,通讯都无需利用系统调度实现。(自己理解:我们可以把它理解为伪线程,这些线程无法直接调用操作系统,需要调度器进行调度分配一个内核线程,使用户线程和内核线程有一个映射关系,然后在通过这个内核线程进行调用系统。
  • 内核级线程(KLT):Ring0级别 为什么分为两类,因为线程安全问题,只有内核空间的线程才能调用操作系统。

内核对于用户的线程包一无所知,所以内核角度就是按正常管理方法管理,即单线程进程(存在运行时系统)

image.png

java 在1.2之前用的ULT,在1.2之后用的就是KLT

  • java 线程中用户线程和内核线程是1:1的映射关系

image.png

用户线程优缺点

与内核线程 是多对1的情况, n->1 image.png

优点:

  • 可以在不支持线程的操作系统中实现
  • 创建和销毁,切换等线程管理的代价比内核线程少的多, 因为线程状态的过程和调用程序都只是本地的过程
  • 允许每个进程制定自己的调度算法,线程管理比较灵活。必须写自己的管理程序,与内核区别
  • 线程能利用的表空间和堆栈空间比内核级线程多
  • 不需要陷阱,不需要上下文切换,也不需要怼内存高速缓存的刷新,使线程调用非常快捷
  • 线程调度不需要内核直接参与,控制简单

缺点

  • 当线程发生IO阻塞时,如果调用阻塞的系统,因为内核不知道有多线程的存在(上面说过,内核对用户线程是无感知的,是以单线程的方式进行的),从而阻塞了整个进程(比如 一个程序进程 里有t1,t2,t3...多个线程,当t1被调度并被内核线程执行时阻塞了,那么他会一直阻塞在哪里,从而导致整个进程阻塞,用户进程内的其他线程不会切换,从而阻塞所有线程),因此同一个进程中只能同时有一个线程在运行
  • 页面失效也会产生类似问题

在用户级线程中,每个进程里的线程表由运行时系统管理。当一个线程转换到就绪状态或阻塞状态时,在该线程表中存放重新启动该线程所需的信息,与内核在进程表中存放的进程的信息完全一样

内核线程

内核级线程的实现方式, 每个用户线程都直接与一个内核线程相关联. 1-》1 image.png

  • 内核线程建立和销毁都是由操作系统负责,通过系统调度完成
  • 线程管理的所有工作都是由内核完成

内核线程驻留在内核空间,它们是内核对象。有了内核线程,每个用户线程被映射或绑定到一个内核线程。用户线程在其生命期内都会绑定到该内核线程。一旦用户线程终止,两个线程都将离开系统。这被称作”一对一”线程映射

  • 线程可以在全系统内进行资源的竞争

内核线程的特点

当某个线程希望创建一个新线程或撤销一个已有线程时,它进行一个系统调用

优点

- 多处理器系统中,内核能够并行执行同一进程内的多个线程
- 如果进程中的一个线程被阻塞,能够切换同一进程内的其他线程继续执行(用户线程的缺点)
- 所有能阻塞线程的调用都以系统调用的形式实现
- 当一个线程阻塞时,内核根据选择可以运行另一个进程的线程,而用户空间实现的线程中,运行时系统始终运行自己进程中的线程
- 信号是发给进程,而不是线程,当一个信号到达时,应该有那个县城处理它?线程可以“注册”他们感兴趣的信号

本人对很多知识都是在学习当中,文章中也是学习过程当中的粗浅理解,如果有认知错误的地方,或者大家有更多的补充,希望能在评论区评论,我也会及时改正,也可以避免产生误导行为。。如果大家有什么学习资料或者沟通群,也希望能私聊我一下,渴望同大家一起交流,一起学习,一起进步