switch_to 把寄存器中的值比如esp等存放到进程thread结构中,保存现场一边后续恢复,同时调用 __switch_to 完成了堆栈的切换 。
在进程的 task_struct 结构中有个重要的成分 thread , 它本身是一个数据结构 thread_struct, 里面记录着进程在切换时的(系统空间)堆栈指针,取指令地址(也就是“返回地址”)等关键性的信息 。
关于__switch_to 的工作就是处理 TSS (任务状态段) 。
TSS 全称task state segment,是指在操作系统进程管理的过程中,任务(进程)切换时的任务现场信息 。
linux 为每一个 CPU 提供一个 TSS 段,并且在 TR 寄存器中保存该段 。
linux 中之所以为每一个 CPU 提供一个 TSS 段,而不是为每个进程提供一个TSS 段,主要原因是 TR 寄存器永远指向它,在任务切换的适合不必切换 TR 寄存器,从而减小开销 。
在从用户态切换到内核态时,可以通过获取 TSS 段中的 esp0 来获取当前进程的内核栈 栈顶指针,从而可以保存用户态的 cs,esp,eip 等上下文 。
TSS 在任务切换过程中起着重要作用,通过它实现任务的挂起和恢复 。所谓任务切换是指,挂起当前正在执行的任务,恢复或启动另一任务的执行 。
在任务切换过程中,首先,处理器中各寄存器的当前值被自动保存到 TR(任务寄存器)所指定的任务的 TSS 中linux切换进程命令;然后,下一任务的 TSS 被装入 TR;最后,从 TR 所指定的 TSS 中取出各寄存器的值送到处理器的各寄存器中 。由此可见,通过在 TSS 中保存任务现场各寄存器状态的完整映象,实现任务的切换 。
因此,__switch_to 核心内容就是将 TSS 中的内核空间(0级)堆栈指针换成 next-esp0 。这是因为 CPU 在穿越中断门或者陷阱门时要根据新的运行级别从TSS中取得进程在系统空间的堆栈指针 。
thread_struct.esp0 指向进程的系统空间堆栈的顶端 。当一个进程被调度运行时 , 内核会将这个变量写入 TSS 的 esp0 字段,表示这个进程进入0级运行时其堆栈的位置 。换句话说,进程的 thread_struct 结构中的 esp0 保存着其系统空间堆栈指针 。当进程穿过中断门、陷阱门或者调用门进入系统空间时,处理器会从这里恢复期系统空间栈 。
由于栈中变量的访问依赖的是段、页、和 esp、ebp 等这些寄存器,所以当段、页、寄存器切换完以后,栈中的变量就可以被访问了 。
因此 switch_to 完成了进程堆栈的切换 , 由于被切进的进程各个寄存器的信息已完成切换 , 因此 next 进程得以执行指令运行 。
由于 A 进程在调用 switch_to 完成了与 B 进程堆栈的切换 , 也即是寄存器中的值都是 B 的,所以 A 进程在switch_to 执行完后,A停止运行 , B开始运行,当过一段时间又把 A 进程切进去后,A 开始从switch_to 后面的代码开始执行 。
schedule 的调用流程如下:
linux中查看系统当前所有进程的命令是psaux为查看系统当前所有进程命令 。
工具/原料
VMwareLinux电脑
方法/步骤
1、打开VMware虚拟机linux切换进程命令,打开终端命令行linux切换进程命令,通过”su“命令切换到root用户下 。
2、输入“psaux“按下回车键linux切换进程命令,即可显示linux下所有linux切换进程命令的进程 。
3、输入ps-le也可以显示所有的进程,这个是按照优先级来显示 。
Linux系统的进程调度Linux进程调度
1.调度方式
Linux系统的调度方式基本上采用“抢占式优先级”方式,当进程在用户模式下运行时,不管它是否自愿,核心在一定条件下(如该进程的时间片用完或等待I/O)可以暂时中止其运行,而调度其他进程运行 。一旦进程切换到内核模式下运行时,就不受以上限制,而一直运行下去,仅在重新回到用户模式之前才会发生进程调度 。
推荐阅读
- 男款羊羔绒裤直播间卖货,男款羊羔绒裤直播间卖货是真的吗
- 电脑镜像系统怎么下到u盘,电脑系统镜像怎么用
- ios13.1开发版,ios13开发者选项在哪里
- 计算机毕业设计会影响工作吗,计算机专业毕设可以做什么
- php删除数据表的记录 php删除数据库表单中一行内容
- 荣耀升级鸿蒙怎么申请,荣耀手机怎么申请升级鸿蒙
- mysql修改表utf8,mysql修改表名
- excel折线颜色怎么选,excel怎么设置折线图颜色
- python函数求累加和 python中累加求和