进程上下文
进程上下文与中断上下文的理解(感觉加个“进程由用户态切换到内核态时”反而不对,比较了下,感觉着讲的是错的)
又看了一些文章,首先CS(context switch)只会在内核态进行。而发生系统调用是会进入内核态,上下文已经发生变化了,即使回到用户态,未发生进程切换,也算是上下文切换。所以进程的上下文切换不一定有进程切换。
????但是如果当前进程一直没有系统调用,而且未有其他进程抢占,难道一直不发生上下文切换吗?
进程上下文切换 – 残酷的性能杀手(上)(转载cppthinker.com)
什么情况下进行用户态到内核态的切换
1.进程上下文主要是异常处理程序和内核线程。内核之所以进入进程上下文是因为进程自身的一些工作需要在内核中做。例如,系统调用是为当前进程服务的,异常通常是处理进程导致的错误状态等。
2.中断上下文是由于硬件发生中断时会触发中断信号请求,请求系统处理中断,执行中断服务子程序。
现有以下疑问:
如果上下文切换是在内核态,那么系统的调度机制是怎么样对一个从不进入内核态的程序进行调度的?比如一个简单的死循环
中断到底是什么东西?说是硬件的信号,那么如果我软件想触发中断可以吗??还是说软件通过信号触发硬件的中断?
一个进程抢占计算资源是通过中断进行的吗?好像又涉及调度了。
还有中断发生时是所有进程都被中断吗?
摘自上文
(1)进程上文:其是指进程由用户态切换到内核态时需要保存用户态时cpu寄存器中的值,进程状态以及堆栈上的内容,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
(2)进程下文:其是指切换到内核态后执行的程序,即进程运行在内核空间的部分。
看百科的解释“进程上下文由用户级上下文,寄存器上下文以及系统级上下文组成”所以即使切换到内核依旧处于当前进程上下文中。真正的上下文切换应该是不同进程之间的切换才对
百度百科
进程上下文实际上是进程执行活动全过程的静态描述。我们把已执行过的进程指令和数据在相关寄存器与堆栈中的内容称为上文,把正在执行的指令和数据在寄存器和堆栈中的内容称为正文,把待执行的指令和数据在寄存器与堆栈中的内容称为下文。具体的说,进程上下文包括计算机系统中与执行该进程有关的各种寄存器(例如通用寄存器,程序计数器PC,程序状态字寄存器PS等)的值,程序段在经过编译过后形成的机器指令代码集,数据集及各种堆栈值PCB结构。这里,有关寄存器和栈区的内容是重要的,例如没有程序计数器PC和程序 状态寄存器PS,CPU将无法知道下一条待执行指令的地址和控制有关操作。
Linux下的进程1——进程概念,进程切换,上下文切换,虚拟地址空间
摘自上文
-
当内核选择一个新的进程运行时,我们就说内核调度了这个进程。在内核调度了一个新的进程运行后,他就抢占当前进程,并使用一种称为上下文切换的机制来将控制转移到新的进程。
上下文切换 - 保存当前进程的上下文
- 恢复某个先前被抢占的进程被保存的上下文
-
将控制传递给这个新恢复的进程
上下文简单说来就是一个环境,相对于进程而言,就是进程执行时的环境。
具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。
一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。