Articles of malloc

如何保证当一个进程调用malloc()时,它会立即分配物理内存?

我正在寻找一种方法来预先分配内存到一个进程(物理内存),所以当我调用new / malloc时,它将绝对保证可用于C ++堆。 我需要这个内存可用于我的进程,而不pipe其他进程正在尝试如何处理系统内存。 换句话说,我希望将物理内存保留到C ++堆中,以便在调用malloc()时立即可用。 以下是详细信息: 我正在开发一个实时系统。 该系统由几个需要内存的进程组成。 stream程A是关键任务stream程,它必须存在并且不受任何其他stream程的不良行为的影响。 它通常适合0.5 GB的内存,但有时需要高达2.5 GB。 其他进程尝试使用任意数量的内存。 我担心的是,其他进程可能会分配大量内存,耗尽系统中的物理内存。 然后,当进程A需要更多的内存快速,它不可用,系统将不得不交换页面,这将需要很长的时间。 Process A很快就能获得它所需要的所有内存,而对于其他进程的失败我没有问题。 我在Windows 7 64位上运行。 编辑:将SetProcessWorkingSetSize工作? 意思是:调用这个足够大的内存可以保护我的进程A不受系统中其他进程的影响。

Malloc无法在Windows上分配1 GiB的内存

我想在Windows上使用malloc()分配1 GiB的内存,并且失败。 我知道malloc的不确定性。 分配1 GiB的内存的最佳解决scheme是什么?

Windows内核中的Free / malloc函数

我可以在内核中findfree和malloc函数? 我包含stdlib.h但free和malloc函数不在stdlib.h 。 我在哪里可以find这些function? 谢谢!

Win7上的dlmalloc崩溃

一段时间以来,我一直在愉快地使用dlmalloc进行跨平台项目(Windows,Mac OS X,Ubuntu)。 然而,最近似乎在Windows 7上使用dlmalloc会导致崩溃崩溃。 为了确保在我的项目中不会太高兴,我创build了一个超级最小testing程序 – 除了从main返回外,什么都不做。 一个版本(“ malloctest ”)链接到dlmalloc,另一个(“ malloctest ”)不链接。 在WinXP上,两者都运行良好。 在Windows 7上, malloctest崩溃。 你可以在这里看到testing的屏幕录像。 我的问题是:这是为什么发生? 这是在dlmalloc中的错误? 或者在Windows 7中的加载器更改? 有没有解决方法? fyi,这里是testing代码(test.cpp): #include <stdio.h> int main() { return 0; } 这里是nmake makefile: all: regulartest.exe malloctest.exe malloctest.exe: malloc.obj test.obj link /out:$@ $** regulartest.exe: test.obj link /out:$@ $** clean: del *.exe *.obj 为了简洁起见,我不在这篇文章中包含dlmalloc源代码,但是你可以在这里获得(v2.8.4)。 编辑:看到这些其他relavent SOpost: […]

为什么malloc覆盖RSP和RSP + 8?

你可以在这里阅读关于64位调用约定。 x64函数应该自己清理,但是,当我从.asm中调用malloc时,它将覆盖RSP和RSP + 8的值。 这似乎是非常错误的。 有什么build议么? public TestMalloc extern malloc : near .CODE align 8 TestMalloc proc mov rcx, 100h 000000018000BDB8 48 C7 C1 00 01 00 00 mov rcx,100h call malloc 000000018000BDBF E8 CC AC 06 00 call malloc (180076A90h) ret 000000018000BDC4 C3 ret 000000018000BDC5 66 66 90 xchg ax,ax TestMalloc endp END

堆大小为Windows应用程序

我有一个8 Gb RAM的Windows7最大64位计算机。 我在MSVC中创build了一个Win32控制台应用程序,并编写如下: size_t const s_chunkSize = 1024 * 32; size_t total = 0; for (;;) { if (!::malloc(s_chunkSize)) { break; } total += s_chunkSize; } printf("total = %li", total); // yes, I do not free allocated memory for simplicity 它输出我2111668224低于2Gb。 我如何强制我的程序分配更多的2Gb? 我必须更改一些MSVC项目设置? 或者我不得不使用malloc但Windows特定的function? 或者我必须以某种方式configurationWindows?

无法在vc ++ mfc应用程序中分配1.5GB内存

我有用VS2010编写的MFC vc ++应用程序。 当我尝试分配使用两个大小“185000000”的数组 malloc:它返回NULL 新的操作符:它抛出CMemoryException 但是,当我编写独立的win32控制台应用程序在c ++中是这样的: double *ptr = NULL; ptr = new double[185000000]; 它工作正常,并ProcessExplorer应用程序显示〜1411MB的内存allcoated。 我的MFC应用程序具有graphics用户界面(GUI),并添加了大量的库,以便与安捷伦仪表和NI-6255仪表电压测量一起工

将dynamic分配的内存返回到操作系统而不终止程序

我正在使用一个程序,我正在使用大量但有限的内存。 内存在不同的线程上运行时分配和释放。 但是,我注意到程序的内存使用情况不会保持在指定的范围内。 随着时间的推移它会增加。 我写了下面的示例程序来检查内存是否被释放回操作系统。 释放一半分配的内存来检查内存使用是否下降。 int main() { char *p[COUNT]; for(int i = 0; i < COUNT; i++) { p[i] = new char[1048576]; memset (p[i], 0, 1048576); printf("%p\n", p[i]); } printf("done allocating … \n"); sleep(10); printf("Freeing\n"); for(int i; i < COUNT; i++) { delete[] p[i]; } while(1) sleep(1); } 运行程序后,似乎操作系统不会回收释放的页面。 内存使用情况与Linux中的“top”命令一样,分配后和释放后保持不变。 它只是将页面标记为可供相同程序重复使用的页面。 在我的程序中,malloc和free在不同的线程上运行。 当malloc被调用的频率比free更频繁时,这会引起内存pipe理问题,并且进程数据段变得非常大,导致OS将页面交换到磁盘。 […]

malloc(和它的表兄弟)返回的内存块是否初始化为零?

我写了一个代码来testing,以强调testingLinux和Windows操作系统的内存pipe理。 为了进一步testing,我继续检查malloc()返回的内存中存在的值。 正在返回的值全部为0(零)。 我已经阅读了malloc的手册页,在Windows和Linux上都检查过了,但是我找不到这种行为的原因 。 根据手册 malloc()函数分配大小字节并返回指向已分配内存的指针。 内存不被初始化。 要清除内存段,必须手动使用memset()。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <stdbool.h> int eat(long total,int chunk){ long i; for(i=0;i<total;i+=chunk){ short *buffer=malloc(sizeof(char)*chunk); if(buffer==NULL){ return -1; } printf("\nDATA=%d",*buffer); memset(buffer,0,chunk); } return 0; } int main(int argc, char *argv[]){ int i,chunk=1024; long size=10000; printf("Got %ld bytes in chunks of %d…\n",size,chunk); if(eat(size,chunk)==0){ […]

Memcpy与memset相同

我想用memcpy来测量内存带宽。 我从这个答案修改了代码: 为什么vector化循环没有使用memset来衡量带宽的性能改进 。 问题是memcpy只比memset稍慢,因为我认为memcpy运行速度是内存两倍以上的两倍。 更具体地说,我运行了超过1 GB的数组a和b (分配将calloc )100次,执行以下操作。 operation time(s) —————————– memset(a,0xff,LEN) 3.7 memcpy(a,b,LEN) 3.9 a[j] += b[j] 9.4 memcpy(a,b,LEN) 3.8 请注意, memcpy只比memset慢一点。 a[j] += b[j] (其中j越过[0,LEN) )的操作应该比memcpy长三倍,因为它操作的数据量是三倍。 但是它只有memset 2.5左右。 然后我用memset(b,0,LEN)将b初始化为零并再次testing: operation time(s) —————————– memcpy(a,b,LEN) 8.2 a[j] += b[j] 11.5 现在我们看到, memcpy大约是memset两倍, a[j] += b[j]大约是memset三倍。 至less我会预期,在memset(b,0,LEN) , memcpy会比较慢,因为 100次迭代中的第一次迭代的延迟分配(第一次触发) 。 为什么我只能在memset(b,0,LEN)之后得到预期的时间? test.c的 #include <time.h> […]