Articles of 内存

这些内存区域来自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后不能合理地移动。) 谢谢。

loggingLinux中所有可执行文件/进程的内存访问

我一直在寻找一种方法来logging在Linux中进程/执行的所有内存访问。 我知道以前在这个问题上有关于这个话题的问题 在Linux中logging整个系统的内存访问占用情况 但我想知道是否有任何非仪器工具执行此活动。 我不想为此目的寻找QEMU / VALGRIND ,因为它会有点慢,我想要尽可能less的开销。 为了这个目的,我查看了perf mem和PEBS事件,例如cpu/mem-loads/pp ,但是我发现它们只会收集采样数据,实际上我想要所有内存访问的跟踪而没有任何采样。 我想知道是否有可能收集所有的内存访问,而不用像QEMU这样的工具在开销上浪费太多。 是否有可能只使用PERF,但没有样本,以便我获得所有的内存访问数据? 有没有其他的工具,我失踪了? 或者任何其他策略,给我所有的内存访问数据?

logging内存访问占用空间

我发现了Dr.Clements的mtrace 。 虽然它是有用的,但在我需要的情况下,它不能正常工作。 我打算用这个logging来理解不同场景下的内存访问模式。 有人可以分享相关经验吗? 任何build议将不胜感激。 0313更新 :我试图用qemu-mtrace来启动Linux-mtrace(3.8.0)的Ubuntu 16.04,但它只显示几个错误信息并终止。 希望有一些工具能够logging每一个访问。 $ ./qemu-system-x86_64 -mtrace-enable -mtrace-file mtrace.out -hda ubuntu.img -m 1024 Error: mtrace_entry_ascope (exit, syscall:xx) with no stack tag! mtrace_entry_register: mtrace_host_addr failed (10) mtrace_inst_exec: bad call 140734947607728 Aborted (core dumped)

ioread32后跟iowrite32没有给出相同的价值

我已经开始学习Linux设备驱动程序。 我正在做一些示例程序作为我学习的一部分。 为了理解内存映射IO,我写了下面的代码(这里只显示init)。 没有硬件映射在基地址。 static unsigned long base = 0xfed00000; unsigned long device_base=0; unsigned long virtual_base=0; static int __init sharedirqmodule_init(void) { u32 register1=0; u32 value=0x23456789; device_base=base; void *address=0; if(!request_mem_region(device_base,8,"device")) return -ENODEV; virtual_base = (unsigned long) ioremap(device_base, 8); address=(void *)virtual_base; printk(KERN_ERR "Sharedirq : Address value: %lx\n",address); iowrite32(value,address); wmb(); register1=(u32)ioread32(address); rmb(); printk(KERN_ERR "Shared irq :value: %d \n",register1); […]

我的蹦床不会反弹(绕路,C ++,GCC)

这感觉就像我滥用我所有的问题Stackoverflow,但它是一个问答论坛毕竟:)无论如何,我已经使用了一段时间了,但我还没有实现我自己(我已经使用包装更早)。 因为我想完全控制我的代码(谁不?),我决定自己实现一个function齐全的绕行程序,所以我可以理解我的代码的每个字节。 代码(下面)尽可能简单,但问题不是。 我已经成功地实施了绕道(即我自己的function),但是我还没有能够实施蹦床 。 每当我打电话给蹦床,根据我使用的偏移量,我得到“分段错误”或“非法指令”。 尽pipe两个案件都结束了。 “核心倾销”。 我认为这是因为我混淆了“相对地址”(注:我对Linux很新,所以我远远没有掌握GDB)。 如代码中所述,取决于sizeof(jmpOp) (在第66行),我得到一个非法指令或分段错误。 我很抱歉,如果这是明显的事情,我熬夜太晚了… // Header files #include <stdio.h> #include <sys/mman.h> #include <unistd.h> #include "global.h" // Contains typedefines for byte, ulong, ushort etc… #include <cstring> bool ProtectMemory(void * addr, int flags) { // Constant holding the page size value const size_t pageSize = sysconf(_SC_PAGE_SIZE); // Calculate relative […]

我如何解释meminfo中的所有内存?

我想了解meminfo如何跟踪内存。 这就是我正在看的: MemTotal: 341596 kB MemFree: 147288 kB Buffers: 56 kB Cached: 46752 kB SwapCached: 0 kB Active: 86928 kB Inactive: 41384 kB Active(anon): 81532 kB Inactive(anon): 288 kB Active(file): 5396 kB Inactive(file): 41096 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 81532 […]