学习LINUX高级程序设计之进程存储管理

来源:互联网 发布:芒果移动广告优化平台 编辑:程序博客网 时间:2024/05/20 04:50

      ELF格式可执行文件在存储(没有调入内存)时分为代码区(text)、数据区(data)、未初始化数据区(bss)三个部分,说明如下:

1.   代码区:存放CPU执行的机器指令。通常代码区是可共享的,使其可共享的目的是对于被频繁执行的程序只要在内存中有一份代码即可。代码区是只读的,故常量数据在编译时代码段中分配空间。

代码区的指令包括操作码和操作对象(或对象地址引用)。如果是立即数将直接包含在代码中;如果是局部数据,将在运行时在栈区分配空间,然后再引用该数据的地址;如果是BSS区和数据区,同样引用该数据的地址。

2.   全局初始化数据区/静态数据区(data,包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(全局和局部)。但被const声明的变量以及字符串常量在代码段中申请空间。

3.   未初始化数据区(BSS)存入的是未初始化的全局变量和未初始化的静态变量,BSS段的数据在程序开始执行前被内核初始化为0或者空指针。

 

linux进程结构:

linux系统下,将某个ELF文件加载到内存中运行,则将演变成一个或多个进程。进程是LINUX事务管理的基本单元,所有的进程均拥有自己独立的环境和资源。进程的环境由当前系统状态和其父进程信息决定。

上面是ELF可执行文件存储结构和LINUX进程基本结构对照图。

一个进程主要包括在内存中申请的空间,代码,堆,栈以及内核进程信息结构task_struct、打开的文件、上下文信息以及挂起的信息。

系统之所以分成这么多个区,主要是基于以下的考虑:

a.   代码段和数据段分开,运行时便于分开加载,在哈佛体系结构的处理器可以取得更好的流水线处理效率。

b.   代码是依次执行的,由处理器的PC指针依次读入,而且代码可以被多个进程共享,数据在整个运行过程中有可能多次被使用,如果将代码和数据混合在一起的话会造成空间的浪费。

c.   临时数据及需要再次使用的代码在运行时放入栈中,生命周期短,便于提高资源利用率。

d.   堆区可以由程序员分配和释放,以便用户自由分配,提高灵活性。

0 0
原创粉丝点击