线程是否有不同的堆?

2024-10-22 08:29:00
admin
原创
82
摘要:问题描述:据我所知,每个线程在由操作系统创建时都会获得一个不同的堆栈。我想知道每个线程是否也有一个与自身不同的堆?解决方案 1:不,所有线程共享一个公共堆。每个线程都有一个私有堆栈,可以快速添加和删除项目。这使得基于堆栈的内存速度很快,但是如果您使用过多的堆栈内存(如无限递归中发生的情况),则会导致堆栈溢出。...

问题描述:

据我所知,每个线程在由操作系统创建时都会获得一个不同的堆栈。我想知道每个线程是否也有一个与自身不同的堆?


解决方案 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 的机制,这就是为什么在分配或释放堆上的内存时需要使用某种类型的进程同步/锁定,例如信号量或互斥锁。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用