谁在Linux中调用calloc()时将页面归零?

谁在Linux中调用calloc()时将页面归零?,linux,ubuntu,kernel,calloc,Linux,Ubuntu,Kernel,Calloc,我知道实现者可以选择是将malloc页面归零,还是让操作系统给他一个归零的页面(为了更优化的目的) 我的问题很简单——在linux内核3.16和GCC4.8.4附带的Ubuntu14.04LTS中,谁会将我的页面归零?它是在用户区还是内核区?这取决于内存来自何处。calloc代码是userland,它将使被进程重用的内存页归零。当内存以前被使用,然后被释放,但没有返回到操作系统时,就会发生这种情况。但是,如果页面是新分配给进程的,则操作系统会将其清除为0(出于安全目的),因此无需通过calloc

我知道实现者可以选择是将malloc页面归零,还是让操作系统给他一个归零的页面(为了更优化的目的)


我的问题很简单——在linux内核3.16和GCC4.8.4附带的Ubuntu14.04LTS中,谁会将我的页面归零?它是在用户区还是内核区?

这取决于内存来自何处。
calloc
代码是userland,它将使被进程重用的内存页归零。当内存以前被使用,然后被释放,但没有返回到操作系统时,就会发生这种情况。但是,如果页面是新分配给进程的,则操作系统会将其清除为0(出于安全目的),因此无需通过
calloc
清除。这意味着
calloc
可能比先调用
malloc
再调用
memset
更快,因为它可以跳过
memset
,如果它知道它已经归零了。

这取决于标准库的实现者,而不是主机系统。对于特定的OS,不可能给出特定的答案,因为它可能是多个编译器及其库的构建目标——包括在其他系统上,如果你考虑交叉编译的可能性(建立在一种类型的系统上以另一种类型为目标)。 我见过的大多数
calloc()
实现都使用调用
malloc()
,然后再调用
memset()
,或者(对于一些针对unix的实现)调用一个名为
bzero()
的遗留函数,该函数本身有时会被扩展为调用
memset()的宏调用所取代
在许多最新版本的库中

memset()
通常是手动优化的。但是,这同样取决于库的实现者