Tag: 上下文切换

上下文切换内部

在这个问题的帮助下,我想学习和填补我的知识空白 因此,用户正在运行一个线程(内核级),现在它调用yield(我认为是一个系统调用)。调度程序现在必须将当前线程的上下文保存在TCB中(存储在内核中的某个地方),然后select另一个线程运行并加载其上下文并跳转到其CS:EIP。 为了缩小范围,我正在研究运行在x86架构之上的Linux。 现在,我想进入细节: 所以,首先我们有一个系统调用: 1)yield的包装函数将系统调用参数推送到堆栈上。 按下返回地址,并将系统调用号码压入某个寄存器(例如EAX),引发中断。 2)中断将CPU模式从用户切换到内核,并跳转到中断向量表,并从那里到内核中的实际系统调用。 3)我想调度器现在被调用,现在它必须保存TCB中的当前状态。 这是我的困境。 因为调度器将使用内核堆栈而不是用户堆栈来执行其操作(这意味着SS和SP必须被改变),它如何在不修改任何寄存器的情况下存储用户的状态。 我已经在论坛上看到有保存状态的特殊硬件指令,但是调度程序如何访问它们以及谁在运行这些指令? 4)调度器现在将状态存储到TCB中并加载另一个TCB 5)当调度程序运行原始线程时,控件返回到清除堆栈和线程继续的包装函数 旁边的问题:调度程序是否作为内核线程运行(即只能运行内核代码的线程)? 每个内核线程或每个进程是否有单独的内核堆栈?

线程上下文切换与进程上下文切换

有谁能告诉我在这两种情况下究竟做了什么? 他们每个人的主要成本是多less?