windows下怎样让某个进程独占cpu的某个核心,从而防止上下文切换
SetProcessAffinityMask function (Windows)上下文切换是防止不了的,不然操作系统没法调度了。至于切换的延迟,用户态程序可以用如下代码测量。void MeasureLatencyPerformanceCounter(){\tLARGE_INTEGER fre, begin, end, sum;\tQueryPerformanceFrequency(\u0026amp;fre);\tsum.QuadPart = 0;\tconst int total = 1000000;\tfor (int i = 0; i \u0026lt; total; i++)\t{\t\tQueryPerformanceCounter(\u0026amp;begin);\t\tSwitchToThread();\t\tQueryPerformanceCounter(\u0026amp;end);\t\tsum.QuadPart += end.QuadPart - begin.QuadPart;\t}\tprintf("%lf us per switch\", (double)sum.QuadPart / (double)fre.QuadPart);}注意这只是系统低负载情况下的测量方法,高负载时会有调度问题,很难预测。
■网友
我去,上面的那个INLINE HOOK的方式太暴力了..设置个亲缘性就好了。进程、线程都可以。关于度量切换带来的延迟问题,我觉着你还是用性能监视器看看你在运行时发生的切换频率。不过这个一般情况下不是问题。而且还有你如果认为是切换给你带来了损耗,建议你还是看看其他部分是否有性能问题。
■网友
写个驱动,先获取dispatch level或者更高权限,然后一个while循环就行了。————————————————————————————告诉你这是标准答案,题主太不负责任了,也不回来
■网友
无论hook context switch还是设置亲缘性都不能避免操作系统进行上下文切换。操作系统在中断到来时,会首先保存用户态线程context,处理完中断后恢复某个用户态线程context。所以哪怕只有一个线程并且hook了context switch也会因为时钟、dma、mmu等中断不断发生上下文切换。此外,除了你的线程外,被恢复的“某个”线程还有可能是:某个waitforxxobject线程、某个读写i/o被阻塞的线程、某个倒霉的等待时间太长被临时提升优先级的线程,不一而足。更重要的是,除了用户态线程外,还有大量的内核级进程/线程在ring 0捯饬,在ring 3上根本无能为力╮(╯▽╰)╭。真要达到目的可以用xen之类虚拟机,然后不把某个核分配给windows,不过通信又成了大麻烦。。。。至于上下文切换的耗时,可以试试用interl system debugger测量ring0时间和中断时间来计算。估计题主是想用独占cpu的方式完成一些实时性要求高的操作。那么答案是:该方法无法保证ms级别的响应稳定性,但在驱动没问题的情况下能完成10ms以上(含)的相应。
■网友
可以试试看SetProcessAffinityMask,SetThreadAffinityMask,设置关连性,再结合上SetThreadPriority,以及SetPriorityClass,设置优先级,应该就能指定占用某些核心,但是那些核心,直到处理完线程内的任务之前,是不能用的。因为线程优先级太高了。不要轻易尝试,可能会死机。
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采
- 怎样评价类似前橙会、百老汇、南极圈这样类型的离职帮抱团,对企业的积极意义和消极意义
