12.程序运行为啥需要内存


12.1.计算机程序的本质
(1)计算机程序的目的是为了去运行,程序运行是为了得到一定的结果。计算机程序的本质都是在做计算。计算就是计算数据,譬如视频播放器程序的本质就是在做视频数据编解码的计算。计算机程序=代码+数据,代码就是加工数据的动作,数据就是被代码加工的数字。程序运行得到结果,等价于代码+数据+运行=结果。
(2)程序运行的目的就是得到结果或过程。用函数类比:函数形参和局部变量就是被加工的数据,函数体就是代码,函数体的执行过程就是运行,函数的返回值就是结果。有的函数重视结果、有的函数重视运行过程、有的函数既重视结果又重视运行过程。
(3)计算机程序运行的过程,其实就是很多个函数相继运行的过程。程序是由很多个函数组成的,程序的本质就是函数,函数的本质就是加工数据的动作。


12.2.冯诺依曼结构和哈佛结构
(1)冯诺依曼结构是数据和代码存放在一起,哈佛结构是数据和代码分开存放。数据即全局变量和局部变量;代码即函数。
(2)在S5PV210中运行的linux系统上,运行应用程序时所有的应用程序的代码和数据都DRAM动态内存中,所以该结构就是冯诺依曼结构;在单片机中,我们将程序烧录到Flash(NorFlash)中,程序在Flash中原地运行,程序中所涉及到的数据放在RAM静态内存(SRAM)中,所以该结构就是哈佛结构。


12.3.为啥需要内存
(1)内存是用来存储可变数据的,数据在程序中表现为全局变量、局部变量等(在gcc中,常量存储在内存中)(在大部分单片机中,常量存储在Flash中,也就是在代码段)。内存对我们写程序来说非常重要,对程序运行更是本质相关。
(2)内存对程序来说几乎是本质需求,程序越庞大越复杂,需要的内存会越多。内存管理是我们写程序时很重要的话题。我们所接触到的很多编程的关键其实都是为了管理内存,譬如说数据结构(数据结构就是研究数据如何组织的,数据就是存放在内存中的)和算法(算法是为了用更优秀更有效的方法来加工数据,既然跟数据有关就离不开内存)。
(3)对于计算机来说,内存容量越大则可能性越大。我们写程序时如何管理内存非常重要,如果管理不善,可能会造成程序运行消耗过多的内存,这样内存迟早都会被程序给吃光,当没内存可用时程序就会崩溃。所以内存对程序来说是一种资源,所以管理内存对程序来说是一个重要技术和话题。


12.4.操作系统如何管理内存
(1)操作系统掌握所有的硬件内存,因为内存很大,所以操作系统把内存分成很多的页面(就是一块,一般是4KB),然后以页面为单位管理,页面内以字节为单位管理。操作系统内存管理的原理非常麻烦、非常复杂、非常不人性化。那么对我们使用这些操作系统的人来说,其实不需要了解这些细节。操作系统给我们提供了内存管理的一些接口,我们只需要用API即可管理内存。譬如说在C语言中使用malloc和free这些API接口来管理内存。
(2)如果没有操作系统,即在裸机程序中,程序需要直接操作内存,编程者需要自己计算内存的使用和安排。如果编程者不小心把内存用错了,错误结果就需要自己承担。


12.5.编程语言如何管理内存
(1)汇编语言:根本没有任何内存管理,内存管理全靠程序员自己,汇编中操作内存时直接使用内存地址(譬如0xd0020010),非常麻烦。
(2)C语言:C语言中编译器帮我们管理直接内存地址,我们都是通过编译器提供的变量名来访问内存的。在操作系统下如果需要大块内存,可以通过API(malloc、free)来访问系统内存。在裸机程序中需要大块的内存需要自己定义数组等数据结构来解决。
(3)C++语言:C++语言对内存的使用进一步封装。我们可以用new来创建对象(其实是为对象分配内存),使用完了用delete来删除对象(其实是释放内存)。所以C++语言对内存的管理比C高级一些,但C++中管理内存还是靠程序员自己去做,如果程序员new了一个对象,但是用完了忘记delete就会造成这个对象造成的内存不能释放,这就是内存泄漏。
(4)Java/C#等语言:这些语言不直接操作内存,而是通过虚拟机来操作内存。这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。如果程序申请了内存,使用完成后忘记释放,则虚拟机会帮我释放掉这些内存。
(5)总结:听起来似乎C#、java等语言比C/C++有优势,但是其实虚拟机回收内存是需要付出一定代价的。所以说语言没有好坏,只有适合不适合。当我们程序对性能非常在乎的时候(譬如操作系统内核)就会用C/C++语言;当我们对开发程序的速度非常在乎的时候,就会用Java/C#等语言。


/*
 * 公司:XXXX
 * 作者:Rston
 * 博客:http://blog.csdn.net/rston
 * GitHub:https://github.com/rston
 * 项目:程序运行为啥需要内存
 * 功能:使用函数类比"程序运行的目的就是得到结果或过程"。
 */
#include <stdio.h>

// 该函数的执行重在得到结果
#if 0
int add(int a, int b)
{
    return (a + b);             
}
#endif

// 该函数的执行重在运行过程,不需要返回值
#if 0
void add(int a, int b)
{
    int c = 0;

    c = a + b;
    printf("c = %d.\n", c);
}
#endif

// 该函数的执行既重结果又重过程
#if 0
int add(int a, int b)
{
    int c = 0;

    c = a + b;
    printf("c = %d.\n", c);

    return c;
}
#endif

int main(int argc, char **argv)
{
    printf("I am Rston.\n");

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值