开始; 您对线条大小、关联性和线条数的回答是正确的。
标签大小以位为单位?14(缓存中的行数为 2^14,这为我们提供了 14 位用于标记)
标签大小将是“磁盘位置/行大小”,加上一些其他位(例如,用于管理替换策略)。我们不知道磁盘有多大(“大”除外)。
然而; 向后解决这个问题可能不是不合理的——从假设操作系统被设计为支持各种不同的硬盘大小并且标签是一个很好的“2的幂”开始;然后假设 4 位用于其他目的(例如 LRU 的“年龄”)。如果标签是 32 位(非常常见的“2 的幂”),则意味着操作系统可以支持最大磁盘大小为 2 TiB(“1 << (32-4) * 8 KiB”),即 (牢记“面向未来”)对于过去 10 年左右设计的操作系统来说有点太小了。下一个更大的“2 的幂”是 64 位,这对于现代硬件很可能,但对于较旧的硬件(例如 32 位 CPU、较小的磁盘)不太可能。基于“128 MiB of RAM”,我怀疑硬件很旧(例如
换货政策?我完全不确定(可能是近似 LRU 的时钟算法)
回写还是直写?回写(始终与磁盘不一致)写分配?是的,因为在页面错误之后,我们将页面带到内存中进行写入和读取
没有足够的信息可以确定。
字面直写策略将是性能灾难(想象一下,每次将数据推送到堆栈上时,都必须将 8 KiB 写入相对较慢的磁盘)。回写策略对容错非常不利(例如,如果发生电源故障,您将丢失太多数据)。
仅此一项就足以暗示它是某种定制设计(既不是严格回写也不是严格直写)。
使事情更复杂;操作系统可以考虑“驱逐成本”。例如,如果内存中的数据已经在磁盘上,则该页面可以立即重新使用,但如果内存中的数据已被修改,则该页面必须先保存到磁盘,然后才能重新使用内存;因此,如果/当操作系统需要从缓存中逐出数据以腾出空间时(例如,对于最近使用的数据),更倾向于逐出未修改的页面(这更便宜)是合理的。此外; 对于旋转磁盘,操作系统通常会优化磁盘访问以最小化磁头移动(目标是减少寻道时间并提高磁盘 IO 性能)。
在决定何时将修改后的数据写入磁盘时,操作系统可能会结合所有这些因素。
排他性/包容性?我认为非包容性和非独占性(NINE),可能是因为内存映射文件部分在内存中,部分在交换文件或 ELF 文件(程序文本)中。例如,进程堆栈仅在内存中,除非我们用完内存并将其发送到交换文件。我对吗?
如果 RAM 被视为磁盘缓存,则系统是单级存储的示例(请参阅https://en.wikipedia.org/wiki/Single-level_store)并且不是普通操作系统(具有普通虚拟内存 - 例如交换空间和文件系统)。通常,使用单级存储的系统是围绕拥有“持久对象”的想法构建的,根本没有文件。考虑到这一点;我认为做出对正常操作系统有意义的假设是不合理的(例如,假设存在可执行文件,或者支持内存映射文件,或者磁盘的某些部分是“交换空间”而另一个部分磁盘没有)。
然而; 我会假设您对“非包容性和非独占性(九)”是正确的-包容性对性能不利(出于同样的原因,直写对性能不利),而独占性对容错性非常不利(出于同样的原因,回写不利于容错)。