Linux系统编程(5)——进程的地址空间

进程地址空间的分配规模:

 问:

栈有多大?

答:栈的大小是可分配的,在Centos系统下是8M,利用ulimit -a可以看到stack size(栈的大小)可以看到,并且利用ulimit -s <数字> 可以修改成<数字>大,注:数字单位是B。

堆有多大?非常大

进程地址空间多大?没有具体值,上限可以和内存一样大。

问:对象分配在堆上还是栈上?

如果是大对象,在堆上分配。

如果是小对象,并且需要频繁创建和销毁,推荐在栈上创建分配。

注:因为栈上分配内存更加高效,相当于修改esp寄存器修改,分配四字节就是esp寄存器减4。然而堆上分配更加复杂。要知道如何分配堆的分配去了解malloc底层实现。

问:如果大对象有需要频繁申请和释放怎么办?

这时候就需要内存池。提前申请好一批内存,需要的时候拿来用,不用的时候放在内存池中。注:这是性能优化的最常用的手段。

注:池的概念有很多,内存池,进程池,线程池,数据库连接池......

性能优化的手段:缓冲区,缓存,池......

问:你对你的项目还能不能进行优化优化?

注:抛开性能谈优化是不正确的,类似问int类型占几个字节?要说在32位操作系统中占四个字节,要有前提条件。

答:首先要进行对程序性能测试,看问题出在什么环节,根据问题,针对其采用合理的措施去优化,优化手段可以采用缓冲区,缓存,池......

对于性能测试——计时,查看程序按一部分运行时间最多,哪的代码运行最慢,对症下药。

 问:malloc和new都是动态内存申请方式,都是在堆上申请内存,二者有何区别?

答:先反问:C++中new有三种用法,你说的是那种方式。

new最基本的申请方式和malloc的区别?

答:(最直观的)new申请内存后,根据用户需要会调用构造函数,malloc不会调用构造函数。malloc申请失败会返回指针,new会抛出异常......(等等很多可以自己研究)。

虚拟地址: 

进程地址空间实际是:进程的虚拟地址空间

类似,一个年级那么多班级,问李同学在哪?每个班都有自己班级的李同学,不知道确切是哪一个。但是都是李同学,但是不是一个人。每个班级都有自己的编号,就是每个进程有自己的虚拟地址,但是实际物理地址不一样。找到李同学了,但是不知道是哪个班的,所以要每个班级的花名册,同样每个进程内部也有自己的表格——页表维持虚拟地址和实际物理地址的映射关系

这样做的目的:极大的保证了程序和程序之间的独立性。进程1崩溃不会导致其他进程发生影响。(还有很多的优势,《深入理解计算机系统》会有对虚拟地址单独介绍。页表还有别的东西在上面,这本书也有介绍。)

注:页表就是数据结构的哈希表构造,MMU硬件设备专门负责地址映射,最快的,但是成本太高了。

类似:写代码和听音乐同时进行,如果写代码时候发生内存崩溃,如果没有独立性,代码写不了同时音乐听不了,啥都干不了,独立了,写不了代码你可以听音乐,写博客。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值