Articles of 内存

读取内存时出现访问冲突

背景 我正在用Visual Studio 2013 Community Edition编写命令行C ++程序。 它通过LDAP连接到Active Directory服务器,并在一些属性(例如:办公地点,部门)中检索唯一值列表。 问题 该程序编译好,但我遇到一个内存访问问题,当我运行它: Unhandled exception at 0x74EDC6B1 (Wldap32.dll) in LdapSearchResultTest1.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC. 这是我第一次使用C ++与外部库,所以我不知道如何甚至接近debugging(通常我为Android写Java)。 我花了一天的更好的时间来看看这个问题,并根据类似问题的答案尝试一些想法,但是我仍然无法解决这个问题。 确切的问题在于这个函数调用的最后一个参数: // Do the search int searchReturnCode = ldap_search_s( ldapSession, &searchBase[0], LDAP_SCOPE_SUBTREE, filter, pAttributes, 0, &pSearchResults); // Error is here 我的代码 我的代码是基于MSDN网站的一个例子,我已经在代码中复制了这个例子。 这是一个certificate这个问题的SSCCE : #include<iostream> #include<Windows.h> #include<Winldap.h> #include<WinBer.h> […]

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> […]

CUDA和固定(页面locking)内存不是页面locking?

我试图弄清楚CUDA(或OpenCL实现)是否在需要固定(页面locking)的内存时说实话。 我试着cudaMallocHost并看着/proc/meminfo值Mlocked和Unevictable ,都停留在0,永远不会( /proc/<pid>/status报告VmLck也为0)。 我用mlock来locking页面内存,并按照预期值上升。 所以这种行为的两个可能的原因可能是: 我没有从CUDA API获取页面locking内存,并且cudaSuccess是假的 CUDA绕过了页面locking内存的操作系统计数器,因为CUDA在Linux内核方面有一些神奇的function 所以实际的问题是:当我使用CUDA分配页面locking内存时,为什么我无法从操作系统获取页面locking内存的值? 另外:如果不是从/proc/meminfo或/proc/<pid>/status我可以在哪里得到正确的值? 谢谢! 系统:Ubuntu 14.04.01 LTS; CUDA 6.5; Nvidida Driver 340.29; Nvidia Tesla K20c

Linux中C ++应用程序的内存稳定性

我想validation我为Linux编写和编译的C ++应用程序的内存稳定性。 这是一个networking应用程序,以每秒10-20个连接的速度响应远程客户端连接。 从长远来看,内存是上升到50MB,尽pipe该应用程序正在打电话删除… 调查显示,Linux不会立即释放内存。 所以这是我的问题: 如何强制Linux释放我实际释放的内存? 至less我想这样做一次来validation内存的稳定性。 否则,有没有可靠的内存指示器可以报告内存我的应用程序实际上是持有?

当加载/清除大量的数据时,std :: vector会变得越来越慢

问题 我有一个相当复杂的image processing应用程序,其中一个子模块需要将巨大的二进制位图加载到内存中。 实际上高达96 GB(意思是888 888 x 888 888像素的图像)。 磁盘是2xSSD raid0,读写速度约为1 GB / s。 它将图像加载到智能指针向量(每个元素表示8个像素)的向量中(每个元素表示一个位图中的一行)。 这里的一个奇怪的问题是,在重复加载和清除向量之后(我发现内存实际上是没有内存泄漏的填充和清除),每次迭代似乎花费的时间越来越长。 特别清理记忆需要很长时间。 testing 我做了一些简单的testing应用程序来testing这个孤立的,从不同的angular度。 用原始指针代替智能指针给了同样奇怪的行为。 然后,我试图使用本地数组而不是vector,并做了诀窍。 使用向量后,100次迭代的载入/清除24 GB时间急剧增加,而arrays实现时间稳定。 下面是testing应用程序填充内存与24 GB的垃圾,而不是加载一个实际的图像,具有相同的结果。 在Windows 10 Pro上使用128 GB RAM进行testing,并使用Visual Studio 2013 Update 5进行构build。 这个函数使用vector来加载/清除: void SimpleLoadAndClear_Vector(int width, int height) { time_t start_time, end_time; // Load memory time(&start_time); cout << "Loading image into memory…"; auto […]

这些内存区域来自Linux进程?

我发现我的一个进程(~90个线程)使用> 8G内存,我不认为它需要这么大。 因此,我读了/proc/{pid}/maps , /proc/{pid}/smaps和pstack {pid} 。 我想知道这些大型的63M + 508K地区是如何来的,以及它们是怎样的,我可以通过某种方式削弱我的内存使用量吗? 我发现这些地区几乎分为三类: 4xxx000-4xxxx000 :线程堆栈? 313xxxx000-313xxxx000 :lib文本和数据? 2xxxxxxxx000-2xxxxxxxx000 :许多混淆( 64M+…+63M+508K )块。 这种区域的数量非常接近线程的数量。 那么这些与线程相关的大区域呢? 这是合并/proc/{pid}/maps和pstack {pid} | grep Thread的结果后的结果 pstack {pid} | grep Thread : (如果0x@@@@@@@@位于这个区域内,我把*Thread ?? (Thread 0x@@@@@@@@@@ (LWP !!!!))*放在每个区域的末尾(我想@@@@是线程堆栈的基础,因此这个区域是线程堆栈的。) Region 0: 18M, 00400000-01675000 r-xp 00000000 08:02 5401 /mybinary Region 1: 236K, 01875000-018b0000 rw-p 01275000 08:02 5401 […]

vector <string>在超出范围之后不会清除内存

我遇到了以下问题,我不确定我是错的还是它的一个非常奇怪的错误。 我填充了大量的string,并希望它在某个点被清除。 这是一个简单的例子 #include <string> #include <vector> #include <unistd.h> //sleep #include <iostream> int main(){ { std::vector<std::string> strvec; for(long i = 0; i < 1000000; ++i){ std::string out = "This is gonna be a long string just to fill up the memory used by this fucking pthread\n"; strvec.push_back(out); } std::cout << "finished loading 1st\n"; sleep(10); // […]

我怎样才能减less最小的Linux进程的内存占用量

考虑下面的C程序,'pause.c': void main() { pause(); } 使用这个命令“gcc -Os pause.c -o pause”在x64 Linux 3.0.0-16-generic上编译这个文件会产生大小为〜8KB的可执行文件。 当我运行这个可执行文件并使用“pmap -d PID”检查其精确的内存占用情况时,它告诉我分配给进程的私有内存是192KB(通常在128KB到192KB之间,在不同的系统上有所不同)。 使用valgrind和massif检查进程未能检测到任何内存分配事件。 我对192KB的数字是否准确持怀疑态度,但是我发现,启动“暂停”进程的5个实例消耗了大约1MB的系统内存。 我无法解释这个记忆的起源,任何人都可以提供一些关于这个记忆被分配的原因以及任何可能减less它的潜在行为,欢呼声。

如何dynamic地分配大内存,如10 G,在64-linux上使用c ++的新操作符?

我需要dynamic分配一个更大的浮点数组为一个特殊的应用程序使用C + +新操作符,如10G。 运行在64-ubuntu-14.04 Linux OS上的代码,带有64G内存。 当我把内存的请求设置为大约7G, 1879048192×4/(1024x1024x1024)=7G (浮点数有4个字节),像这样: float * data; data = new float[1879048192]; 程序运行良好,但是当我尝试增加对10G的请求时,我得到了一个what(): std::bad_alloc 。 我也尝试使用malloc()来取代新的操作符: data =(float*)malloc(1879048192*sizeof(float)); 但是获得相同的结果。 我的ulimit -a是这样的: core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 514689 max locked memory (kbytes, -l) […]

我如何保留内存地址而不分配它们

我希望(在* nix中)分配一个大的连续的地址空间,但是不要马上消耗资源,也就是说我想保留一个地址范围,以后再分配给它。 假设我做foo = malloc(3 * 1024 * 1024 * 1024)来分配3G,但是在1G的计算机上有1G的交换文件。 它会失败,对吧? 我想要做的是说“给我一个内存地址范围foo … foo + 3G 我将分配 ”,所以我可以保证在这个区域内的所有分配是连续的,但没有实际分配直接。 在上面的例子中,我想跟随一个bar = malloc(123)调用foo = reserve_memory(3G)调用,它应该成功,因为reserve_memory还没有消耗任何资源,它只是保证吧不会在范围内烟草工业富+ 3G。 后来我会做一些像allocate_for_real(foo,0,234)来消耗foo范围的字节0..234。 在这一点上,内核将分配一些虚拟页面,并将它们映射到foo + 123 + N 这是可能的用户空间? (这一点是foo中的对象需要是连续的,创build后不能合理地移动。) 谢谢。