在最近有关碎片整理实用程序的讨论中,出现的一个问题是 MS-DOS 是否缓冲了 FAT 扇区,如果是,那么缓冲的程度如何。
1
最佳答案
3
幸运的是,我们现在有了 DOS 1、2 和 4 版本的源代码。[1]
IBM DOS 1.25(1982年)
(IBM PC 推出一年后)。
正如在 中看到的MSDOS.ASM
, 对 的评论FATREAD
指出:
如果磁盘可能已更改,则读取 FAT 并将缓冲区标记为无效。如果没有,则不采取任何措施。
因此 FAT 始终被缓存,并在磁盘更改时再次读取。
有一个单扇区缓冲区。
IBM DOS 2.0(1983年)
(与 IBM PC/XT 同一年)。
源代码已为硬盘(HRDDRV.ASM
分别为HRDDRV.SYS
)提供了配置。 中有一个通用缓冲区管理BUF.ASM
,而 FAT 缓冲区有特殊字段(BUFWRTCNT
、BUFWRTINC
)来处理多个 FAT 副本,FAT 的管理方式与普通扇区类似。
可能希望相应的 FAT 扇区能够被足够频繁地访问,以便大多数时间都能将正确的 FAT 扇区保留在内存中,但是对于更大的硬盘,极其碎片化的文件可能会导致“FAT 抖动”,即需要读取 FAT 扇区。
对这个话题有以下看法 [2]:
新的 MS-DOS 不会始终将文件分配表保存在内存中。相反,这些表与部分数据传输共享扇区缓冲区的使用。这意味着在任何时候,FAT 都可能全部、部分或完全不在内存中。缓冲区处理算法可能会将经常使用的扇区保存在内存中,这也适用于 FAT 的各个扇区。DOS 中的这一变化完全违背了我最初的设计原则。内存越来越便宜,因此将几千个字节专用于 FAT 应该是完全无痛的。现在我们又回到了执行磁盘读取只是为了找出数据在哪里。在随机访问大型碎片文件的情况下(例如,当访问占了小型 Winchester 磁盘一半的数据库时),可能需要以随机顺序访问 FAT 的几个扇区,以找到所需的分配单元。
由于缓冲代码已经区分了 FAT 和非 FAT 扇区,因此引入两组缓冲区(一组用于 FAT 扇区,一组用于非 FAT 扇区)并且两个池大小都可以独立配置是极其容易的,但由于某种原因,这并没有这样做。
IBM DOS 4.0(1988年)
此 DOS 版本引入了大于 32MB 的分区大小。缓冲区现在已散列,并且可以存储在 EMS 中。缓冲区已获得一个标志字节,其中包含用于 FAT 扇区/目录扇区/纯数据的位。但是,仍然可以看到 DOS 2.0 中的大多数原始例程。
另一方面,它现在有一个名为FASTOPEN [3]的扩展:
FASTOPEN 是一种非常专业的磁盘缓存。FASTOPEN 仅缓存文件搜索和文件打开,并且比磁盘缓冲区效率高得多。当典型应用程序搜索文件(例如 PATH 搜索)时,它需要读取包含大量不相关信息的目录扇区和 FAT 扇区。在磁盘缓冲区数量相对较少(10 个左右)的典型情况下,磁盘搜索倾向于强制退出所有有用的文件缓冲区并将其替换为相对不重要的目录/FAT 缓冲区,从而导致磁盘 I/O 增加。对于较大的磁盘(在 100MB 以上范围内),这是一个问题。FASTOPEN 需要更少的内存来缓存相同的信息,从而提高了磁盘缓冲区的效率。
此外,在 DOS 4.0 中,FASTOPEN 还实现了所谓的 FASTSEEK 功能。这是另一个用于快速访问文件范围信息的专用缓存。随着文件变得越来越大且碎片化,定位文件的各个部分可能需要大量的磁盘访问来读取和处理 FAT,并且昂贵的寻道会在 FAT(位于磁盘的开头)和数据区域之间移动
概括
始终实施 FAT 信息缓存,但从 2.0 开始,它对于大分区(和非常零散的文件)变得效率低下。这个问题在 4.0 中得到了纠正。
使用来源:
- [1]
- [2]
- [3]
|
在 DOS 3.0 之前,卷上的簇数限制为 4095,而具有 4095 个簇的卷的 FAT 需要 6K RAM 才能全部保存。即使在具有 192K 和一个 10MB 硬盘的系统上(规格与我进行编程的第一台 IBM PC 相匹配),花费 4K RAM 始终在内存中保存 FAT 的副本可能不是最佳的资源利用方式。如果系统的缓冲逻辑优先考虑 FAT 扇区,而不是任何不包含当前打开的文件将读取的下一个数据的数据扇区,那么可能会很有用,但在大多数情况下,FAT 中任何有用的部分都会通过最近最少使用的算法保存在内存中。
2
-
3“花费 4K RAM 始终在内存中保存 FAT 的副本” 1. 您之前说过每个 FAT 为“6K”,这与实际可能需要的近 6 KiB 相匹配。 2. 6 KiB 是每个驱动器的数字,并且具有硬盘的系统必须至少支持 3 个驱动器,因此 3 个驱动器的 FAT 为 18 KiB。
– -
2@ecm:具有 4096 个簇的驱动器需要保留 6K 的 FAT。10MB 驱动器大约有 2,500 个簇,需要 3.5K 到 4K 的 FAT 条目,即每个 512 字节的 8 个扇区。
–
|
当我去现场修理 DOS PC 时,有一半的时间意味着要插上电源、打开开关或调高亮度。
但无论我做了什么,我总是增加缓冲区config.sys
。它从根本上改善了拼写检查等功能,在拼写检查中,您无法将整个词典保存在内存中,但可以保留整个 FAT 常驻内存以在搜索单词时运行集群链。
当你的超能力(理解事物)能够帮助别人时,这真是太棒了——使他们的工作更快、更轻松、生活更美好。
比如,我注意到数据输入终端以 1200 波特运行。在 Unix 中,您可以在系统运行时重新配置串行端口,我一个接一个地让数据输入人员高兴得咯咯笑。他们大部分时间都闲着等屏幕刷新。老板也喜欢这样。
|
–
|