操作系统内核级线程

操作系统全部笔记目录 见:操作系统笔记整理

为什么没有用户级进程?这是因为进程需要分配资源,资源是统一分配的。

多处理器,多核,如果系统没有核心级线程,多核是没什么用的。多处理器中,每个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,然后申请一段内存作为内核栈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章