相关疑难解决方法(0)

brk()系统调用了什么?

根据Linux程序员手册:

brk()和sbrk()改变程序中断的位置,它定义了进程数据段的结束.

这里的数据段意味着什么?是仅仅将数据段或数据,BSS和堆组合在一起?

根据维基:

有时,数据,BSS和堆区域统称为"数据段".

我认为没有理由改变数据段的大小.如果它是数据,BSS和堆集合那么它是有意义的,因为堆将获得更多的空间.

这让我想到了第二个问题.在我到目前为止阅读的所有文章中,作者都​​说堆积增长,堆栈向下增长.但是他们没有解释的是当堆占用堆和堆栈之间的所有空间时会发生什么?

在此输入图像描述

c unix linux memory-management brk

173
推荐指数
4
解决办法
8万
查看次数

malloc() - 它是否使用brk()或mmap()

c代码:

// program break mechanism
// TLPI exercise 7-1

#include <stdio.h>
#include <stdlib.h>

void program_break_test() {
    printf("%10p\n", sbrk(0));

    char *bl = malloc(1024 * 1024);
    printf("%x\n", sbrk(0));

    free(bl);
    printf("%x\n", sbrk(0));

}

int main(int argc, char **argv) {
    program_break_test();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译以下代码时:

 printf("%10p\n", sbrk(0));
Run Code Online (Sandbox Code Playgroud)

我收到警告提示:

format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’

问题1:为什么?


在我之后malloc(1024 * 1024),程序突破似乎没有改变.

这是输出:

9b12000
9b12000
9b12000
Run Code Online (Sandbox Code Playgroud)

问题2:进程在启动以备将来使用时是否在堆上分配内存?或者编译器改变分配的时间点?否则,为什么?


[更新]摘要:brk()或mmap()

在查看TLPI并检查手册页(在TLPI的作者的帮助下)之后,现在我了解了如何malloc()决定使用brk()mmap(),如下所示:

mallopt() …

c malloc memory-management mmap sbrk

16
推荐指数
3
解决办法
9634
查看次数

为什么 malloc() 可以互换调用 mmap() 和 brk()?

我是 C 和堆内存的新手,仍在努力理解动态内存分配。

我跟踪了Linux系统调用,发现如果我malloc用来请求少量的堆内存,那么内部malloc调用brk

但是如果我使用malloc请求非常大量的堆内存,则在内部malloc调用mmap

所以必须有一个很大的区别brkmmap,但理论上我们应该能够使用brk分配堆内存无论请求的大小。那么为什么在分配大量内存时会malloc调用mmap呢?

c linux heap-memory linux-kernel dynamic-memory-allocation

15
推荐指数
2
解决办法
1021
查看次数

关于 sbrk() 和 malloc()

我已经彻底阅读了关于 sbrk() 的 linux 手册:

sbrk() 改变程序中断的位置,它定义了进程数据段的结束(即程序中断是未初始化数据段结束后的第一个位置)。

而且我确实知道用户空间内存的组织如下: 在此处输入图片说明

问题是: 当我调用 sbrk(1) 时,为什么它说我正在增加堆的大小?正如手册所说,我正在更改“数据段和 bss”的结束位置。那么,数据段和bss的大小应该增加多少,对吗?

c linux operating-system sbrk

4
推荐指数
1
解决办法
2898
查看次数