首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >linux中的内存分配是否是非阻塞的?

linux中的内存分配是否是非阻塞的?
EN

Stack Overflow用户
提问于 2011-01-05 09:59:50
回答 4查看 5K关注 0票数 21

我很想知道使用默认的new操作符分配内存是否是非阻塞操作。

例如:

代码语言:javascript
复制
struct Node {
    int a,b;
};

..。

代码语言:javascript
复制
Node foo = new Node();

如果多个线程试图创建一个新的节点,如果其中一个线程在分配过程中被操作系统挂起,是否会阻止其他线程取得进展?

我问这个问题的原因是因为我有一个创建新节点的并发数据结构。然后,我修改了算法以回收节点。在24核机器上,这两种算法的吞吐量性能几乎相同。然而,我随后创建了一个在所有系统内核上运行的干扰程序,以便创建尽可能多的操作系统抢占。与回收节点的算法相比,创建新节点的算法的吞吐量性能降低了5倍。

我很好奇为什么会发生这种情况。

谢谢。

*编辑:告诉我linux的c++内存分配器的代码也会很有帮助。我试着在张贴这个问题之前寻找,但很难找到它。

EN

回答 4

Stack Overflow用户

发布于 2011-01-05 10:55:20

在多线程系统中,malloc()free() (以及new / delete)通常使用同步原语来确保从多线程调用它们是安全的。

这种同步也会影响一些应用程序的性能,特别是在高度并行的环境中进行大量分配和释放的应用程序。更有效的多线程内存分配器是一个活跃的研究领域-有关两个著名的分配器,请参见jemalloctcmalloc

票数 4
EN

Stack Overflow用户

发布于 2011-01-05 10:09:08

这真的和this question差不多。

基本上,malloc没有被定义为线程安全的,但是实现者可以自由地添加实现以使其线程安全。从你的描述中,听起来你的特定版本是。

可以肯定的是,用欧比万的话说,“使用源头,卢克。”malloc源码将会出现,它通常很容易阅读。

@Mark,你可以通过以下方式获得标准的GNU libc源代码

代码语言:javascript
复制
$ git clone git://sourceware.org/git/glibc.git
$ cd glibc
$ git checkout --track -b glibc-2_11-branch origin/release/2.11/master

另请参见here。请记住,malloc位于手册的第3部分--它是一个库函数,因此它不会出现在内核源代码中。但是,您可能需要向下阅读brksbrkgetrlimitsetrlimit等命令,才能了解内核的功能。

还有一个链接:GCC project

好的,还有一个(我可以随时停下来):here's a page,你可以从它下载源代码。解压该文件,您可以在./malloc/malloc.c中找到它。

票数 3
EN

Stack Overflow用户

发布于 2011-01-05 10:13:32

这个问题有很多好的回答:In multithreaded C/C++, does malloc/new lock the heap when allocating memory.

人们的共识是存在锁定。因此,较大的分配或需要一些交换的分配可能会阻塞另一个线程中的较小分配,即使如果没有正在进行的较大分配,较小的分配可能会完成。

如果你在pthread支持下编译,那么gcc的新版本是线程安全的,但这并不是你真正想要的。

我知道在windows中你可以创建自己的堆,它可以在你的程序开始时用来设置内存。我不知道有任何linux/unix调用来做类似的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4600208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档