进程的创建和可执行程序的加载,这个有点难度啊,分开来阐述吧,只能讲个大概了。 进程的创建:这个必须先从进程在Linux内存中的存在形式来说起,PCB(这可不是PrintedCircuitBoard,而是ProcessControlBlock)进程控制块是一个数据结构,在内核源码中叫做task_struct,这个数据结构里面描述了很多东西,最主要的几个有进程状态,用户标识信息,标识号,调度信息,信号处理信息,内部状态标志,进程链信息,等待队列,时间与定时器,打开的文件与文件系统信息,内存管理信息,进程间的通信,上下文信息。这么多,你以为没了吗?多了去了,我是不好意思写了,我看的源码是3.9.2版本的,光一个数据结构就一大串,除了上面几个主要的我看了看其他的我都看不下去了,太多了,然后进程调度就是调度这个数据结构的指针,其实对于计算机来说只要复制好指针处的东西就没有问题了。反正关于进程的一些信息都在数据结构中,要如何处理只要根据结构内部的信息来判断就可以了。好吧,现在开始说进程是怎么创建的,首先进程是运行在内存中的,之前我有一个问题一直想不明白,就是为什么切换进程那么多的资源要从运行的内存切出去,然后还要切进来新的东西,这不是很耗时间么,而且理论上来说越大的程序切起来应该越耗时间啊。这个问题一直困扰了我好久,原来切换进程只不过是换了几个CPU内部的关键值,所以才会这么快。新创建的进程是在父进程的基础上的,很多东西都是共用父进程的资源,是一个叫Copy-on-Write的技术,就是说父进程产生一个子进程很多东西都是父子进程共用的,然后只有新进程中要改变才会从原来共享的部分复制出来重新存放。这样创建新的进程和进程之间的切换就会显得很快了。 可执行程 序的加载:我是这样理解的,在一个操作系统里面跟普通的单片机不一样,操作系统是要管理系统内部的程序的,所以会有一部分信息来分清楚哪个程序是对应于哪个存储代码,所以必须有一个头(相当于一个名字吧)在Linux系统内部为了规范,将文件头定义成规范的数据结构格式。在源代码中这个数据结构对我来说是相当庞大的,所以我指是了解了个大概,知道是一个怎么回事,具体没有深刻探讨。
阅读(2244) | 评论(0) | 转发(0) |