进程虚拟地址空间划分

大体概括
当一个程序跑起来时,我们的操作系统会主动的分配此程序的虚拟地址空间,每个进程的虚拟地址空间会被划分成为多个区间,当然,地址空间的划分因为其依赖于操作系统而实现的,所以划分方式会随着内核的不同而不同,可以肯定的是其分为两大部分,内核空间和用户空间。

提问:为什么会有这么个东西?
至于为什么需要划分虚拟地址空间我们提一嘴,是因为操作系统对进程地址空间的管理以及物理地址的隐蔽,我们所运行的程序代码是无法直接访问物理内存的。早期的内存管理机制呢是在运行一个程序的时候将程序全部一股脑儿的加载到内存,这样的操作对计算机的内存来说是一个挑战,他需要足够大,而且还不能同时运行多个程序,需要挂掉一个再补充一个,数据在磁盘和内存之间来回拷贝,费时费力,这伴随着相当多的问题:
1.进程地址空间没有明确的隔离,不安全;
2.内存的使用效率极大地降低;
3.程序跑起来时数据地址不明确,因为是随机分配;

分段
首先我们明确一点就是编程在计算机上展示的行为就是指令+数据,操作系统为了更人性化更科学,改进后通过分段分页的行为来进行内存地址管理;将内存通过CPU由段寄存器分割,这样就解决了程序见的空间隔离,如果发生越界行为,就容易判断,而且最妙的是通过首地址+地址偏移量来确定实际地址(虚拟地址),达到操作数据,这就说明实际代码和数据的地址其实本质上是地址偏移量。

分页
分段解决了一部分问题,之后又出现了一个分页,用它来解决内存的实际使用效率问题;针对内存物理地址和虚拟地址的内存管理及两者的映射机制,通过分页,我们可以认为拿到一块儿连续的但实际上不是连续的地址块,通过页表映射关系,既保证了对程序使用内存的连续,也可以保证对内存地址的访问权限,两全其美。

概述优点:
1.为所有运行的程序进程提供了一致的地址空间,给进程一个自身占用完全单机系统存储资源的假象;
2.保护进程地址空间,实现地址隔离,保障安全;
3.建立物理地址和虚拟地址的映射,通过分页行为,提高内存的使用效率;

瞅瞅
我们就以x86 32位操作系统内核划分来具体看看:
在这里插入图片描述
如上图呢,一块完整的4G大小的内存空间被分割成了多块区域,每个区域对应的会在程序运行期间存储相对于的类型数据,存储数据的类型呢大家可以自行了解;
算了还是说一下吧

.data 初始化且初始化不为0的全局变量,数据,编译产生的符号
.bss 初始化或初始化为0的全局变量,数据,编译产生的符号
.text 存放编译指令
.dll .so 存放共享库
.heap 大名鼎鼎的堆
.stack 同样大名鼎鼎的栈

其中注意的是每一个进程的user space是私有的,其kernal space是共享的;user space是封闭的,原因是需要匿名管道通信。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值