怎么样的溢出才能使UNIX的CPU达到100%
- C/C++ code
#include "stdio.h"typedef struct a{ int t;}A;typedef struct b{ A abc[10];}B;int test(B *p){ for (int i=0;i<16;++i) { p->abc[i].t=i; } return 0;}void show(){ B myb; test(&myb); for (int i=0;i<16;++i) { printf("%d\n",myb.abc[i].t); }}int main(){ show(); printf("test!\n"); while(1) { printf("waiting\n"); } return 0;}上面是我的测试code,毫无疑问,我对结构体变量的操作超出的它的定义范围.
WINDOWS环境会在show执行完报错,完全打印不出test!
但是我在UNIX上面测试,不但可以打印出test!还能继续后面的循环。
这里做个死循环是为了看内存和CPU使用情况,ps了一下,CPU基本在8%左右浮动。
最近为了查server hang费了很多心,很想知道UNIX到底什么情况才能使得CPU使用率在99%以上。
先谢过。
[解决办法]
写个
while(1);
试试
[解决办法]
内存越界不是必然会导致运行失败,行为是不确定的
可能运气好
[解决办法]
[解决办法]
while(1)
{
printf("waiting\n");
}
printf是要往屏幕输出的,耗得是IO,CPU不怎么耗。
[解决办法]
这个比较困难
你用小程序来模拟,更困难,很难重现,运行环境毕竟不同
感觉还是从程序日志入手,查看直接表现,查找直接原因
[解决办法]
用gdb单步或设断点调试
[解决办法]
呵呵,内存越界的表现就是千奇百怪的
不会固定在同一个地方出错
对代码进行静态检查,也许能发现一点问题
工具PC-Lint
[解决办法]
只要让CPU一直做复杂的运算就可以达到99%了(如果是多个CPU),你就多开几个进程一起做。
很容易就可以让CPU达到99%。
楼主,估计你还是得调式自己的代码了。
[解决办法]
申请内存,不释放,程序久了肯定CPU上去.
[解决办法]
[解决办法]
[解决办法]
只不过你的代码正好让windows崩了,show稍微改改就能不蹦。
- C/C++ code
void show(){ int arr[1000]={0}; B myb; test(&myb); for (int i=0;i<16;++i) { printf("%d%d\n",myb.abc[i].t); } cout<<arr[0]; // 使用下arr,确保release下,编译器不会觉得arr没用过,直接优化掉了}
[解决办法]
楼主不必纠结吧,至少我重新运行你的代码,直接Segmentation fault了。
那就说明,这种内存越界结果是未定义的。
[解决办法]
CPU100% 估计是死循环了,跟内存没多大关系