内核级线程

时间:2024-03-06 07:22:27

没有用户级进程这一说法,因为进程在内核中。实际上切换进程真正的是切换内核级线程。

因为进程要分配资源访问内存,这些都是计算机硬件资源,用户态不行

在这里插入图片描述
用户级线程、核心级线程、进程

多核要想发挥作用,就必须支持核心级线程。

多处理器特点是:每个CPU都有自己的一套缓存和内存映射

只有函数到内核以后,才能分配到CPU(核)上

并发是同时触发,交替执行,用的是同一套资源。
并行是同时触发,多处理器同时执行多个线程

在这里插入图片描述
用户级线程是两个栈,核心级线程是两套栈(用户层、内核层)
在这里插入图片描述
在这里插入图片描述
出现中断,从用户栈进入到内核栈

进入内核态前,把线程的用户栈信息(ss,sp,pc,cs元数据)压入到内核栈,即把同一个线程的用户栈与内核栈关联起来
就是内核栈进入内核执行代码时要保存用户栈用来切换到用户态

在这里插入图片描述
在这里插入图片描述
tcb只是内核中的tcb,只记录内核态切换的栈地址,而内核栈通过自己记录的栈pc地址和用户栈绑定在一起,从而实现了tcb切换,内核栈与用户栈都切换!

真正的代码在用户态,切完后在内核态溜达一下切回用户态程序(进来时候就储存了)

在这里插入图片描述
线程用户栈,中断进入内核栈,内核栈用到tcb。根据这个tcb切换到下一个tcb,这个tcb里有该线程的内核栈,这个内核栈又关联该线程的用户栈
在这里插入图片描述
在这里插入图片描述
五段论:1,由中断将内核栈与用户栈关联起来并进入内核 2,进行中断处理,中断处理过程中产生阻塞或者时钟中断,引发切换 3,找到目标的tcb,然后执行切换 4,根据tcb切换内核栈5,中断返回,弹出内核栈中的内容,切换到用户态,此时就完成了内核线程切换
在这里插入图片描述
用户灵活性, 用户线程大于核心线程;

原因:

  • 用户线程的调度,开发人员可以自己编写调度策略进行控制,如调用 yield让出cpu;
  • 而内核级线程无法修改调度,即内核线程调度策略是操作系统写死的,无法修改;