1 不读入内存就无法运行
计算机中主要的存储部件是内存和磁盘。磁盘中存储的程序,必 须要加载到内存后才能运行。负责解析和运行程序内容的 CPU,需要通过内部程序计数器来指定内存地址,然后才能读出程序。

2 磁盘缓存加快了磁盘访问速度
磁盘缓存
指的是把从磁盘中读出的数据存储 到内存空间中的方式。这样一来,当接下来需要读取同一数据时,就 不用通过实际的磁盘,而是从磁盘缓存中把内容读出。使用磁盘缓存 可以大大改善磁盘数据的访问速度(图 5-2)。

3 虚拟内存把磁盘作为部分内存来使用
虚拟内存
是指把磁盘的一部分作为假想 的内存来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚 拟内存是假想的内存(实际上是磁盘)。
通过借助虚拟内存,在内存不足时也可以运行程序。例如,在只 剩下 5MB 内存空间的情况下也能运行 10MB 大小的程序。不过,就如 本章开头所讲述的那样,CPU 只能执行加载到内存中的程序。虚拟内 存虽说是把磁盘作为内存的一部分来使用,但实际上正在运行的程序 部分,在这个时间点上是必须存在在内存中的。也就是说,为了实现 虚拟内存,就必须把实际内存(也可称为物理内存)的内容,和磁盘上 的虚拟内存的内容进行部分置换(swap),并同时运行程序。
虚拟内存的方法有分页式和分段式两种。
Windows采用的是分页式
。该方式是指, 在不考虑程序构造的情况下,把运行的程序按照一定大小的页(page) 进行分割,并以页为单位在内存和磁盘间进行置换。
在分页式中,我 们把磁盘的内容读出到内存称为 Page In,把内存的内容写入磁盘称为 Page Out。

4 节约内存的编程方法
通过借助磁盘虚拟内存就可以解决内存不足的问题。而虚拟内存也确实能避免因内存不足导致的应用无法启动。 不过,由于使用虚拟内存时发生的 Page In 和 Page Out 往往伴随着低速的磁盘访问,因此在这个过程中应用的运行会变得迟钝起来。
为了从根本上解决内存不足的问题,需要增加内存的容量,或者 尽量把运行的应用文件变小。
把应用文件变 小的编程方法
(1) 通过 DLL 文件实现函数共有
DLL(Dynamic Link Library)文件
,顾名思义,是在程序运行时可 以动态加载 Library(函数和数据的集合)的文件。此外,还有一个需要 大家注意的地方,那就是多个应用可以共有同一个 DLL 文件。而通过 共有同一个 DLL 文件则可以达到节约内存的效果。


Windows 的操作系统本身也是多个 DLL 文件的集合体。像这样,之所以要利用多个 DLL 文件,其中一个原因 就是可以节约内存。
(2) 通过调用 _stdcall 来减小程序文件的大小
_stdcall 是 standard call(标准调用)的略称。
C 语言中,在调用函数后,需要执行栈清理处理指令。 栈清理
处理是指,把不需要的数据从接收和传递函数的参数时使用的内存 上的栈区域中清理出去。该命令不是程序记述的,而是在程序编译 时由编译器自动附加到程序中的。编译器默认将该处理附加在函数 调用方。


栈清理处理,比起在函数调用方进行,在反复被调用的函数一方进 行时,程序整体要小一些。这时所使用的就是 _stdcall。在函数前加上 _stdcall,就可以把栈清理处理变为在被调用函数一方进行。把代码清单 5-1 中的 int MyFunc(int a, int b) 部分转成 int _stdcall MyFunc(int a, int b) 进行再编译后,和代码清单 5-2 中 add esp, 8 同样的处理就会在函数 MyFunc() 一方执行。

5 磁盘的物理结构
磁盘是通过把其物理表面划分成多个空间来使用的。划分的方式 有 扇区方式和 可变长方式两种,前者是指将磁盘划分为固定长度的空 间,后者则是指把磁盘划分为长度可变的空间。
扇区方式
中,把磁盘 表面分成若干个同心圆的空间就是 磁道
,把磁道按照固定大小(能存储 的数据长度相同)划分而成的空间就是 扇区
(图 5-8)。

扇区是对磁盘进行物理读写的最小单位。一般 1 个扇区是 512 字节。Windows 在逻辑方面(软件方面)对 磁盘进行读写的单位是扇区整数倍 。根据磁盘容量的不同,1 簇可以 是 512 字节(1 簇 = 1 扇区)、1KB(1 簇 = 2 扇区)、2KB、4KB、8KB、 16KB、32KB(1 簇 = 64 扇区)。所有的文件都会占用 1 簇的整 数倍的磁盘空间。