线程是否有不同的堆?

2024-10-22 08:29:00
admin
原创
281
摘要:问题描述:据我所知,每个线程在由操作系统创建时都会获得一个不同的堆栈。我想知道每个线程是否也有一个与自身不同的堆?解决方案 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 的机制,这就是为什么在分配或释放堆上的内存时需要使用某种类型的进程同步/锁定,例如信号量或互斥锁。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   1  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   2  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用