防止 Linux 线程被调度程序中断
- 2024-11-14 08:30:00
- admin 原创
- 43
问题描述:
如何告诉 Linux 中的线程调度程序不要因任何原因中断您的线程?我正在用户模式下编程。只需锁定互斥锁就能实现这一点吗?我想在执行某个函数时阻止进程中的其他线程被调度。它们会阻塞,而我将通过上下文切换浪费 CPU 周期。我希望执行该函数的任何线程都能够不间断地完成执行,即使超出了线程的时间片。
解决方案 1:
如何告诉 Linux 中的线程调度程序不要因任何原因中断你的线程?
真的做不到,你需要一个实时系统。使用 Linux 最接近的做法是将调度策略设置为实时调度程序,例如 SCHED_FIFO,并设置 PTHREAD_EXPLICIT_SCHED 属性。参见此处,但即使现在,例如 irq 处理程序和其他东西也会中断你的线程并运行。
但是,如果您只关心您自己进程中的线程无法执行任何操作,那么,让它们阻塞您正在运行的线程所持有的互斥锁就足够了。
困难的部分是当您的线程需要执行其操作时,协调所有其他线程来获取该互斥锁。
解决方案 2:
您应该设计您的软件,这样您就不必依赖调度程序从您的应用的角度来做“正确”的事情。调度程序很复杂。它会做它认为最好的事情。
上下文切换很便宜。你说
我可能会因为上下文切换而浪费 CPU 周期。
但你不应该这样看。使用互斥锁和阻塞/等待进程的多线程机制。这些机制是为你准备的……
解决方案 3:
你不能。如果可以,什么可以防止你的线程永远不释放请求并导致其他线程挨饿。
您所能做的最好的事情就是设置线程优先级,以便调度程序优先选择该线程而不是低优先级线程。
解决方案 4:
为什么不简单地让竞争线程阻塞,这样调度程序就只剩下你的活动线程可以调度了?为什么要让设计变得复杂,还要对调度程序进行二次猜测?
解决方案 5:
研究 Linux 下的实时调度。我从未这样做过,但如果您确实需要它,这是您在用户应用程序代码中可以做到的最接近的事情。
不过,您担心的其实并不是什么大问题。您无法阻止内核因实际中断或更高优先级的任务想要运行而中断您的程序,但在常规调度中,内核确实会使用它自己计算的优先级值,这几乎可以处理您所担心的大部分问题。如果线程 A 独占资源 X(X 可能是锁),而线程 B 正在等待资源 X 可用,那么 A 的有效优先级将至少与 B 的优先级一样高。它还会考虑进程是否正在占用大量 CPU 或者是否花费大量时间处于休眠状态来计算优先级。当然,nice 值也会被考虑进去。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件