进程映像、虚拟内存、内存管理

进程映像:
程序就是存储在磁盘上的可执行文件 ,当程序运行时,系统会将可执行文件加载到内存中,从而在内存中形成进程(一个程序可以同时加载多个进程)
进程在内存空间中的分布情况就是进程映像,从低地址到高地址一次分布为:
txet 代码段(只读段) 二进制指令、常量(字符串字面值、const修饰过的原data段的数据),修改会产生段错误
data 数据段 初始化过的全局变量呵静态局部变量
bss 静态数据段 未初始化过的全局变量和静态局部变量
该段内存开始前会被清理为0
heap 堆 体量较大的数据,例如结构变量
手动管理、释放时间可控,足够大,需要与指针配合使用
使用麻烦,可能会产生内存碎片和内存泄漏
stack 栈 局部、块变量
自动分配、释放内存,不会产生内存碎片、内存泄漏
大小很有限,释放时间不可控
environ 环境变量表 环境变量
每个进程都有一份,修改不会影响其他进程
argv 命令行参数 程序执行时附加的参数

虚拟内存:
1、系统会给每个进程分配4G的虚拟内存空间
32个0~32个1 地址范围
2、用户只能使用虚拟内存地址,而无法直接使用物理内存地址
3、虚拟内存地址与物理内存地址需要进行映射才能使用,否则就会产生段错误
4、虚拟内存地址与物理内存地址的映射是由操作系统动态维护
5、一是可以让用户使用安全的虚拟内存地址,另一方面操作系统可以让应用程序比实际物理内存更大的地址空间
6、4G的虚拟地址分为两部分
[0G,3G) 用户空间
[3G,4G) 内核空间
注意:所有进程的内核映射都是同一块,统一管理所有用户的内核映射的内存
7、用户空间中的代码不能直接访问内核空间的代码和数据,但是可以通过调用系统API来切换到内核态,间接地与内核间交换数据
8、虚拟内存访问越界(使用没有映射的内存),将导致段错误

内存管理:
1、mmap\munmap底层不维护任何东西,只返回一个映射后的内存首地址,所映射的内存位于堆中
2、brk\sbrk底层维护一个双向链表和必要的控制维护信息,所映射的内存也是位于堆中,底层调用了mmap\munmap
3、malloc\free底层维护一个双向链表和必要的控制维护信息,所映射的内存位于堆中,底层调用了brk\sbrk
4、每个进程都有4G(32位系统)的虚拟内存空间,虚拟内存的地址只是一个数字,必须与实际的物理内存地址进行映射才有意义
5、平时所说的内存的分配和释放有两侧含义
a、权限的分配和释放
b、映射关系的建立和取消
6、重点是理解Linux系统的内存管理机制,而不是brk\sbrk\mmap\mmunmap的使用方法

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值