问题标签 [sbrk]
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 - 实现 malloc() 时 brk() 超出堆
我正在尝试实现我自己的内存分配器 malloc() 版本。但是有人指出,在我的情况下, brk() 已超过最大堆。
我需要在进行测试的平台上运行我的代码(所以我看不到测试)。
这是我对 malloc() 的实现:
我在测试时遇到了这个错误:
谁能告诉我如何解决这个问题?
linux - brk 和 sbrk 是否将程序四舍五入到最近的页面边界?
我的问题正如tilte所说,根据我的教科书
int brk(void *end_data_segment);
brk() 系统调用将程序中断设置为 end_data_segment 指定的位置。由于虚拟内存是以页面为单位分配的,因此 end_data_segment 有效地向上舍入到下一个页面边界。
并且由于在 Linux 上, sbrk() 被实现为使用 brk() 系统调用的库函数,所以我希望这两个函数都会将程序中断舍入到下一页边界。但是当我在 x86_64 Linux 机器(ubuntu)上进行测试时,事实证明这两个函数都将程序中断移动到所要求的确切位置(我尝试使用 brk,结果是相同的)。
这是输出
那么这里发生了什么?
c - Mac OS Catalina sbrk 已弃用
我正在尝试在 C 中实现自己的内存分配器。当我尝试在 Mac OS Catalina 的终端中编译我的代码时,它说函数“sbrk”已被弃用。有人知道解决此问题的解决方案吗?其他在线解决方案似乎有点过时了。
c - sbrk() - 从不同大小的整数转换为指针
我正在尝试通过系统调用分配内存并管理返回缓冲区来实现我自己的堆内存分配器。返回值:sbrk()
void *sbrk(intptr_t increment);
来自man sbrk
:
成功时,sbrk() 返回上一个程序中断。(如果增加了中断,那么这个值是一个指向新分配内存开始的指针)。出错时,返回 (void *) -1,并将 errno 设置为 ENOMEM
使用 gcc 和 gcc 标志编译:cc main.c -pedantic -Wconversion -Werror
程序按预期运行,但我不明白为什么 linux 分配大量内存,2200hex 字节,而我只要求 4096?
添加 gcc 标志之一-ansi
或-std=c89
产生以下编译错误:
在函数'extend_heap'中:main.c:15:20:错误:从'int'初始化'void *'使指针从整数而不进行强制转换[-Werror=int-conversion] 15 | 无效 *sp = sbrk(ALIGN(nbytes, VP_ALIGNMENT)); | ^~~~ main.c:在函数'main'中:main.c:31:22:错误:从'int'初始化'void *'使指针从整数而不进行强制转换[-Werror = int-conversion] 31 |
无效 *cbrk = sbrk(0); | ^~~~
sbrk
返回void*
。为什么我收到上面的错误?我的 glibc 版本 = 2.31,gcc 版本 9.3.0
谢谢。
c - 我可以强制 sbrk 返回地址在某个特定范围内吗?
我想确保的返回地址sbrk
在某个特定范围内。我在某个地方读到了sbrk
从程序初始化时分配的区域分配的内容。所以我想知道是否有办法强制程序初始化从特定地址分配?例如,使用mmap
,我将能够使用MAP_FIXED_NOREPLACE
。有没有可能有类似的东西?
malloc - 请求内存 sbrk 时内存对齐是怎么回事?
我是nooby,所以请温柔
我一直在尝试为 C++ 编写垃圾收集器库(只是一个项目),但我一直坚持使用 sbrk() 编写自己的内存分配器,但我不知道内存对齐,我浏览了很多文章和视频但无法绕过它。
我写的东西适用于某种大小,如果我请求 8 个大小的内存的倍数,它就可以工作。
虽然这个答案帮助我修复了我的分配器,但我不知道它是如何工作的
我不明白为什么要替换sbrk(size + sizeof(Chunk))
为
作品。
这就是我在简单请求时得到的size + sizeof(Chunk)
***运行时错误:在未对齐的地址 0x55f69e5a724d 内访问类型“struct Chunk”的成员,这需要 8 字节对齐 0x55f69e5a724d:注意:指针指向此处 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c++ - 如何将 Void* 转换为 size_t?
我有以下功能:
并想像这样使用它:
但我收到错误:
我如何转换void*
即指向数字的指针?那是合法的吗?
c++ - C++ Malloc 不调用 mmap 或 brk?
在 ubuntu 18.04 上,我编写了以下 c 程序并使用输入 100 运行它
终端的输出是:(使用 strace)
这不是很奇怪吗?为什么 malloc 不使用brk
ormmap
来分配内存(在 2 次调用 for 之间nanosleep()
)。这种奇怪行为的原因是什么?
如果我将输入更改为 200000,我会在两者之间看到对 mmap 的调用。
c - 警告:导入 unistd.h 后函数“sbrk”的隐式声明
有人可以告诉我如何解决标题中描述的这个问题吗?我已经搜索了很长时间,但仍然没有找到解决方案。
更新:我正在使用窗口系统
c - malloc() 在哪里分配内存?是进程虚拟地址空间的数据段还是堆段?
自从我被介绍到C
,我被告知C
动态内存分配是使用malloc
家族中的函数完成的。我还了解到,动态分配的内存malloc
是在进程的堆部分分配的。
各种操作系统教科书说这malloc
涉及系统调用(尽管并非总是但有时)将堆上的结构分配给进程。现在假设malloc
返回指向堆上分配的字节块的指针,为什么需要系统调用。函数的激活记录被放置在进程的堆栈部分中,由于“堆栈部分”已经是进程虚拟地址空间的一部分,因此激活记录的推送和弹出,堆栈指针的操作,只需从虚拟地址空间的最高可能地址。它甚至不需要系统调用。
现在基于相同的理由,既然“堆部分”也是进程的虚拟地址空间的一部分,为什么需要系统调用来分配该部分中的一大块字节。例程malloc
可以自行处理“空闲”列表和“分配”列表。它只需要知道“数据部分”的结尾。某些文本说系统调用对于“将内存附加到进程以进行动态内存分配”是必要的,但是如果malloc
在“堆部分”上分配内存,为什么在 期间还需要将内存附加到进程malloc
?可以简单地取自过程的一部分。
在浏览 Kernighan 和 Ritchie 的文本“C 编程语言”[2e] 时,我遇到了他们对malloc
函数的实现 [第 8.7 节第 185-189 页]。作者说:
malloc
要求操作系统根据需要获取更多内存。
这是操作系统文本所说的,但与我上面的想法相反(如果malloc
在堆上分配空间)。
由于向系统请求内存是一项相对昂贵的操作,因此作者不会在每次调用时都这样做malloc
,因此他们创建了一个morecore
至少请求NALLOC
单位的函数;这个更大的块根据需要被切碎。并且基本的空闲列表管理是由free
.
但问题是作者sbrk()
用来向操作系统请求内存morecore
。现在维基百科说:
brk
并且sbrk
是 Unix 和类 Unix 操作系统中使用的基本内存管理系统调用,用于控制分配给进程数据段的内存量。
在哪里
数据段(通常表示为 .data)是目标文件或程序的相应地址空间的一部分,其中包含已初始化的静态变量,即全局变量和静态局部变量。
我猜这不是“堆部分”。[数据段是上图中倒数第二段,堆是倒数第三段。]
我完全糊涂了。我想知道到底发生了什么以及这两个概念是如何正确的?请通过将分散的部分连接在一起来帮助我理解这个概念......