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