深入浅出计算机组成原理学习笔记: 第九讲

一、程序装载面临的挑战

1、装载需要满足的条件

1、可执行程序加载后占用的内存空间应该是连续的

2、我们需要同时加载很多个程序,并且不能让程序自己规定在内存中加载的位置

2、如何解决以上问题

1、放到内存里

2、我们只关心虚拟内存地址就行了

1、什么是虚拟内存地址

我们把指令里用到的内存地址叫做虚拟地址

2、什么是物理内存地址

实际在内存硬件里面的空间地址、我们叫物理内存地址

二、内存分段

1、什么是内存分段

这种找出一段连续的物理内存和虚拟内存地址进行映射的方法,我们叫分段,这里的段,就是指系统分配出来的那个连续的内存空间

2、内存分段的好处和存在的问题

分段的的办法很好,解决了程序本身不需要关心具体的物理内存地址的问题,但它也有一些不足之处,第一个就是内存碎片的问题

三、内存交换

当然,这个我们也有解决办法。解决的办法叫内存交换

1、解决内存碎片过多的问题

2、内存交换的优缺点

1、优点

虚拟内存、分段、再加上内存交换,看起来视乎已经解决了计算机同时装载运行很多个程序的问题

2、存在的问题

不过,你千万不要大意,我们都需要把一大段连续的内存数据写到应哦按上,所以、如果内存交换的时候,交换的是一个很占内存空间的程序这样整个机器都会显得卡顿

四、内存分页

1、内存分页解决了什么问题

2、少出现内存碎片的解决办法

3、从磁盘装载的数据更少一点解决办法

更进一步地,分页的方式使得我们在加载程序的时候,不载需要一次性把程序记载到物理内存中,我们完全可以进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存里面去

4、缺页错误

实际上,我们的操作系统,的确是这么做的,当要读取特定的页,却发现数据并没有加载到物理内存里的时候,就会触发一个来自CPU的缺页错误、我们的操作系统会捕捉到这个错误,

然后将对应的页,从存放在硬盘上的虚拟内存里读取出来,加载到物理内存里,这种方式,使得我们可以运行那些大于我们实际物理内存的程序,同时,这样一来,

任何程序都不需要一次性加载完所有指令和数据,只需要加载当前需要用到的就可行了


通过虚拟内存、内存交换和内存分页这三个技术的组合,我们最终的到了一个程序不需要考虑实际的物理内存地址,大小和当前分配的解决方案

这些技术和方法,对于我们程序编写、编译和链接过程都是透明的,这也是我们在计算机的软硬件开发中常用的一种方法,这就是加入一个间接层

通过引入虚拟内存、页映射和内存交换,我们的程序本身,就不再考虑对应的真实的内存地址、程序加载、内存管理等问题了,任何一个程序、都主要把内存当成一块完成而连续的空间来直接使用

五、总结延伸

现在回到开头我问你的问题,我们的电脑只有640k内存就够了吗?很显然、现在看来,比尔盖茨的这个判断是不合理的,那为什么他会这么认为呢?因为他也是一个很优秀的程序员啊!

在虚拟内存、内存交换和内存分页这三者结合之下,你会发现,其实要运行一个程序“必须”的内存是很少的。CPU只需要执行其当前的指令,极限情况下,内存页只需要加载一页就好了,

再大的程序,页可以分成一页。每次,只在需要用到对应的数据和指令的时候,从应哦按上交换到内存里目前来就好了,以现在4k内存一页的大小,640k内存页能放下足足160页呢,

页无怪乎在比尔盖茨会说“640K ought to be enough for anyone这”样的话


不过呢,硬盘的访问速度比内存慢很多,所以我们现在的计算机,没有几个G的内存都不好意思和人打招呼

原文地址:https://www.cnblogs.com/luoahong/p/10894963.html