深入思考:如何管理内存(无OS时,有OS时)

 对于计算机来说,内存容量越大,能够实现功能的可能性就更大,所以大家都希望自己电脑的内存越大越好。但是不管我们的内存有多大,一旦内存使用管理不善,程序运行时就会消耗过多的内存,这样内存迟早都被程序消耗殆尽。当无内存可用时,程序就会崩溃。因此我们说内存是一种资源,如何高效地管理内存对程序员来说是一个重要技术和话题。

       在C语言中定义变量时,就会分配一块内存空间。如果想要获取更大内存空间的话,我们可以通过定义数组来实现。其实在有操作系统(OS)的前提下,我们还可以通过一些操作系统提供的接口来分配内存,这样的分配方式称为静态内存分配。在程序运行的时候,需要时随时分配,不需要时随时释放,这种分配叫动态内存分配。

下面我们以有无操作系统这两种情况介绍内存的管理。

当有操作系统时,操作系统会管理所有的硬件内存。由于内存很大,所以操作系统把内存分成一块一块的页面(一块一般是4KB) ,然后以页面为单位来管理。页面内用更细小的字节为单位管理。操作系统内存管理的原理非常复杂,那么对我们这些使用操作系统的人来说,不需要了解这些细节,只要通过静态内存分配和动态内存分配就够了。动态内存分配时,操作系统给我们提供了接口,我们只需要用API即可管理内存。例如在C语言中使用malloc free这些接口来动态管理内存。

当没有操作系统时(裸机程序) ,程序需要直接操作内存,编程者需要自己计算内存的使用和安排,这属于静态内存分配。如果编程者不小心把内存用错了,产生的不良结果就由程序员自己承担。

从系统的角度介绍完,我们再从语言角度来讲:对比几种语言对内存的管理。

(1)汇编语言:根本没有任何内存管理,内存管理全靠程序员自己,汇编中操作内存时直接使用内存地址(譬如0xd0020010) ,非常麻烦,但如果用得好,程序执行效率是最高的。

(2)C语言: C语言中编译器帮我们管理内存地址,我们都是通过编译器提供的变量名等来访问内存的,操作系统下如果需要大块内存,可以直接通过API (malloc free)来访问系统内存。裸机程序中所需的大块内存需要自己来定义数组等来解决。

(3) C+语言: C++语言对内存的使用进一步封装。我们可以用new来创建对象(其实就是为对象分配内存) ,使用完后用delete来删除对象(其实就是释放内存) 。所以C++语言对内存的管理比C语言要高级一些,也容易一些。但是C++中内存的管理还是靠程序员自己来做。如果程序员用new创建一个对象,但是用完之后忘记delete,就会造成这个对象占用的内存不能释放,这就是内存泄漏。

(4) Java/C#等语言:这些语言不直接操作内存,而是通过虚拟机来操作内存。这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。如果我的程序申请了内存,使用完成后忘记释放,则虚拟机会帮助我释放掉这些内存。听起来似乎C#/Java等语言比C/C++有优势,但是其实虚拟机回收内存是需要付出一定代价的。所以说语言没有好坏,只有适应不适应。当程序对性能非常在乎的时候(如操作系统内核) ,就会用C/C++语言;当我们对开发程序的速度非常在乎的时候,就会用Java/C#等语言。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小生不是书呆子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值