-
-
[讨论]关于KeSetEvent启动等待线程
-
发表于:
2014-7-14 21:14
4192
-
驱动中间,创建了另一个线程Thread1,等待一个Event,KeWaitForSingleObject(&Event,....);
驱动接受 Irp,就设置 Event,然后Thread1就应该启动了吧。运行完毕,继续等待。。。
按照道理应该是这样的流程:
CPU0:
---接受Irp并KeSetEvent-时间点0,等待CPU1执行,----时间点2,CPU1执行完毕,CPU0继续发送下一个Irp--重复前面的步骤
CPU1:
---WaitFor....-------------时间点1,执行--------------完毕时间点3,-----继续WaitFor....
按照道理 ,时间点0和时间点1应该是重合的,时间点2和时间点3也应该是重合的。
但是我查看cpu的占用比率,发现并没有占用达到 25%,4核cpu,也就是说4核中的一个核都没有完全占满,也就是说,时间点0以后,设置了信号KeSetEvent,而cpu1等待 Event并没有在同时执行,
而是在时间点0过去很多时间以后,比如过了10ms再执行,造成了时间点0---时间点 1这10毫秒的时间,系统无事可做,处于IDLE状态。为什么会这样,我希望时间点0KeSetEvent以后,马上唤醒CPU1的 等待事件并马上执行,为什么不是马上唤醒,而是等待10ms以后再唤醒再执行呢?这样造成了10毫秒的浪费,而这10毫秒中系统处于无事可做的状态,可是明明有一个线程可以被调度啊,已经KeSetEvent了,为什么不调度这个线程执行呢?我想要不浪费这10毫秒,马上执行,有什么办法?
不知道我说清楚没有,反正这个问题很难解释清楚。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!