问:程序运行为什么需要内存?

问:程序运行为什么需要内存?

本章知识点主要来自朱有鹏老师视频课,部分自己添加总结

什么是内存?(硬件和逻辑两个角度)

从硬件角度:内存实际上是电脑的一个配件(一般叫内存条)。根据不同的硬件实现原理还可以把内存分成SRAM和DRAM(DRAM又有好多代,譬如最早的SDRAM,后来的DDR1、DDR2·····、LPDDR)

从逻辑角度:内存是这样一种东西,它可以随机访问(随机访问的意思是只要给一个地址,就可以访问这个内存地址)、并且可以读写(逻辑上当然也可以限制其为只读或者只写);内存在编程中天然是用来存放变量的(就是因为有了内存,所以C语言才能定义变量,C语言中的一个变量实际就对应内存中的一个单元)。

计算机程序运行的目的是什么?

计算机为什么需要编程?编程已经编了很多年,已经写了很多程序,为什么还需要另外写程序?计算机有这个新的程序到底为了什么?

程序的目的是为了去运行,程序运行是为了得到一定的结果。

计算机就是用来计算的,所有的计算机程序其实都是在做计算。计算就是在计算数据。

所以计算机程序中很重要的部分就是数据。

计算机程序 = 代码 +

数据 计算机程序运行完得到一个结果,就是说代码

+ 数据 (经过运行后) = 结果

从宏观上来理解,代码就是动作,就是加工数据的动作;数据就是数字,就是被代码所加工的东西。

那么可以得出结论:程序运行的目的不外乎2个:结果、过程

用函数来类比:

函数的形参就是待加工的数据(函数内还需要一些临时数据,就是局部变量),

函数本体就是代码,

函数的返回值就是结果,

函数体的执行过程就是过程。

int add(int a, int b)

{

return a + b;

} // 这个函数的执行就是为了得到结果

void add(int a, int b)

{

int c;

c = a + b;

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

} // 这个函数的执行重在过程(重在过程中的printf),返回值不需要

int add(int a, int b)

{

int c;

c = a + b;

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

return c;

} // 这个函数又重结果又重过程

计算机程序运行过程

计算机程序的运行过程,其实就是程序中很多个函数相继运行的过程。程序是由很多个函数组成的,程序的本质就是函数,函数的本质是加工数据的动作。

什么是代码?:函数

什么是数据?:全局变量、局部变量

总结:为什么需要内存呢?

内存是用来存储可变数据的,数据在程序中表现为全局变量、局部变量等(在gcc中,其实常量也是存储在内存中的,对于大部分单片机中,常量是存储在flash中的,也就是在代码段),对我们写程序来说非常重要,对程序运行更是本质相关。

所以内存对程序来说几乎是本质需求。越简单的程序需要越少的内存,而越庞大越复杂的程序需要更多的内存。内存管理是我们写程序时很重要的话题。我们以前学过的了解过的很多编程的关键其实都是为了内存,譬如说数据结构(数据结构是研究数据如何组织的,数据是放在内存中的)和算法(算法是为了用更优秀更有效的方法来加工数据,既然跟数据有关就离不开内存)。

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

对于计算机来说,内存容量越大则性能越大,所以大家都希望自己的电脑内存更大。我们写程序时如何管理内存就成了很大的问题。如果管理不善,可能会造成程序运行消耗过多的内存,这样迟早内存都被你这个程序吃光了,当没有内存可用时程序就会崩溃。所以内存对程序来说是一种资源,所以管理内存对程序来说是一个重要技术和话题。

先从操作系统角度讲:

操作系统掌握所有的硬件内存,因为内存很大,所以操作系统把内存分成1个1个的页面(其实就是一块,一般是4KB),然后以页面为单位来管理。页面内用更细小的方式来以字节为单位管理。操作系统内存管理的原理非常麻烦、非常复杂、非常不人性化。那么对我们这些使用操作系统的人来说,其实不需要了解这些细节。操作系统给我们提供了内存管理的一些接口,我们只需要用API即可管理内存。

譬如在C语言中使用

malloc free 这些接口来管理内存。

当没有操作系统时:

在没有操作系统(其实就是裸机程序)中,程序需要直接操作内存,编程者需要自己计算内存的使用和安排。如果编程者不小心把内存用错了,错误结果需要自己承担。

再从语言角度来讲:

不同的语言提供了不同的操作内存的接口。

譬如汇编:根本没有任何内存管理,内存管理全靠程序员自己,汇编中操作内存时直接使用内存地址(譬如0xd0020010),非常麻烦;

譬如C语言:C语言中编译器帮我们管理直接内存地址,我们都是通过编译器提供的变量名等来访问内存的,操作系统下如果需要大块内存,可以通过API(malloc

free)来访问系统内存。裸机程序中需要大块的内存需要自己来定义数组等来解决。

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

Java/C#等语言:这些语言不直接操作内存,而是通过虚拟机来操作内存。这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。如果我的程序申请了内存,使用完成后忘记释放,则虚拟机会帮我释放掉这些内存。听起来似乎C#

java等语言比C/C++有优势,但是其实他这个虚拟机回收内存是需要付出一定代价的,所以说语言没有好坏,只有适应不适应。当我们程序对性能非常在乎的时候(譬如操作系统内核)就会用C/C++语言;当我们对开发程序的速度非常在乎的时候,就会用Java/C#等语言。

相关推荐

宜家的马库斯办公椅怎么样
365真人注册

宜家的马库斯办公椅怎么样

📅 08-16 👁️ 9197
LoL改外服语音包会被封嘛
365真人注册

LoL改外服语音包会被封嘛

📅 10-02 👁️ 2917
继玄彬和孙艺珍之后...在电视剧中相识的顶级演员夫妇宣布“结婚”