Linux内核:进程管理——进程的上下文切换

1、概念

  • 上下文切换 :操作系统通过处理器调度让处理器轮流执行多个进程。实现不同进程中指令交替执行的机制称为进程的上下文切换。
  • 进程的上下文 :进程的物理实体(代码和数据等)和支持运行的环境合称为进程的上下文。进程的上下文包括用户级上下文和系统级上下文。

1.用户级上下文 :由用户的程序块、数据块、运行时的堆和用户栈(统称为用户堆栈)等组成的用户空间信息被称为用户级上下文。

2.系统级上下文 :由进程标识信息、进程现场信息、进程控制信息(包含进程表、页表、打开文件表等)和系统内核栈等组成的内核空间信息被称为系统级上下文。

  • 寄存器上下文 :处理器中各个寄存器的内容被称为寄存器上下文(或硬件上下文)。

用户级上下文地址空间和系统级上下文地址空间一起构成了一个进程的整个存储器映像 ,如下表所示:

Linux内核:进程管理——进程的上下文切换_第1张图片

实际上它就是进程的虚拟地址空间。

  • 进程控制信息 :包含各种内核数据结构,如记录有关进程信息的进程表、页表、打开文件表等。

2、上下文切换

上下文切换发生在操作系统调度一个新进程到处理器时,它需要完成以下三件事:

  1. 将当前处理器的寄存器上下文保存到当前进程的系统级上下文的现场信息中;
  2. 将新进程系统级上下文中的现场信息作为新的寄存器上下文恢复到处理器的各个寄存器中;
  3. 将控制转移到新进程执行。

这里,一个重要的上下文信息是PC的值,当前进程被打断的断点处的PC作为寄存器上下文的一部分被保存在进程现场信息中,这样,下次改进程再被调度到处理器上执行时,就可以从其现场信息中获得断点处的PC,从而能从断点处开始执行。

下面给出的例子是一种典型的进程上下文切换场景。以下是经典的hello.c程序。

# include

int main () 
{
    printf ( "hello, world\n") ;
}

对于上述高级语言源程序,首先需先对其进行预处理、编译成汇编语言表示,然后再用汇编程序将其转换为可重定位的二进制目标程序,再和库函数目标文件printf.o进行链接,生成最终的可执行目标文件hello。

假定在UNIX系统上启动hello程序,其 shell命令行和 hello程序运行的结果如下。

unix> ./hello [Enter]
hello, world
unix>

上下文切换指把正在运行的进程换下,换一个新进程到处理器执行 。图4.38给出了上述 shell 命令行执行过程中 shell 进程和 hello 进程的上下文切换过程:

  1. 首先运行 shell 进程,从 shell 命令行中读入字符串“./ hello”到主存;
  2. 当 shell 进程读到字符“[Enter]”后,转到操作系统执行,由操作系统 进行上下文切换,以保存 shell
    进程的上下文并创建 hello 进程的上下文;
  3. hello 进程执行结束后,再转到操作系统完成将控制权从 hello 进程交回给 shell 进程。

Linux内核:进程管理——进程的上下文切换_第2张图片

从上述过程可以看出,在一个进程的整个生命周期中,可能会有其他不同的进程在处理器中交替运行,例如,对于图4.38中的 hello 进程用户感觉到的时间除 hello 本身的执行时间外,还包括了操作系统执行上下文切换的时间。因此,对于每个进程的运行很难凭感觉给出准确时间。

3、作用

显然,处理器调度等事件会引起用户进程的正常执行被打断,因而形成了突变的异常控制流,而进程的上下文切换机制很好地解决了这类异常控制流,实现了从一个进程安全切换到另一个进程执行的过程。

内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料

学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

原文作者:精通Linux内核

原文地址:Linux内核:进程管理——进程的上下文切换 - 知乎(版权归原文作者所有,侵权留言联系删除)

你可能感兴趣的:(linux,Linux内核,进程管理)