内存和磁盘的亲密关系
0、问题
- 存储程序的方式指的是什么?
在存储装置中保存程序,并逐一运行的方式。 - 通过使用内存来提高磁盘访问速度的机制称为什么?
Disk Cache(磁盘缓存)。 - 把磁盘的一部分作为假想内存来使用的机制称为什么?
Virtual Memory(虚拟内存)。 - Windows中,在程序运行时,存储着可以动态加载调用的函数和数据的文件称为什么?
DDL文件。 - 在EXE程序文件中,静态加载函数的方式称为什么?
静态链接。 - 在Windows计算机中,一般一个扇区是多少字节?
512 Byte
从具有存储程序命令和数据这点来看,内存和磁盘的功能是相同的。
计算机五大部件:输入装置、输出装置、存储器、运算器、控制器。
内存(主要指主存,即负责存储CPU中运行的程序指令和数据的内存)和磁盘就属于存储部分。
从存储容量看,内存是高速低价,而磁盘是低速高价。
1、不读入内存就无法运行
存储程序方式:程序保存在存储设备中,有序地被读出来实现运算。
磁盘中存储的程序,要加载到内存中才能运行。
这是为何呢?
因为负责程序解析和运行的CPU,要通过其内部的程序计数器来指定内存地址,进而读出程序。
即使CPU可以直接读出并运行磁盘中保存的程序,但是磁盘读取速度慢,程序额运行速度还是会降低。
2、磁盘缓存加快了磁盘访问的速度
磁盘缓存:把从磁盘中读取的数据存储到内存空间中的方式。
所以,磁盘缓存是通过使用内存来提高磁盘访问速度的机制。
把”低速“设备的数据保存到”高速“设别中,需要时再从”高速“设备中读取,这种“缓存”的方式在其他地方也会见到。
其中的一个实例就是在Web浏览器中的使用。
由于Web浏览器是通过网络来获取远程Web服务器的数据并将其显示出来的。
因此,在显示较大的图片等文件时,会花费不少时间。
于是,Web浏览器就可以把获取的数据暂时保存在磁盘中,然后在需要时再显示磁盘中的数据。
也就是说,把低速的网络数据保存到相对高速的磁盘中。
3、虚拟内存把磁盘作为部分内存使用
虚拟内存:指把磁盘的一部分作为假想的内存来使用。
“虚拟内存”和“磁盘缓存”是相对的。
- 虚拟内存是假想的内存,实际上是磁盘。
- 磁盘缓存是假想的磁盘,实际上是内存。
借助于虚拟内存,在内存不足的时候也可以运行程序。但是要时刻记住,某个时间点正在运行的程序必须存在于内存中!!!
CPU只能执行加载到内存中的数据!!!
所以说,虽然是“虚拟内存”,但是某个时间的运行程序还是存在于内存中的。
换句话说,为了实现虚拟内存,就必须把实际内存的数据和虚拟内存的数据进行部分置换,并同时运行程序。
按照我自己的理解,打个比方就是虚拟内存中数据和内存中的数据很熟很熟,熟到虚拟内存中的数据想上CPU运行时,只要跟内存中的数据说一声,然后两者置换一下就行了,虚拟内存的数据就可以上CPU正常的运行。
虚拟内存的实现方式有分页式和分段式。
分页式:把运行的程序按照一定大小的页(page)进行分割,并以page为单位在内存和磁盘间进行置换。
分段式:把要运行的程序分割成“处理集合”及“数据集合”等为单位的段落,然后以分割后的单位在内存和磁盘间进行置换。
我们日常使用的Windows操作系统就是采用“分页式”。
4、节约内存的编成方法
虚拟内存也确实能避免因内存不足导致的应用无法启动,但是虚拟内存不能解决内存不足的问题,只能说缓解。因为使用虚拟内存时发生的 Page In和 Page Out往往伴随着低速的磁盘访问,因此在这个过程中应用的运行会变得迟钝起来。
所以说,虚拟内存无法彻底解决内存不足的问题。
为了从根本上解决内存不足的问题,无非就是增加内存的容量,或者尽量把运行的应用文件变小。增加内存容量很直接,但是囊中羞涩啊。
所以我选择把应用文件变小的编程方法,常见有两种:
- 通过DDL文件实现函数共有
- 通过调用 _stdcall 来减小程序文件的大小
第一种:通过DDL文件实现函数共有
DDL(Dynamic Link Library):动态链接库,在程序运行时可以动态加载Library(函数和数据的集合体)的文件。
一般多个应用可以共有同一个DLL文件,而通过共有同一个 DLL文件则可以达到节约内存的效果。
Windows的操作系统本身也是多个DLL文件的集合体,有时在安装新应用时DLL文件也会被追加,应用则会通过利用这些DLL文件的功能来运行。
之所以要利用多个DLL文件,原因有两个:
- 可以节约内存
- 在不变更EXE文件的情况下,只通过升级DLL文件就可以更新应用
第二种:通过调用 _stdcall 来减小程序文件的大小
5、磁盘的物理结构
磁盘的物理结构:磁盘存储数据的形式。
磁盘是通过将其物理表面划分成多个空间来使用的,根据划分的方式分为:
- 扇区方式:划分为固定长度的空间。
- 可变长方式:划分为长度可变的空间。
一般Windows操作系统使用硬盘和软盘都是扇区方式。
磁道:把磁盘表面分成若干个同心圆空间。
扇区:把磁道按照固定大小划分而成的空间。
Windows对磁盘进行读写的单位是扇区的整数簇倍,所以“扇区是对磁盘进行读写的最小单位”。
在软盘中,1簇 = 512 Byte = 1个扇区
- 无论软盘、硬盘,不同文件是不能存储同一个簇中的。
- 无论文件再小,都会占用一个簇的空间。
- 所有文件都会占用1簇的整数倍的磁盘空间。
- 磁盘的数据保存是以簇为单位。
- 以簇为单位进行读写时,1簇中没有被填满的区域会保持不被使用的状态。
注:如有错误,敬请指正!