优化CPU占用率及内存占用
程序写好,也调试通过了,但是今天发现有几个地方有问题,
1.cpu占用率高,最后发现是因为O_NDELAY这个参数,导致程序非阻塞,把这个参数去掉之后,CPU占用率马上下降到%1之下。
fd_gps = open( dev, O_RDWR |O_NOCTTY | O_NDELAY)
2内存占用
一个小程序,开了5个线程,内存占用44M左右,
怎么会这样子,我输入pmap 命令查看进程的内存占用情况,发现有5 个anon内存存占用8MB, 这5个8M就是40MB了,关键就是窧个地方。
但是anon又是什么呢,继续baidu,学习到pmap的输出,就2类,一类是file-backed,一类是anonymous,file-backed对应的是这段内存在硬盘上有对应的文件,而anonymous即是在硬盘上没有对应的文件,这只是大概的分类,明白就行。
但程序是哪个地方会一下子分配了8MB内存呢,我查遍程序也没有发现。
我的线程是5个,刚好有5个8MB,这么巧,肯定不是,肯定有联系,难道是线程堆栈?
继续baidu,果然是堆栈,ulimt -s,返回就是默认的8MB, 但是怎么修改呢,继续baidu,顺利找到解决方案。
原理是这样:创建线程前,首先修改线程参数,通过pthread_attr_init()初始化参数,——》修改参数——》创建线程——》支除属性,这几个步骤来完成。
ret = pthread_attr_init( &attr ); //!> 初始化属性
if(ret != 0)
{
perror("pthread_attr_init");
return -1;
}
stack_size = 0;
ret = pthread_attr_getstacksize(&attr, &stack_size);//获取线程堆栈大小
//打印堆栈值
printf("stack_size = %dB, %dk\n", stack_size, stack_size/1024);
ret = pthread_attr_setstacksize(&attr, 1024*1024);//设置线程堆栈大小
if(ret != 0)
{
perror("pthread_attr_getstacksize");
return -1;
}
/* 启动远程升级线程 */
ret=pthread_create(&update_id, &attr, (void *) update_tsk, NULL);
if(ret != 0)
printf("create update task error%d\r\n", ret);
pthread_attr_destroy( &attr ); //!> 去除属性