20

你如何告诉 linux 中的线程调度程序不要以任何理由中断你的线程?我正在用户模式下编程。简单地锁定互斥体是否可以实现这一点?我想防止在执行某个函数时调度我的进程中的其他线程。他们会阻塞,我会在上下文切换上浪费 CPU 周期。我希望任何执行该函数的线程都能够在不中断的情况下完成执行,即使超过了线程的时间片。

4

5 回答 5

17

你如何告诉 linux 中的线程调度程序不要以任何理由中断你的线程?

真的做不到,你需要一个实时系统。使用 linux 完成的任务是将调度策略设置为实时调度程序,例如 SCHED_FIFO,并设置 PTHREAD_EXPLICIT_SCHED 属性。参见例如这里,即使现在,例如 irq 处理程序和其他东西会中断您的线程并运行。

但是,如果您只关心自己进程中的线程不能做任何事情,那么是的,让它们阻塞在您正在运行的线程持有的互斥锁上就足够了。

困难的部分是协调所有其他线程以在您的线程需要执行其操作时获取该互斥锁。

于 2010-04-07T21:02:15.920 回答
2

您应该构建您的软件,这样您就不会依赖调度程序从您的应用程序的角度做“正确”的事情。调度器很复杂。它会做它认为最好的事情。

上下文切换很便宜。你说

我会用上下文切换浪费 CPU 周期。

但你不应该那样看。使用互斥锁和阻塞/等待进程的多线程机制。机器在那里供您使用...

于 2010-04-07T20:45:15.117 回答
1

你不能。如果可以的话,什么会阻止您的线程永远不会释放请求并使其他线程挨饿。

您可以做的最好的事情是设置您的线程优先级,以便调度程序会更喜欢它而不是较低优先级的线程。

于 2010-04-07T20:40:53.737 回答
1

为什么不简单地让竞争线程阻塞,那么调度程序除了你的活线程之外就没有什么可以调度的了?为什么第二次猜测调度程序会使设计复杂化?

于 2010-04-07T20:42:14.960 回答
1

研究 Linux 下的实时调度。我从来没有这样做过,但如果你确实需要这样做,那么这与你在用户应用程序代码中所能获得的一样接近。

不过,你似乎害怕的并不是什么大不了的事。您无法阻止内核中断您的程序以获得真正的中断或要运行的更高优先级任务,但是通过定期调度,内核确实使用它自己计算的优先级值,这几乎可以处理您担心的大部分问题。如果线程 A 独占地持有资源 X(X 可能是锁)并且线程 B 正在等待资源 X 可用,那么 A 的有效优先级将至少与 B 的优先级一样高。它还考虑一个进程是否正在使用大量 cpu,或者它是否花费大量时间休眠来计算优先级。当然,不错的价值也在那里。

于 2010-04-07T20:56:30.860 回答