关于计算机内存

又打开了博客,之前就是瞎玩,也没想过写博客,后来发现写博客就像人的生长足迹。从婴孩、儿童、到成年……,这是成长和历练的过程,太美妙了!!

本文主要讲解计算机内存。这里就有思考几个问题了

1、    内存在电脑哪里的?

2、    内存是什么玩意?

3、    内存功能又是干神马的呢?

4、    内存的一二三级缓存,搞这么多干嘛?干神马用?

5、    寄存器、存储器和内存,这么乱?区别呢?

6、    我们写的程序又是放在内存哪里的呢?

哎呀,妈呀!问题真够多的,容我蹲墙角思考下下

 

先来看个内存条, 内存是由内存芯片、电路板、金手指等部分组成的(自己对号入座)


第一个问题:

内存放在哪里的?

这就是一个尼玛问题,当然放在主机箱里的啦(哈哈哈哈~~)逗你玩啦~。不知道你小时候有没有玩过那种插卡的电视机游戏,我是玩过的,(当时真是疯狂,玩的我都懒得吃饭了),那种游戏卡就像这种内存,内存就是直插式的(排除其他),只有插入游戏卡才能玩游戏,当然电脑只有插了内存条才能运作。至于插在哪?自己拆电脑看看吧。当然还有其他的内存,比如一级缓存,则是集成在CPU中;只读存储器ROM,和各个主要部件有关系了,比如显卡,网卡等等。


第二个问题:

内存是什么玩意?

内存(主存储器,主存),用来存储程序和数据的部件(容器懂不懂),有了存储器,才有记忆功能,才能保证正常工作。

内存一般采用半导体存储单元,包括随机存储器RAM),只读存储器ROM),以及高速缓存CACHE

只读存储器ROM):在被制造的时候,信息(数据、程序)就永久的被写入其中(就像你,生下来就被烙印了性别的信息,前提是你不能去泰国啊!!)。这些信息只能读出,一般不能写入,即使机器停电,这些数据也不会丢失。ROM一般用于存放计算机的基本程序和数据,如BIOS ROM。其物理外形一般是双列直插式(DIP)的集成块。

随机存储器RAM):既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。我们所经常说的,就是那种直插式的内存条,就是RAM

高速缓冲存储器Cache):一级缓存(L1Cache)、二级缓存(L2 Cache)、三级缓存(L3Cache)这些数据,位于CPU中,是一个读写速度比内存更快的存储器。一级缓存为静态存储器,二级缓存后为动态存储器(两者是不同的,找找度娘吧)。CPU获取数据时,先向缓存中读取,如果没有则进入内存索取,同时,将获取到的经常使用的数据放入缓存中。下次再访问时,直接从缓存中读取。


第三个问题:

内存功能又是干神马的呢?

直接笼统的讲就是暂时存储数据的地方,断电就没了(限RAM)。

内存是计算机重要的部件之一,它就像一座无私的桥梁压弯了腰呀(太伟大),将河两岸导通,一头连着CPU,一头连着硬盘,通过桥梁,运送货物(数据),计算机中所有程序的运行都是在内存中进行的,运行程序的时候,程序会被写入内存中。因此内存的性能对计算机的影响非常大(桥梁不平坦走的就慢嘛,桥梁不结实早晚会歇菜嘛)。


第四个问题:

内存的一二三级缓存,搞这么多干嘛?干神马用?

上面也讲了些,这里总结下吧

搞这么多缓存是为了加快运行速度嘛,奔!!!

一级缓存为静态存储器(速度不是一般的快),二级缓存为动态存储器(二级缓存是飞机,那一级缓存就是火箭)

一级缓存可以存储指令缓存和数据缓存,二级缓存只能存储一级缓存存储不下的数据缓存,不能存储指令缓存(向CPU推送各类运算指令)

二级缓存是一级缓存的缓冲器


第五个问题:

存储器、寄存器和内存,这么乱?区别呢?

区别:

存储器包括寄存器和内存

寄存器和存储器,物理结构不一样,寄存器由基本的RS触发器结构衍生出来的D触发,就是一些非门构成的结构(回去翻书看数电),存储器RAM由六MOS管构成。

寄存器,是CPU内部的存储单元,离CPU最近,是数据的中转站,数量有限,但速度快,有通用寄存器和特殊功能寄存器。计算机做运算时,必须将数据读入寄存器才能运算。

存储器,是独立于CPU之外的,比如内存、硬盘(这是啥,不用我说了吧)。

【关于寄存器和缓存参考:http://blog.csdn.net/dzweather/article/details/8159772】

关系:

寄存器是最贴近CPU的,而且CPU只和寄存器通话,寄存器读取缓存中的数据,需要什么样数据就向缓存中索要什么类型的数据,缓存中没有,就绕过缓存向内存中找。

计算机的存储架构:从远近来看CPU<----->寄存器<----->缓存<----->内存<----->硬盘

第六个问题:

我们写的程序又是放在内存哪里的呢?

内存分配方式有三种:

(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。(其实在面向对象编程中,没有全局变量的概念)

(2)在栈上创建。由编译器自动分配释放,存放函数的参数值,局部变量的值等。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)从堆上分配,亦称动态内存分配。一般由程序员分配释放,程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

代码区(codesegment)存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域

public class People//定义类
{
         string name = "Lee";
         string sex = "Man";
         int age = 20;
 
         publicPeople()
         {
              Debug.Log("Name:"+name+"   Sex:"+sex);
         }
}
 
public class NewBehaviourScript :MonoBehaviour {
 
 
         private static Transform parentObj;//全局静态变量,放入静态区中
         private int Num;//字段,new出,放入堆中
         voidStart () {
 
               Peoplepeople = new People();//new中的对象,放入堆区中,也就是People类中的字段全部放在堆中,仅将堆中开始地址返回
 
               DoSomething("Lee");
         }
 
         voidDoSomething( string m)//方法中参数m放入栈区中,方法体等放入代码区
         {
               string Temp = m;//函数内的局部变量,放入栈区中
               print(Temp);
 
         }
}
 


内存分配理解

class1 object1;  

object1=new class1(); 

第一句定义了一个class1的引用,实质上只是在堆栈中分配了一个4个字节的空间,它将用来存储后来实例化对象在托管堆中的地址,在windows中这需要4个字节来表示内存地址。第二句实例化object1对象,实际上是在托管堆中开僻了一个内存空间来存储类class1的一个具体对象,假设这个对象需要36个字节,那么object1指向的实际上是在托管堆一个大小为36个字节的连续内存空间开始的地址。由此也可以看出在C#编译器中为什么不允许使用未实例化的对象,因为这个对象在托管堆中还不存在。当对象不再使用时,这个被存储在堆栈中的引用变量将被删除,但是从上述机制可以看出,在托管堆中这个引用指向的对象仍然存在,其空间何时被释放取决垃圾收集器而不是引用变量失去作用域时。

只有在函数内部直接定义的值类型,比如你在函数内部定义了一个int a,它才是在stack上面分配的。而对象内部的成员变量(除非静态),不管是值还是引用类型,它都只是整个对象的一部分,而整个对象是在堆上分配的。


其它:

内存泄露:在开始申请内存空间之时,到应用程序结束,期间没有释放内存,即为泄露(主要是堆区)。

内存溢满:类如int类型,4个字节,共32位,如果存储数据超过其限值,则为溢满。

 

关于申请堆内存:

堆内存空间比栈要大很多,malloc和new可申请堆内存,多次申请内存,有可能造成堆碎片,因为堆申请时,是根据需要申请的大小,进行遍历,找到合适的连续的空间即可,如果空间比需要申请的空间要大,那么剩余的空间释放为可用空间(就像硬盘碎片一样,两存储之间有空隙,产生浪费)

 

有错误的地方,还请各位给予见谅!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值