进程切换需要保存上下文,其实就是保存所有用到的寄存器。
开销
-
虚拟地址空间的切换:修改CR3寄存器来切换页表全局目录
-
寄存器组切换(上下文) 3 切换内核态堆栈
-
TLB刷新
-
cache 失效
-
执行一段调度器的代码
跨CPU的话,之前热起来的TLB、L1、L2、L3因为运行的进程已经变了,
以局部性原理cache起来的代码、数据也都没有用了,导致新进程穿透到内存的IO会变多
源码-riscv上下文切换
# Context switch
#
# void swtch(struct context *old, struct context *new);
#
# Save current registers in old. Load from new.
.globl swtch
swtch:
sd ra, 0(a0)
sd sp, 8(a0)
sd s0, 16(a0)
sd s1, 24(a0)
sd s2, 32(a0)
sd s3, 40(a0)
sd s4, 48(a0)
sd s5, 56(a0)
sd s6, 64(a0)
sd s7, 72(a0)
sd s8, 80(a0)
sd s9, 88(a0)
sd s10, 96(a0)
sd s11, 104(a0)
ld ra, 0(a1)
ld sp, 8(a1)
ld s0, 16(a1)
ld s1, 24(a1)
ld s2, 32(a1)
ld s3, 40(a1)
ld s4, 48(a1)
ld s5, 56(a1)
ld s6, 64(a1)
ld s7, 72(a1)
ld s8, 80(a1)
ld s9, 88(a1)
ld s10, 96(a1)
ld s11, 104(a1)
ret