[计算机操作系统] —— 内核级线程

288 阅读2分钟

多处理器架构每个处理器都有自己的Cache和MMU(逻辑地址到物理地址的映射),多核心架构多个核心共享同一个Cache和MMU,系统只有支持核心级线程,才能发挥多核心的作用。

创建内核级线程的create是系统调用,内核管理TCB,内核负责线程切换。

每个内核级线程都有两个栈,一个用户栈,一个内核栈。TCB关联内核栈,内核栈关联用户栈,因此内核级线程的切换是内核栈与用户栈的切换。

用户程序通过中断进入内核,硬件会在内核栈中记录用户栈的sp和pc,这样就将内核栈和用户栈关联到一起了。中断返回(iret)将相应寄存器从内核栈弹出就退回到用户态了。

system call进入中断处理,假设此处是sys_read(),开始读磁盘,内核线程阻塞,系统进行线程调度,找到next_tcb,switch_to另一个内核线程。

switch_to和用户线程类似,切换tcb,从而切换内核栈指针,然后ret到另一个内核程序。

总结一下就是内核级的线程也需要在用户态执行,需要内核操作时就中断,将控制权交给内核,内核在多个从用户态发起的中断任务中切换,如果某个中断完成了,就返回用户态继续执行。

内核栈底是sp和pc等用户栈信息,接着是iret的指令,每一次switch_to的ret会弹出要切换的栈的栈顶,从那里继续执行切换到的内核程序,如果弹出的是iret的指令地址,那么切过去就中断返回。

内核线程的create就是准备好用户栈和内核栈的内容,再准备好tcb,接着将tcb加入就绪队列。