c - 从内存中获取操作数的最坏情况时间

标签 c assembly

我不确定如何解决这个问题。有人可以解释我应该采取的步骤,因为我需要理解这个问题。

考虑到地址对齐,从具有 60 纳秒周期时间和 8 位宽数据总线的存储器中获取 4 字节操作数所需的最坏情况时间是多少?

提前致谢

最佳答案

假设没有缓存或 TLB 未命中,使用精心设计的处理器的“典型”最坏情况应该是四次单字节读取,耗时 60ns --> 240ns。这可能是预期的答案。

要真正回答这个问题,您需要考虑反常情况。

有评论指出,如果硬件出现故障,可能需要无限的时间,但这是一个开玩笑的回答。

但即使硬件没有出现故障,它也可能比您想象的要花费更长的时间。

另一位评论者指出,如果有页面映射,您可能会对页面映射 ("TLB") 重新填充感到惊讶。 TLB 未命中以重新填充页面转换槽可能需要在实际数据读取开始之前读取一个或通常为几个字节的“字”(指针/保护位)。

然后考虑您的 4 字节值跨越虚拟页面边界的情况,并且至少有一个虚拟页面已从物理内存中推出到磁盘上的页面文件。然后访问时间由查找/旋转/读取/调整内存映射的时间决定,所有这些都可能需要几十毫秒(如果磁头必须查找很远的距离,则更多)。

如果两个页面都被推送到磁盘,您可能会面临 2 次寻道时间。如果驱动器已经减速并且必须加速,则延迟会更多。

一个设计糟糕的操作系统可能会陷入较低地址的页面不存在,然后在第一页页面,重新启动指令,在第二页出现页面不存在错误,驱逐第一页以进行第二页的空间,再次重新启动有问题的指令,然后重复此循环。然后访问可以永远进行,而不会出现硬件故障。我假设现代操作系统锁定顺序虚拟页面对以避免这种情况。 (如果您考虑到指令体可能跨越页面边界,并且也可能不存在于内存映射中,这会变得非常疯狂)。

关于c - 从内存中获取操作数的最坏情况时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22027800/

相关文章:

c - C iph_tos 中的 IP header 的含义是什么?

C bsearch 总是返回 pointer=NULL

c - 如何将 Linux 内核驱动模块添加为 Buildroot 包?

c - 在回调中收到时数据指针已更改

c - switch case在c语言中与数组一起使用

assembly - POPCNT是如何在硬件中实现的?

c++ - 编译 flex.cc 会报错

c - 在 C 中使用内联汇编的错误

c - PIC32速度: Optimizing c code

assembly - MOV moffs32 在 64 位模式下对地址进行符号或零扩展?