当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 进程的产生

进程的产生 时间:2018-09-26      来源:未知

我们都知道,进程是一个程序的一次执行过程,但是程序是静态的,进程是动态的,程序到进程的是怎样的一个过程呢?这是计算机运行的核心问题,今天我们从硬件和软件两个角度来了解UNIX下这一过程。

首先,从硬件角度,UNIX环境下,程序是指我们编译好的、存放在硬盘上的二进制文件(具体来说是ELF文件)。程序要被运行,第一步,需要将其从硬盘载入内存;第二步,CPU一条一条取出内存中的程序指令并执行。这里的一些细节问题,下面逐一进行解析。

以上为简单从硬件角度介绍进程产生,下面从内核角度来解释进程的产生。

在UNIX下,每个进程产生时,内核都会为其开辟一段虚拟内存,每一个进程的这段空间都是独立的,在32位系统中,这段空间有4G大小,0-3G为进程所用。内核将这段空间与ELF文件建立映射关系,并在程序运行时将其载入。借用一个图来说明进程在内存中的空间分布。

stack:栈,以帧为单位,存放函数的参数和局部变量,以及返回地址。

heap:堆,程序员使用malloc等函数开辟的空间。

bss:静态区,存放未初始化的全局变量。

data:数据段,存放已初始化段全局变量。

text:代码段,存放程序执行代码。

除了上述结构,内核还维护一个关于进程的tast_struct结构体,保存进程的标识符PID、父进程的标识符PPID、进程组编号PGID、以及进程的状态、CPU的使用等信息。内核可以通过查看自己空间中的各个进程的附加信息就能知道进程的概况,而不用进入到进程自身的空间 (就好像我们可以通过门牌就可以知道房间的主人是谁一样,而不用打开房门)。每个进程的附加信息中还有位置专门用于保存接收到的信号。

在UNIX下,用户进程都是由fork()函数产生的,fork将上面的的内存空间复制出来一个(然而现在的linux内核使用了写时拷贝技术copy_on_write),形成一个新的进程,然后在内核里为这个进程复制出一个task_struct结构,分配新的PID和PPID以区分新的进程。复制出来的进程我们把它叫做子进程,源进程称为父进程。根据进程之间的UNIX进程呈现一个树形结构。

每个进程都是由它的父进程拷贝而来,所以就涉及到新的进程将原有内容替换的问题,这里由exec函数族将原有内存空间替换成新的进程内容,。

进程创建成功后由内核进行调度,内核会在很短的时间内在进程间进行切换,这就是宏观概念上多任务的产生,内核给进程分配的时间叫做时间片,只有获得时间片的进程在能在CPU中执行。进程获得的时间片并不是固定的,内核基于进程的属性(CPU消耗型或者IO消耗型)和优先级进行动态分配。

至此,进程的产生及简单调度讲解完成。

上一篇:什么是ViewDragLayout?

下一篇:从Cortex-A8平台学习PWM

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部