本篇文件记录自己在从书籍中了解到的进程相关知识
进程与程序
进程是程序执行的一个实例, 可以用一个程序来创建多个进程实例。进程就类似于人类, 被产生后最终消亡, 而且只有一个父亲。
从内核角度看, 进程的目的就是担当分配的系统资源(CPU时间、内存等)的实体。且其由用户内存空间和一系列内核数据结构组成,其中用户内存空间包含了程序代码及代码所使用的变量, 而内核数据结构则用于维护进程状态的信息。
进程内存布局
每个进程所分配的内存由很多部分组成, 通常称之为“段”。 如下所示:
-
文本段
包含了进程运行的程序机器语言指令。 具有只读属性, 防止进程修改程序指令。同一程序的多个进程实例共享同一文本段, 进程将程序代码拷贝到虚拟地址空间中。
-
初始化数据段
包含显式初始化的全局变量和静态变量。 当程序加载时,从可执行文件中读取这些变量的值。
-
未初始化数据段
包含了未进行显示初始化的全局变量和静态变量。被称为BSS段。程序在磁盘上存储时, 没有为此段的变量分配存储空间。可执行文件仅仅记录未初始化数据段的位置及所需大小, 运行时再分配内存。
-
栈
栈是一个动态增长和收缩的段, 由栈帧组成。系统为每个调用的函数分配一个栈帧。 栈帧中存储函数的局部变量、实参、和返回值。
-
堆
堆是可在运行时动态进行内存分配的一块区域。堆顶端称为program break
可以利用shell命令查看程序的文本段、初始化数据段、未初始化数据段大小: