一本书讲透Java线程:原理与实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.4 上下文切换

进程创建好之后,内核必须有能力挂起正在CPU运行的进程,并切换其他进程到CPU上执行,这个过程被称为上下文切换。上下文切换的过程包含硬件上下文切换和软件上下文切换。

虽然每个进程都可以有自己的物理内存地址空间,但所有进程共用CPU寄存器,因此上下文切换的时候需要首先保证能进行硬件上下文切换。硬件上下文切换主要是通过汇编指令,保存当前进程的CPU的一些寄存器数据,然后恢复下一个进程的CPU的一些寄存器数据。当进程被切换出去时,Linux进程描述符中的thread字段就会保存该进程的硬件上下文。thread数据结构包含了大部分CPU寄存器数据。

进程地址空间指的是进程所拥有的虚拟地址空间,是Linux内核通过数据结构描述出来的,是虚拟的内存地址空间。而CPU访问的指令和数据需要落实到实际的物理地址。软件上下文切换主要完成从进程的虚拟地址空间切换到物理空间。如果即将执行的进程是内核进程,则不需要进行内存空间切换,因为所有的内核进程共用相同的物理空间。