随笔
2015-11-02 15:31
239 查看
1.ProcWatch实例代码为什么会占用100%的CPU?(3rd->demo->ProcWatchClientConsole)
这里特别说一下,当时多核虚拟机时也不会到100%,一半cpu使用率会很低,到了20~30就已经很高了,因为是多核啊
bug:
#define EVENT_NAME L"ProcEventx" // (L"//global//procEvent") //win7中需要加入global否则会出错误的
#define DRIVER_NAME "ProcWatch"
while (::WaitForSingleObject(hProcessEvent, INFINITE))//是阻塞的,会让出cpu,当hprocessevent为null时,返回的是-1,这样会一直轮询拿数据,底层通过event与r3进行同步
{
Sleep(1000);
DWORD dwRet = 0;
BOOL bRet = FALSE;
.
.
.
}
这个bug的原因在于逻辑错误,首先这个while循环的目的是像通过内核对象“事件”,来实现r0与r3的同步,但是wait函数时阻塞函数,当event没有被赋值,即内核没有释放event来通知r3已经ok,可以来拿数据了,wait函数会阻塞并交出cpu的使用。
所以当是#define EVENT_NAME L"ProcEvent 时,事件没有准备好时,wait函数返回的是0,所以不会进入while循环,这个不会占用cpu,当是#define EVENT_NAME L"ProcEventx“时,由于并不跟r0内核event对应,所以hProcessEvent是NULL,这样wait函数返回-1,会一直占用cpu,这就是原因。
正确的写法是:
//while (TRUE)
//{
//DWORD dwRet = 0;
//BOOL bRet = FALSE;
//::WaitForSingleObject(hProcessEvent, INFINITE);
就可以了
2.
这里特别说一下,当时多核虚拟机时也不会到100%,一半cpu使用率会很低,到了20~30就已经很高了,因为是多核啊
bug:
#define EVENT_NAME L"ProcEventx" // (L"//global//procEvent") //win7中需要加入global否则会出错误的
#define DRIVER_NAME "ProcWatch"
while (::WaitForSingleObject(hProcessEvent, INFINITE))//是阻塞的,会让出cpu,当hprocessevent为null时,返回的是-1,这样会一直轮询拿数据,底层通过event与r3进行同步
{
Sleep(1000);
DWORD dwRet = 0;
BOOL bRet = FALSE;
.
.
.
}
这个bug的原因在于逻辑错误,首先这个while循环的目的是像通过内核对象“事件”,来实现r0与r3的同步,但是wait函数时阻塞函数,当event没有被赋值,即内核没有释放event来通知r3已经ok,可以来拿数据了,wait函数会阻塞并交出cpu的使用。
所以当是#define EVENT_NAME L"ProcEvent 时,事件没有准备好时,wait函数返回的是0,所以不会进入while循环,这个不会占用cpu,当是#define EVENT_NAME L"ProcEventx“时,由于并不跟r0内核event对应,所以hProcessEvent是NULL,这样wait函数返回-1,会一直占用cpu,这就是原因。
正确的写法是:
//while (TRUE)
//{
//DWORD dwRet = 0;
//BOOL bRet = FALSE;
//::WaitForSingleObject(hProcessEvent, INFINITE);
就可以了
2.
相关文章推荐
- 修改友盟社会化组件
- 浅谈UML的概念和模型之UML九种图
- android里的进程和线程
- 一次去重大批 数据时夯死临时处理实例
- Google Protocol Buffer 的使用和原理 .
- C#进阶系列——动态Lamada
- iOS -一些常用的方法
- 诸侯安置
- Java [leetcode 31]Next Permutation
- Elasticsearch - 核心概念
- Python - Json
- Tomcat内存设置
- SpringMVC介绍之Validation
- css画个三角形,可旋转
- 使用 ApiGen 生成开发文档
- Cookie设置HttpOnly属性,防止前端脚本更改cookie的XSS攻击
- ios 开发日记 20 - runTime
- MyEclipse10 工具栏图标的添加与隐藏
- 制作mac系统启动U盘
- elipse 调整字体背景色