内存和磁盘的亲密关系
从都具有存储程序命令和数据这点来看,内存和磁盘的功能是相同的,而且两者都被归类为存储部件,但从存储容量来看,内存是高速高价,而磁盘是低速廉价,他们在计算机系统中是协同作业的。在本章中,内存是主内存(就是前文提到的负责存储CPU中运行的程序指令和数据的内存),磁盘指硬盘。
因为在存储程序方式被提出来之前程序都是通过改变计算机的布线等来变更程序的,因此对于这一方式的提出可谓是一个里程碑。我们知道计算机中主要的存储部件是内存和磁盘,但两者又有什么关系呢? 它们两者有着密不可分的关系,因为存储在磁盘中的程序,需要读入到内存后才能运行。这是因为负责解析和运行程序内容的CPU,需要通过内部程序计算器来指定内存地址,然后才能读出程序。若CPU直接读取并运行磁盘中保存的程序,由于磁盘读取速度慢,程序的运行速度会降低。
若我们想深入了解内存和磁盘之间的关系,能够体现的一个示例,就是磁盘缓存。那么什么为磁盘缓存呢?磁盘缓存指的是把从磁盘中读取的数据存储到内存空间中的方式,这样一来,在读取数据时就可以大大提高磁盘数据的访问速度。下图是利用磁盘缓存读取数据的过程:
对于Windows操作系统来说因如今磁盘速度大幅,改善磁盘缓存的效果也没有之前那么明显了。另外值得一提的是把低速设备的数据保存在高速设备中需要时可直接将其,从高速设备中提取出来的这种缓存的方式也会经常用到,例如Web浏览器的使用。
接下来就是第二个示例——虚拟内存,它是指只把磁盘的部分作为假想的内存来使用。由此也可得出虚拟内存与磁盘缓存两者是相对的。若我们为了实现虚拟内存就必须把实际内存的内容和磁盘上的虚拟内存内容进行部分置换,并同时运行程序。那么应如何操作呢?下面我们就以Windows操作系统为例来说明。首先我们要知道虚拟内存的方法有分叶式和分段是两种,而Windows采用的是分页式,而该方式就是在不考虑程序构造的情况下,把运行的程序,按照一定大小的叶进行分割,并以叶为单位在内存和磁盘间进行置换。在分式中,我们把磁盘的内容读出到内存称为Page In ,把内存的内容写入磁盘称为Page Out 。对于Windows操作系统为实现虚拟内存的功能,他在磁盘上提供了虚拟内存用的文件(页文件)而页文件的大小也就是虚拟内存的大小。
虽然虚拟内存可以避免Windows操作系统因内存不足导致的应用无法启动,但是由于虚拟内存时发生的Page In 和Page Out 往往伴随着低速的磁盘访问,在这个过程中运行会变得迟钝起来。这说明虚拟内存无法彻底解决内存不足的问题。因此,想要从根本上解决内存不足的问题,可以用增加内存的容量和尽量把运行的应用文件变小(也就是节约内存)这两种方法。但增加内存的容量花销可能较大,因此我们主要在这里说明怎样把应用文件变小这种方法。而把应用文件变小也有两种方法:
1、通过Dll文件实现函数共有。因为多个应用可供有同一个DLL文件,所以可以达到节约内存的效果,同时DLL文件还可以在不变更EXE文件的情况下只升级DLL文件就可以更新。
2、 通过调用_stdcall来减小程序文件的大小。因为C语言中在调用函数后需要执行栈清理处理指令,就是把不需要的说数据,从接收和传递函数的参数时使用的内存上的栈区域中清除出去。若用普通的函数调用会造成栈多次处理同样的内容,造成内存的浪费。若用_stdcall函数调用函数站清理处理只需在最后一步进行即可,这样就能节约三个字节的程序大小。如图所示:
前文我们了解了内存的物理结构那么磁盘的物理结构是什么呢?其实就是指磁盘存储数据的形式。而磁盘的使用是通过把其物理表面划分成多个空间。划分的方式有单驱方式和可变长方式两种。扇区方式是指将磁盘划分为固定长度的空间,可变长方式是指把磁盘划分为长度可变的空间。Windows计算机所用的硬、软盘采用的都是扇区方式。扇区方式中把磁盘分成若干个同心圆的空间,就是磁道磁道,按照固定大小划分成的空间就是扇区。如图所示:
在这里单趋势对磁盘进行物理读写的最小单位,1簇=1扇区=512字节。另外以簇为单位进行读写时,1簇中没有填满的区域会保持不被使用的状态,并且扇区和簇的大小是由处理速度和存储容量的平衡来决定的。