我希望它是适合它的地方,我找不到更相关的StackExchange网络来问这个。
我对寄存器文件有疑问,可能是基于(非常)错误的假设,因此对某些人来说可能听起来很傻,所以请光临我。
假设我在汇编语言中编写了一些代码,甚至用更高级的语言编写代码,我在linux操作系统上编译并运行它。
据我所知,当我的程序运行时,它使用CPU 8阵列寄存器文件,而每个阵列都是32位长。 所以,我的程序运行 - 并且可以(并且确实)访问这些32位数组中的每一个。
现在我的问题是: 怎么样,我的计算机,特别是CPU,能够负担得起如此昂贵的资源 - 它的整个SRAM高速缓冲存储器,而不是更少 - 用于一个简单的C / C ++程序,当然,它有更重要的事情要做。做它,以及更广泛,要求更高的流程在后台运行? 我希望我的简单C / C ++程序可以从RAM中获得一个很好的切片来运行。
答案 0 :(得分:1)
如果有两个任务都想要使用CPU,并且机器中只有一个CPU,那么其中一个将运行而另一个将等待。偶尔,计时器中断到来,导致CPU停止运行当前活动的作业并跳转到内核的中断处理程序。
内核可能会决定恢复当前任务,或者给另一个任务一个机会。如果没有人自愿产生CPU(例如等待来自磁盘或网络的数据),那么内核将每秒在它们之间来回切换几次。
确切何时切换任务的决定是一个微妙的平衡:允许单个进程长时间独占CPU使得其他进程看起来没有响应,但是过于频繁的切换会使CPU缓存效率降低(切换后)旧流程留下的缓存内容可能对新流程无用。)
因此从CPU的角度来看,没有“在后台运行”这样的事情。只有一个正在运行的任务,其他一切都只是存储在内存中等待使用的数据。
您对流程获得CPU“切片”的想法并非完全错误 - 您只是在错误的维度中切入。进程没有得到寄存器文件的片段;他们获得整个CPU的时间片。他们被称为 timeslices 。
答案 1 :(得分:1)
您需要区分寄存器和缓存(以及现代多任务处理机器中涉及的各种其他内容):