操作系统的重要功能之一是进行进程管理,而进程管理是指在适当的时候选择适当的进程并执行,在单一的cpu执行队列上各进程进行宏并行微观串行执行,多个cpu执行队列上的各进程流程管理是一个复杂的过程,包括流程描述、创建和处置、生命周期管理、流程切换、流程抢占、调度策略和负载平衡。 本文主要关注进程管理的切入点之一,它是进程的上下文切换,了解linux内核如何处理进程的上下文切换,从而揭示上下文切换的奥秘。
(注意:本文在linux-5.0内核源中进行了介绍,并采用了arm64体系结构。)
正文目录:
1 .流程上下文概念
2 .上下文切换详细流程
2.1进程地址空间切换
2.2处理器状态(硬件上下文)切换
3.ASID机制
4 .一般用户进程、一般用户线程、内核线程之间的切换差异
5 .进程切换全景视图
6 .总结
1 .流程上下文概念
进程上下文是进程执行其活动的所有进程的静态说明。 被执行的进程的命令和数据位于相关寄存器和栈中的内容称为进程正文,执行中的命令和数据位于寄存器和栈中的内容称为进程正文,等待执行的命令和数据位于寄存器和栈中的内容称为进程正文。
实际上,在linux内核中,进程上下文包含进程的虚拟地址空间和硬件上下文。
进程硬件上下文包含当前cpu的一组寄存器。 arm64是使用task_struct结构的thread成员的cpu_context成员编写的。 这包括x19-x28、sp和pc等。
2 .上下文切换详细流程
进程上下文切换主要涉及两个主要进程:进程地址空间切换和处理器状态切换。 地址空间的切换主要是针对用户进程进行的,处理器状态的切换对应于所有的调度单位。 让我们看一下以下两个过程。
_ _ schedule//kernel/sched/core.c
-context_switch
-switch_mm_irqs_off//进程地址空间切换
-switch_to//处理器状态切换
2.1进程地址空间切换
进程地址空间是指进程拥有的虚拟地址空间,该地址空间为假,由于linux内核用数据结构描述,各进程会感到自己拥有整个存储器的假象,cpu访问的命令和数据最终会被实际执行因为进程地址空间内有进程执行的命令和数据,所以在调度程序从其他进程再次切换到我之前,为了保证当前进程访问的虚拟地址是自己的,必须切换地址空间。
实际上,过程地址空间使用mm_struct结构来描述,该结构嵌入到过程描述符(一般称为过程控制块PCB ) task_struct中,mm_struct结构组织并管理每个vma
pgd包含进程的页面全局目录的虚拟地址。 (本文讨论了有关页表的一些概念,但在这里并不重要。 如果不清楚,请参考相关资料。 在后期的机会中,我们将介绍进程页面表。 )请记住虚拟地址已保存。 pgd的值什么时候设定? 如果答案为fork,则在创建进程时,必须分配配置mm_struct。 在此处,您将分配包含进程页面全局目录的页面,并将第一个地址分配给pgd。