进程上下文、中断上下文、内核代表…

来源:互联网 发布:深圳阿里云大厦邮编 编辑:程序博客网 时间:2024/06/05 11:41

《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/