所以我最近一直在进行一些集会,我是初学者,所以我想知道是否有人可以澄清一些事情 . 我认为每个进程都有自己的寄存器集,每个线程都可以修改这些寄存器吗?那么多个线程如何使用相同的寄存器而不会引起冲突?或者每个线程都有自己的寄存器集?
线程上下文切换涉及保存当前执行上下文的寄存器,并使用保存的值从执行上下文开始切换到加载寄存器 . (除其他事项外) . 因此每个线程实际上都有自己的一组寄存器 . 也是它自己的堆栈,因为ESP是寄存器之一 .
考虑这一点的一种方法是通过保存当前寄存器状态并使用新状态加载寄存器来获取线程 . 如果没有发生,那么它不是一个线程切换 . 如果您还要切换到另一组虚拟地址表,那么您所拥有的是一个进程切换而不是一个线程切换 .
你说:
我认为每个进程都有自己的寄存器集,每个线程都可以修改这些寄存器吗?
但这不太对 . 每个CPU内核都有一组寄存器 . 只要操作系统切换到不同的线程,就会更改这些寄存器 . 但是在任何时候CPU核心中只有一个线程在执行 . 进程实际上没有自己的寄存器,进程自己的线程(或至少一个线程),并且线程有寄存器,或者更确切地说是一个位置来保持寄存器的值,同时线程正在等待CPU内核可用于运行 .
在硬件中,每个处理器内核只有一组寄存器 . 因此,一次只有一个线程可以使用寄存器 . 通过从一个线程快速切换到另一个线程,多个线程在单个核心上同时运行 . 调度哪个线程在作业操作系统时运行 .
当从一个线程切换到另一个线程时,寄存器的内容被保存到特殊的存储区域,下一个线程的寄存器被复制回处理器 . 这包括指令指针,因此线程知道在它获得控制权时继续执行的位置 . 此过程称为上下文切换 .
由于操作系统的调度程序位于另一个线程中,因此它只能在运行时调度进程 . 这意味着需要特殊的硬件功能 - 中断 - 来控制上下文切换 . 只有操作系统才能安排上下文切换中断 .
该线程由内核或操作系统完成,因此程序不应该关心它 . 如果没有可用的内核或操作系统,那么您需要自己实现它 . 为此你需要:
一个函数,它将CPU中所有寄存器的状态(SP:堆栈指针,内部寄存器值,PC:程序计数器等......)保存在另一个存储空间中以切换到新线程 .
将线程环境加载到CPU环境的函数,将先前保存的内部寄存器值恢复到CPU寄存器 .
根据处理器的不同,只有一组寄存器 . 每个线程没有一组 .
有一些方法可以保存所有寄存器的状态,以便线程可以占用它停止的位置 .
Some processors facilitate this .
你有
a set of processes 这是您的操作系统之一,
每个 process 都有一个包含 dynamic allocated memory , static data 和 code assembly 的内存空间,
每 process 都有 threads 的清单
每 thread 都有自己的 set of registers , program counter 和 stack
使用 context switch ,您的调度程序交换线程数据以将执行传递给另一个 .
通常 process 比 thread 重,并且存在各种调度方法:
在内部(绿色线程)进行上下文切换到您的程序(您的操作系统只会将其视为单个进程,因此:硬多核)
您可以指定一些实际流程,以实现混合方法,从而实现轻松的多核优化 .
每个线程都有自己的上下文,包括寄存器集,CPU标志,堆栈等 .
6 回答
线程上下文切换涉及保存当前执行上下文的寄存器,并使用保存的值从执行上下文开始切换到加载寄存器 . (除其他事项外) . 因此每个线程实际上都有自己的一组寄存器 . 也是它自己的堆栈,因为ESP是寄存器之一 .
考虑这一点的一种方法是通过保存当前寄存器状态并使用新状态加载寄存器来获取线程 . 如果没有发生,那么它不是一个线程切换 . 如果您还要切换到另一组虚拟地址表,那么您所拥有的是一个进程切换而不是一个线程切换 .
你说:
但这不太对 . 每个CPU内核都有一组寄存器 . 只要操作系统切换到不同的线程,就会更改这些寄存器 . 但是在任何时候CPU核心中只有一个线程在执行 . 进程实际上没有自己的寄存器,进程自己的线程(或至少一个线程),并且线程有寄存器,或者更确切地说是一个位置来保持寄存器的值,同时线程正在等待CPU内核可用于运行 .
在硬件中,每个处理器内核只有一组寄存器 . 因此,一次只有一个线程可以使用寄存器 . 通过从一个线程快速切换到另一个线程,多个线程在单个核心上同时运行 . 调度哪个线程在作业操作系统时运行 .
当从一个线程切换到另一个线程时,寄存器的内容被保存到特殊的存储区域,下一个线程的寄存器被复制回处理器 . 这包括指令指针,因此线程知道在它获得控制权时继续执行的位置 . 此过程称为上下文切换 .
由于操作系统的调度程序位于另一个线程中,因此它只能在运行时调度进程 . 这意味着需要特殊的硬件功能 - 中断 - 来控制上下文切换 . 只有操作系统才能安排上下文切换中断 .
该线程由内核或操作系统完成,因此程序不应该关心它 . 如果没有可用的内核或操作系统,那么您需要自己实现它 . 为此你需要:
一个函数,它将CPU中所有寄存器的状态(SP:堆栈指针,内部寄存器值,PC:程序计数器等......)保存在另一个存储空间中以切换到新线程 .
将线程环境加载到CPU环境的函数,将先前保存的内部寄存器值恢复到CPU寄存器 .
根据处理器的不同,只有一组寄存器 . 每个线程没有一组 .
有一些方法可以保存所有寄存器的状态,以便线程可以占用它停止的位置 .
Some processors facilitate this .
你有
a set of processes 这是您的操作系统之一,
每个 process 都有一个包含 dynamic allocated memory , static data 和 code assembly 的内存空间,
每 process 都有 threads 的清单
每 thread 都有自己的 set of registers , program counter 和 stack
使用 context switch ,您的调度程序交换线程数据以将执行传递给另一个 .
通常 process 比 thread 重,并且存在各种调度方法:
在内部(绿色线程)进行上下文切换到您的程序(您的操作系统只会将其视为单个进程,因此:硬多核)
您可以指定一些实际流程,以实现混合方法,从而实现轻松的多核优化 .
每个线程都有自己的上下文,包括寄存器集,CPU标志,堆栈等 .