// 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;
}
编译以下代码时:
printf("%10p\n", sbrk(0));
我得到警告提示:
格式“%p”需要类型为“void*”的参数,但参数2的类型为“int”
在Imalloc(1024*1024)
之后,程序中断似乎没有改变。
以下是输出:
9b12000
9b12000
9b12000
问题2:进程在启动时是否在堆上分配内存以供将来使用?还是编译器更改了分配的时间点?否则,为什么?
mallopt()
可以设置参数来控制malloc()
的行为,并且有一个名为m_mmap_threshold
的参数,一般情况下:
brk()
;mmap()
;该参数的默认值是128KB
(在我的系统上),但在我的测试程序中我使用了1MB,所以选择了mmap()
,当我将请求的内存更改为32KB时,我看到将使用brk()
。
这本书在TLPI第147页和第1035页提到了这一点,但我没有仔细阅读这部分。
该参数的详细信息可以在mallopt()
的手册页中找到。
如果我们更改程序以查看malloc
的内存在哪里:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void program_break_test() {
printf("%10p\n", sbrk(0));
char *bl = malloc(1024 * 1024);
printf("%10p\n", sbrk(0));
printf("malloc'd at: %10p\n", bl);
free(bl);
printf("%10p\n", sbrk(0));
}
int main(int argc, char **argv) {
program_break_test();
return 0;
}
sbrk
不会改变,这可能更清楚一些。malloc
给我们的内存被映射到一个完全不同的位置。
您还可以在Linux上使用strace
查看进行了哪些系统调用,并发现malloc
正在使用mmap
执行分配。
问题内容: 如果malloc / free是作为libc中的库例程实现的,那么它是在 sbrk syscall还是 mmap syscall或其他东西之上实现的呢? 通常, sys / syscall.h 中声明的函数是否包含目标计算机中的所有系统调用? 问题答案: 和是标准C库函数,其是由每个C实现来实现。 C标准仅定义了这些函数的行为方式以及预期的行为。在每种实现方式中如何实现它们。 简而言之
本文向大家介绍请你回答一下malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?相关面试题,主要包含被问及请你回答一下malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?时的应答技巧和注意事项,需要的朋友参考一下 Malloc函数用于动态分配内存。为了减少内存碎片和系统调用的开销,malloc其采用内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内
我有一个重要的问题。 我以前使用过JSF1.2。我会使用一些基本的标签,比如 还有像这样的脸 为了使用ajax功能,我与 例如我使用了q jetty Web服务器来使用JSF标记。今天,我在JSF2.0、PrimeFaces和glassfish应用服务器上工作了一周。 所以我有以下问题:我是与JSF合作过,还是与Mojarra合作过?抱歉,但我并不清楚这两种技术之间的确切区别。 多谢了,麦克
问题内容: 内置函数在我看来更像Pythonic,但我发现使用起来更频繁。 Python文档指出它们是等效的。 一位博客作者声称这比。 我应该使用哪个? 问题答案: 我会用。 来自:https : //wiki.python.org/moin/DubiousPython#Premature_Optimization 尽管正确应用优化确实可以加快代码的速度,但很少使用[..]的优化代码会使代码更难阅
问题内容: 我知道这可能是一个愚蠢的问题,但是我已经寻找了一段时间,找不到确切的答案。如果我使用或(在Linux机器上的C语言中),是否有人在RAM中分配空间?例如,如果我有2GB的RAM并想使用所有可用的RAM,我可以只使用组合键,还是还有我不知道的另一种选择? 我想编写一系列简单的程序,这些程序可以同时运行,并保留进程中使用的所有RAM来强制使用交换,并且频繁交换页面。我已经在下面的程序中尝试
问题内容: 对于我开发的某些应用程序(后来逐渐忘记了),我一直在编写纯SQL,主要是针对MySQL。尽管我在SQLAlchemy之类的python中使用过ORM,但是我并没有坚持很长时间。通常,这是文档或复杂性(从我的角度来看)使我退缩。 我这样看:如果要使用一种类型的数据库,则使用ORM进行可移植性,使用普通SQL。我真的在寻求有关在开发需要数据库支持的应用程序时何时使用ORM或SQL的建议。