一个寄存器文件怎么样?

时间:2013-12-10 00:29:04

标签: caching memory-management

我希望它是适合它的地方,我找不到更相关的StackExchange网络来问这个。

我对寄存器文件有疑问,可能是基于(非常)错误的假设,因此对某些人来说可能听起来很傻,所以请光临我。

假设我在汇编语言中编写了一些代码,甚至用更高级的语言编写代码,我在linux操作系统上编译并运行它。

据我所知,当我的程序运行时,它使用CPU 8阵列寄存器文件,而每个阵列都是32位长。 所以,我的程序运行 - 并且可以(并且确实)访问这些32位数组中的每一个。

现在我的问题是: 怎么样,我的计算机,特别是CPU,能够负担得起如此昂贵的资源 - 它的整个SRAM高速缓冲存储器,而不是更少 - 用于一个简单的C / C ++程序,当然,它有更重要的事情要做。做它,以及更广泛,要求更高的流程在后台运行? 我希望我的简单C / C ++程序可以从RAM中获得一个很好的切片来运行。

2 个答案:

答案 0 :(得分:1)

如果有两个任务都想要使用CPU,并且机器中只有一个CPU,那么其中一个将运行而另一个将等待。偶尔,计时器中断到来,导致CPU停止运行当前活动的作业并跳转到内核的中断处理程序。

内核可能会决定恢复当前任务,或者给另一个任务一个机会。如果没有人自愿产生CPU(例如等待来自磁盘或网络的数据),那么内核将每秒在它们之间来回切换几次。

确切何时切换任务的决定是一个微妙的平衡:允许单个进程长时间独占CPU使得其他进程看起来没有响应,但是过于频繁的切换会使CPU缓存效率降低(切换后)旧流程留下的缓存内容可能对新流程无用。)

因此从CPU的角度来看,没有“在后台运行”这样的事情。只有一个正在运行的任务,其他一切都只是存储在内存中等待使用的数据。

您对流程获得CPU“切片”的想法并非完全错误 - 您只是在错误的维度中切入。进程没有得到寄存器文件的片段;他们获得整个CPU的时间片。他们被称为 timeslices

答案 1 :(得分:1)

您需要区分寄存器和缓存(以及现代多任务处理机器中涉及的各种其他内容):

  1. 在调度程序时隙的持续时间内,寄存器文件确实专门分配给您的程序。但是,在上下文切换中完全重新加载它并不是一件大事 - 毕竟,你最终可能会在一个简单的函数调用上重新加载整个寄存器文件(如果你的函数有很多局部变量)。
  2. 缓存更复杂。首先,它非常依赖于特定的CPU实现 - 更简单/更旧的CPU确实可以在上下文切换上刷新缓存,但没有现代高端CPU可以做到这一点。如果缓存是“物理映射”的(缓存地址标记对应于物理内存位置,并且在缓存访问之前发生虚拟地址转换),则CPU和OS都不必对上下文切换执行任何特殊操作。 “逻辑映射”缓存(使用虚拟地址标记缓存行的缓存,以便稍微减少缓存访问延迟)将在每一行上具有额外的“任务标记”。操作系统在上下文切换时,会将一些值设置为“任务ID”寄存器,缓存硬件将使用该寄存器来建立,无论是属于当前正在运行的进程还是应该替换的任何行。