1.计算机程序运行的目的
程序的目的就是为了运行,程序运行是为了得到一定的结果,程序其实就是在计算数据。
计算机程序 = 代码 + 数据
代码 + 数据(经过运行后) = 结果
另一种理解就是,代码就是动作,就是加工数据的动作,数据就是数字,就是被代码加工的东西。
所以程序运行的目的可得出为:结果、过程。
拿函数类比一下,形参就是待加工的数据,当然还需要一些局部变量(临时数据),函数本体就是代码,函数返回值就是运行结果,函数的执行就是过程。函数的不同,有的函数重在过程,有的函数重在结果,有的函数都看重,具体环境具体分析。
2.计算机程序运行的过程
计算机程序运行的过程就是很多函数相继运行的过程,程序是由很多函数组成的,程序的本质就是函数,函数的本质就是加工数据的动作。
3.冯诺依曼结构和哈佛结构。
冯诺依曼:数据和代码放在一起
哈佛结构:数据和代码分开存在
代码:函数
数据:全局变量、全局变量
在S5PV210中运行在linux系统上,运行应用程序时:这个时候应用程序的代码和数据DRAM,所以这种结构就是冯诺依曼结构。在单片机中,我们把程序代码烧写到Flash(NorFlash)中,然后程序在Flash中原地运行,程序中所涉及到数据(全局变量、局部变量)不能放在Flash中,必须放在RAM(SRAM)中,这就是哈佛结构。
4.动态内存DRAM和静态内存SRAM
SRAM(Static Random-Access Memory),它是一种具有静止读取存取功能的内存,不需要刷新电路即能保存它内部存存储的数据。不像DRAM内存那样需要刷新电路,每隔一段时间,固定要对DRAM刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积
DRAM(Dynamic Random-Access Memory),即动态随机存储器最为常见的系统内存。DRAM 只能将数据保持很短的时间。为了保持数据,DRAM使用电容存储,所以 必须隔一段时间刷新(refresh)一次,如果存储单元没有被刷新,存储的信息就会丢失。动态RAM的工作原理 动态RAM也是由许多基本存储元按照行和列来组成的
5.为什么需要内存
内存是用来存储可变数据的,数据在程序中表现为全局变量、局部变量等(gcc中,其实常量也是存储在内存中的)(大部分单片机中,常量是存储在flash中的,也就是代码段)对我们写程序来说非常重要,对程序运行更是本质相关。
所以内存对程序来说就是本质需求,
6.如何管理内存:
从操作系统讲:操作系统掌握所有的硬件内存,因为内存很大,所以操作系统把内存分成1个1个的页面,(其实就是一块,一般是4KB),然后以页面为单位管理,页面内用更细小的方式来以字节为单位管理。操作系统内存管理的原理非常麻烦、非常复杂、非常不人性化。操作系统给我们提供了内存管理的一些接口,我们只需要API即可管理内存。譬如在C语言中使用malloc free这些接口来管理内存。
没有操作系统时:(实际就是裸机程序),程序需要直接操作内存,编程者需要自己计算内存的使用和安排。
从语言角度来讲:不同语言提供了不同的操作内存接口。
汇编:没有如何内存管理,内存管理全靠程序员自己,汇编使用内存地址直接(0xd1111100)
C语言:C语言中编译器帮我们管理直接内存地址,我们通过编译器提供的变量名来访问内存的,操作系统下需要大块内存,可以通过API(malloc free)来访问系统内存。裸机需要大块内存需要自己来定义 数组等在解决。
C++:C++语言内存的使用进一步封装。我们用new来创建对象(其实就是为对象分配内存),然后使用delete来删除对象释放内存,如果new了一个对象,不用delete释放,内存泄漏。
Java/C#等语言:这些语言不直接操作内存,而是通过虚拟机来操作内存。这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。如果我的程序申请了内存,使用完成后忘记释放,则虚拟机会帮我释放掉这些内存。