code1Life

导航

 

第一部分

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


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


冯诺依曼和哈佛结构跟程序运行的关系:
在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。

 

第二部分

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

      硬件角度:内存实际就是电脑的一个配件(一般叫内存条)。根据不同的硬件实现原理还可以把内存分成DRAM和SRAM。

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

 

2、内存的逻辑抽象图(内存的编程模型)

       从逻辑角度来讲,内存实际上就是由无限多个内存单元格组成的,每个单元格有一个固定的地址叫内存地址,这个内存地址和这个内存单元格唯一对应且永久绑定。

       以大楼来类比内存是最合适的。逻辑上的内存就像是一栋无限大的大楼,内存的单元格就好像是大楼中的每个小房间号。

       虽说逻辑上内存可以有无限大,但现实中内存大小是有限制的。例如,32位的系统(32位数据线,决定了内存地址只能有32位二进制,也就是2的32次方)

       内存限制为4G。实际上32位的系统中可用的内存是小于等于4G的(比如作者32位CPU装32位windows,但实际上电脑只有512M内存)

 

3、内存位宽(硬件和软件两个角度)

      硬件角度:

              硬件内存的实现本身是有宽度的,也就是说有些内存条就是8位的,而有些就是16位的。需要强调的是内存芯片之间是可以并联的。

      逻辑角度:

              内存位宽在逻辑上是任意的,因为从逻辑上来讲不管内存位宽是多少,我直接操作就可以。但是我们的操作不是纯逻辑而是需要硬件去实现的。

     

 

4、位&&字节&&字&&半字&&双字

      内存单元的大小单位4个:位(1bit) 字节(8bit)半字(一般是16bit) 字(一般是32bit)

      需要强调的是:在所有机器中(不管是32位系统还是16位系统还是64位系统),位永远都是1bit ,字节永远都是8bit。

      字, 半字, 双字具体是多少依赖于平台。所以咯,要看我们工作时所用的每种平台的定义(字是多少位,半字是字的一半,双字是字的一半)。

      Linux+ARM,字是32位。

 

 

posted on 2019-04-07 16:03  code1Life  阅读(90)  评论(0)    收藏  举报