现在的位置: 首页 > 综合 > 正文

进程上下文

2018年04月16日 ⁄ 综合 ⁄ 共 1402字 ⁄ 字号 评论关闭


可执行程序代码是进程的重要组成部分。这些代码从可执行文件载入到进程的地址空间执行。一般程序在用户空间执行当一个程序调用了系统调用或者触发了某个异常,它就陷入了内核空间。此时,我们称内核“代表进程执行”并处于进程上下文。在此上下文中current宏是有效的。除非在此间隙有更高优先级的进程需要执行并由调度器做出了相应调整,否则在内核退出的时候,程序恢复在用户空间继续执行。
系统调用和异常处理程序是对内核明确定义的接口。进程只有通过这些接口才能陷入内核执行——对内核的所有访问都必须通过这些接口。 
进程上下文实际上是进程执行活动全过程的静态描述。我们把已执行过的进程指令和数据在相关寄存器堆栈中的内容称为上文,把正在执行的指令和数据在寄存器和堆栈中的内容称为正文,把待执行的指令和数据在寄存器与堆栈中的内容称为下文。具体的说,进程上下文包括计算机系统中与执行该进程有关的各种寄存器(例如通用寄存器程序计数器PC,程序状态字寄存器PS等)的值,程序段在经过编译过后形成的机器指令代码集,数据集及各种堆栈PCB结构。这里,有关寄存器和栈区的内容是重要的,例如没有程序计数器PC和程序 状态寄存器PS,CPU将无法知道下一条待执行指令的地址和控制有关操作。
进程上下文是可以按照层次规则组合起来的。例如在UNIX System V中,进程上下文由用户级上下文,寄存器上下文以及系统级上下文组成。
用户级上下文由进程的用户程序段部分编译而成的用户正文段,用户数据,用户栈组成。
寄存器上下文则有程序寄存器PC,处理机状态寄存器PS,栈指针通用寄存器的值组成,其中PC给出了CPU将要执行的下一条指令的虚地址;PS给出了机器与该进程相关联的硬件状态;栈指针指向下一项的当前地址,而通用寄存器则用于不同执行模式间的参数传递
进程的系统级上下文分为静态和动态部分。这里的动态指进程在进入和退出不同的上下文层次时,系统为各层上下文中相关联的寄存器所保存和恢复的记录。静态部分为PCB结构,将进程虚地址空间映射到物理空间以得到核心栈。这个核心栈主要是用来装载进程中所使用系统调用的调用序列。
系统级上下文的动态部分是与寄存器上下文相关联的。进程上下文的层次概念也主要体现在动态部分,及系统级上下文的动态部分可看成是一些数量变化的层次组成。其变化规则满足先进后出的堆栈方式,每个上下文层次在栈中各占一项。
进程上下文包含:每个进程执行过的、执行时的以及待执行的指令和数据;在指令寄存器、堆栈、状态字寄存器等中的内容。
当发生进程调度时,进行进程切换就是上下文切换(context switch).操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的模式切换(mode
switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。 


在进程上下文中,可以用current宏关联当前进程,也可以睡眠,也可以调用调度程序。
看《LInux内核设计与实现 第二版》时,看到一句 “当执行一个中断处理程序或下半部时,内核处于中断上下文。”

中断上下文和进程上下文是两个没有瓜葛的概念,尽管中断上下文的current宏会被指向被中断的进程。
因为没有进程的背景,所以中断上下文不可以睡眠,也不能调用会引起睡眠的函数,如kmalloc。中断上下文中的代码应该尽可能迅速简洁。

抱歉!评论已关闭.