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.