ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c++ 对特定进程的内存监控

2019-10-12 19:54:30  阅读:243  来源: 互联网

标签:grep 迭代 buffer c++ pf 内存 监控 进程


在工具实现的过程中,遇到了内存爆了的问题,部分模型的规模可以达到10的100次方方甚至1000次方。
(工具的主要算法涉及到了递归,递归深度会很深,所以也用到了ulimit修改栈空间来缓解爆栈的问题,治标不治本。)
有一个循环,这个循环迭代16次,但是可能程序在某一次迭代过程中,已经耗光了内存,再申请空间的时候,出现异常,导致将整个进程杀死。而我的想法是,当某一个迭代过程中,出现无法再申请内存的情况,就输出内存申请失败的提示信息,并跳过它,进行下一次的迭代,而不是将整个进程kill。

解决方法:
创建一个子线程,让它每隔1秒去检查 当前进程的内存占用,如果超过一定的比例,则跳过此次的迭代。
检查当前进程的内存占用,是用shell脚本实现的,使用shell脚本进行对内存的查询只需要两三行即可。
当执行shell脚本的时候,要获取其输出结果,也就是该进程的内存占用。
具体代码如下

 1 void detect_memory()
 2 {
 3 
 4     for(;;)
 5     {
 6         FILE *pf;
 7         char buffer[20];
 8 
 9         //执行内存检测脚本
10         pf = popen("sh detect_memory.sh", "r");
11 
12         if(pf!=NULL){
13 
14             //buffer:enPAC进程占用的内存(KB)
15             //fread 将pf指向的内容,读sizeof(buffer)个字节,读一次,读到buffer中
16             fread(buffer, sizeof(buffer), 1, pf);
17 
18             //used:将buffer转成整型,单位为MB
19             short int used = atoi(buffer)/1024;
20             pclose(pf);
21 
22             //判断enPAC占用的内存,超过一定比例,则将memory_flag=false
23             //同时break,让dfs()进行return,结束此公式的search
24             if(100*used/total_mem > 70)
25             {
26                 memory_flag = false;
27                 cout<<"detect memory over the size  given"<<endl;
28                 break;
29             }
30         }else{
31             cout<<"未能检测到enPAC进程所占内存"<<endl;
32             pclose(pf);
33         }
34 
35         //每隔5秒,对enPAC占用内存进行查询
36         sleep(1);
37     }
38 
39 
40 }
41 
42 detect_mem_thread = thread(&Product_Automata::detect_memory,this);  //创建一个子线程进行内存监控
View Code

注:popen总是和pclose一起出现被使用的。popen() 创建一个管道,通过fork或者invoke一个子进程,然后执行command。popen返回该FIFO数据流的指针。fread(buffer, sizeof(buffer), 1, pf),fread 将pf指向的内容,读sizeof(buffer)个字节,读一次,读到buffer中。

 

shell脚本如下:
#!/bin/bash
process="enPAC"        #进程名字
PID=$(ps x | grep $process | grep -v grep | awk '{print $1}')
size=` cat /proc/${PID}/status | grep RSS | tr -cd "[0-9]"`
echo $size

标签:grep,迭代,buffer,c++,pf,内存,监控,进程
来源: https://www.cnblogs.com/tvtaqa/p/enPAC_note.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有