进程(虚拟)地址空间

以前我们学习过程序的地址空间,但是不太准确,准确点来说应该叫做进程的虚拟地址空间,大致如下图:
在这里插入图片描述

  • 栈有多大
    栈的大小是可以配置的
    (比较小)在我自己装的centos7下面默认是8兆左右,但是是可以修改的,ulimit -a可以查看一些系统的默认数据大小,ulimit -s 数字,就可以修改栈的大小。

  • 堆有多大?
    (非常大)可以粗略认为,内存有多大,堆比其稍微小一点

  • 栈上申请的内存自动释放;堆上申请的内存要手动释放

  • 如果是大对象,那么就必须在堆上分配。
    如果是小对象,并且需要频繁创建和销毁,推荐在栈上。因为在栈上分配内存更高效。(所谓的栈上分配内存,就是把esp寄存器修改,例如,申请四个字节就是esp-4,释放四个字节就是esp+4)
    在堆上分配内存就很复杂了,就要进入操作系统内核,由内核对堆上的内存统一分配和管理(看malloc底层实现很复杂)
    如果是大对象,又要频繁申请和释放,那就是在堆上,采用内存池思想

  • “池”思想:目的在于性能优化
    【优化思想:缓存,缓冲区,池】
    抛开系统,谈一个变量占几个字节,就是在耍流氓;同样的,抛开测试,谈性能优化也是在耍流氓(性能优化,要知道慢在哪儿,要对症下药);可以采用计时的方法,对逻辑A,B,C,D…进行比较,找出性能大的瓶颈,在做出优化


malloc和new有啥区别???


进程的虚拟地址空间
在这里插入图片描述
虽然两者的虚拟地址是相同的,但是他们映射到物理地址的结果是不同的
其实弄这个虚拟内存实际上是降低了效率,但是为啥还要这么做呢?是因为,为了让各个进程之间相互独立,不要影响其他进程,在页表上找不到映射的部分,那么就不会真的在物理内存中修改,万一直接修改到其他的进程的数据就出错了。所以才有了虚拟地址空间。

页表应该设计成什么样的数据结构呢?
哈希表(O(1))N
比硬件更快的就是软件,MMU硬件设备专门 的负责地址的映射

虚拟地址空间过程
在C/C++中所使用到的地址空间(房间号)都是虚拟地址,并不是物理内存上真实的编号,目的是为了保证进程和进程之间不会相互影响(进程的独立性),那为什么就能不影响到,因为程序在访问地址时就要通过页表这样的一个数据结构把虚拟地址翻译成真实的物理地址,如果出现内存写/读越界这样的情况时,再页表上差不到对应的表象,且就不会对物理内存造成一个负面影响(原因之一)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值