杭州网站外包公司,扫描二维码进入公司网站怎样做,长沙 网站运营,苏州网站推广工具计算机主要处理计算、网络、存储三个方面。计算主要是 CPU 和内存的合作#xff1b;网络和存储则多是和外部设备的合作#xff1b;在操作外部设备的时候#xff0c;往往需要让出 CPU#xff0c;就像上面两段代码一样#xff0c;选择调用 schedule() 函数。
上下文切换主要…计算机主要处理计算、网络、存储三个方面。计算主要是 CPU 和内存的合作网络和存储则多是和外部设备的合作在操作外部设备的时候往往需要让出 CPU就像上面两段代码一样选择调用 schedule() 函数。
上下文切换主要干两件事情一是切换进程空间也即虚拟内存二是切换寄存器和 CPU 上下文。
在 x86 体系结构中提供了一种以硬件的方式进行进程切换的模式对于每个进程x86 希望在内存里面维护一个 TSSTask State Segment任务状态段结构。这里面有所有的寄存器。
还有一个特殊的寄存器 TRTask Register任务寄存器指向某个进程的 TSS。更改 TR 的值将会触发硬件保存 CPU 所有寄存器的值到当前进程的 TSS 中然后从新进程的 TSS 中读出所有寄存器值加载到 CPU 对应的寄存器中。
下图就是 32 位的 TSS 结构。 但是这样有个缺点。我们做进程切换的时候没必要每个寄存器都切换这样每个进程一个 TSS就需要全量保存全量切换动作太大了。
这里面会给每一个 CPU 关联一个 TSS然后将 TR 指向这个 TSS然后在操作系统的运行过程中TR 就不切换了永远指向这个 TSS。TSS 用数据结构 tss_struct 表示在 x86_hw_tss 中可以看到和上图相应的结构。
在 Linux 中真的参与进程切换的寄存器很少主要的就是栈顶寄存器。
从进程 A 切换到进程 B用户栈要不要切换呢当然要其实早就已经切换了就在切换内存空间的时候。每个进程的用户栈都是独立的都在内存空间里面。
那内核栈呢已经在 __switch_to 里面切换了也就是将 current_task 指向当前的 task_struct。里面的 void *stack 指针指向的就是当前的内核栈。
内核栈的栈顶指针呢在 __switch_to_asm 里面已经切换了栈顶指针并且将栈顶指针在 __switch_to 加载到了 TSS 里面。 此文章为10月Day27学习笔记内容来源于极客时间《趣谈Linux操作系统》推荐该课程。