众所周知,如果执行线程大于处理器核心数,则线程在某些时隙(量子)之间切换。这适用于Win / * nix。但是,为线程切换实现了什么机制,它是在特定时隙启动的硬件中断,不是吗?
这个中断(IRQ)的数字,我可以更改/设置此时间的值(时间段),以及如何关闭此中断,短时间,对于我的关键性能(实时)部分代码(使用WINAPI / Posix)?
答案 0 :(得分:6)
您无法关闭操作系统的定时器中断;他们是
在操作系统本身内管理,并且是正确的必要条件
functionning。在大多数Unix下,你可以使用sched_setscheduler
和/或pthread_setscheduler
将调度策略设置为
设置SCHED_FIFO
和sched_setparam
/ pthread_setschedprio
优先权;然后你将保证不被打断
什么都没有,除非它有更高的优先级。
在Linux下,至少(以及我曾经使用过的其他Unix),
也可以将页面锁定到实际内存中,所以你不能
他们得到一个页面错误(这将导致你等待
磁盘访问)。 Linux中的函数是mlock
。
请注意,您可能需要特殊权限才能更改
全局调度程序或使用mlock
。
答案 1 :(得分:4)
简答:你一般不能。
更长的答案:如果你有一个关键任务,你可以尝试提升该线程的优先级,但它不会无限期地帮助,因为现代(非实时)操作系统不允许线程“采取所有机器中的CPU“。
此外,任何中断都可能导致您的任务被安排。计时器是基于时间量程执行的计时器,但是例如,如果另一个任务正在等待网络数据包,那么当这样的数据包进入时,该任务将被放置在可运行队列中,因此调度程序将在此处运行如果是时候运行另一个线程(技术上可能不是你的线程,也不是网络数据包等待线程),请做出决定。同样,如果你的线程接触到一些已经换成磁盘的内存,它显然无法继续,直到从磁盘读回数据,因此它将被“停放”在被阻塞的队列中以及来自runnable的其他一些线程队列。从磁盘读取块后,操作系统将重新计划。
实际上没有(简单)方法。任何不容易的方法都会涉及搞乱驱动程序和几乎编写自己的操作系统。
答案 2 :(得分:1)
如果您需要确定性调度,则需要一个实时操作系统。