进程上下文、中断上下文、内核代表进程执行、内核空间、用户空间释疑

 

《LKD2》P21对于进程上下文的解释是:当程序执行系统调用或触发了某个异常,陷入内核空间。此时我们称“内核代表进程执行”并处于进程上下文。

       对于此段我的理解是进程的程序代码只能运行于用户空间,只有当执行了系统调用时才会在内核空间执行。程序执行到一半的时候由于并没有结束,会产生一些资源使用情况,中间数据等,这些需要一并传递到内核空间。所以要暂存为一个进程上下文到某个地方,程序代码在内核空间执行的时候把这些数据和状态读出来,接着执行。此时是由内核执行而不是由进程执行。当系统调用执行完毕时又要暂存一个进程上下文,然后程序代码进入用户空间由进程的形式执行。

问题出现了:1.只有当程序代码陷入内核的时候才有进程上下文么?进程间相互切换或进程同步的过程中是否会有进程上下文?2.进程上下文是谁保存的,存在哪里,是存在寄存器里还是内存里,以什么形式保存的,是直接把任务控制块PCB保存了还是怎样。3.内核代表进程执行什么意思,我一直以为进程可以在用户空间也可以在内核空间存在,因为进程就是可执行程序的代码的运行过程,为什么这里说内核代表进程执行。4.想到这里又把我搞晕了,内核到底是什么玩意,不应该是一个不会被改变的已经提前写好的大C程序么,那么内核是不是就是一个一开机就运行的大进程呢?他到底是指进程还是指程序代码呢?内核态和用户态到底是进程的状态还是处理器的状态?

在随后对《LKD2》第四页参考之后得到了解释:先解释问题4的答案。可以说系统内核就是一个大C程序,硬件资源是绝对的只能由内核这个程序才能直接访问的,用户对于硬件资源的使用要通过系统调用(内核和应用程序间的接口)借助内核间接使用,这样做是为了内核对于系统正常运转的一种保护。

接下来问题3,明白了内核是什么那么进程的问题就不难明白了,内核和应用程序是对立统一的,对立是说他俩干的活自己干自己的,互不影响,统一是说内核的存在是为了无差错的有效运行应用程序,应用程序的执行离不开内核的工作。对于Linux系统来说,只能由内核直接使用的硬件设备、器件(特定的寄存器啊什么的)和内存空间统称为内核空间,只能由应用程序使用的有限系统资源和内存空间称为用户空间。如果应用程序想要使用硬件,那就要跟内核打招呼,内核访问硬件之后把应用程序需要的地址啊,变量啊,参数啊什么的通过系统调用函数传递给应用程序。内核态和用户态可以通过CPU的运行状态来区分(有一个东西叫做程序状态字,里面有个字段就是记录当前CPU处于内核态还是用户态)。抽象地说处理器只有一个,它在执行内核代码提供的功能的时候(响应硬件中断,执行进程的请求)就处于内核态,否则就是用户态。进程也是,应用程序代码在被跑起来的时候,或者说执行的时候使用用户空间的资源(如用户空间内存)就处于用户态,而在通过内核间接访问内核空间的时候就处于内核态。使用硬件设备这一部分的工作其实是内核这个大程序在做的,而不是应用程序,所以是“内核代表进程执行”,更确切地说译者应该说是内核代替进程执行。这种状态也就是所谓的进程陷入内核。由此可见,可以就认为说进程就是应用程序代码被执行的时候才叫进程,这种抽象活动只存在于用户空间(传统的Unix有#0,#1,#2这三种内核进程可以单拿出来另算)。当处理器一上电工作开始,内核也开始运转,当处理器掉电停止工作,内核也就停止工作,虽然这么说可能不起恰当,毕竟有特殊情况处理器工作内核不转,但是可以这样划分,内核占用处理器处理进程请求就是出于进程上下文,内核占用处理器处理与进程无关的硬件中断就处于中断上下文,内核不占用处理器而应用程序占用处理器就处于用户态。这是从内核空间与用户控件的角度来解释的。

      解释完这个大问题问题2就无从谈起了,一切都是处理器干的,进程上下文具体怎么干,存到哪是内核说了算,看具体的调用了。问题1,只有应用程序陷入内核的时候才涉及到进程上下文,如果只是单纯的用户空间就能解决的事,与内核无关,就无所谓进程上下文。

      暂时理解到这种程度,以后再有更深的理解再作出修正。

转自:

http://yzytr.blog.163.com/blog/static/9025414201062371544674/

你可能感兴趣的:(linux程序设计)