【发布时间】:2011-01-25 06:07:41
【问题描述】:
所以我最近一直在进行一些组装,而且我是初学者,所以我想知道是否有人可以澄清一些事情。我认为每个进程都有自己的一组寄存器,每个线程都可以修改这些寄存器对吗?那么多个线程如何使用相同的寄存器而不引起冲突呢?还是每个线程都有自己的一组寄存器?
【问题讨论】:
所以我最近一直在进行一些组装,而且我是初学者,所以我想知道是否有人可以澄清一些事情。我认为每个进程都有自己的一组寄存器,每个线程都可以修改这些寄存器对吗?那么多个线程如何使用相同的寄存器而不引起冲突呢?还是每个线程都有自己的一组寄存器?
【问题讨论】:
线程上下文切换涉及保存当前执行上下文的寄存器,并使用从执行上下文开始切换到的保存值加载寄存器。 (除其他事项外)。所以每个线程实际上都有自己的一组寄存器。也是它自己的堆栈,因为 ESP 是寄存器之一。
考虑这一点的一种方法是通过保存当前寄存器状态并加载具有新状态的寄存器来获取线程。如果这没有发生,那么它不是线程切换。如果您还切换到一组不同的虚拟地址表,那么您所拥有的是进程切换而不是线程切换。
你说:
我认为每个进程都有自己的一组寄存器,每个线程都可以修改这些寄存器对吗?
但这并不完全正确。每个 CPU 内核都有一组寄存器。每当操作系统切换到不同的线程时,这些寄存器都会更改。但是在任何时候,一个 CPU 内核中只有一个线程在执行。进程实际上并没有自己的寄存器,进程自己的线程(或至少一个线程),线程有寄存器,或者更确切地说是在线程等待 CPU 内核可用时保存寄存器值的地方继续运行。
【讨论】:
pushad 保存所有 reg 可能是您为协程所做的事情,而不是操作系统抢先式多任务处理。)
在硬件中,每个处理器内核只有一组寄存器。因此,一次只能有一个线程使用这些寄存器。通过从一个线程快速切换到另一个线程,多个线程在单个内核上同时运行。调度哪个线程在操作系统的工作时间运行。
当从一个线程切换到另一个线程时,寄存器的内容被保存到内存的一个特殊区域,并且下一个线程的寄存器被复制回处理器。这包括指令指针,因此线程知道当它重新获得控制权时在哪里继续执行。这个过程称为上下文切换。
由于操作系统的调度程序在另一个线程中,它只能在运行时调度进程。这意味着需要一个特殊的硬件特性——中断——来控制上下文切换。只有操作系统可以安排上下文切换中断。
【讨论】:
线程是由内核或操作系统完成的,所以程序不应该关心它。如果没有可用的内核或操作系统,那么您需要自己实现它。为此,您将需要:
【讨论】:
你有
使用 上下文切换,您的调度程序会交换线程数据以将执行传递给另一个。
通常进程比线程重,并且存在各种调度方法:
【讨论】:
【讨论】:
每个线程都有自己的上下文,其中包括寄存器集、CPU标志、堆栈等。
【讨论】: