我对汇编了解一点,通用寄存器有 4 到 8 个左右。计算机上的所有程序如何使用这么多的寄存器来工作,特别是多线程和其他所有程序?

有帮助吗?

解决方案

多线程本身并不影响正在使用的寄存器数量。当一个线程被换出时,它通常会将其寄存器保存到内存中,并且下一个要运行的线程会从之前的保存中加载这些寄存器。

一个示例是具有线程控制块结构(TCB)的系统。该结构将包含(当线程未运行时)保存的指令指针、堆栈指针、通用寄存器、浮点寄存器、线程统计信息等。简而言之,需要做的一切工作才能将线程完全恢复到被换出另一个线程运行时的状态。

并不是计算机中发生的所有事情都是在寄存器中完成的。现代编译器可以优化代码,以便将最常用的数据项保存在寄存器中,但绝大多数数据保存在内存中,仅在需要时才购买到寄存器中。

我读过的关于这个主题的最好的书是 塔南鲍姆的 《结构化计算机组织》 它从数字逻辑层到操作系统层对计算机进行分层检查,每个级别都建立在前一个级别的基础上。

           alt text

在旁边: 我的梦想是有一天写一本像这样的书 一切, ,从夸克级到 Emacs :-)

其他提示

在其它变量和线程堆栈通常存储在受保护的存储器空间,在那里它们可以在需要时被调用到寄存器中。

您可能要检查出书元素了解一个很好的了解你的计算机的CPU是如何工作的。这本书被设置为一个系列的,你从一个非门工作到一个CPU,汇编,简单的编译器,以及一个小型的操作系统项目。这是无价的理解所有计算机的部分是如何结合在一起的。

每个时间的螺纹(或过程)换出,所有的寄存器由操作系统内核压入堆栈成通常被称为进程控制块的数据结构。然后,当线程/进程掉期,备份寄存器的数据被从读PCB和弹出堆栈到寄存器。


有也内部寄存器和映射表,该86具有内部那样设置虚拟寄存器表的同时具有更大的灵活性来设计超标量体系结构和复杂指令的调度算法以保留IA32指令集架构。

此外,指令集通常具有负载存储指令,其在与指针存储器一起使用时,允许数据从寄存器存储到存储器中。这是其中术语加载 - 存储机来自,即,计算机不具有直接在内存操作指令。

某些计算机具有对存储器操作的指令;有些是基于堆栈的。这取决于设计者和约束被放置在硬件

您必须认识到,几千到几百万的汇编指令获得,甚至简单的事情执行。这些寄存器越来越交换往往是他们的价值观。

这其实是非常有趣的计算机如何能够使用如此少的寄存器来实现的一切,它的。

有在组件级别(通常由于巧妙得不得了编译器)的真巧妙的编程,使如此少的寄存器来指定,以便有效地使用。

如果一个问题是不可能仅提供的几个寄存器来完成的,该程序将典型的“溢出”它的寄存器到主存储器堆栈。只要记住在栈上,我们把我们打翻寄存器,我们可以轻松地检索他们回来。

当我们需要我们简单地将它们存储在堆栈,这给我们的 FAR 超过我们大多数人的需要为我们的程序空间寄存器的冒了出来。

在多线程的具体情况,我们只是保存所有的寄存器来存储的,那么我们有一个干净的石板其他线程。

这是的事情之一是,计算机的其它存储,特别是RAM,用于:保存和恢复在与出寄存器的数据的比特

当一个线程被切换掉,以便另一个线程可以运行。第一线程寄存器状态被保存某处(堆栈或一些其他数据结构上),并且秒线程的寄存器状态从任何地方被以前保存恢复。 RAM是速度不够快,数以千计的这些开关可以在一秒会发生,但需要足够的时间,如果你不必要交换线程它会影响性能。

另一个非常,很普遍的情况是局部变量 - 如果使用的时间足够短周期的局部变量,它可能永远存在的寄存器之外。然而,在很多情况下,一个局部变量可能需要从寄存器保存到存储位置等等一些其他的值可以加载到一个寄存器操作。同实际发生的几乎任何变量,而不仅仅是本地人(但它更可能对本地从来没有在内存中的存在)。

这是一个非常复杂的问题,答案取决于您的 CPU 架构。

在过去的好日子里,你是对的——确实只有一些通用寄存器。如今,CPU和编译器玩着一个“游戏”三卡蒙特“通过以下技术使用您的通用寄存器 寄存器重命名.

尽管在简单的架构上,当发生上下文切换时,寄存器确实会被复制到[缓存]内存,但诸如此类的技术 表面贴装技术 “愚弄”操作系统,使其认为内核数量比实际数量多。

但对你的问题最普遍的答案是数据被移入和移出寄存器 很多. 。这就是为什么您在任何给定的汇编程序中看到的大量指令都是“MOV”指令。CPU 和编译器设计者花费大量时间和金钱来优化他们的设计,这样你就不会将数据从主内存(缓慢)移动到寄存器中——他们试图尽可能多地缓存数据。如此大量的“MOV”指令就是为什么内存延迟和总线速度对于整个计算机的性能如此重要的原因。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top