操作系统内核级线程
操作系统全部笔记目录 见:操作系统笔记整理
为什么没有用户级进程?这是因为进程需要分配资源,资源是统一分配的。
多处理器,多核,如果系统没有核心级线程,多核是没什么用的。多处理器中,每个CPU都有自己的一套映射,而多核是公用同一套映射。核心级线程中,多核可以共用同一套MMU和缓存。
如果是用户级线程,操作系统看不到,就没法分配资源,没法发挥多核的价值。
多核级线程(难度大,可以以后进行学习)
核心级线程就不是两个栈了,而是两套栈。因为用户级线程只会在用户栈里跑,但是使用核心级线程的程序,既需要在用户层跑,也需要在内核里跑。
在用户级线程,先TCB切,然后根据TCB切换用户栈。核心级线程,是TCB切换,然后用户栈和内核栈都得需要切换。
在内核中运行的时候要调用C函数等,使用内核栈。只有通过中断才能进入内核。Intel硬件会启动对应的内核栈,把SS和SP(在用户态执行的栈)压栈,以及PC指针压栈。如上图,就像拉了一条线,一套栈(用户栈+内核栈)。
read是库,里面执行内核程序,然后执行中断。read上面的东西都是在用户栈里执行的,所以104和204压栈,然后执行read。int工作以后就把这一套栈设置好,CS在这里指向段基址,然后执行sys_read内核程序。
返回的时候则是根据SS和SP返回用户栈。
阻塞以后就会引起调度,然后引发下一个线程。
switch_to函数中,cur是当前线程的TCB,next是下一个线程的TCB。但是这个时候是找内核栈的指针,esp指向线程T的最下面,然后ret弹栈,从esp最下面指向的东西继续执行。
????里面的代码应该是一段包含iret中断返回的代码,
PC和CS就是线程T用户态的代码。
画个图好好解释一下:
首先我们创建线程的时候,每当一个线程打算切换到另外一个线程,它都会做出如下创建:
假设现在线程S要入栈,通过中断进入到内核,然后通过TCB建立这套栈的绑定。
切换时,从当前的TCB切换到另一个TCB:
切换到的TCB里面有线程T的内核栈,线程T的内核栈又关联了线程T的用户栈。通过中断返回机制返回到用户态的线程里去执行线程T的代码。
首先申请一段内存作为TCB,然后申请一段内存作为内核栈。