线程是否有不同的堆?
- 2024-10-22 08:29:00
- admin 原创
- 82
问题描述:
据我所知,每个线程在由操作系统创建时都会获得一个不同的堆栈。我想知道每个线程是否也有一个与自身不同的堆?
解决方案 1:
不,所有线程共享一个公共堆。
每个线程都有一个私有堆栈,可以快速添加和删除项目。这使得基于堆栈的内存速度很快,但是如果您使用过多的堆栈内存(如无限递归中发生的情况),则会导致堆栈溢出。
由于所有线程共享同一个堆,因此必须同步对分配器/释放器的访问。有多种方法和库可以避免分配器争用。
某些语言允许您创建私有内存池或单独的堆,您可以将其分配给单个线程。
解决方案 2:
默认情况下,C 只有一个堆。
也就是说,一些线程感知的分配器将对堆进行分区,以便每个线程都有自己的分配区域。这样做的目的是使堆的扩展性更好。
这种堆的一个例子是Hoard。
解决方案 3:
取决于操作系统。Windows 和 Unix 上的标准 C 运行时使用跨线程共享堆。这意味着锁定每个 malloc/free。
例如,在 Symbian 上,每个线程都有自己的堆,尽管线程可以共享指向任何堆中分配的数据的指针。我认为 Symbian 的设计更好,因为它不仅消除了在分配/释放期间锁定的需要,而且还鼓励线程之间明确指定数据所有权。此外,在这种情况下,当线程死亡时,它会带走它分配的所有对象 - 即它不能泄漏它已分配的对象,这是内存受限的移动设备中的一个重要属性。
Erlang 也遵循类似的设计,以“进程”作为垃圾收集的单位。所有数据都通过复制在进程之间传递,除了引用计数的二进制 blob(我认为)。
解决方案 4:
每个线程都有自己的堆栈和调用堆栈。
每个线程共享同一个堆。
解决方案 5:
这取决于你说“堆”时到底是什么意思。
所有线程共享地址空间,因此所有线程都可以访问堆分配的对象。从技术上讲,堆栈也是共享的,也就是说,没有什么可以阻止您访问其他线程的堆栈(尽管这样做几乎没有任何意义)。
另一方面,堆结构用于分配内存。堆内存分配的所有记录都在这里完成。这些结构经过精心组织,以尽量减少线程之间的争用 - 因此一些线程可能共享一个堆结构(一个竞技场),而一些线程可能使用不同的竞技场。有关
详细信息的出色解释,请参阅以下线程:malloc 如何在多线程环境中工作?
解决方案 6:
通常,线程共享堆和其他资源,但是有些线程类结构不共享。这些线程类结构包括 Erlang 的轻量级进程和 UNIX 的完整进程(通过调用 创建fork()
)。您可能还在处理多台机器并发,在这种情况下,您的线程间通信选项会受到很大限制。
解决方案 7:
一般来说,所有线程都使用相同的地址空间,因此通常只有一个堆。
然而,它可能有点复杂。你可能正在寻找线程本地存储(TLS),但它只存储单个值。
Windows 特定:TLS 空间可以使用TlsAlloc分配,并使用TlsFree释放(概述在这里)。同样,它不是堆,只是 DWORD。
奇怪的是,Windows 支持每个进程有多个堆。可以将堆的句柄存储在 TLS 中。然后,您将获得类似“线程本地堆”的东西。但是,其他线程不知道句柄,它们仍然可以使用指针访问其内存,因为它仍然是相同的地址空间。
编辑:一些内存分配器(特别是FreeBSD 上的jemalloc)使用 TLS 为线程分配“竞技场”。这样做是为了通过减少同步开销来优化多核的分配。
解决方案 8:
在 FreeRTOS 操作系统上,任务(线程)共享相同的堆,但每个任务都有自己的堆栈。这在处理低功耗低 RAM 架构时非常方便,因为同一个内存池可以被多个线程访问/共享,但这有一个小问题,开发人员需要记住需要一种同步 malloc 和 free 的机制,这就是为什么在分配或释放堆上的内存时需要使用某种类型的进程同步/锁定,例如信号量或互斥锁。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件