2

我一直在尝试了解实现用户空间线程的机制。我无法理解堆栈和框架的机制。我遇到了两个非常棒的资源(这里这里),它们解释了线程以及它是如何实现的,但我仍然不明白以下细节:

  1. 线程执行中如何使用机器上下文?我知道它由一个堆栈指针和一堆寄存器值组成。但是操作系统究竟是如何使用它来执行线程的呢?
  2. 为什么我们需要一个蹦床函数(mctx_create_trampoline)?在链接 #2 中,他们设置了一个函数作为信号处理程序,用于保存机器上下文并启动线程函数 (mctx_create_boot)。
  3. 基于这些函数,如何实现线程可以调用的“yield”函数?另外,我们如何中断正在运行的线程?我假设你有一个计时器和 SIGALRM,它会在它关闭时调用一个信号处理程序。但是如果 yield 函数切换上下文,那么信号处理程序将不会返回,这将阻止进一步的信号传递。
4

1 回答 1

1
  1. 一旦线程开始在物理 CPU 上执行,操作系统就不再参与,直到时间片到期或需要进行一些其他重新调度。所以关键问题是:线程是如何调度到物理 CPU 上的?好吧,操作系统将物理 CPU 寄存器设置为适当的值并跳转到线程上次中断的位置(实际上设置了指令指针)。此时操作系统已失去控制,不再参与其中。只有在发生硬件中断或某些其他物理 CPU 内核决定接管 CPU 时,它才能重新获得控制权。
  2. 目前无法打开该文档。
  3. “yield”不能在用户空间中实现。它通常是一个内核 API,它选择一些其他线程来调度并将其调度到当前 CPU。
于 2013-03-30T22:20:25.343 回答