汇编寄存器初学者

6

最近我开始学习汇编,作为初学者,我想请教一个问题。我知道每个进程都有自己的寄存器集,而且每个线程可以修改这些寄存器,但是如果多个线程使用相同的寄存器会不会产生冲突?或者每个线程都有自己的一套寄存器?

6个回答

11
一个线程切换包括保存当前执行上下文的寄存器,并将寄存器加载为要切换到的执行上下文中保存的值(以及其他事情)。 因此,每个线程实际上都有自己的一组寄存器。另外还有自己的堆栈,因为ESP是其中之一。
可以这样思考:通过保存当前寄存器状态并加载新状态的寄存器来获得线程。如果没有发生这种情况,则不是线程切换。如果您还要切换到不同的虚拟地址表集,则所拥有的是进程切换而不是线程切换。
你说:
每个进程都有自己的一套寄存器,每个线程可以修改这些寄存器,对吗?
但这不完全正确。每个CPU核心只有一个寄存器集。这些寄存器在OS切换到不同的线程时更改。但是,在任何一个时间点,CPU核心中只有一个线程在执行。进程实际上没有自己的寄存器,进程拥有线程(或至少一个线程),线程拥有寄存器,或者说拥有一个地方在等待可用于运行的CPU核心时保留寄存器值。

很好的信息,谢谢!所以在上下文切换之前,当前线程会推送fd和ad?然后在弹出它之后就可以继续了? - Dnaiel
@Dnaiel:我不知道他们是否真的使用这些指令,但基本思路是这样的。 - John Knoeller
你可以说每个线程都有自己的寄存器“状态”,当你切换到该进程时,它会被加载到体系结构寄存器中。这包括程序计数器;在恢复所有其他寄存器之后,你跳转(或返回到用户空间)到保存的PC,继续执行。 (@Dnaiel:是的,这包括像EFLAGS这样的特殊寄存器,但也包括堆栈指针本身。使用pushad保存所有寄存器可能适用于协程,而不适用于操作系统的抢占式多任务处理。) - Peter Cordes

4
在硬件中,每个处理器核心只有一个寄存器集。因此,一次只能有一个线程使用这些寄存器。多个线程在单个核心上同时运行,通过快速从一个线程切换到另一个线程来实现。调度哪个线程何时运行是操作系统的工作。
当从一个线程切换到另一个线程时,寄存器的内容被保存到内存的一个特殊区域,并将下一个线程的寄存器复制回处理器。这包括指令指针,因此线程知道在获取控制权后继续执行的位置。这个过程称为上下文切换。
由于操作系统的调度程序位于另一个线程中,因此只有通过一种特殊的硬件特性——中断——才能控制上下文切换。只有操作系统才能安排上下文切换中断。

2

线程是由内核或操作系统完成的,因此程序不需要关心它。如果没有可用的内核或操作系统,则需要自己实现。为此,您需要:

  • 一个函数,将CPU中所有寄存器的状态(SP:堆栈指针、内部寄存器值、PC:程序计数器等)保存在另一个内存空间中,以切换到新线程。
  • 一个函数,将线程环境加载到CPU环境中,并将先前保存的内部寄存器值恢复到CPU寄存器中。

2

您有:

  • 一组进程,它是您操作系统中的一个进程。
  • 每个进程都有一个内存空间,其中包含动态分配的内存、静态数据和代码汇编。
  • 每个进程都有一个线程列表。
  • 每个线程都有自己的寄存器集、程序计数器和堆栈。

通过上下文切换,调度程序会交换线程数据以将执行传递给另一个线程。

通常,进程线程更重,因此存在各种调度方法:

  • 仅在程序内部进行上下文切换(绿色线程),使您的操作系统将其视为单个进程(因此:硬多核)
  • 您可以分配一些真实进程以具有混合方法,从而实现易于多核优化。

1

根据处理器的不同,只有一个寄存器集。而不是每个线程都有一个集合。

有方法可以保存所有寄存器的状态,以便线程可以从离开的地方继续执行。

一些处理器可以实现这一点


0
每个线程都有自己的上下文(context),其中包括寄存器、CPU标志、堆栈等内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接