了解线程的实现方式

时间:2013-03-30 22:07:53

标签: multithreading

我一直在努力了解实现用户空间线程的机制。我无法理解堆栈和框架的机制。我遇到了两个非常好的资源(herehere),它们解释了线程及其实现方式,但我仍然不了解以下细节:

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

1 个答案:

答案 0 :(得分:0)

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