3

众所周知,如果执行线程多于处理器内核的数量,则线程会在特定时隙(量子)之间切换。这适用于 Win/*nix。但是,线程切换实现了什么机制,它是在特定时隙启动的硬件中断,不是吗?

这个中断(IRQ)是多少号,我可以更改/设置这个时间(时隙)的值,以及如何在短时间内关闭这个中断,因为我对代码的性能(实时)部分至关重要(通过使用 WINAPI/Posix)?

4

3 回答 3

6

您不能关闭操作系统的定时器中断;它们在操作系统本身内进行管理,并且是其正常运行所必需的。在大多数 Unix 下,您可以使用sched_setscheduler 和/或pthread_setscheduler将调度策略设置为 SCHED_FIFO,和sched_setparam/pthread_setschedprio来设置优先级;然后,除非它具有更高的优先级,否则您将被保证不会被任何东西打断。

至少在 Linux 下(以及在我研究过的其他 Unix 下),也可以将页面锁定到真实内存中,因此您不会在它们上出现页面错误(这会导致您等待磁盘使用权)。Linux 中的函数是mlock.

请注意,您可能需要特殊权限才能更改全局调度程序或使用mlock.

于 2013-08-29T10:39:12.987 回答
4

简短的回答:你通常不能。

更长的答案:如果您有一项关键任务,您可以尝试提高该线程的优先级,但这不会无限期地帮助,因为现代(非实时)操作系统不允许线程“占用所有 CPU机器”。

此外,任何中断都可能导致您的任务被安排。计时器是基于时间量子执行的,但是例如,如果另一个任务正在等待网络数据包,那么当这样的数据包进来时,该任务将被放置在可运行队列中,因此调度程序将在那个时间运行点,并决定是否该运行另一个线程(从技术上讲,它既不是您的线程,也不是网络数据包等待线程)。同样,如果您的线程接触到一些已换出到磁盘的内存,它显然无法继续,直到数据从磁盘读回,因此它将被“停放在”阻塞队列和可运行的其他一些线程中队列。当从磁盘读取块时,操作系统将再次重新调度。

确实没有(简单的)方法可以解决这个问题。任何不容易的方法都会涉及到弄乱驱动程序并几乎编写自己的操作系统。

于 2013-08-29T10:37:25.530 回答
1

如果您需要确定性调度,您将需要一个实时操作系统。

http://en.wikipedia.org/wiki/Real-time_operating_system

于 2013-08-29T10:49:24.093 回答