进程与线程-3、内核级线程切换过程

来源:互联网 发布:小米电视怎么样 知乎 编辑:程序博客网 时间:2024/06/05 04:51
参考哈工大李治军老师公开课。


内核级线程的TCB结构

用户级线程是使用对于每个线程设置一个TCB栈来存储程序执行过程中的地址的跳转,通过切换TCB栈来实现线程的切换。

而内核级线程是用户程序执行中断INT进入内核,进行内核执行线程。而内核线程执行时可能会申请I/O操作等待I/O响应,这时该线程就需要等待,这时内核会自动切换到其他线程执行,以免CPU资源的浪费。那么这种切换的基础就是把TCB进行扩展,不但要记录用户级线程的调用情况,而且要记录内核中线程的相关情况。通过中断(INT)进入切换到该线程的内核栈;通过IRET进行中断返回,切换到用户栈。

图一:TCB的扩展

下面是一个实际的例子,线程基址是100,然后执行A()函数,调用了B(),在B()中调用了read()开启中断,进入内核,TCB也由用户栈切换到内核栈,内核栈用ss:sp记录下该线程用户栈的相关地址信息便于后期的中断返回

 

图二:用户栈-内核栈切换示例

 


当进行核心级线程程序时,可能需要等待IO相应,这时操作系统会通过switch_to(cur,next)切换到其他线程,进行其他认任务。在switch_to(cur, next)中核心的操作是esp指针(指向当前执行线程的TCB栈)的切换,从而完成一个线程到另一个线程的切换。

图三:内核线程之间的切换

下面用另一幅图来更好的展示内核级线程切换的过程:

图四:内核级线程切换的过程

 

最后,用图表的形式将用户级线程和核心级线程做个比较:

图五:用户VS内核

阅读全文
0 0
原创粉丝点击