内存初探——程序运行为什么需要内存



冯诺依曼结构和哈佛结构:
冯诺依曼结构:数据和代码放在一起
哈佛结构:    数据和代码分开存在


什么是代码:函数
什么是数据:全局变量,局部变量


冯诺依曼和哈佛结构跟程序运行的关系:
在S5PV210中运行的Linux系统上,运行应用程序时:这时候所有的应用程序的代码和数据都在DRAM,所以这种结构就是冯诺依曼结构;
在单片机中,我们把程序烧写到Flash(norFlash)中,然后程序在flash中原地运行,程序中所涉及到的数据(全局变量,局部变量)不能放在flash中,必须放在RAM(SRAM)中。这就是哈佛结构。(从Flash中只能读出来程序我不能进行修改,要想修改就得要在SRAM中)


动态内存DRAM   &    静态内存SRAM



Finally,为什么需要内存???
内存是用来存储可变数据的,数据在程序中表现为全局变量,局部变量等(在gcc中,其实常量也是存储在内存中的)(大部分单片机中,常量是存储在flash中的,也就是在代码段中)“回忆视频里老师有句话说的很对:写代码就是在把握数据,数据是可变,代码才是不可变的,(因为它从flash中出来是只读形式的)”


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


汇编语言根本没有任何内存管理,内存管理全靠程序眼自己,汇编中操作内存时直接使用内存地址。


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


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


Java/c#等语言:这些语言不直接操作内存,而是通过虚拟机来操作内存。这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。也就是说,乳沟我们的程序申请里内存,使用完了后忘记了释放,则虚拟机会帮我们释放掉这些内存。but虚拟机回收内存是需要付出一定代价的。
因此,当我们程序对性能非常在乎的时候(操作系统的内核)就会用C/C++

     

        当我们对开发程序的速度很在乎的时候就会用Java

你可能感兴趣的:(小小小项目知识)