闲聊内存,我所知道的那些事

来源:互联网 发布:mutlab定一个数组 编辑:程序博客网 时间:2024/05/21 17:33

计算机不可获取的三大部件,CPU,内存,总线

CPU :对数据进行运算。

              数据从哪来 :数据从内存来。

              数据进行什么运算:运算规则通过解析指令获取,指令从内存读取。

             数据去哪里:运算过程产生的临时数据以及运算结果最终还是会写入到内存。

内存:存储指令和数据,以下把指令和数据统称为数据 。

总线:连接CPU和内存的纽带。


从上面可以看出,CPU都是和内存在打交道。

             

由于内存无法永久保留数据,在断电以后,数据会全部丢失,所以在计算机启动以后,需要从外部读入数据,所以在三大部件基础上可以添加一个I/O设备。

从早期的插件板,到穿孔卡片,再到磁带,磁盘。不管输入数据的方式怎么变化,归根结底就是写入一串01序列的数据,就是机器语言。


那01序列的数据和我们口中的程序有什么关系?

人们发现关于指令部分的01序列可以由字符代替,字符具有可读性,对人更亲和,这样减少编程中出现的错误,也许就是为了偷懒。

如   add  1 ,  2    代替  011  1  10 

add  代替  011,  2的二进制是10,当然  这只是一个虚假的例子,实际计算机中add 不是这样编码。

这就是汇编语言。


人们“偷懒”当然不会止步于汇编语言,进而出现高级语言(c, c++)。人们编程所做是事情越来越简单,机器所做的事情就越来越多。我们编程的文件存放在磁盘中,为了执行这一段程序,机器先将高级语言翻译成汇编语言,在将汇编语言翻译成机器语言。不管时代怎么变迁,机器始终值认识机器语言也就是01序列。我们最终还是要还原到最原始是状态。


机器语言 --> 汇编语言  ---->高级语言 ---->  汇编语言  --------> 机器语言


说了变天,好像没提多少内存的事情。

一个程序A要执行,得先转换成01序列,然后读入内存,最后CPU 和内存就友好的交流合作。如果内存的空间足够大,能容得下程序,那就什么问题也没有,大家都好。如果内存空间不够到又会有什么情况呢?一个只有1GB内存的电脑,能不能运行需要一个4GB空间的程序呢?

什么叫1GB的内存就是它的地址空间是 0x00000000~0x3fffffff ,地址只有30位,而我们一般程序的地址都是32位,也就是4GB寻址空间。由于程序具有局部性原理,也就是说程序并不要全部装入内存,在任意一时刻,程序只要一部分装入内存就可以了。现在我们提出一个新的名词叫虚拟地址空间。虚拟存储的技术好处并不止这么一点点。在程序装载,和程序运行都能发挥起优势。

程序在编写时,要保证不管在什么机器上都能运行,内存1GB, 2GB, 3GB, 4 GB,甚至只有几百兆都没关系。所以程序使用的虚拟地址。程序要内存的作用无非是读取,和存放数据,存放在实际物理地址的那个位置不重要。虚拟地址技术让程序和内存不发生直接联系。

虚拟技术提出一个分页的概念。他将虚拟地址和物理地址分成等大的页。页的大小可以是1KB, 2 KB, 4KB,1MB,都行

举个小点例子

虚拟地址 16位 ,每一页 4KB,   分成16个页面

物理地址 14位, 每一页 4KB, 分成 4 个页面


待续。。。。。。。。。。。。


原创粉丝点击