smw*_*dia 19 c memory cpu assembly operating-system
我听到很多数据应该在内存中正确对齐,以提高访问效率.CPU访问内存在字边界上.
因此,在以下场景中,CPU必须进行2次内存访问才能获得单个字.
Supposing: 1 word = 4 bytes
("|" stands for word boundary. "o" stands for byte boundary)
|----o----o----o----|----o----o----o----| (The word boundary in CPU's eye)
----o----o----o---- (What I want to read from memory)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?什么是CPU的根本原因只能读取字边界?
如果CPU只能访问4字节字边界,则地址线应仅需要30位,而不是32位宽.因为CPU的眼中最后2位始终为0.
更重要的是,如果我们承认CPU必须读取字边界,为什么边界不能从我想要读取的地方开始?似乎边界在CPU眼中是固定的.
根据AndreyT的说法,似乎边界设置是硬连线的,它是由内存访问硬件硬连线的.就这一点而言,CPU是无辜的.
非常感谢...
AnT*_*AnT 25
在这种情况下,"can"(在"...... CPU可以访问......")中的含义取决于硬件平台.
在x86平台上,CPU指令可以访问绝对任何边界上对齐的数据,而不仅仅是"字边界".未对齐的访问可能不如对齐访问有效,但其原因与CPU完全无关.它与底层低级内存访问硬件的工作方式有关.在这种情况下,与存储器相关的硬件很可能必须对实际存储器进行两次访问,但这是CPU指令不知道并且不需要知道的事情.就CPU而言,它可以访问任何边界上的任何数据.其余部分透明地实现到CPU指令.
在Sun SPARC等硬件平台上,CPU 无法访问未对齐的数据(简单来说,如果您尝试,程序将崩溃),这意味着如果由于某种原因您需要执行这种错位访问,则必须实现它手动和显式:将其拆分为两个(或更多)CPU指令,从而显式执行两个(或更多)内存访问.
至于为什么会这么......好吧,这就是现代计算机内存硬件的工作原理.数据必须对齐.如果未对齐,则访问效率较低或根本不起作用.
现代记忆的一个非常简化的模型是细胞网格(行和列),每个细胞存储一个数据字.可编程机器人手臂可以将单词放入特定单元格并从特定单元格中检索单词.一次一个.如果您的数据分布在多个单元格中,则除了使用该机械臂连续多次跳闸之外别无选择.在某些硬件平台上,组织这些连续行程的任务对CPU是隐藏的(意味着手臂本身知道如何从多个部件组装必要的数据),在其他平台上它对CPU是可见的(意味着它是负责组织这些连续行程的CPU).
如果您可以对地址进行某些假设(例如“最低n位为零”),则可以节省寻址逻辑中的硅。某些CPU(x86及其工作方式)将放置逻辑,以将未对齐的数据转换为多次提取,从而隐藏了一些内容程序员的讨厌性能降低了性能,该世界以外的大多数CPU都会引发硬件错误,毫无疑问地说明他们不喜欢这样做。
您将听到的有关“效率”的所有争论都是胡扯,或更准确地说,是在乞求这个问题。真正的原因很简单,如果可以减少操作的地址位数,则可以节省处理器内核中的硅。由不对齐的访问(例如在x86世界中)引起的任何效率低下都是硬件设计决策的结果,而不是通常要解决的固有问题。
话虽如此,对于大多数用例来说,硬件设计决策是有意义的。如果你在两字节字访问数据,最常见的用例中有你的访问offset,然后offset+2,再offset+4等等。在访问两个字节的字时,能够按字节递增地址的地址通常(当然是99.44%)不是您想要执行的操作。因此,要求地址偏移量在字边界上对齐并没有什么坏处(在设计数据结构时,这是一种轻度的一次性麻烦),但确实可以节省硅片。
除了历史,我曾经在Interdata Model 70(16位微型计算机)上工作过。它要求所有内存访问都必须是16位对齐的。到我按照当时的标准进行处理时,它的内存也非常少。(即使在那时,这也是一个遗物。)字对齐用于使存储容量增加一倍,因为绕线式CPU很容易被黑客入侵。添加了新的地址解码逻辑,该逻辑在地址的低位取1(以前是对齐错误),并使用它来切换到第二个存储器组。尝试不使用对齐逻辑!:)