【问题标题】:How does linux manage threads stacklinux如何管理线程栈
【发布时间】:2016-10-28 10:15:16
【问题描述】:

在英特尔 x86 32/64 位架构上,每个线程都拥有自己的堆栈。 内核在同一进程的线程之间切换的地方,当前线程的堆栈和寄存器都备份在某处。我想它在堆栈中?

这是否意味着如果我的进程中有 N 个线程,我将在进程内存中有 N+1 个堆栈?还是由内核管理?如果它知道那个线程的 esp/bsp,我可以线程读取另一个线程的堆栈吗? (我说的是同一进程的线程)

【问题讨论】:

    标签: multithreading elf


    【解决方案1】:

    内核在同一进程的线程之间切换的地方,当前线程的堆栈和寄存器都备份在某处。我想它在堆栈中?

    是的,没错。通常,重新调度由timer interrupt 触发。 timer interrupt,与任何其他硬件中断[1] 一样,请求 CPU 停止当前正在工作的工作并执行一些特殊代码,interrupt service routine。内核可以自己设置,所以它只是内核提供的一个功能。通常,内核在中断发生时做的第一件事就是将所有寄存器压入堆栈。内核唯一需要保存的是栈顶,esp。当内核现在切换到另一个线程时,它所要做的就是加载新线程esp 并弹回所有寄存器。

    这是否意味着如果我的进程上有 N 个线程,我的进程内存中将有 N+1 个堆栈?

    您的内存中很可能有 N 个堆栈,内核内存中有 N 个堆栈,作为中断,调用内核代码,加载另一个堆栈。通常,每个线程都有自己的内核堆栈,但不要引用我的话。

    如果它知道那个线程的 esp/bsp,我可以线程读取另一个线程的堆栈吗? (我说的是同一进程的线程)

    是的,你可以。同一进程中的线程共享相同的虚拟地址空间,因此如果您知道线程堆栈的确切位置,您就可以访问该内存。


    [1]:当发生某些事情时,例如键盘上的按键,Programmable Interrupt Controller 从 CPU 的“外部”触发硬件中断。还有一些软件中断,由 cpu/软件本身触发,要么是为了处理错误,要么是为了处理错误(除以零)。软件中断是实现系统调用的一种方式,因为您不能从 ring-3 代码调用 ring-0 代码。但是,如果设置了 TSS,则中断可以“向上”跳转到 ring-0。

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      相关资源
      最近更新 更多