Articles of 内存

Linux的munmap不工作(或至less不能立即工作)

我打电话munmap没有错误,但映射仍然visibe在/proc/<pid>/maps ,当我试图mmap(address_overlapping_with_what_I_tried_to_munmap, …)我没有得到我要求的地址。 这是一个错误或function? 有什么我可以做,以确保一些未映射? 详细信息:32位Linux 4.1.18 编辑 最初,地图条目是 bfe50000-bfe71000 rw-p 00000000 00:00 0 然后我使用参数0xbfe50000, 0x21000调用munmap 入口是 bfe50000-bfe50000 rw-p 00000000 00:00 0

如何将进程状态从睡眠状态更改为在Linux中运行?

我有一个python程序需要扫描一些大的日志文件来提取有用的信息。 在这个程序中,为了更好地利用服务器(运行Ubuntu 12.04 LTS,拥有64个内核和96 GB内存)的计算资源, 我创build了一个大小为10的进程池,并向这些池工作者应用服务器。 每个作业使用file.readlines()从几个大文件(每个大约file.readlines() ,共20个文件)中file.readlines() ,然后逐行分析以find有用的信息并将结果保存到字典中。 在所有文件被扫描和分析之后,结果字典被写入磁盘。 另外,在整个脚本中没有显式调用gc.collect() 。 我使用root账号在服务器上启动了这个程序,这些程序首先运行正常:这个程序的每个进程将占用大约3.8GB的内存,所以共有40GB 几个小时后, 其他用户启动另一个耗费内存的程序(也使用root帐户),它积极使用几乎所有的内存(占内存总量的99%),之后该程序被CTRL-Z中断, killall -9 process_name 但是,在这之后,我发现我的大部分池工的进程状态已经改为S,这些睡眠进程的CPU使用率降为0.根据man top : The status of the task which can be one of: 'D' = uninterruptible sleep, 'R' = running, 'S' = sleeping, 'T' = traced or stopped, 'Z' = zombie 我使用ps -axl命令来检查进程正在hibernate的内核函数的名称, 事实certificate这些poolworker进程在_fastMutex上_fastMutex 。 这种情况会持续很长一段时间(进程状态现在仍然是S),我不想重新启动我的进程再次扫描所有文件, 我怎么能改变这些进程从睡眠状态到运行?

内存映射对象在线程终止后会自动释放吗?

我有几个简单的问题。 如果我在C中创build一个新的子线程,在线程完成处理并终止之后,执行: 内存映射对象“自动”释放? (我知道C没有垃圾收集器,但此时孩子已经终止) 猜猜我贴得太快了。 find第二个问题的答案(供将来参考): http : //www.ibm.com/developerworks/linux/library/l-memory-leaks/index.html? ca= drs- 孩子可以返回一个值父线程? (这是否可以使用一些常见的例程?我知道孩子和父母的内存空间是相同的?) 另外我想提一下,操作系统是符合POSIX的。 谢谢,Neco

在静态库中查找静态分配的数据块

我有一个小的静态库( .a )。 在静态库中是一个指向一个大的,静态分配的一维数组的指针。 当我将代码链接到这个库时,指针的地址在各个位置被硬编码,通过反汇编很容易find。 问题是,我想我的代码能够访问这个数组(图书馆是错误的,我想知道为什么)。 当然,通过反汇编,将该地址硬编码到我的代码中,然后重新编译,这将是微不足道的。 这不会是一个问题,除了库可以用不同的方式configuration其他模块,并且数组的指针根据链接的模块而改变。 我有什么select获得该指针? 因为数组的起始状态是可预测的,所以我可以遍历内存,用信号处理程序捕捉段错误,直到find合理的东西。 有没有更好的办法?

我怎样才能得到我的程序的内存消耗高峰?

我有一个小程序,就像grep或cat在运行时分配内存一样。 我想知道在整个运行过程中最多分配了多less内存。 我怎么能这样做?

为什么Linux中的物理内存被分配线性增加而不是一次?

我写了一个如下的程序,一次分配了大约1.2G的内存,我在Linux上testing过。 然后我发现 如果我定义了macros* WRITE_MEM *,则物理内存使用率(由命令顶部检查)将线性增加。 如果我没有定义这个macros,那么物理内存的使用量非常小(大约几百KB),而且不会变大。 我不明白这个现象。 #include <iostream> #include <cmath> #include <cstdlib> using namespace std; float sum = 0.; int main (int argc, char** argv) { float* pf = (float*) malloc(1024*1024*300*4); float* p = pf; for (int i = 0; i < 300; i++) { cout << i << "…" << endl; float* qf […]

什么可能会导致ShellExecute返回SE_ERR_OOM(错误8)?

我经常从本机C ++ / Win32应用程序中调用ShellExecute来执行GUI中由最终用户select的任何shell项目。 项目是可执行文件/脚本或链接(.lnk)。 在某些对我来说SE_ERR_OOM情况下,以下函数有时会返回8 ( SE_ERR_OOM错误;只是非常简要的logging)。 结果,该项目不被执行。 什么可能导致这个错误? int doExecute(LPCTSTR file, LPCTSTR args, LPCTSTR workDir) { assert(file && *file); HRESULT hRes = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); assert(hRes == S_OK || hRes == S_FALSE); int code = (int)ShellExecute(NULL, NULL, file, args, workDir, SW_SHOWNORMAL); doLog("ShellExecute returned: %d, %u", code, GetLastError()); // EDIT CoUninitialize(); return code; […]

如何使用内置函数而不是NULL检查来validation指针?

在今天的讨论中,我发现在VxWorks和LynxOS中都有检查,告诉你为一个指针指定的地址来自有效范围。 这是我第一次听到这个代码,如我分配int *i=&variable; 。 我应该得到一个警告或错误,说在我的应用程序,我不能分配地址值的整数。 就像我做NULL检查时,我只检查地址0x00000000 。 但是地址可能是0x00000001 。 如果其未映射的区域可能无法访问,则这也是无效的情况。 有没有人知道一些类似的Linux的事情,或者可以指导如何在VxWorks或LynxOS完成 。 有任何想法吗??

使用ps的线程

我想检查进程线程对进程RSS,VSZ和SZ值的贡献。 我怎样才能做到这一点。 因为如果我这样做: ps w -eL -o pid,tid,%cpu,cputime,%mem,sz,rss,vsz,command 我得到了tid,但是一个进程的所有线程的所有其他值都是相同的。 我甚至可以用ps做这个吗?

内存分配失败,即使有足够的内存

我正在使用Linux(正好是Ubuntu 13.04),目前我有一个问题:为什么内存分配将失败,即使有足够的内存? 我今天写了一个简单的testing应用程序,在运行这个testing应用程序时遇到了这个问题 以下是我用来testing的代码片段: #include <stdio.h> #include <unistd.h> #include <list> #include <vector> #include <strings.h> using namespace std; unsigned short calcrc(unsigned char *ptr, int count) { unsigned short crc; unsigned char i; //high cpu-consumption code //implements CRC algorithm: Cylic //Redundancy code } void* CreateChild(void* param){ vector<unsigned char*> MemoryVector; pid_t PID = fork(); if (PID == 0){ […]