国庆节第一次笔记

深入理解内存这个家伙

写在前面:我写的这些都是个人的理解,只能抛砖引玉,不一定全对。所以大家还需要看看正规的书本,不要让我理解带你误入歧途!这些理解都是在学习完朱有鹏老师的视频后自己的感悟,为了加深理解,总结一下上传至CSDN博客,不做任何其它用途,特此声明!

一.程序为什么需要内存?

二.什么是位、字节、字、内存位宽?

三.什么是内存编址、寻址、内存对齐?

一.程序为什么需要内存?

1.什么是程序

  • 程序就是在电脑中利用特定(某几个结合)软件所编写的一种为了完成不同功能的代码和数据。
  • 代码和数据是组成程序的两个部分。
  • 代码就是函数,数据就是数。在C语言中,所谓的数就是全局变量、局部变量。通过函数对变量进行加工后,所得到的就是程序运行的结果。
  • 程序的运行的目的是:1.得到结果,例如返回值;2.得到过程,例如打印值(用于测试程序)。

2.程序运行的过程

  • 运行程序的目的是为了得到特定的结果。因为程序是由函数和数组组成的,所以程序的运行实质就是程序中被调用函数的运行,程序是从主函数main()开始的,在主函数中所有的函数都是按照顺序进行的,函数的本质就是对数据的加工过程。所以函数实际是一个动词,基本上没有函数不需要数据来进行运算的。
  • 函数是死的,数据是活的。这句话要这么理解:函数就是编写好、不能被修改的代码,在哈弗结构中函数被存放在ROM中,作为可读,这样就可以保证函数的安全性,单独的函数,不进行运行,什么都不会得到。数据就是需要利用函数进行处理的,这些数据在哈弗结构中被存放在RAM中,可以被随时获取,方便更改。

3.冯诺依曼结构和哈佛结构

  • 冯诺依曼结构是将程序中的代码和数据都放在一起进行存储,这种存储方式的优点就是存储简单,最重要的缺点是容易造成函数被篡改,从而导致程序崩溃。
  • 哈佛结构是将程序中的代码和数据分开放,函数存放在ROM(Flash)中,在没有特殊情况下是不能对程序进行修改的。数据存放在RAM(内存)中,可以被随时获取。这种结构的优点就是访问速度快,程序安全。缺点就是存储变得复杂了。单片机中基本都是用的哈佛结构,效率更高。

4.动态内存DRAM和静态内存SRAM

  • DRAM:容量大
  • SRAM:存取效率高

5.总结:为什么需要内存

  • 内存是为了存储数据(全局变量、局部变量)的,程序的运行对内存的需求是必不可少的,错误的、浪费的使用内存都会对程序的运行造成不可估计的损失。程序越复杂,需要的内存越多。程序的编写离不开对内存深入的学习,了解其本质被编写程序而言至关重要。数据结构和算法就是针对内存的,数据结构就是研究数据如何组织的,因为数据是放在内存中的,所以,和内存是分不开的。算法是研究如何用更优秀的方法加工数据的,也离不开内存。所以我们可以说内存对程序来说是本质需求。管理内存也就显得很关键。

6.如何管理内存

  • 从操作系统而言:有操作系统的机器中,操作系统掌握所有硬件资源,内存很大,对内存的管理需要划分为一块一块(页面管理4kb),每个页面内用更细小的方式以字节来管理,1KB=1024BYTE,1BYTE=8bit。对带有操作系统的机器而言,我们只需要调用系统封装好的接口即可管理内存。没有操作系统的机器中(裸机),我们就需要人工对内存进行管理,比较麻烦。也就是分配地址。
  • 从语言本身而言:汇编没有内存管理,全靠编写人自己,汇编中操作内存实际就是操作内存地址(0xffff_ffff),非常麻烦;C语言有一定的内存管理,我们定义的变量,实际就是给这个变量定义了它的内存地址,例如int a,这个a就由C语言自动分配了一个随机地址(0xffff_ffff)。操作a实际就是操作这个地址,相对于汇编,简单了很多。C++中对内存进一步进行封装,操作时需要new和delete。如果new了而没有delete,则会导致内存泄漏。C#、JAVA这种高级语言,不需要我们管理内存,由语言自带虚拟机来进行内存的申请和释放,这样听起来很简单,但是实际上运行效率是不高的。当我们对性能非常在乎时(操作系统内核),我们使用汇编、C语言;当我们程序对速度非常在乎时(手机游戏),就会用C#和JAVA。
  • 总而言之,在不同的场合下我们需要用不同的语言去完成任务,原则是:离内核越近,我们就需要越低级的语言,这样运行效率是最高的,比如说汇编就用在内核代码的编写中,但是汇编太麻烦了,C语言的优越性就体现出来了,C语言是所有语言的平衡点,在内核的编写中大部分用的是C语言,C语言是集效率高与复杂程度中等于一身的语言。所以学好C语言至关重要。

二.什么是位、字节、字、内存位宽?

1.从硬件角度分析什么是内存?

  • 内存就是内存条,越大越好,现在电脑一般内存都可以达到4G、8G、16G,但是内存越大,需要的价格也就越高。内存条上有一个个的内存块和电路,这些组成了内存条。

2.从逻辑上分析什么是内存?

  • 内存就是RAM,可以被随机访问,随机访问的意思就是想访问谁就访问谁。内存实际就是按照一定顺序组合起来的一个一个的格子,CPU操作着系统中所有的硬件,内存也不例外,内存是一个硬件,一般说32位操作系统就有32根数据线,地址线一般和数据线相同,所以也是32根,32根地址线可以表示的最大值是2的32次方=4G,所以32位操作系统最大的内存是4G,你买个8G内存条,也只能使用4G空间。但是实际上并不是所有的地址线都是和内存相连接的,还会和其它相连。
  • 这些格子有着自己的地址,地址实际上就是数字(0xffff_ffff)。格子是用来存储东西的,所以也叫内存空间,内存空间是和内存地址一一对应的。CPU在访问内存的时候,只知道内存地址,不知道内存空间有多大。所以说到内存要想到两个方面:1.内存地址;2.内存空间。

3.位、字节、字

  • 一个字节(byte)=8位(bit)
  • 一个字就是int型,4字节,32位

4.内存位宽

内存是个硬件,这个硬件的实现是有宽度的,比如说8位,16位,32位,但是它们之间是可以结合进行扩展的,也就是说两个16位的内存条经过并联后就是一个32位内存条。32位内存条的硬件实现就是按照以下方式。

很明显,32位宽的内存一条就4个字节,这也就是32位操作系统下一个int就占4字节的原因了。
CPU每次读指令,都是直接读一条,不管你定义的是int 还是char,所以定义int型变量效率最高。

三.什么是内存编址、寻址、内存对齐?

1.内存编址

  • 内存是可以直接被访问的存储器,之所以可以被直接访问是因为内存与CPU通过总线直接相连。说到内存就要想到它的样子,对于32位内存而言,4个一排4个一排的往上堆起来。之所以这样分布式因为方便管理,每个小块都是用来存储的,并且每个小块都具有特定地址,所以说到内存就要想到它的关键两点;1.内存有地址,2.内存有空间。地址和空间是绑定的,所以CPU实际只认识地址就够了,知道了地址,就可以去获取内存中的东西。这就是内存编址。

2.每个格子的解析

  • 内存中被分为一个一个的小格子,每个小格子都具有特定的地址,它们的空间,也就是空间大小就是1个字节(1BYTE),8位(8bit)。这一点很重要,它说明了如果有一个数字8,然后说这个数字是一个内存地址,那么也就是说这个数字所占空间就是一个字节8bit。

3.内存和数据类型的关系

  • 内存就是用来存储数据的,数据类型就是给数分配空间大小,空间大小根据数据类型有关,比如说int 就是一个整形,它占了4个字节,也就是一排格子,定义一个int变量就是按照整形的存储规定存储这个变量,如果按照别的数据类型,比如float使用这个变量,那么就不能按照int型(存储数据的规定)的规定,使用的这个变量也就会出问题。
  • 数据类型的定义直接影响系统的运行速度,32位系统中,内存的硬件就是按照上面说的4个一排推起来,使用int就正好符合硬件的设计,让CPU可以和内存更好的匹配,CPU可以更快的读取内存。

4.内存对齐

  • 内存对齐就是指上面说的4个一排推起来的排列方式。非内存对齐的效率不高,但是为了兼容性的问题,一般系统都会有非内存对齐的设计。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值