问题标签 [brk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
414 浏览

c++ - brk(0) 是否花费了太多时间?

这是 的输出strace -T -ttt -ff -x -y -o pid.trace -p 2145。跟踪如下。

如果您在两个brk(0)s (请参阅 1503431273.935080 和 1503431291.010478)上查看上述跟踪,则分别花费了太多时间,分别约为17 秒和 10 秒(比较左侧时间)。但是右侧的执行时间很短。我已经在同一个Redhat Linux 盒子 (7.2) 中多次运行了这个程序,所有运行都在系统调用的同一位置 (brk(0)) 给出了相同的时间(微秒差异)。

可能是什么问题?它是在编程级别还是操作系统级别?我没有这方面的源代码,但我知道它是 ac/c++ 程序。

0 投票
2 回答
301 浏览

c - brk() 上的 Bash 脚本段错误

有人可以解释为什么这个“无尽的”循环会很快出现段错误吗?例如,假设我们有这个功能:

这会在8-10秒后出现段错误。通过 strace 检查,我们可以看到很多brk()调用:

我的问题是:

  1. 这是因为它试图访问内存空间中的未映射区域(通过 brk)而导致段错误吗?
  2. 如果是,为什么要尝试访问它?
  3. malloc() 在这里会是更好的选择吗?
  4. 如果您对此有任何额外/琐事信息,我们将不胜感激。
0 投票
1 回答
518 浏览

c - 什么是内存中的程序中断?

我正在阅读一篇关于为指针分配空间的文章,该文章并未确切说明“程序中断”是什么,但提到了它。我需要知道程序中断是什么。如果我用 malloc 创建一个指向内存空间的指针..IE

PROGRAM BREAK 是开始还是结束?是 p[0] 还是 p[99] 的地址 THX

0 投票
1 回答
1358 浏览

c - 为什么调用 sbrk(0) 两次会给出不同的值?

我试图理解这个sbrk()功能。

据我所知:
sbrk(0)返回中断的当前地址并且不增加它。
sbrk(size)以字节为单位增加中断的地址size并返回中断的前一个地址。

所以我创建了一些东西来测试它:

所以我期待看到这样的结果:

但相反,我得到了这个:

为什么前两个调用不sbrk(0)返回相同的值?这两个更改中断地址的调用之间会发生什么?

编辑: 在变量中存储地址可以解决问题:

0 投票
1 回答
562 浏览

c - 为什么第一个 sbrk 的返回值与后续调用不同?

我试图了解内存在 C 中是如何工作的,所以现在正在尝试这个sbrk函数。我知道sbrk(0)应该返回当前的程序中断,即数据段的结束。

所以我尝试sbrk(0)多次调用,由于某种原因,我得到的第一个值与其他值不同。例如,这个程序

给我以下输出:

不确定为什么第一个值与其他三个值不同,有什么想法吗?

0 投票
1 回答
980 浏览

c - brk/sbrk 有什么不安全/遗留问题?

我在很多地方(musl 邮件列表、macOS 论坛等)都听说过brk()sbrk()不安全的。其中很多地方要么根本不解释,要么解释的很模糊。例如,链接指出“这些功能从根本上被破坏”,并继续说mallocsbrk子系统完全被破坏,它们破坏了堆等。

我的问题是:为什么会这样?如果malloc以这样的方式使用它分配一个sbrk足够大的内存块来平息或大大减少对进一步分配的需求,那么使用起来不应该sbrk并且brk完全安全吗?

这是我的sbrkand实现brk

sbrk

brk

0 投票
5 回答
7169 浏览

c - 在 malloc 中,为什么要使用 brk 呢?为什么不直接使用 mmap?

malloc使用brk/sbrk作为从操作系统申请内存的主要方式的典型实现。但是,它们也用于mmap获取大分配的块。使用brk而不是有真正的好处mmap,还是只是传统?用它来做这一切难道不一样mmap吗?

(注意:我在这里使用sbrkbrk互换,因为它们是同一个 Linux 系统调用的接口,brk。)


作为参考,这里有一些描述 glibc 的文档malloc

GNU C 库参考手册:GNU 分配器
https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.html

glibc wiki:Malloc 概述
https://sourceware.org/glibc/wiki/MallocInternals

这些文档描述的sbrk是用于为小分配声明主要区域,mmap用于声明次要区域,mmap也用于为大对象声明空间(“比页面大得多”)。

使用应用程序堆(用 声明sbrk)并mmap引入了一些可能不必要的额外复杂性:

分配的竞技场 - 主竞技场使用应用程序的堆。其他竞技场使用mmap'd heaps。要将块映射到堆,您需要知道适用哪种情况。如果该位为 0,则该块来自主竞技场和主堆。如果该位为 1,则块来自mmap'd 内存,并且堆的位置可以从块的地址计算。

【glibc mallocptmalloc派生自dlmalloc, dlmalloc 始于 1987 年。】


jemalloc手册页(http://jemalloc.net/jemalloc.3.html)有这样的说法:

传统上,分配器用于sbrk(2)获取内存,这是次优的,原因有几个,包括竞争条件、增加的碎片和对最大可用内存的人为限制。如果sbrk(2)操作系统支持,则此分配器mmap(2)按优先顺序同时使用和 sbrk(2);否则仅mmap(2)使用。

因此,他们甚至在这里说这sbrk是次优的,但他们仍然使用它,即使他们已经费心编写代码以便没有它也能正常工作。

[jemalloc 的编写始于 2005 年。]

更新:再想一想,关于“按优先顺序”的那一点给了我一条询问线。为什么是优先顺序?它们是否只是在不支持(或缺少必要的功能)sbrk的情况下用作后备mmap,或者该过程是否有可能进入某种可以使用sbrk但不能使用的状态mmap?我会看看他们的代码,看看我是否能弄清楚它在做什么。


我问是因为我正在用 C 实现一个垃圾收集系统,到目前为止,我认为没有理由使用除mmap. 不过,我想知道我是否缺少某些东西。

(在我的情况下,我还有一个额外的理由要避免brk,那就是我可能需要malloc在某些时候使用。)

0 投票
0 回答
112 浏览

assembly - 汇编 x86 使用系统调用动态分配结构数组

我需要在家庭作业项目中通过系统调用分配内存的帮助。我从命令行参数中得到一个数字“x”,我需要分配包含两个 dword 字段的“x”结构数组。

我尝试使用 brk 系统调用来做到这一点,但我认为我不太理解它,这是我的尝试:

0 投票
2 回答
2051 浏览

linux - 谁在调用 brk(NULL),为什么?

我编写了一个小型 hello world 程序,并在其二进制文件上运行 strace,它列出了所有已作为我的 Hello_world 程序执行的一部分调用的系统调用。

brk(NULL) 用于查找当前 DSS 的上限,但我的问题是,谁想知道这个,为什么?

edit1:我的程序中没有 malloc

0 投票
1 回答
264 浏览

c - Linux:brk() 错误“无法分配内存”

我正在尝试在 C 程序中使用 brk() 函数。我的目标是通过检查当前程序中断(pb)来直接使用它(作为更大测试的一部分)

执行 malloc(用于测试,如果分配的空间足够大,malloc 有时应该执行 brk)

而不是通过使用当前地址+增量直接执行 brk() (并检查这是否增加了 pb):

我的问题是,无论是使用大型 malloc (malloc(5000;)) 还是使用(对齐或未对齐) brk() 调用 pb 都不会更改。检查 errno 时,我得到一个

无法分配内存!error (as given bystrerror(errno)

谁能明白为什么我无论如何都无法增加程序中断?

感谢您的任何提示!

(系统为:Debian 10(buster),内核为 4.19)

编辑:根据要求,这是主要功能,包括: