每个线程都有自己的堆栈吗?
Posted
技术标签:
【中文标题】每个线程都有自己的堆栈吗?【英文标题】:Does each thread have its own stack? 【发布时间】:2013-08-23 09:35:25 【问题描述】:当我从一个进程创建多个线程时,每个线程都有自己的堆栈,还是它们共享父进程的堆栈。当线程进行系统调用时会发生什么?线程是否也像进程一样维护自己的内核堆栈?
【问题讨论】:
是线程特定堆栈!,全局值可在线程之间共享(本地非) @GrijeshChauhan 当我们从线程进行系统调用时会发生什么? 例如如果你调用open()
系统调用来打开一个文件。使用int f = open()
然后当然f
是线程本地的。但请记住文件描述符在线程之间共享。如果您知道f
的值,那么您可以在不同的线程中使用该值来访问同一个文件(您不需要再次打开)
Each thread has a reserved region of memory referred to as its stack.
@LidongGuo No. 线程语义是两个委员会合作的一件事。 (接口有所不同,因为 C 显然不能为线程、互斥锁等提供“对象”,但语义是相同的。)
【参考方案1】:
是的,线程有自己的堆栈和自己的内核堆栈(例如 linux)。
当一个线程进行系统调用时,你陷入内核模式(从用户模式),你将参数传递给内核,检查参数,内核做它需要做的事情(在内核堆栈中),将最终值返回给线程并返回用户模式。
【讨论】:
内核如何在没有堆栈的情况下完成“需要做的事情”? 我会在我的回答中澄清 内核堆栈只是添加到预先存在的模型上的安全预防措施。多栈是多线程的先决条件。内核本质上提供了用户空间中发生的任何事情的并行版本,以防止敏感数据泄露。 @Potatoswatter 内核线程如何提高安全性?据我了解,它是为提高性能而设计的。以上是关于每个线程都有自己的堆栈吗?的主要内容,如果未能解决你的问题,请参考以下文章