multithreading - 了解如何实现线程

标签 multithreading

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

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

  • 一旦触发了在物理CPU上执行线程的任务,则直到时间片到期或需要进行其他一些重新调度后,操作系统才不再参与其中。因此,关键问题是:如何将线程调度到物理CPU?好的,操作系统将物理CPU寄存器设置为适当的值,然后跳转到上次中断线程的位置(实际上设置了指令指针)。此时,操作系统已失去控制,不再参与其中。它仅在发生硬件中断或某些其他物理CPU内核决定控制CPU时才能重新获得控制。
  • 目前无法打开该文档。
  • “yield”无法在用户空间中实现。通常,它是一个内核API,它选择其他一些线程进行调度并将其调度到当前CPU。
  • 关于multithreading - 了解如何实现线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15724031/

    相关文章:

    java - 为潜在的并发问题编写证明

    c++ - 带线程的 C/C++ 数组——我需要使用互斥锁还是锁?

    multithreading - .NET 4.5 增加 WCF 客户端调用异步?

    java - 线程状态 TimedWait。如何调试?

    java - hadoop中的 transient 变量和静态方法,dev求教

    c++ - 我是否需要同步 std::condition_variable/condition_variable_any::notify_one

    c++ - 当超过 12 个线程时,pthread_create 段错误?

    c++ boost导致崩溃

    Python多线程两行代码

    python - 并行运行两个嵌套的 for 循环以创建矩阵