进程切换需要保存上下文,其实就是保存所有用到的寄存器。

开销

  1. 虚拟地址空间的切换:修改CR3寄存器来切换页表全局目录

  2. 寄存器组切换(上下文) 3 切换内核态堆栈

  3. TLB刷新

  4. cache 失效

  5. 执行一段调度器的代码

跨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