谁在Linux中调用calloc()时将页面归零?
我知道实现者可以选择是将malloc页面归零,还是让操作系统给他一个归零的页面(为了更优化的目的)谁在Linux中调用calloc()时将页面归零?,linux,ubuntu,kernel,calloc,Linux,Ubuntu,Kernel,Calloc,我知道实现者可以选择是将malloc页面归零,还是让操作系统给他一个归零的页面(为了更优化的目的) 我的问题很简单——在linux内核3.16和GCC4.8.4附带的Ubuntu14.04LTS中,谁会将我的页面归零?它是在用户区还是内核区?这取决于内存来自何处。calloc代码是userland,它将使被进程重用的内存页归零。当内存以前被使用,然后被释放,但没有返回到操作系统时,就会发生这种情况。但是,如果页面是新分配给进程的,则操作系统会将其清除为0(出于安全目的),因此无需通过calloc
我的问题很简单——在linux内核3.16和GCC4.8.4附带的Ubuntu14.04LTS中,谁会将我的页面归零?它是在用户区还是内核区?这取决于内存来自何处。
calloc
代码是userland,它将使被进程重用的内存页归零。当内存以前被使用,然后被释放,但没有返回到操作系统时,就会发生这种情况。但是,如果页面是新分配给进程的,则操作系统会将其清除为0(出于安全目的),因此无需通过calloc
清除。这意味着calloc
可能比先调用malloc
再调用memset
更快,因为它可以跳过memset
,如果它知道它已经归零了。这取决于标准库的实现者,而不是主机系统。对于特定的OS,不可能给出特定的答案,因为它可能是多个编译器及其库的构建目标——包括在其他系统上,如果你考虑交叉编译的可能性(建立在一种类型的系统上以另一种类型为目标)。
我见过的大多数calloc()
实现都使用调用malloc()
,然后再调用memset()
,或者(对于一些针对unix的实现)调用一个名为bzero()
的遗留函数,该函数本身有时会被扩展为调用memset()的宏调用所取代
在许多最新版本的库中
memset()
通常是手动优化的。但是,这同样取决于库的实现者