进程(process) 是一个可执行程序(program) 的实例。
从内核角度:进程是由内核定义的抽象的实体,并为该实体分配用以执行程序的各项系统资源(因为进程的创建工作其实都是由内核完成的)。
程序(将可执行程序文件加载到内存中去)是包含一系列信息的文件:
- 二进制格式标识:
每个程序文件都包含用于描述可执行文件格式的元信息(metainformation) 。
内核(kernel) 利用此信息来解释文件中的其他信息。
- 机器语言指令:对程序算法进行编码。
- 程序入口地址:标识程序开始执行时的起始指令位置。
- 数据:程序文件包含变量初始值和程序使用的字面常量(literal constant)值(比如字符串)。
- 符号表及重定位表:描述程序中函数和变量的位置及名称。这些表格有多种用途,其中包括调试和运行时的符号解析(动态链接)。
- 共享库和动态链接信息:程序文件所包含的一些字段,列出了程序运行时需要使用的共享库,以及加载共享库的动态链接器的路径名。
- 其他信息:程序文件还包含许多其他信息,用以描述如何创建进程。
可以用一个程序来创建许多进程;
多进程可以运行同一个程序;
和 。
进程内存布局(进程虚拟内存地址的逻辑划分)
每个进程所分配的内存(虚拟内存)由多部分组成,通常称之为“段(segment)"或区(section)。
• 文本段包含了进程运行的程序机器语言指令。
文本段具有只读属性,以防止进程通过错误指针意外修改自身指令(为什么文本段是只读的?)。
多个进程可同时运行同一程序,所以将文本段设为可共享(一份程序代码的拷贝可以映射到所有这些进程的虚拟地址空间中)
• 初始化数据段(用户初始化数据段---user-initialized data segment)包含显式初始化的全局变量和静态变量。
当程序加载到内存时,从可执行文件中读取这些变量的值。
• 未初始化数据段(BBS段,"block started by symbol",也称作零初始化数据段---zero-initialized data segment)包含了未进行显式初始化的全局变量和静态变量。
程序启动之前,系统将本段内所有内存初始化为0(汇编语言完成的工作,在linux内核arch目录中寻找) 。
未经初始化的变量没必要分配存储空间;
可执行文件只需记录未初始化数据段的位置及所需大小,直到运行时再由程序加载器来分配这一空间。
• 栈(stack) 是一个动态增长和收缩的段,由栈帧(stack frames) 组成。
系统会为每个当前调用的函数分配一个栈帧。
栈帧中存储了函数的局部变量(所谓自动变量)、实参和返回值。
• 堆(heap) 是可在运行时(为变量)动态进行内存分配的一块区域。
堆顶端称作program break 。
note:size(1)命令可显示二进制可执行文件的文本段、初始化数据段、非初始化数据段(bss) 的段大小。
在Linux/x86-32 中典型的进程内存结构

参考书籍:linux/unix系统编程
进程是可执行程序的实例,由内核定义并分配资源。程序文件包含元信息、机器语言指令、数据、符号表等。内存布局分为文本段(只读、可共享)、初始化数据段、未初始化数据段(BBS段)、栈和堆。栈用于函数调用,堆用于动态内存分配。
15万+

被折叠的 条评论
为什么被折叠?



