进程

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

进程(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系统编程

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值