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

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

 void detect_memory()
{ for(;;)
{
FILE *pf;
char buffer[]; //执行内存检测脚本
pf = popen("sh detect_memory.sh", "r"); if(pf!=NULL){ //buffer:enPAC进程占用的内存(KB)
//fread 将pf指向的内容,读sizeof(buffer)个字节,读一次,读到buffer中
fread(buffer, sizeof(buffer), , pf); //used:将buffer转成整型,单位为MB
short int used = atoi(buffer)/;
pclose(pf); //判断enPAC占用的内存,超过一定比例,则将memory_flag=false
//同时break,让dfs()进行return,结束此公式的search
if(*used/total_mem > )
{
memory_flag = false;
cout<<"detect memory over the size given"<<endl;
break;
}
}else{
cout<<"未能检测到enPAC进程所占内存"<<endl;
pclose(pf);
} //每隔5秒,对enPAC占用内存进行查询
sleep();
} } detect_mem_thread = thread(&Product_Automata::detect_memory,this); //创建一个子线程进行内存监控

注: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

c++ 对特定进程的内存监控的更多相关文章

  1. Linux下实现脚本监测特定进程占用内存情况

    Linux系统下,我们可以利用以下命令来获取特定进程的运行情况: cat /proc/$PID/status 其中PID是具体的进程号,这个命令打印出/proc/特定进程/status文件的内容,信息 ...

  2. zabbix 监控特定进程

    因为一些server上跑着一些重要程序,须要对它们进行监控,公司用的是zabbix监控,之前都是在zabbix中加入自己定义脚本对特定程序进行监控,近期看了zabbix的官方文档,发现原来强大的zab ...

  3. C#获取特定进程CPU和内存使用率

    首先是获取特定进程对象,可以使用Process.GetProcesses()方法来获取系统中运行的所有进程,或者使用Process.GetCurrentProcess()方法来获取当前程序所对应的进程 ...

  4. crond守护进程实现定时监控某进程占有内存的大小

    1)添加计划任务 crontab -e会使用某个编辑器打开某个文件,然后在内输入需要执行的计划任务,保存后在/var/spool/cron/crontabs/下会出现以用户名命名的文件 2)计划任务如 ...

  5. 【进程/作业管理】篇章一:Linux进程及管理(专用内存监控类工具)------【vmstat、pmap】

    主要讲解专用内存监控工具的使用:vmstat.pmap命令的使用. 命令概览: vmstat 显示虚拟内存状态 pmap 报告进程与内存映射关系 vmstat命令是最常见的Linux/Unix监控工具 ...

  6. [转]使用 Shell 对进程资源进行监控

    原文:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-monitoring/ 使用 Shell 对进程资源进行监控 检查进程是否存在 在 对 ...

  7. 使用Shell脚本对Linux系统和进程资源进行监控

    ShellLinux脚本 摘要:Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.本文我们以Bash做为实例总结了使用Shell对系统和进 ...

  8. 使用 shell 脚本对 Linux 系统和进程资源进行监控

    Shell 简介 Shell 语言对于接触 LINUX 的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行.实际上 Shell 是 ...

  9. .NET(C#):获取进程的内存私有工作集

    当前.NET Framework(.NET 4.0)的Process仅提供进程的内存工作集的获取(通过WorkingSet64属性),而没有提供对私有工作集的获取.注意在Windows Vista之后 ...

随机推荐

  1. codeforces 816 C. Karen and Game(模拟+思维)

    题目链接:http://codeforces.com/contest/816/problem/C 题意:给出一个矩阵,问能否从都是0的情况下只将一整行+1或者一整列+1变形过来,如果可以输出需要步数最 ...

  2. NOIP 2016 组合数问题 题解

    一道sb题目,注意范围,可打表解决,打出杨辉三角,在用前缀和求解即可 代码(一维前缀和) #include<bits/stdc++.h> using namespace std; int ...

  3. JAVA - 一个for循环实现99乘法表

    public class Test03 {public static void main(String[] args) { int lie = 1; for (int hang = 1; hang&l ...

  4. 用户上传gif动图分解成多张帧图片,并合并生成新gif图片

    背景 为什么要制作这么一款工具 首先公司最近在做一款表情包的产品,需要将文字生成到gif图片中,并可以控制文字显示的位置,并将不同的文字显示在不同的图片上 制作成网页端工具,随时随地,方便使用 探索 ...

  5. CSS3 04. 伸缩布局、设置主轴,侧轴方向、主/侧轴对齐方式、 伸缩比例、元素换行、换行控制、覆盖父元素的align-items;控制子元素顺序、web字体、突变字体

    CSS3 在布局方面做了非常大的改进,对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开发中可以发挥极大的作用.(兼容性不好) 必要元素: 指定一个盒子为伸缩盒子 displa ...

  6. 洛谷 P3952时间复杂度 (本地AC测评RE的伪题解)

    [题目描述] 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写 ...

  7. 最佳内存缓存框架Caffeine

    Caffeine是一种高性能的缓存库,是基于Java 8的最佳(最优)缓存框架. Cache(缓存),基于Google Guava,Caffeine提供一个内存缓存,大大改善了设计Guava's ca ...

  8. FreeSql (七)插入数据时忽略列

    var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...

  9. 微信小程序点击控制元素的显示与隐藏

    微信小程序点击控制元素的显示与隐藏 首先我们先来看一下单个点击效果 我们来看一下wxml中的代码: <view class="conten"> <view cla ...

  10. LVM(逻辑卷管理)

    一.LVM概念 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管 ...