问题标签 [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.
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++ 程序。
c - brk() 上的 Bash 脚本段错误
有人可以解释为什么这个“无尽的”循环会很快出现段错误吗?例如,假设我们有这个功能:
这会在8-10秒后出现段错误。通过 strace 检查,我们可以看到很多brk()调用:
我的问题是:
- 这是因为它试图访问内存空间中的未映射区域(通过 brk)而导致段错误吗?
- 如果是,为什么要尝试访问它?
- malloc() 在这里会是更好的选择吗?
- 如果您对此有任何额外/琐事信息,我们将不胜感激。
c - 什么是内存中的程序中断?
我正在阅读一篇关于为指针分配空间的文章,该文章并未确切说明“程序中断”是什么,但提到了它。我需要知道程序中断是什么。如果我用 malloc 创建一个指向内存空间的指针..IE
PROGRAM BREAK 是开始还是结束?是 p[0] 还是 p[99] 的地址 THX
c - 为什么调用 sbrk(0) 两次会给出不同的值?
我试图理解这个sbrk()
功能。
据我所知:
sbrk(0)
返回中断的当前地址并且不增加它。
sbrk(size)
以字节为单位增加中断的地址size
并返回中断的前一个地址。
所以我创建了一些东西来测试它:
所以我期待看到这样的结果:
但相反,我得到了这个:
为什么前两个调用不sbrk(0)
返回相同的值?这两个更改中断地址的调用之间会发生什么?
编辑: 在变量中存储地址可以解决问题:
c - 为什么第一个 sbrk 的返回值与后续调用不同?
我试图了解内存在 C 中是如何工作的,所以现在正在尝试这个sbrk
函数。我知道sbrk(0)
应该返回当前的程序中断,即数据段的结束。
所以我尝试sbrk(0)
多次调用,由于某种原因,我得到的第一个值与其他值不同。例如,这个程序
给我以下输出:
不确定为什么第一个值与其他三个值不同,有什么想法吗?
c - brk/sbrk 有什么不安全/遗留问题?
我在很多地方(musl 邮件列表、macOS 论坛等)都听说过brk()
是sbrk()
不安全的。其中很多地方要么根本不解释,要么解释的很模糊。例如,此链接指出“这些功能从根本上被破坏”,并继续说malloc
和sbrk
子系统完全被破坏,它们破坏了堆等。
我的问题是:为什么会这样?如果malloc
以这样的方式使用它分配一个sbrk
足够大的内存块来平息或大大减少对进一步分配的需求,那么使用起来不应该sbrk
并且brk
完全安全吗?
这是我的sbrk
and实现brk
:
sbrk
:
brk
:
c - 在 malloc 中,为什么要使用 brk 呢?为什么不直接使用 mmap?
malloc
使用brk
/sbrk
作为从操作系统申请内存的主要方式的典型实现。但是,它们也用于mmap
获取大分配的块。使用brk
而不是有真正的好处mmap
,还是只是传统?用它来做这一切难道不一样mmap
吗?
(注意:我在这里使用sbrk
和brk
互换,因为它们是同一个 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
在某些时候使用。)
assembly - 汇编 x86 使用系统调用动态分配结构数组
我需要在家庭作业项目中通过系统调用分配内存的帮助。我从命令行参数中得到一个数字“x”,我需要分配包含两个 dword 字段的“x”结构数组。
我尝试使用 brk 系统调用来做到这一点,但我认为我不太理解它,这是我的尝试:
linux - 谁在调用 brk(NULL),为什么?
我编写了一个小型 hello world 程序,并在其二进制文件上运行 strace,它列出了所有已作为我的 Hello_world 程序执行的一部分调用的系统调用。
brk(NULL) 用于查找当前 DSS 的上限,但我的问题是,谁想知道这个,为什么?
edit1:我的程序中没有 malloc
c - Linux:brk() 错误“无法分配内存”
我正在尝试在 C 程序中使用 brk() 函数。我的目标是通过检查当前程序中断(pb)来直接使用它(作为更大测试的一部分)
执行 malloc(用于测试,如果分配的空间足够大,malloc 有时应该执行 brk)
而不是通过使用当前地址+增量直接执行 brk() (并检查这是否增加了 pb):
我的问题是,无论是使用大型 malloc (malloc(5000;)) 还是使用(对齐或未对齐) brk() 调用 pb 都不会更改。检查 errno 时,我得到一个
无法分配内存!
error (as given by
strerror(errno)
谁能明白为什么我无论如何都无法增加程序中断?
感谢您的任何提示!
(系统为:Debian 10(buster),内核为 4.19)
编辑:根据要求,这是主要功能,包括: