我知道每个线程通常都有一个调用堆栈,它只是一个内存块,并使用esp和ebp进行控制。
这些调用堆栈是如何创建的,是谁负责的?我猜是运行时,例如iOS应用程序的Swift运行时。线程是通过esp和ebp或通过运行时直接与自己的调用堆栈对话吗?
2,对于每个调用堆栈,它们必须与esp和ebb cpu寄存器一起工作,如果我有一个具有2个内核的CPU (4个线程),那么假设它有4个核心(指令集)。这是否意味着每个调用堆栈将只处理特定核心中的这些寄存器?
发布于 2019-10-16 04:16:15
(我假设Swift线程就像其他语言中的线程一样。实际上并没有很多好的选择,无论是普通的OS级线程还是用户空间的“绿色线程”,或者两者的混合。区别只是在发生上下文切换的情况下;主要概念仍然相同)
每个线程都有自己的堆栈,由mmap或父线程在进程的地址空间中分配,或者通过创建线程的同一个系统调用来分配。iOS系统调用。在Linux中,您必须将一个void *child_stack传递给实际创建一个新线程的clone(2)系统调用。直接使用特定于操作系统的低级别系统调用是非常罕见的;语言运行库可能会在像pthread_create这样的线程函数的基础上执行线程处理,而线程库将处理特定于操作系统的详细信息。
是的,每个软件线程都有自己的体系结构状态,包括x86-64或论AArch64上的RSP。(如果您制作了过时的32位x86代码,也可以使用ESP )。我认为框架指针是可选的,对斯威夫特。
是的,每个逻辑核心都有自己的体系结构状态(寄存器包括堆栈指针);软件线程在逻辑核心上运行,并且在软件线程之间切换保存/恢复寄存器。相关的,可能是线程之间共享哪些资源?的副本。
软件线程共享相同的页表(虚拟地址空间),但不共享寄存器。
https://stackoverflow.com/questions/58405568
复制相似问题