Skip to content

进程上下文切换

内容纲要

进程

进程是系统进行资源分配和调度的基本单位。每一个进程都有它自己的地址空间,一般包括文本区域、数据区域和堆栈。进程的地址空间分为用户地址空间和内核地址空间,在一个32位机器上,linux操作系统的地址空间大小为4G(虚拟地址为32位),在64位机器上不固定,一般来说为256TB(虚拟地址为48位)。这里的地址空间指虚拟地址空间,实际对应的物理地址空间不一定有这么大。关于进程地址空间的详细介绍可以参看最后参考资料[3]。

进程上下文

一个进程让出CPU,当再次被CPU调度恢复执行时所需的状态信息就叫进程上下文。这个进程状态信息包括地址空间、栈空间、虚拟地址空间以及寄存器集映射(例如,程序计数器,栈指针,指令寄存器,程序状态字以及通用处理器寄存器)。
从另外一个角度看,进程上下文可以分为用户级上下文、寄存器上下文和系统级上下文:

  • 用户级上下文由进程的用户程序段部分编译而成的用户正文段、用户数据和用户栈等组成。
  • 寄存器上下文由程序计数器(PC)、处理机状态字(PSW)、栈指针和通用寄存器组成。 PC给出CPU将要执行的下一条指令的虚地址;PS给出机器与该进程相关联时的硬件状态;栈指针指向下一项的当前地址;通用寄存器则用于不同执行模式之间的参数传递。
  • 系统级上下文系统级上下文又分为静态部分和动态部分。 这里的动态部分是指进入和退出不同的上下文层次时,系统为各层上下文中相关联的寄存器值所保存和恢复的记录。 系统级上下文静态部分包括PCB结构、将进程虚地址空间映射到物理空间的有关表格、核心栈等。 这里,核心栈主要用来装载 进程中所使用的系统调用的调用序列。

进程上下文切换

进程上下文切换是CPU上下文切换的一种形式。CPU上下文切换包括进程上下文切换,线程上下文切换和中断上下文切换,这里只讨论进程上下文切换。进程的上下文切换实质上就是将当前CPU寄存器和程序计数器中的数据保存,然后换入待运行进程的上下文。在进程未占用CPU时,进程的上下文存储在进程的控制块(process control block)中。

进程上下文切换发生的条件

进程上下文切换可以分为主动切换和被动切换。进程上下文主动切换包括:

  • 进程分配的CPU时间片用完了;
  • 请求的资源得不到满足;
  • 通过系统调用函数主动挂起,比如sleep;

进程上下文被动切换包括:

  • 被高优先级进程抢占CPU;
  • 发生硬件中断;

进程上下文切换的步骤

进程上下文切换可以总结为如下步骤:

  1. 保存当前CPU上运行的进程的上下文,将其更新到进程控制块(PCB),以及更新相关重要域;
  2. 将上面进程控制块放入相关队列,比如
  3. 挑选新的进程执行,更新进程控制块信息;
  4. 载入挑选进程控制块的相关信息到CPU寄存器和程序寄存器;

进程上下文切换开销

进程的上下文切换开销分为直接开销和间接开销。直接开销有如下几个方面:保存和恢复CPU寄存器,系统调度器的代码执行,刷新TLB(translation lookaside buffer),CPU pipeline冲洗。发生进程切换,说明处理器有多个任务需要调度,任务之间是共享cache的,那么可能导致cache命中率降低,间接开销大小和工作负载、内存访问行为以及架构有关。

下面结果是我在自己服务器上使用lmbench3做的一个简单进程上下文切换测试。lmbench3的安装和使用可以参考资料[6]。

参考资料

1、https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B/382503
2、https://zhuanlan.zhihu.com/p/52845869
3、https://www.tutorialspoint.com/what-is-context-switching-in-operating-system
4、https://www.usenix.org/legacy/events/expcs07/papers/2-li.pdf
5、http://www.bitmover.com/lmbench/

0
Published in操作系统

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。